當我們試圖從新浪微博抓取數據時,我們會發現網頁上提示未登錄,無法查看其他用戶的信息。模擬登錄是定向爬蟲制作中一個必須克服的問題,只有這樣才能爬取到更多的內容。
實現微博登錄的方法有很多,一般我們在模擬登錄時首選WAP版。
因為PC版網頁源碼中包括很多的js代碼,提交的內容也更多,不適合機器模擬登錄。
我們實現微博登錄的大體思路是這樣的:
用抓包工具把正常登錄時要提交的字段都記錄下來;
模擬提交這些字段;
判斷是否登錄成功;
原理很簡單,讓我們一步一步來實現吧。
一.抓包利器Fiddler
在電腦和互聯網之間的通信是通過不同的數據包收發來實現的。
Fiddler可以從中間對數據進行攔截,拷貝一份數據以后再將數據發送給目的端。(這也是為什么說咖啡館的公共WIFI不安全的原因)
同類的還有WireShark。為何這兒不用WireShark呢?
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與保持登錄
關于Cookies
維基百科是這樣解釋的:
Cookie(復數形態Cookies),中文名稱為“小型文本文件”或“小甜餅”,指某些網站為了辨別用戶身份而儲存在用戶本地終端(Client Side)上的數據(通常經過加密)。
通俗來說就是服務器端為了確認用戶終端的身份而設定的一種加密標識,它是存儲在本地終端上的。
當然,隨著Cookies技術的發展,Cookies的作用已經不止于用戶身份標識。
當登陸一個網站時,網站往往會請求用戶輸入用戶名和密碼,并且用戶可以勾選“下次自動登錄”。
如果勾選了,那么下次訪問同一個網站時,用戶會發現沒輸入用戶名和密碼就已經登錄了。
這正是因為前一次登陸時服務器發送了包含登錄憑據(用戶名+密碼的某種加密形式)的Cookie到用戶的硬盤上。
第二次登錄時,如果該Cookies尚未到期,瀏覽器會發送該Cookies,服務器驗證憑據,于是不必輸入用戶名和密碼就讓用戶登錄了。
三.Cookies模擬登錄
下面將介紹使用 Fiddler 獲取新浪微博 Cookies,然后使用 Requests 提交 Cookies 從而實現模擬登錄。
抓取登錄數據包
使用Fiddler抓取數據包.
獲取Cookies
打開新浪微博WAP版頁面(weibo.cn),點擊登錄,然后填寫賬號密碼,勾選“記住登錄狀態”,切記要勾選此項.
登錄成功后,從Fiddler中選擇最新的那個weibo.cn,然后復制Cookies字段的內容,填寫到代碼內.
代碼如下:
#!/usr/bin/env python
#coding=utf8
'''
在學習過程中有什么不懂得可以加我的python學習交流扣扣qun,934109170
群里有不錯的學習教程、開發工具與電子書籍。
與你分享python企業當下人才需求及怎么從零基礎學習好python,和學習什么內容。
'''
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('
')
r = pat_title.search(text)
if r:
print(r.group(1))
if __name__ == '__main__':
visit()
四.使用 Post 提交數據的方法實現模擬登錄
由于使用Cookies登錄存在很多的弊端,一般我們都使用Post提交數據的方法來實現模擬登錄.
通過Fiddler來抓取http數據包來分析該網站的登錄流程;
分析抓到的post包的數據結構和header,要根據提交的數據結構和heander來構造自己的post數據和header;
構造自己的HTTP數據包,并發送給指定url;
通過urllib2等幾個模塊提供的API來實現request請求的發送和相應的接收;
?大部分網站登錄時需要攜帶cookie,所以我們還必須設置cookie處理器來保證cookie.
notice:如果遇到登錄后網站重定向到其他url這種情況,我們可以使用chrome的審查元素功能找出重定向后的網站url和該網站的提交數據,再次使用post方法就行.
?代碼如下:
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
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
