在爬數據的時候,登錄一直是一個比較麻煩的問題。我也一直在網上找過各種資料,都挺麻煩的,因為需要分析各種http過程,感覺太麻煩了。
不過最近在一個同學的幫助下,找到了使用cookie登錄的方法。因為帶cookie登錄的話,server會認為你是一個已登錄的用戶,所以就會返回給你一個已登錄的內容
本文介紹的方法,是使用python的scrapy框架登錄的方法。而且也只能登錄一些比較簡單的網站,對於那種大型的網站,因為目前我也還沒有驗證過,所以不敢保證。但是經過驗證,登錄豆瓣是萬試萬靈的。
1. 獲取cookie
這個是整個任務的關鍵所在。只有獲得了cookie才能進行下一步的編碼工作。cookie獲取的大致過程是自己先手動登錄一次你想要的網站,然后記錄想登錄過程中的cookie就可以了。而想要獲取這個cookie,也有兩種方法。
1.1 chrome方法——簡單粗暴

進入豆瓣首頁后,F12-Network,就可以看到如上的截圖。在這個截圖中我們可以看到待會登錄過程中各種http的請求的詳細信息。注意右下角的紅色按鈕是紅色的,紅色表示正在記錄,如果不是紅色的話。。。就把它按一下保證是紅色的就可以了。
在登錄框中輸入用戶名和密碼后就會看到下面的Network中出現了一大排的內容,如下圖所示:

上圖是登錄成功后的截圖,我們可以看到原本Network中的內容是空的,現在已經出現了很多了。為了防止不斷出現內容干擾我們的分析,(其實不會干擾,但還是)將剛才的紅色按鈕關閉,也就是不再記錄http消息,如上圖中的灰色按鈕。
然后這個時候我們就可以好好分析一下,在Network下的Name列中,從哪一項中我們才可以找到cookie了。
我們可以看到(如果出現了很多的話,就把滾動條拉到最上面可以看到)前面幾行,除了第二行的“www.douban.com”是text/html類型的,其他的都是些網頁的輔助內容,如css和圖片。這樣呢,我們可以想着說,cookie有可能是在這個html類型的項中,所以我們把“www.douban.com”點擊一下,可以得到如下的圖片:
咦?我們在Headers中的Request Headers中找到了cookie誒?現在先假設它能用吧,我們要找的就是他了。那么我們就可以進入到第2步寫代碼了。
1.2 chrome獲取cookie的方法簡單粗暴,但是還有另外一種方法也是可以的,不過必須要firefox瀏覽器,叫做firebug的一個插件工具。這個需要大家自己裝一下,挺簡單的。

打開以后會出現如上所示的樣子,現在還什么都沒有。如果想要抓取http通信或者cookie的話,需要要左上角的“start”打開,表示需要firebug進行記錄通信內容了。
這時就可以開始登陸了,登陸后相應的會出現很多firebug截取的內容,如下圖:

這時我們可以看到,在最上面的一欄中,出現了firebug截取到通信內容,和我們在chrome中看到的內容似乎是一樣的。所以我們還是選擇“http://www.douban.com”這一項。然后下面一欄中Headers, Cookies之類的就會出現相應的內容。我們要找的內容當然在cookies中,就如上圖所示的樣子。
我們可以看到,在firebug中獲取的cookies的內容,似乎比chrome中獲取的內容要少得多。但是沒關系,chrome中的內容冗余比較多,只需要firebug中截取的cookies的內容就夠了。
然后我們就開始進入到編碼階段了。
2. 編碼
# -*- coding:UTF-8 -*- import re import json import codecs from scrapy.spider import Spider from scrapy.selector import Selector from scrapy.http import Request from scrapy import log from douban.items import DoubanItem import sys default_encoding = 'utf-8' reload(sys) sys.setdefaultencoding(default_encoding) class SanzhaSpider(Spider): name = "douban" allowed_domains = ["http://www.douban.com"] def start_requests(self): yield Request(response.url,cookies={'viewed':'"1083428"', '__utmv':'30149280.3975'}, callback=self.parse_with_cookie) def parse_with_cookie(self, response): file = codecs.open('page.html', 'w', encoding='utf-8') file.write(response.body) file.close()
插入代碼的內容就如上所示,最重要的方法就是重寫的“start_requests”方法。這個方法就不在這里詳細講了,大家可以去官網看。只解釋下Request方法的3個參數
url #要帶cookie訪問的網頁的url cookies #這是我們前面討論了很久才獲取的cookie的鍵值對的內容,需要按照一定的格式描述 callback #當我們提交了這個request請求並獲得了相應的response后,我們應該用什么方法去處理返回的response,處理的方法就是callback中給出的方法
好了,按照這種方法,大家就可以順利的登錄豆瓣了。
補充:
1. 當我們抓取登錄時http通訊內容時,有那么多的項都會有cookie的內容,為什么我們唯獨選擇“http://www.douban.com”這一項中的cookie內容呢?
其實這個問題我也沒有太明白,如果對於比較復雜的網站,如淘寶新浪之類的,應該沒有這么簡單。需要后續的深入研究才能解答這個問題。
2. 那應該如何選擇正確的cookie內容呢?
額,,,試一試就好了,反正我試過其他的cookie內容,並不能成功。
3. 豆瓣登錄有時候可能需要驗證碼,這個是沒關系的,你獲取帶驗證碼登錄的cookie就沒問題了。
Bon Appetite!
