关于解决爬取拉勾全网遇到的302重定向问题的一些记录

问题背景

没想到,拉勾再次进行了一番反爬策略的更新,不再是针对爬取频率、user-agent锁定等方案去反爬了,爬取的难度也增加了一些。

今天发现,如果单纯地使用scrapy的crawlspider去做全网爬取,会出现如下问题:
在这里插入图片描述
就是重定向到登录页面,增加了登录验证才能进行内容访问的逻辑,但接下来却发现并没有这么简单。

问题分析

分析一:
如果单纯只是需要登录才能爬取,那么只需要用selenium去模拟登陆就好了,但是事实证明,登陆进去之后,依然会报302,那到底是登录逻辑有问题还是访问本身有某些限制?

分析二:
通过用“分析一”中的试验,可以确定,首页登录是必须的,但是深度爬取却不仅仅需要登录验证这么简单,那么肯定是需要请求中携带一些特征才能被“拉勾”接收,到底是什么东西呢?

解决问题

为了搞清楚,到底登录后去访问各个模块和爬虫自己爬取有什么区别,我用chrome的调试窗口不断点击各个标签的同时,留意着header的变化。。。

发现,如果要正经地对拉勾发起请求,必须要带上登录时就分配好的cookie,通过用PostMan试验,得到了这个结论:

这里所谓的携带cookie,不是登录时才携带,而是对拉勾每次的请求都必须携带,点击每一个页面都需要携带

那么问题就好办了,如何把cookie放到每一次默认的header中呢?

从crawlspider源码发现,它继承的还是spider,那么就好办了,在重写start_requests方法前,就设置好header,并且不再从Request中改变它,具体实现:

class LagouSpider(CrawlSpider):
    name = 'lagou'
    allowed_domains = ['www.lagou.com']
    start_urls = ['http://www.lagou.com/']



    cookie_list = "BAIDUID=49CD7FFD2795459E5636D68C031B954A:FG=1;BDORZ=B490B5EBF6F3CD402E515D22BCDA1598;BIDUPSID=49CD7FFD2795459E5636D68C031B954A;HMACCOUNT=74B79914C73B8BB4;HMVT=6bcd52f51e9b3dce32bec4a3997715ac|1542536300|;H_PS_PSSID=1464_21089_26350;Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1542536602;Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1542528328,1542531922;JSESSIONID=ABAAABAAAGFABEF8CAD2AB2C87A80463EDFBEFE83F99314;LGRID=20181118182321-f9106e94-eb1b-11e8-8955-5254005c3644;LGSID=20181118182258-ebc43aeb-eb1b-11e8-a642-525400f775ce;LGUID=20181118160527-b5880c53-eb08-11e8-a631-525400f775ce;LG_LOGIN_USER_ID=e9648477163e6d25128836cde213a8348f196851cc08f5b48dae8f3ba92ce173;PSINO=6;PSTM=1542536505;TG-TRACK-CODE=index_user;X_HTTP_TOKEN=9a090316d567b03a792f6a0bd9c27711;_ga=GA1.2.910298970.1542528328;_gid=GA1.2.138938673.1542528328;_putrc=920F2336999B0934123F89F2B170EADC;delPer=0;gate_login_token=48191040edb4aafbb49d06fe8453642fb39167bf9c61f0ee1ab41ee15ba58cc0;hasDeliver=12;index_location_city=%E5%B9%BF%E5%B7%9E;login=true;sajssdk_2015_cross_new_user=1;sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2216725dab2a41f4-03e196f0ddfc75-e313761-1631252-16725dab2a6637%22%2C%22%24device_id%22%3A%2216725dab2a41f4-03e196f0ddfc75-e313761-1631252-16725dab2a6637%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_referrer_host%22%3A%22%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%7D%7D;showExpriedCompanyHome=1;showExpriedIndex=1;showExpriedMyPublish=1;unick=%E6%9D%8E%E9%93%AD%E8%BE%89;user_trace_token=20181118160527-b5880957-eb08-11e8-a631-525400f775ce"
    custom_settings = {
           "COOKIES_ENABLED": False,
           "DOWNLOAD_DELAY": 1,
           'DEFAULT_REQUEST_HEADERS': {
               'Accept': 'application/json, text/javascript, */*; q=0.01',
               'Accept-Encoding': 'gzip, deflate, br',
               'Accept-Language': 'zh-CN,zh;q=0.8',
               'Connection': 'keep-alive',
               'Cookie': cookie_list,
               'Host': 'www.lagou.com',
               'Origin': 'https://www.lagou.com',
               'Referer': 'https://www.lagou.com/',
               'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
   }
}

没错,cookie非常长,怎么获取的?打开浏览器调试工具,自己登陆一遍拉勾,然后在调试工具里就找到了,把所有的namevalue都用“=”号连接,然后放到custom_settings的Cookie中,接下来该写start_request的就继续写,该写prase_item的也不用改变,但是请不要随意在Request中改变header。

猜你喜欢

转载自blog.csdn.net/weixin_42833042/article/details/84206764