关于使用Scrapy的体会,最明显的感受就是这种模板化、工程化的脚手架体系,可以说是拿来即可开箱便用,大多仅需按一定的规则套路配置,剩下的就是专注于编写跟爬虫业务有关的代码。绝大多数的反反爬虫策略,大多有以下几种:
- 忽略robots.txt协议
- 添加随机请求头,如cookie、user-agent等
- sleep休眠
- 控制并发请求数、设置页面下载延迟
- 验证码识别(靠谱)
- 使用ip代理池(最靠谱)
文章的出发点是share本人使用scrapy爬取Boss和拉勾两个招聘网的一些实操总结经验。两个网站的网页结构不尽相同,好在需要及提取出的最终数据基本保持了一致,出于两个网站不同的反爬策略和请求配置(settings.py
),因此对应实际的情况是两个Scrapy项目。
友情提醒,这里不介绍scrapy示例及完整代码(Tip: 下方贴有完整代码链接)。如文章标题描述的那样,由于拉勾和Boss都有各自不同的反爬策略,多少也限制了一些爬虫学习者的热情,包括我自身在内,不过多番尝试之后还是有收获的,跑的是定时计划,目前已入库的有近三万条数据。
Data
进入正题,下面分别介绍拉勾网以及Boss直聘网岗位招聘数据的爬取心得,不过网站的反爬策略和网页结构随时都有发生变动的可能,因此还是需要根据实际情况进行再调整。本次分享的内容截止到2018年09月28日,在实际运行项目中依然生效。
拉勾
- 关闭默认
cookie
(否则会跟请求头中的Cookie
冲突),自定义请求headers
并添加随机Cookie
属性- 在
settings.py
中找到并设置COOKIES_ENABLED = False
- 可以在spider代码中为
Request
手动添加headers
,或者修改settings.py
中的DEFAULT_REQUEST_HEADERS
属性,或者编写自定义的HeadersMiddleware(继承DefaultHeadersMiddleware
,重写process_request
方法,别忘了配置)
- 在
拉勾网的cookie,用uuid随机生成即可,参考如下:
代码语言:javascript复制 def random_cookie():
args = (uuid.uuid4(),) * 5
cookie = 'user_trace_token={}; LGUID={}; JSESSIONID={}; LGSID={}; LGRID={}'.format(*args)
return cookie
- 控制并发请求数及设置下载延迟
在settings.py
中找到并设置如下,因此理论上一天可抓60/2 * 2 * 60 * 24 =
86400条数据:
# 当并发数和下载延迟均设置为2时,没有出现反爬限制(可多次尝试)
CONCURRENT_REQUESTS = 2
DOWNLOAD_DELAY = 2
补充:上述说明中,请求Cookie是必须要加的,否则会重定向到登录页面;在未使用ip代理的情况下,并发数不宜设置过大,亲测是直接封了IP...
Boss直聘
对比拉勾网,感觉直聘网的反爬策略会更加严格,不过抓慢一点还是可以的(这样理论上一天是60/5 * 1 * 60 * 24 =
17280条数据)
- 设置随机
User-Agent
(可能非必需) - 控制并发请求数、下载延迟
# 这么慢还是被限制...
CONCURRENT_REQUESTS = 1
DOWNLOAD_DELAY = 5
- 加入验证码识别
事实上,这种情况下限制后是被重定向到一个验证码页面。本人目前的解决方案是编写自定义的CustomRedirectMiddleware(继承RedirectMiddleware
,重写process_response
方法进行验证码识别[第三方API])
小结
分享的都是比较曲中的解决方案,不差钱的建议直接上ip代理(实测过免费的,别指望了)。
相关代码 - 拉勾 相关代码 - boss