Python 爬蟲(chóng)之——模擬登陸

??????? 爬蟲(chóng)實(shí)際上就是通過(guò)代碼實(shí)現(xiàn)“自動(dòng)”登陸,并且能夠自動(dòng)完成一些數(shù)據(jù)的下載,一般網(wǎng)站都會(huì)對(duì)一些允許抓取的數(shù)據(jù)進(jìn)行規(guī)定,具體的規(guī)定內(nèi)容寫(xiě)在了每個(gè)網(wǎng)站的robots文件中。

??????? 爬蟲(chóng)是數(shù)據(jù)挖掘和分析的第一部,及:獲取數(shù)據(jù),因而對(duì)于從事數(shù)據(jù)分析的人來(lái)說(shuō),首先應(yīng)該“了解”。也就是說(shuō),對(duì)于想要從事數(shù)據(jù)挖掘的人來(lái)說(shuō),并不要求你爬蟲(chóng)的技術(shù)非常高超,只要能夠知道里面的基本技術(shù)層面即可。個(gè)人認(rèn)為,數(shù)據(jù)挖掘的要旨并非在于數(shù)據(jù)(盡管很多數(shù)據(jù)界的名人都似乎推崇“大數(shù)據(jù)”),而是在于對(duì)于數(shù)據(jù)后面事件的理解......

??????? 言歸正傳:

? ? ? ? 爬蟲(chóng)的基本框架是:模擬登陸——獲取數(shù)據(jù)——存儲(chǔ)數(shù)據(jù),當(dāng)然,每一個(gè)步驟中都涉及很多需要注意的地方,如在模擬登陸中,要考慮request的方式和數(shù)據(jù)內(nèi)容(這里要了解一些http的基礎(chǔ)知識(shí)w3school 可以經(jīng)常去看看,如用到xpath的時(shí)候),還要驗(yàn)證碼以及密碼加密(如新浪和拉鉤網(wǎng))。

??????? 模擬登陸之前,還要掌握一些httpclient/firebug這些軟件的基本操作,以及具備看懂request/post數(shù)據(jù)的“技能”,這些“攔截”軟件能夠在client(瀏覽器)和server互動(dòng)時(shí)“截獲”雙方信息。ps:所以登陸公共場(chǎng)所的wifi極其危險(xiǎn)。

1 靜態(tài)網(wǎng)站+密碼可見(jiàn)

??????? 這種情況下,server要求不高,既沒(méi)有動(dòng)態(tài)碼,也沒(méi)有驗(yàn)證碼,更沒(méi)有加密,因而這類(lèi)網(wǎng)站的模擬登陸一般非常好實(shí)現(xiàn),只要python中的一些基本操作即可:


import urllib

import urllib2

url=r"http://www.xxxx.com" # 加入“r“的目的是為了避免一些轉(zhuǎn)義字符額識(shí)別問(wèn)題,個(gè)人編習(xí)慣

request=urllib2.Request(url)

rep=urllib2.urlopen(request) #此時(shí)的rep為instance,可以理解為類(lèi)似于“文件”的東西


??????? 到這里已經(jīng)將server返回的html文檔記錄在了rep中,后面就可以對(duì)rep進(jìn)行讀寫(xiě)操作

??????? 這里一定要注意網(wǎng)站的編碼是什么,一般在“查看網(wǎng)站源碼”中,可以看得到有一個(gè)為character=“utf-8”的內(nèi)容,就表示網(wǎng)站html編碼為utf-8,那么用python時(shí),就必須對(duì)html進(jìn)行decode(以u(píng)tf-8編碼方式轉(zhuǎn)化為unicode),然后再進(jìn)行其他處理,如正則表達(dá)式查找等。

content=rep.read().decode("utf-8")

with open(r"yourfile.txt","w") as f: #將rep中的html文檔以u(píng)ft-8的形式進(jìn)行編碼后存儲(chǔ)

??????? f.write(content.encode("utf-8"))

??????????? 好了,這就是一般網(wǎng)頁(yè)的模擬登陸 ????



2 網(wǎng)站拒絕“機(jī)器”登陸

??????? 一般來(lái)說(shuō),除了像學(xué)校網(wǎng)站以及學(xué)校bbs這類(lèi)的網(wǎng)站,其他網(wǎng)站都會(huì)對(duì)“機(jī)器”登陸比較反感,畢竟,那么此時(shí),就需要在以上的基礎(chǔ)上模擬瀏覽器登陸。

??????? 瀏覽器登陸的時(shí)候會(huì)發(fā)送一些我們看不到的內(nèi)容,想要模擬瀏覽器登陸,就必須將瀏覽器發(fā)送的內(nèi)容以post的形式發(fā)送給server端。瀏覽器一般post的內(nèi)容見(jiàn)下:


具體參數(shù)的意思,如果忘了可以再google一下(查問(wèn)題一定要用google)

????? 這里要注意的一個(gè)定方是accept-encoding那里是:gzip和defualt,也就是說(shuō)server會(huì)以壓縮包的形式法給你html文檔(有的時(shí)候也不是,這個(gè)還是具體實(shí)驗(yàn)),那么如果是以gzip的形式返回html,那么就一定要“解壓”,否則會(huì)寶HTTPError 500,這個(gè)異常出來(lái),一般很難發(fā)現(xiàn)。具體解壓方法后面介紹。

????? 在模擬瀏覽器登陸的過(guò)程中,也沒(méi)有必要全部按照post的形式發(fā)送,可以只發(fā)送一些User-Agent或者referer的東西。發(fā)送user-agent是因?yàn)橛行﹕erver要通過(guò)這個(gè)參數(shù)來(lái)判斷是否是瀏覽器,發(fā)送referer是由于“反盜鏈”的原因,大概意思就是防止本網(wǎng)站的鏈接內(nèi)容被其他“二道販子”用來(lái)“倒賣(mài)”。

那么,在上面代碼的基礎(chǔ)上,這里可以加入:

headers={"User-Agent":"xxx","Referer":"xxx"}

request改為:

request=urllib2.Request(url,headers=headers)#在發(fā)送請(qǐng)求的時(shí)候加入header

這里附上urllib2的中文教程:urllib2 tutorial ?

PS:如果可以用Request庫(kù)的還是用它吧? request tutorial


未完.....

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容