实现爬虫的套路
首先准备url,明确爬取的目标
- 准备start_url
- url地址规律不明显,总数不确定的话,用正则或者xpath提取
- 通过代码提取下一页url
- xpath
- 寻找url地址,部分参数会在当前响应中,如当前页码数或者页码总数
- 准备url_list
- 页码数明确
- url规律明显
发送请求,获取响应
添加随机User-Agent,反反爬虫
添加随机的代理ip地址,反反爬虫
如果被对方判定为爬虫,则应该添加更多的请求头,如referrer,cookies
cookie的处理可以用session来解决
requests库提供了session对象
# 生成session对象 session=requests.session() # 使用session发送post请求,cookie保存在其中 session.post(post_url,data=post_data,headers=headers) # 在使用session进行请求登录之后才能访问的网址 r = session.get(url,headers=headers) # 进行之后的保存操作或者其他的操作
可以准备一堆cookie,组成cookie池
如果不登录
准备刚开能够成功请求对方网站的cookie,即接收对方网站设置在response的cookie
下一次请求的时候,使用之前列表中的cookie来请求
如果登录
准备多个账号
- 使用程序获取每个账号的cookie
- 之后请求登录之后才能访问的网站随机的选择cookie
提取数据
- 首先确定数据的位置,如在response的网页中,还是js中
- 如果数据在当前的url地址中
- 提取列表页数据
- 直接请求列表页的url地址,不进入详情页
- 提取详情页的数据
- 确定url
- 发送请求
- 提取数据
- 返回
- 如果数据不在当前的url中
- 如果在其他响应中,寻找数据的位置
- 从network中依次寻找
- 使用Chrome的过滤条件
- 使用Chrome的search all file,搜索数字或者英文
- 数据提取
- xpath,从HTML中整块的数据,先分组,再依据分组提取
- re,提取price,max_time,或者其他在js中或者html中的json字符串
- json数据
保存
- 保存在本地 text json csv
- 保存在数据库
正则和xpath相关
正则
正则如何进行非贪婪匹配,在div标签中的数据如何提取?
*? 或者 +?
re.findall("<div class="a">.*?<div id="">(.*?)</div>",str)
返回列表,没有匹配到就是空列表
xpath
xpath如何获取文本,如何获取任意标签下的文本
a/text()
只能获取a下的文本a//text()
能够获取a下和a包含的标签文本- `a[text()=’下一页’]
xpath如何获取属性,如何对标签进行定位
a/@href
div[@class='b']
xpath中
//
有什么用//
在最前面的时候,表示在html中任意位置开始选择div\\*放在节点后面的时候,能够选择当前节点下所有的标签
xpath中获取某一个或者某几个
//a[1]
第一个//a[last()]
最后一个//a[position()<=3]
//a[1]|//a[3]
lxml如何使用,如何把lxml处理后的内容转为字符串
from lxml import etree element = etree.HTML(bytes,str) # 把字符串转为element对象 etree.tostring(element) # 把element对象转为字符串 element.xpath("xpath语句") # 用xpath匹配数据