爬虫进阶:Scrapy抓取boss直聘、拉勾心得经验

2018-10-11 11:28:27 浏览数 (1)

关于使用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条数据:

代码语言:javascript复制
    # 当并发数和下载延迟均设置为2时,没有出现反爬限制(可多次尝试)
    CONCURRENT_REQUESTS = 2
    DOWNLOAD_DELAY = 2

补充:上述说明中,请求Cookie是必须要加的,否则会重定向到登录页面;在未使用ip代理的情况下,并发数不宜设置过大,亲测是直接封了IP...

Boss直聘

对比拉勾网,感觉直聘网的反爬策略会更加严格,不过抓慢一点还是可以的(这样理论上一天是60/5 * 1 * 60 * 24 =17280条数据)

  • 设置随机User-Agent(可能非必需)
  • 控制并发请求数、下载延迟
代码语言:javascript复制
    # 这么慢还是被限制...
    CONCURRENT_REQUESTS = 1
    DOWNLOAD_DELAY = 5
  • 加入验证码识别

事实上,这种情况下限制后是被重定向到一个验证码页面。本人目前的解决方案是编写自定义的CustomRedirectMiddleware(继承RedirectMiddleware,重写process_response方法进行验证码识别[第三方API])

小结

分享的都是比较曲中的解决方案,不差钱的建议直接上ip代理(实测过免费的,别指望了)。

相关代码 - 拉勾 相关代码 - boss

0 人点赞