??????? 爬蟲(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
未完.....