摘要:當我們試圖從新浪微博抓取數(shù)據(jù)時,我們會發(fā)現(xiàn)網(wǎng)頁上提示未登錄,無法查看其他用戶的信息。三模擬登錄下面將介紹使用獲取新浪微博,然后使用提交從而實現(xiàn)模擬登錄。
當我們試圖從新浪微博抓取數(shù)據(jù)時,我們會發(fā)現(xiàn)網(wǎng)頁上提示未登錄,無法查看其他用戶的信息。模擬登錄是定向爬蟲制作中一個必須克服的問題,只有這樣才能爬取到更多的內(nèi)容。
實現(xiàn)微博登錄的方法有很多,一般我們在模擬登錄時首選WAP版。
因為PC版網(wǎng)頁源碼中包括很多的js代碼,提交的內(nèi)容也更多,不適合機器模擬登錄。
我們實現(xiàn)微博登錄的大體思路是這樣的:
用抓包工具把正常登錄時要提交的字段都記錄下來;
模擬提交這些字段;
判斷是否登錄成功;
原理很簡單,讓我們一步一步來實現(xiàn)吧。
一.抓包利器Fiddler
在電腦和互聯(lián)網(wǎng)之間的通信是通過不同的數(shù)據(jù)包收發(fā)來實現(xiàn)的。
Fiddler可以從中間對數(shù)據(jù)進行攔截,拷貝一份數(shù)據(jù)以后再將數(shù)據(jù)發(fā)送給目的端。(這也是為什么說咖啡館的公共WIFI不安全的原因)
同類的還有WireShark。為何這兒不用WireShark呢?
Wireshark太過于專業(yè)了,它可以實現(xiàn)抓取各種包,抓下來的包也很亂,針對性沒Fiddler那么強。
下載安裝
1.下載地址:http://www.telerik.com/fiddler
2.安裝方法:fiddler依賴.Net環(huán)境,如果已經(jīng)有則無需配置,直接點擊下一步就行。
使用方法
1.啟動Fiddler
2.配置Fiddler
點擊左上角的“ WinConfig”,找到你使用的瀏覽器并勾選,點擊“Save Changes”
3.使用Fiddler開始抓包
打開瀏覽器訪問WAP版新浪微博網(wǎng)站weibo.cn
Fiddler窗口左側(cè)找到weibo.cn /pub/的數(shù)據(jù)包,并雙擊,這時我們就能夠在右側(cè)看到抓取到的信息.
找到Cookies字段,這正是我們需要的.
二.Cookies與保持登錄
關于Cookies
維基百科是這樣解釋的:
Cookie(復數(shù)形態(tài)Cookies),中文名稱為“小型文本文件”或“小甜餅”,指某些網(wǎng)站為了辨別用戶身份而儲存在用戶本地終端(Client Side)上的數(shù)據(jù)(通常經(jīng)過加密)。
通俗來說就是服務器端為了確認用戶終端的身份而設定的一種加密標識,它是存儲在本地終端上的。
當然,隨著Cookies技術的發(fā)展,Cookies的作用已經(jīng)不止于用戶身份標識。
當?shù)顷懸粋€網(wǎng)站時,網(wǎng)站往往會請求用戶輸入用戶名和密碼,并且用戶可以勾選“下次自動登錄”。
如果勾選了,那么下次訪問同一個網(wǎng)站時,用戶會發(fā)現(xiàn)沒輸入用戶名和密碼就已經(jīng)登錄了。
這正是因為前一次登陸時服務器發(fā)送了包含登錄憑據(jù)(用戶名+密碼的某種加密形式)的Cookie到用戶的硬盤上。
第二次登錄時,如果該Cookies尚未到期,瀏覽器會發(fā)送該Cookies,服務器驗證憑據(jù),于是不必輸入用戶名和密碼就讓用戶登錄了。
三.Cookies模擬登錄
下面將介紹使用 Fiddler 獲取新浪微博 Cookies,然后使用 Requests 提交 Cookies 從而實現(xiàn)模擬登錄。
抓取登錄數(shù)據(jù)包
使用Fiddler抓取數(shù)據(jù)包.
獲取Cookies
打開新浪微博WAP版頁面(weibo.cn),點擊登錄,然后填寫賬號密碼,勾選“記住登錄狀態(tài)”,切記要勾選此項.
登錄成功后,從Fiddler中選擇最新的那個weibo.cn,然后復制Cookies字段的內(nèi)容,填寫到代碼內(nèi).
代碼如下:
#!/usr/bin/env python #coding=utf8 """ 在學習過程中有什么不懂得可以加我的python學習交流扣扣qun,934109170 群里有不錯的學習教程、開發(fā)工具與電子書籍。 與你分享python企業(yè)當下人才需求及怎么從零基礎學習好python,和學習什么內(nèi)容。 """ 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 提交數(shù)據(jù)的方法實現(xiàn)模擬登錄
由于使用Cookies登錄存在很多的弊端,一般我們都使用Post提交數(shù)據(jù)的方法來實現(xiàn)模擬登錄.
通過Fiddler來抓取http數(shù)據(jù)包來分析該網(wǎng)站的登錄流程;
分析抓到的post包的數(shù)據(jù)結(jié)構和header,要根據(jù)提交的數(shù)據(jù)結(jié)構和heander來構造自己的post數(shù)據(jù)和header;
構造自己的HTTP數(shù)據(jù)包,并發(fā)送給指定url;
通過urllib2等幾個模塊提供的API來實現(xiàn)request請求的發(fā)送和相應的接收;
?大部分網(wǎng)站登錄時需要攜帶cookie,所以我們還必須設置cookie處理器來保證cookie.
notice:如果遇到登錄后網(wǎng)站重定向到其他url這種情況,我們可以使用chrome的審查元素功能找出重定向后的網(wǎng)站url和該網(wǎng)站的提交數(shù)據(jù),再次使用post方法就行.
?代碼如下:
import HTMLParser import urlparse import urllib import urllib2 import cookielib import string import re #登錄的主頁面 hosturl = "******" //自己填寫 #post數(shù)據(jù)接收和處理的頁面(我們要向這個頁面發(fā)送我們構造的Post數(shù)據(jù)) posturl = "******" //從數(shù)據(jù)包中分析出,處理post請求的url #設置一個cookie處理器,它負責從服務器下載cookie到本地,并且在發(fā)送請求時帶上本地的cookie cj = cookielib.LWPCookieJar() cookie_support = urllib2.HTTPCookieProcessor(cj) opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler) urllib2.install_opener(opener) #打開登錄主頁面(他的目的是從頁面下載cookie,這樣我們在再送post數(shù)據(jù)時就有cookie了,否則發(fā)送不成功) 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數(shù)據(jù),他也是從抓大的包里分析得出的。 postData = {"op" : "dmlogin", "f" : "st", "user" : "******", //你的用戶名 "pass" : "******", //你的密碼 "rmbr" : "true", //特有數(shù)據(jù),不同網(wǎng)站可能不同 "tmp" : "0.7306424454308195" //特有數(shù)據(jù),不同網(wǎng)站可能不同 } #需要給Post數(shù)據(jù)編碼 postData = urllib.urlencode(postData) #通過urllib2提供的request方法來向指定Url發(fā)送我們構造的數(shù)據(jù),并完成登錄過程 request = urllib2.Request(posturl, postData, headers) print request response = urllib2.urlopen(request) text = response.read() print text
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/45162.html
摘要:本人長期出售超大量微博數(shù)據(jù)旅游網(wǎng)站評論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務,。如果用戶傳入偽造的,則新浪微博會返回一個錯誤。 PS:(本人長期出售超大量微博數(shù)據(jù)、旅游網(wǎng)站評論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務,Message to YuboonaZhang@Yahoo.com。由于微博接口更新后限制增大,這個代碼已經(jīng)不能用來爬數(shù)據(jù)了。如果只是為了收集數(shù)據(jù)可以咨詢我的郵箱,如果是為了學習爬蟲,...
摘要:本人長期出售超大量微博數(shù)據(jù)旅游網(wǎng)站評論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務,。如果用戶傳入偽造的,則新浪微博會返回一個錯誤。 PS:(本人長期出售超大量微博數(shù)據(jù)、旅游網(wǎng)站評論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務,Message to YuboonaZhang@Yahoo.com。由于微博接口更新后限制增大,這個代碼已經(jīng)不能用來爬數(shù)據(jù)了。如果只是為了收集數(shù)據(jù)可以咨詢我的郵箱,如果是為了學習爬蟲,...
摘要:可能有的老手覺得我寫得很啰嗦,但其實很多新手可能都不知道這些細節(jié),所以我把我在分析新浪微博模擬登陸的過程全寫了出來。 這篇文章于去年4月發(fā)布在我的簡書,現(xiàn)在把它放到這里,主要是為了宣傳自己的分布式微博爬蟲。下面是主要內(nèi)容,希望能幫到有這個需求的朋友 最近由于需要一直在研究微博的爬蟲,第一步便是模擬登陸,從開始摸索到走通模擬登陸這條路其實還是挺艱難的,需要一定的經(jīng)驗,為了讓朋友們以后少...
摘要:模擬登錄新浪微博的核心,也是與模擬登錄最大的不同,密碼加密。已經(jīng)實現(xiàn)模擬新浪微博登錄的功能,之后不再更新。 參考資料: http://www.csuldw.com/2016/11/10/2016-11-10-simulate-sina-login/ http://blog.csdn.net/fly_leopard/article/details/51148904 http://www....
閱讀 1172·2021-11-22 15:22
閱讀 3843·2021-10-19 13:13
閱讀 3589·2021-10-08 10:05
閱讀 3302·2021-09-26 10:20
閱讀 2988·2019-08-29 14:21
閱讀 2196·2019-08-27 10:55
閱讀 1876·2019-08-26 10:31
閱讀 2586·2019-08-23 16:47