基于python的爬虫方法总结(一)

news/2024/7/19 10:10:06 标签: 爬虫, requests, 动态ajax, 解析

爬取的方法很多,,但是不管用什么方法总结起来就3大步

  1. 确定要爬取的URL地址
  2. 向网站发请求获取相应的HTML页面
  3. 提取HTML页面中有用的数据

文章目录

  • 一,获取静态页面数据方法
    • urllib方法
    • requests方法
    • selenium方法
    • BeautifulSoup方法
    • Scrapy框架方法
  • 二,解析静态页面数据方法
  • 三,发送的请求类型(以requsets)
    • post请求
    • 带有动态ajax的网页请求
    • 原生的多线程

一,获取静态页面数据方法

urllib方法

1、python2 :urllib、urllib2
2、python3 :urllib.request
对应的版本不同,python的包也不同,
以python3 为例
爬取贴吧图片的部分代码
(这里要注意下url中的文字要经过url编码
方法有:
1.a=urlencode({‘kw’,‘地下城’})
a=‘kw=XXXXXXXXXXXXXXX’
2.a=quote(‘地下城’)
a=‘XXXXXXXXXXXX’ (unquote进行反url编码)
例:

  class BaiduSpider(object):
    def __init__(self):
        self.baseurl = "http://tieba.baidu.com/f?"
        self.headers = {"User-Agent":"Mozilla/5.0 "}
     
   #获取页面    
    def getPage(self,url):
        req =urllib.request.Request(url,headers=self.headers)
        res = urllib.request.urlopen(req)
        html =res.read().decode("utf-8")
        return html
    #解析页面
    def parsePage(self):
        pass
    #保存数据
    def writePage(self,filename,html):
        with open(filename,"w",encoding="utf-8") as f:
            f.write(html)

如果返回的有json文件的话 可以通过dict = json.loads(html),把返回的数据变成一个字典,在进一步取值。

requests_44">requests方法

class NoteSpider(object):
    def __init__(self):
        self.url ="http://code.tarena.com.cn"
        self.headers ={"User-Agent":"Mozilla/5.0"}
        self.proxies = {"http":"http:164.215.6.22:8888"}
        
def getprasepage(self):
    request=requests.get(self.url,auth=self,proxies=self.proxies,headers=self.headers)
    request.encoding ='utf-8'
    html =request.text
    p=re.compile('正则表达式',re.S)
    rlist =p.findall(html)
    self.writepage(rlist)

def writepage(self,rlist):
    pass

selenium方法

爬取快代理的示例:

from selenium import webdriver
import time 
opt = webdriver.ChromeOptions()
opt.set_headless()
driver =webdriver.Chrome(options=opt)

while True:
    print('页数:',page)
    driver.get('https://www.kuaidaili.com/free/inha/'+str(page)+'/')
    time.sleep(1)
    hosts=driver.find_elements_by_xpath("//td[@ data-title='IP']")
    ports=driver.find_elements_by_xpath("//td[@ data-title='PORT']")
    for host,port in zip(hosts,ports):
        test_id=host.text+':'+port.text
        with open('代理ip.txt','a',encoding='utf-8') as f:
            f.write(test_id+'\n')
    page+=1
    if page ==6:
        break
driver.quit()

BeautifulSoup方法

示例:

soup =BeautifulSoup(html,'lxml')
rlist = soup.find_all('div',{"class":"test"})
    
for r in r1list:
    print(r.,div.string)

Scrapy框架方法

emmm,这个框架方法内容下篇再说明有点多

二,解析静态页面数据方法

re正则解析

1.创建正则对象
2.进行匹配,返回一个匹配的结果列表

p = re.compile('<div class="animal">.*?title="(.*?)".*?class="content">(.*?)</p>',re.S)
rList = p.findall(html)

xpath解析

1.创建xpath待解析对象
2.进行xpath解析,结果一定是列表
xpath的一些语法:
/:从当前节点找子结点(非后代节点),返回节点对象
例:
//price /book :查找父节点为price的所有book节点,返回节点对象
// : 从整个文档中查找节点,返回节点对象
例:
//price //book//name 查找price节点的后代book节点后代的name节点,返回节点对象
contains() :匹配一个属性值中包含某些字符串的节点
例:
//title[contains(@class,“e”)]查找title节点中有class属性,且class属性的值中包含一个e的节点,返回节点对象
@ : 节点中含某个属性
例:
//title[@class=“en”]查找class='en’的title节点,返回节点对象
//title/@class 查找有class的title节点,返回class的值
//title[@class=“en”]/text()查找class='en’的title节点,返回符合要求节点里的所有文本。

使用方法:
parseHtml = etree.HTML(html)
r1 = parseHtml.xpath(’//a/@href’)

selenium中独有的find_element

#返回单个节点对象
elmt= driver.find_element_by_name( ‘text’)
elmt= driver.find_element_by_class_name( ‘text’)
elmt= driver.find_element_by_id( ‘text’)
text=elmt.text #获取节点的文本内容
#返回节点列表
text = driver.find_elements_by_id( ‘text’)

BeautifulSoup中独特的解析

创建解析对象(解析方式为lxml或xml)
soup = BeautifulSoup(html,‘lxml’)
查找节点对象,返回的是节点对象列表,用get_text()方法获取文本

 rlist = soup.find_all('div',{'id':''})
 for r in rlist:
 	text=r.get_text()

三,发送的请求类型(以requsets)

带参数的请求
params={‘参数名’:‘参数值’,‘参数名’:‘参数值’,‘参数名’:‘参数值’,…}
自动拼接为url参数名=参数值&参数名=参数值
wd为参数名 flask为参数值
例:https://www.baidu.com/s ? wd=flask
res = requests.get(url, params=params,headers=headers)

post请求

data={‘参数名’:‘参数值’…}
#data为需要发送的表单数据。
requests.post(url,data=data,headers=headers)
cookie请求
requests.get(url,data=data,headers=headers)
语句不变,只是headers中需要带有cookie中的参数,一般用于登录网站。

带有动态ajax的网页请求

这个方法有些许中,比较简单但很慢的是用,适用于初学者,
Selenium + PhantomJs/chromedriver
就加上个
执行脚本,进度条拉到最底部
driver.execute_script(‘window.scrollTo(0,document.body.scrollHeight)’)

还有一种就是分析每次加载的变化是哪些
通过抓包或F12看network中的变化,在服务器发送过来的具体文件中找到我们需要的数据。一般是个较长的json文件,再从文件中分析每次加载变化的是哪些,哪些是需要的发送给服务器的数据,然后根据文件请求的方式(get/post),将确认好的数据按要求添加到发送的data中。

原生的多线程

在框架泛滥的年代写原生的已经很少了,也列举下吧。可用消息队列或者管道或者共享内存,
基本流程是:
1.将一堆要请求的url放到urls的消息队列中
2.将一堆通过请求获取到的带解析的html放到htmls的消息队列中
3.创建多个线程进行请求url 和解析html(需解决最后解析时阻塞问题,设置超时或者其他方法即可)
4.回收线程


http://www.niftyadmin.cn/n/1348172.html

相关文章

通达文件上传及文件包含漏洞复现

目录 1.漏洞概述 2.影响范围 3.风险等级 4.漏洞复现 4.1.环境搭建 4.2.漏洞利用

前端的性能优化

只要是web项目&#xff0c;每次产品&#xff0c;运营&#xff0c;测试团队都回反馈说 XXX性能不好等问题&#xff0c;大抵上都离不开一个字-----“慢”。 什么页面加载太慢&#xff0c;点击触发事件太慢&#xff0c;要不就是APP&#xff0c;小程序太大&#xff08;加载/下载慢&…

Ciphey人工智能解密解码工具部署和使用

目录 1.Ciphey工具介绍 2.Ciphey安装 3.Ciphey选项参数详解 4.使用实例 1.Ciphey工具介绍 Ciphey是一款基于python编写的自然语言和人工智能解密/解码工具。一些常见的加密/编码类型,都能够全自动解密/解码/破解的工具。该工具开源,在github上已获得六千多个赞了,并且…

Burpsuite插件环境配置

目录 1.前言 2.Burp插件环境配置 2.1 插件环境安装 2.2 Burp配置插件环境 2.3 设

深某服等保解决方案

目录 一、深某服等保流程 1.定级备案 2.差距评估 3.方案设计 4.安全整改 二、深某服等保生态圈 1.深某服的关系链 2.深某服运维服务 3.深某服典型案例 4.深某服内部运作方法 一、深某服等保流程 1.定级备案 2.差距评估 3.方案设计 4.安全整改 为什么是百分之百&#…

在django项目中搭建分布式图片服务器fastdfs

FastDFS是一个开源的轻量级分布式文件系统&#xff0c;它对文件进行管理&#xff0c;功能包括&#xff1a;文件存储、文件同步、文件访问&#xff08;文件上传、文件下载&#xff09;等&#xff0c;解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务&#xff…

等保价值提炼及经典成功案例

目录 一、等保价值提炼总结 二、等保经典成功案例 一、等保价值提炼总结 二、等保经典成功案例

使用flask_wtf 的 csrf时的bug问题

之前接收一个老项目&#xff0c;版本迭代的时候&#xff0c;发现了一个问题&#xff0c;用户在登出的时候&#xff0c;再次登录时&#xff0c;报400错误&#xff0c; The CSRF session token is migging.查了查代码&#xff0c;才发现问题。 这个flask项目是用flask_wtf的csrf…