看此文之前,(強(qiáng)烈建議)先去看:
如何用Python,C#等語(yǔ)言去實(shí)現(xiàn)抓取靜態(tài)網(wǎng)頁(yè)+抓取動(dòng)態(tài)網(wǎng)頁(yè)+模擬登陸網(wǎng)站
然后,才明白,此文的作用和產(chǎn)生的背景。
其中,本文的部分內(nèi)容,也會(huì)在上述帖子,給出額外鏈接,其中有更詳細(xì)的解釋的。
之前折騰了兩個(gè)東西:
BlogsToWordPress – 將百度空間,網(wǎng)易163等博客搬家到WordPress
WLW (Windows Live Writer) Plugin–InsertSkydriveFiles
了解了一些關(guān)于,如何抓取對(duì)應(yīng)的網(wǎng)頁(yè)內(nèi)容,如何模擬登陸一個(gè)網(wǎng)站的大概邏輯和流程,以及一些注意事項(xiàng)。
在此整理出來(lái),僅供參考。
抓取網(wǎng)頁(yè)的一般邏輯和過(guò)程
一般普通用戶,用瀏覽器,打開(kāi)某個(gè)URL地址,然后瀏覽器就可以顯示出對(duì)應(yīng)的頁(yè)面的內(nèi)容了。
這個(gè)過(guò)程,如果用程序代碼來(lái)實(shí)現(xiàn),就可以被稱為(用程序?qū)崿F(xiàn))抓取網(wǎng)頁(yè)(的內(nèi)容,并進(jìn)行后期處理,提取所需信息等)
對(duì)應(yīng)的英文說(shuō)法有,website crawl/scrape/data mining。
而用來(lái)抓取網(wǎng)頁(yè)的工具,也常被叫做 spider,crawler等。
即,一般所謂的取網(wǎng)頁(yè)內(nèi)容,指的是通過(guò)程序(某種語(yǔ)言的程序代碼,比如Python腳本語(yǔ)言,C#語(yǔ)言等)實(shí)現(xiàn)訪問(wèn)某個(gè)URL地址,然后獲得其所返回的內(nèi)容(HTML源碼,Json格式的字符串等)。
而對(duì)于這個(gè)抓取網(wǎng)頁(yè)的過(guò)程,是有一套自己的邏輯的。
想要用程序?qū)崿F(xiàn)對(duì)應(yīng)的網(wǎng)頁(yè)內(nèi)容的抓取,就是要先搞懂這套邏輯,然后再去用對(duì)應(yīng)的不同的語(yǔ)言實(shí)現(xiàn),即可。
抓取網(wǎng)頁(yè)的一般邏輯
去訪問(wèn)一個(gè)URL地址,獲得對(duì)應(yīng)的網(wǎng)頁(yè)的過(guò)程,其對(duì)應(yīng)的內(nèi)部機(jī)制是
準(zhǔn)備好對(duì)應(yīng)的Http請(qǐng)求(Http Request)+ 提交對(duì)應(yīng)的Http Request
–>
獲得返回的響應(yīng)(Http Response) + 獲得Http Response中的網(wǎng)頁(yè)源碼
下面介紹這兩大步驟的具體操作流程:
準(zhǔn)備此Http請(qǐng)求Request (訪問(wèn)URL之前的準(zhǔn)備工作)
url
知道了要訪問(wèn)的URL地址是什么,即request url;
其中,此處的url地址,是指的是完整的地址:基本的url + 查詢字符串
此查詢字符串參數(shù):
-
IE中算是稱為request parameter
-
Chrome中稱為query string
其中,查詢字符串,很多時(shí)候也是沒(méi)有的。
舉個(gè)例子:
完整的url = http://www./?s=crifan&submit=Search
==
基本url + 查詢字符串
= http://www./ + s=crifan 和submit=Search
GET還是POST
必須或可選:Headers
即request header
頭信息Headers,包含很多個(gè)Header
有些是必須的,有些是可選的(根據(jù)不同情況,可忽略的)
有的時(shí)候,甚至不設(shè)置任何header也是可以的。
[可選]Post Data
如果是POST方法,則還需要填寫對(duì)應(yīng)的數(shù)據(jù):
此數(shù)據(jù):
-
IE中稱為request body
-
Chrome中稱為Post Data
換句話說(shuō):
如果是GET,則是沒(méi)有POST數(shù)據(jù)的。
提示:所以,你在IE9中通過(guò)F12抓取到的內(nèi)容中,會(huì)看到,對(duì)于所有的GET請(qǐng)求,對(duì)應(yīng)的“請(qǐng)求正文(request body)”都是空的。
必須或可選:cookie
很多時(shí)候,訪問(wèn)對(duì)應(yīng)url還需要提供對(duì)應(yīng)的cookie。
一般來(lái)說(shuō),模擬登陸等情況下,往往都會(huì)涉及到cookie的。
其他一些可能需要準(zhǔn)備的東西
(1)代理proxy
(2)設(shè)置最大超時(shí)timeout時(shí)間
提交HttpRequest,即可獲得此http請(qǐng)求的響應(yīng)Response(訪問(wèn)URL之后的要做的工作)
1.獲得對(duì)應(yīng)的響應(yīng)response
2.從響應(yīng)中獲得對(duì)應(yīng)的網(wǎng)頁(yè)源碼等信息
(1)獲得返回的網(wǎng)頁(yè)HTML源碼(或json等)
(2)[可選]如果有需要,還要獲得對(duì)應(yīng)的cookie
(3)[可選]判斷返回的其他一些相關(guān)信息,比如response code等
【網(wǎng)頁(yè)抓取過(guò)程中的注意事項(xiàng)】
1.網(wǎng)頁(yè)跳轉(zhuǎn)Redirect
(1)直接跳轉(zhuǎn)
(2)間接跳轉(zhuǎn)
A。javascript腳本中有對(duì)應(yīng)的代碼實(shí)現(xiàn)網(wǎng)頁(yè)跳轉(zhuǎn)
B。本身所返回的HTML源碼中包含refresh動(dòng)作,所實(shí)現(xiàn)的網(wǎng)頁(yè)跳轉(zhuǎn)
抓取網(wǎng)頁(yè)后,如何分析獲得所需要的內(nèi)容
一般來(lái)說(shuō),去訪問(wèn)一個(gè)URL地址,所返回的內(nèi)容,多數(shù)都是網(wǎng)頁(yè)的HTML源碼,也有其他一些形式的內(nèi)容的,比如json等。
我們所想要的則是,從返回的內(nèi)容(HTML或json等)中,提取我們所需要的特定的信息,即對(duì)其進(jìn)行一定的處理,獲得所需信息。
就我所遇到的情況,有幾種方法可以實(shí)現(xiàn)提取所需的信息:
1. 對(duì)于HTML源碼:
(1)如果是Python中的話,可以通過(guò)調(diào)用第三方的Beautifulsoup庫(kù)
然后再調(diào)用find等函數(shù),來(lái)提取對(duì)應(yīng)的信息。
這部分內(nèi)容,相對(duì)很復(fù)雜,需要詳細(xì)了解的,可以參考一下:
BlogsToWordPress v3.0 – 將百度空間,網(wǎng)易163等博客搬家到WordPress
中的源碼。
(2)直接使用正則表達(dá)式自己去提取相關(guān)內(nèi)容
對(duì)于內(nèi)容的分析和提取,很多時(shí)候,都是通過(guò)正則表達(dá)式來(lái)實(shí)現(xiàn)的。
關(guān)于正則表達(dá)式的相關(guān)知識(shí)和總結(jié),去看這里:
【總結(jié)】關(guān)于正則表達(dá)式 v2012-02-20
正則表達(dá)式是一種規(guī)范/規(guī)則,具體用何種語(yǔ)言實(shí)現(xiàn),取決于你自己。
我遇到的有Python和C#兩種語(yǔ)言:
A。Python:使用re模塊,常用的函數(shù)是find,,findall,search等。
B:C#:使用Regex類,用對(duì)應(yīng)的pattern和match函數(shù)來(lái)匹配。
關(guān)于C#中的Regex,更多內(nèi)容請(qǐng)參考:
【總結(jié)】C#中的Regex的使用心得和注意事項(xiàng)
2.對(duì)于Json
可以先去看專門的關(guān)于JSON的介紹:
然后再看下面的如何處理Json。
(1)使用庫(kù)(函數(shù))來(lái)處理
A。Python
Python中,有對(duì)應(yīng)的json庫(kù),常用的是json.load,即可將json格式的字符串,轉(zhuǎn)換為對(duì)應(yīng)的字典Dictionary類型變量,很是好用。
(2)還是使用正則表達(dá)式來(lái)處理
A。Python
Python中的re模塊,同上。
B。C#
C#中貌似沒(méi)有自帶json的庫(kù),倒是有很多第三方的json庫(kù),但是我當(dāng)時(shí)遇到解析json字符串的時(shí)候,覺(jué)得這些庫(kù),使用起來(lái)還是很麻煩,所以還是直接使用regex類來(lái)處理了。
模擬登陸網(wǎng)站的一般邏輯和過(guò)程
而對(duì)于用C#實(shí)現(xiàn)網(wǎng)頁(yè)內(nèi)容抓取和模擬登陸網(wǎng)頁(yè)方面,一些心得和注意事項(xiàng),去看這里:
【經(jīng)驗(yàn)總結(jié)】Http,網(wǎng)頁(yè)訪問(wèn),request,response相關(guān)的知識(shí)
多種語(yǔ)言(Python/C#)實(shí)現(xiàn)抓取網(wǎng)頁(yè),模擬登陸網(wǎng)站
【教程】抓取網(wǎng)并提取網(wǎng)頁(yè)中所需要的信息 之 Python版
【教程】模擬登陸網(wǎng)站 之 Python版(內(nèi)含兩種版本的完整的可運(yùn)行的代碼)