上一篇文章《Scrapy用Cookie實現(xiàn)模擬登錄》完成了用Cookie實現(xiàn)模擬登錄,繞開了用戶名、密碼和驗證碼登錄的步驟。今天來比較一下以常規(guī)驗證(用戶名密碼+驗證碼)的方式實現(xiàn)新浪微博的模擬登錄,看看實現(xiàn)的過程中有哪些要注意的點。
一、分析登錄URL和表單字段
為了更好分析登錄驗證過程,找到登錄提交的URL和表單字段,選取了新浪微博手機(jī)版的頁面進(jìn)行追蹤分析,采用的工具是chrome開發(fā)者工具Network功能。

1、查看源代碼,了解基本表單字段
通過查看登錄頁源代碼,了解登錄的url,用戶名字段mobile, 密碼字段password_9771(是password加上一個隨機(jī)數(shù)),還有一些隱藏字段vk, capId,以及驗證碼。
2、Network追蹤登錄過程
1)登錄的完整表單字段:

- 這些字段名和值需要先從登錄頁面抓取:
- 密碼字段名不是一個固定的值,password+隨機(jī)數(shù)
- vk, capId是隱藏字段,登錄時必須
- code 是驗證碼
2)登錄的全過程:
新浪微博的登錄過程,第一步是提交用戶名密碼及其他參數(shù),POST方法,后面經(jīng)過4次重定向,完成登錄。

重定向都是通過location發(fā)送,get方法。理論上登錄流程,重定向的過程不需要我們關(guān)心,但是Scrapy在發(fā)送登錄請求時,會遇到種種問題,需要調(diào)試時,了解整個過程就很關(guān)鍵。
二、抓取登錄表單及參數(shù)
1、先發(fā)送一個登錄url請求:start_requests()方法
def start_requests(self):
return [Request("http://login.weibo.cn/login/", meta={'cookiejar': 1}, callback=self.pre_login)]
2、抓取登錄的表單字段:pre_login()方法
def pre_login(self,response):
selector = Selector(response)
pwdname =selector.xpath('//input[@type="password"]/@name').extract()[0]
vk = selector.xpath('//input[@name="vk"]/@value').extract()[0]
imgsrc = selector.xpath('/html/body/div[2]/form/div/img[1]/@src').extract()[0]
index = imgsrc.find('cpt=')
capId = imgsrc[index+4:]
action = selector.xpath('/html/body/div[2]/form/@action').extract()[0]
action = 'http://login.weibo.cn/login/'+action
# ... ... next, 完成驗證碼驗證,構(gòu)造表單參數(shù)...
三、完成驗證碼的驗證
在這里,我沒有采用復(fù)雜的圖片驗證算法庫,而是直接在控制臺上把驗證碼的URL輸出來,訪問一下,手工填入的方式,codeimg = raw_input('please input image:'), 簡單粗暴、快速準(zhǔn)確。

四、構(gòu)造表單參數(shù),提交登錄請求
data = {'mobile':'name@126.com', #你的微博帳號
pwdname: '123456789', #你的密碼
'code': codeimg, #獲取的驗證碼
'remember':'',
'backURL':'http://weibo.cn/u/2508944032', #登錄后要訪問url
'backTitle':u'手機(jī)新浪網(wǎng)',
'tryCount':'',
'vk':vk, #隱藏字段
'capId':capId, #隱藏字段
'submit':u'登錄'}
yield FormRequest(url=action,meta={'cookiejar': response.meta['cookiejar']},headers=self.headers,formdata=data,callback=self.parse_item)
注意這里使用了FormRequest直接提交登錄url和表單參數(shù),而不是用FormRequest.from_response(),因為請求的登錄url不一樣。Scrapy官網(wǎng)《FormRequest.from_response()方法模擬用戶登錄》
OK,使用Scrapy完成新浪微博驗證登錄。在實現(xiàn)的過程也遇到不少問題,查看錯誤提示,不斷調(diào)試。
可能是因為新浪微博登錄參數(shù)和流程的更改,大家可以對比一下網(wǎng)絡(luò)上的代碼以及Scrapy官網(wǎng)上的說明。
下一步就是數(shù)據(jù)提取、保存。之前文章都有講過。
