1. 程式人生 > >關於解決爬取拉勾全網遇到的302重定向問題的一些記錄

關於解決爬取拉勾全網遇到的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。