閱讀目錄html
當咱們試圖重新浪微博抓取數據時,咱們會發現網頁上提示未登陸,沒法查看其餘用戶的信息。python
模擬登陸是定向爬蟲製做中一個必須克服的問題,只有這樣才能爬取到更多的內容。chrome
實現微博登陸的方法有不少,通常咱們在模擬登陸時首選WAP版。瀏覽器
由於PC版網頁源碼中包括不少的js代碼,提交的內容也更多,不適合機器模擬登陸。安全
咱們實現微博登陸的大致思路是這樣的:服務器
原理很簡單,讓咱們一步一步來實現吧。cookie
在電腦和互聯網之間的通訊是經過不一樣的數據包收發來實現的。數據結構
Fiddler能夠從中間對數據進行攔截,拷貝一份數據之後再將數據發送給目的端。(這也是爲何說咖啡館的公共WIFI不安全的緣由)併發
同類的還有WireShark。爲什麼這兒不用WireShark呢?ide
Wireshark太過於專業了,它能夠實現抓取各類包,抓下來的包也很亂,針對性沒Fiddler那麼強。
1.下載地址:http://www.telerik.com/fiddler
2.安裝方法:fiddler依賴.Net環境,若是已經有則無需配置,直接點擊下一步就行。
1.啓動Fiddler
2.配置Fiddler
點擊左上角的「 WinConfig」,找到你使用的瀏覽器並勾選,點擊「Save Changes」
3.使用Fiddler開始抓包
打開瀏覽器訪問WAP版新浪微博網站weibo.cn
Fiddler窗口左側找到weibo.cn /pub/的數據包,並雙擊,這時咱們就可以在右側看到抓取到的信息.
找到Cookies字段,這正是咱們須要的.
維基百科是這樣解釋的:
Cookie(複數形態Cookies),中文名稱爲「小型文本文件」或「小甜餅」,指某些網站爲了辨別用戶身份而儲存在用戶本地終端(Client Side)上的數據(一般通過加密)。
通俗來講就是服務器端爲了確認用戶終端的身份而設定的一種加密標識,它是存儲在本地終端上的。
固然,隨着Cookies技術的發展,Cookies的做用已經不止於用戶身份標識。
當登錄一個網站時,網站每每會請求用戶輸入用戶名和密碼,而且用戶能夠勾選「下次自動登陸」。
若是勾選了,那麼下次訪問同一個網站時,用戶會發現沒輸入用戶名和密碼就已經登陸了。
這正是由於前一次登錄時服務器發送了包含登陸憑據(用戶名+密碼的某種加密形式)的Cookie到用戶的硬盤上。
第二次登陸時,若是該Cookies還沒有到期,瀏覽器會發送該Cookies,服務器驗證憑據,因而沒必要輸入用戶名和密碼就讓用戶登陸了。
下面將介紹使用 Fiddler 獲取新浪微博 Cookies,而後使用 Requests 提交 Cookies 從而實現模擬登陸。
使用Fiddler抓取數據包.
打開新浪微博WAP版頁面(weibo.cn),點擊登陸,而後填寫帳號密碼,勾選「記住登陸狀態」,切記要勾選此項.
登陸成功後,從Fiddler中選擇最新的那個weibo.cn,而後複製Cookies字段的內容,填寫到代碼內.
代碼以下:
#!/usr/bin/env python #coding=utf8 """ Simulate a user login to Sina Weibo with cookie. You can use this method to visit any page that requires login. """ import urllib2 import re # get your cookie from Fiddler11 cookie = 'your-cookie' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:24.0) Gecko/20100101 Firefox/24.0', 'cookie': cookie } def visit(): url = 'http://weibo.com' req = urllib2.Request(url, headers=headers) text = urllib2.urlopen(req).read() # print the title, check if you login to weibo sucessfully pat_title = re.compile('<title>(.+?)</title>') r = pat_title.search(text) if r: print(r.group(1)) if __name__ == '__main__': visit()
因爲使用Cookies登陸存在不少的弊端,通常咱們都使用Post提交數據的方法來實現模擬登陸.
大部分網站登陸時須要攜帶cookie,因此咱們還必須設置cookie處理器來保證cookie.
notice:若是遇到登陸後網站重定向到其餘url這種狀況,咱們可使用chrome的審查元素功能找出重定向後的網站url和該網站的提交數據,再次使用post方法就行.
代碼以下:
#!/usr/bin/python import HTMLParser import urlparse import urllib import urllib2 import cookielib import string import re #登陸的主頁面 hosturl = '******' //本身填寫 #post數據接收和處理的頁面(咱們要向這個頁面發送咱們構造的Post數據) posturl = '******' //從數據包中分析出,處理post請求的url #設置一個cookie處理器,它負責從服務器下載cookie到本地,而且在發送請求時帶上本地的cookie cj = cookielib.LWPCookieJar() cookie_support = urllib2.HTTPCookieProcessor(cj) opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler) urllib2.install_opener(opener) #打開登陸主頁面(他的目的是從頁面下載cookie,這樣咱們在再送post數據時就有cookie了,不然發送不成功) h = urllib2.urlopen(hosturl) #構造header,通常header至少要包含一下兩項。這兩項是從抓到的包裏分析得出的。 headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1', 'Referer' : '******'} #構造Post數據,他也是從抓大的包裏分析得出的。 postData = {'op' : 'dmlogin', 'f' : 'st', 'user' : '******', //你的用戶名 'pass' : '******', //你的密碼 'rmbr' : 'true', //特有數據,不一樣網站可能不一樣 'tmp' : '0.7306424454308195' //特有數據,不一樣網站可能不一樣 } #須要給Post數據編碼 postData = urllib.urlencode(postData) #經過urllib2提供的request方法來向指定Url發送咱們構造的數據,並完成登陸過程 request = urllib2.Request(posturl, postData, headers) print request response = urllib2.urlopen(request) text = response.read() print text