登錄一個沒有驗證碼的網站是很簡單的,只需要找到登錄的地址,再post它所需要的包即可。
首先就要抓取發送的包。我這裏用的是firefox的httpfox插件。
如圖就是我在研究刷評論的時候的截圖,post方法後面的就是登錄網址,而下面窗口的post data就是我們要發送的包。
首先我們需要找到一個正確的登錄網址。彈出的窗口是js做的,不好抓取,要是那種用html語言生成的頁面,通常都是login結尾的。比如豆瓣就是:
https://www.douban.com/accounts/login
然後查看抓取的包如下:(會有很多包,主要查看的是post以及post前的get)
post包的內容就如上所示了。source爲None,redir是登錄後去往的地址,form_email就是登錄地址了,下面還有密碼,以及login字段等等。這裏需要注意的是,postdata是個字典,不僅僅要保持value一樣,還要保持key一致。每個網站的登錄名和密碼的key並不都是一致的,login字段如果是亂碼,就是中文的‘登錄’。
只要把上述字段弄成一個字典,post到登錄網址上,就完成了登錄過程。因爲目前不想用cookies,因此最好redir的value是你想登錄的網址,這樣一登錄就抓下來了目標地址。
比如我登錄豆瓣的地址就是:
self.pwd = {
'form_email':self.login,
'form_password':self.password,
'source':None,
'redir':self.group_url,
'remember':'on',
'login':'登錄',
}
用戶名密碼地址自己填上就可以了。打開網頁最常用的就是urllib2中的open方法,最近偷懶,用requests,很方便,很好用。
首先模擬登錄網站,先get一下,表示自己點擊了網站。(如果post中有可變內容,通常也是在這一步得到,我會在下一篇文章中詳細說明)。
self.jar = cookielib.CookieJar()
self.request = requests.get(self.url, cookies=self.jar)
這裏生成了一個空的cookie。豆瓣沒有動態驗證(偶爾會有驗證碼),然後我們就可以登錄了。
self.request = requests.post(self.url, headers=self.header, cookies=self.request.cookies, data=self.pwd)
這裏我簡單的僞裝了一個header,具體說明看前面的文章。這裏的self.request就是redir網址的那個對象,就可以繼續分析了。分析方法我前一篇文章也說過了。
有時候會遇到動態驗證的網站,其實原理也很簡單,我會在下一篇文章中說明。
源代碼:https://github.com/gt11799/login_website
——————————————————————
github主頁:https://github.com/gt11799
E-mail:[email protected]