scrapy爬取某網站,模擬登錄過程當中遇到的那些坑

    拿到一個網站以後就是先分析網站,分析以後發現須要的數據要登錄才能看到.這個可難不倒我,不就是模擬登錄嗎,小菜一碟.
    用chrome分析一下,看到有用戶名,密碼,還有其餘兩個校驗值.另外還有一個重定向的callback值.以下:python

<input type="hidden" name="callback" id="callback" value="此處是重定向的連接">

接下來就登錄,觀察post請求的狀況.由於有上面的那行代碼,因此跳轉太快,沒看到post請求狀況,刪掉上面那行代碼,而後請求,此次看到了表單發送信息.chrome

接下來就是寫代碼,模擬登錄.很快就寫好代碼了,而後開始測試.(還記的上面說過的哪兩個校驗值嗎? 這兩個值都是動態的,能夠用正則從登錄頁面提取到).cookie

部分代碼以下:dom

name = "form"
download_delay = 0.18
allowed_domains = ["http://www.xxxxxx.com"]
headers = {
        "Accept":"*/*",
        "Accept-Encoding":"gzip, deflate, sdch",
        "Accept-Language":"zh-CN,zh;q=0.8",
        "Cache-Control":"max-age=0",
        "Connection":"keep-alive",
        "Host": "www.xxxxxx.com",
        "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
    }
def start_requests(self):

        return [scrapy.Request("http://www.xxxxxxx.com/user/login",meta={'cookiejar':1},headers=self.headers, callback=self.post_login)]

    def post_login(self, response):
        # 下面這句話用於抓取請求網頁後返回網頁中的_xsrf字段的文字, 用於成功提交表單
        protected_code = Selector(response).xpath('//label[@class="rem"]/input[@name="protected_code"]/@value').extract()[0]
        matchObj=re.search(r'\"csrftk\":\"(.*)\",\"img_path\"',response.text)
        csrf_tk=matchObj.group(1)
        logging.log(logging.WARNING, u"正則獲取的值----"+csrf_tk)
        # FormRequeset.from_response是Scrapy提供的一個函數, 用於post表單
        # 登錄成功後, 會調用after_login回調函數
        return [scrapy.FormRequest.from_response(response,method="POST",
                                          headers=self.headers,  # 注意此處的headers
                                          formdata={
                                              'protected_code': protected_code,
                                              'email': 'xxxxxx@qq.com',
                                              'csrf_tk': csrf_tk,
                                              'password': 'xxxxxxxxxx',

                                              'remember': 'true',
                                          },
                                          meta={'cookiejar': response.meta['cookiejar']},
                                          callback=self.after_login,
                                          dont_filter=True
                                          )]

而後設置COOKIES_ENABLED = True和COOKIES_DEBUG=True進行測試.結果發現不成功.查看日誌,發現cookie仍是登錄以前的狀態,登錄的那邊被302定向了.(如今想來,應該是scrapy重定向的時候,帶的仍是登錄前的cookie,因此之後的狀態仍是登陸前的).scrapy

既然如此,那就試試關閉重定向,REDIRECT_ENABLED = False,然測試一下,發現爬蟲直接退出了.根據報錯信息上網找答案,HTTPERROR_ALLOWED_CODES = 302, 而後在跑一遍,完美解決.拿到了想要的數據.到這個時候已經花了好幾個小時了.中間走了好多彎路.函數

總結:遇到錯誤要認真分析錯誤信息,多嘗試.頭腦要清晰,有耐心.技術上的,對scrapy理解的仍是不足,對cookies和重定向的理解不到位.理解了運行原理,解決問題就簡單多了.post

REDIRECT_ENABLED = False 關掉重定向,不會重定向到新的地址
HTTPERROR_ALLOWED_CODES = [302,] 返回302時,按正常返回對待,能夠正常寫入cookie

順便談一下,python在解決實際問題的時候仍是很實用的,能夠快速上手,並且有很豐富的開源庫.建議有時間能夠去學一下測試

相關文章
相關標籤/搜索