上一篇文章《Scrapy用Cookie實(shí)現(xiàn)模擬登錄》完成了用Cookie實(shí)現(xiàn)模擬登錄,繞開了用戶名搂妻、密碼和驗(yàn)證碼登錄的步驟砸烦。今天來比較一下以常規(guī)驗(yàn)證(用戶名密碼+驗(yàn)證碼)的方式實(shí)現(xiàn)新浪微博的模擬登錄,看看實(shí)現(xiàn)的過程中有哪些要注意的點(diǎn)。
一炼蛤、分析登錄URL和表單字段
為了更好分析登錄驗(yàn)證過程,找到登錄提交的URL和表單字段,選取了新浪微博手機(jī)版的頁(yè)面進(jìn)行追蹤分析恩静,采用的工具是chrome開發(fā)者工具Network功能。
1蹲坷、查看源代碼驶乾,了解基本表單字段
通過查看登錄頁(yè)源代碼,了解登錄的url循签,用戶名字段mobile, 密碼字段password_9771(是password加上一個(gè)隨機(jī)數(shù))级乐,還有一些隱藏字段vk, capId,以及驗(yàn)證碼县匠。
2风科、Network追蹤登錄過程
1)登錄的完整表單字段:
- 這些字段名和值需要先從登錄頁(yè)面抓热雎帧:
- 密碼字段名不是一個(gè)固定的值,password+隨機(jī)數(shù)
- vk, capId是隱藏字段贼穆,登錄時(shí)必須
- code 是驗(yàn)證碼
2)登錄的全過程:
新浪微博的登錄過程题山,第一步是提交用戶名密碼及其他參數(shù),POST方法故痊,后面經(jīng)過4次重定向顶瞳,完成登錄。
重定向都是通過location發(fā)送愕秫,get方法慨菱。理論上登錄流程,重定向的過程不需要我們關(guān)心戴甩,但是Scrapy在發(fā)送登錄請(qǐng)求時(shí)符喝,會(huì)遇到種種問題,需要調(diào)試時(shí)甜孤,了解整個(gè)過程就很關(guān)鍵协饲。
二、抓取登錄表單及參數(shù)
1课蔬、先發(fā)送一個(gè)登錄url請(qǐng)求: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, 完成驗(yàn)證碼驗(yàn)證,構(gòu)造表單參數(shù)...
三二跋、完成驗(yàn)證碼的驗(yàn)證
在這里战惊,我沒有采用復(fù)雜的圖片驗(yàn)證算法庫(kù),而是直接在控制臺(tái)上把驗(yàn)證碼的URL輸出來扎即,訪問一下吞获,手工填入的方式,codeimg = raw_input('please input image:')
, 簡(jiǎn)單粗暴谚鄙、快速準(zhǔn)確各拷。
四、構(gòu)造表單參數(shù)闷营,提交登錄請(qǐng)求
data = {'mobile':'name@126.com', #你的微博帳號(hào)
pwdname: '123456789', #你的密碼
'code': codeimg, #獲取的驗(yàn)證碼
'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(),因?yàn)檎?qǐng)求的登錄url不一樣傻盟。Scrapy官網(wǎng)《FormRequest.from_response()方法模擬用戶登錄》
OK速蕊,使用Scrapy完成新浪微博驗(yàn)證登錄。在實(shí)現(xiàn)的過程也遇到不少問題娘赴,查看錯(cuò)誤提示规哲,不斷調(diào)試。
可能是因?yàn)樾吕宋⒉┑卿泤?shù)和流程的更改诽表,大家可以對(duì)比一下網(wǎng)絡(luò)上的代碼以及Scrapy官網(wǎng)上的說明唉锌。
下一步就是數(shù)據(jù)提取隅肥、保存。之前文章都有講過袄简。