所謂網(wǎng)頁(yè)抓取,就是把URL地址中指定的網(wǎng)絡(luò)資源從網(wǎng)絡(luò)流中讀取出來(lái),保存到本地。 類似于使用程序模擬IE瀏覽器的功能,把URL作為HTTP請(qǐng)求的內(nèi)容發(fā)送到服務(wù)器端, 然后讀取服務(wù)器端的響應(yīng)資源。
一、通過(guò)urllib2抓取百度網(wǎng)頁(yè)
在Python中,我們使用urllib2這個(gè)組件來(lái)抓取網(wǎng)頁(yè)。urllib2是Python的一個(gè)獲取URLs(Uniform Resource Locators)的組件。它以u(píng)rlopen函數(shù)的形式提供了一個(gè)非常簡(jiǎn)單的接口。最簡(jiǎn)單的urllib2的應(yīng)用代碼只需要四行。

我們通過(guò)瀏覽器可以打開(kāi)百度主頁(yè),右擊,選擇查看源代碼(火狐OR谷歌瀏覽器均可),會(huì)發(fā)現(xiàn)也是完全一樣的內(nèi)容。也就是說(shuō),上面這四行代碼將我們?cè)L問(wèn)百度時(shí)瀏覽器收到的代碼們?nèi)看蛴×顺鰜?lái)。這就是一個(gè)最簡(jiǎn)單的urllib2的例子。
當(dāng)然,除了"http:",URL同樣可以使用"ftp:","file:"等等來(lái)替代。HTTP是基于請(qǐng)求和應(yīng)答機(jī)制的:客戶端提出請(qǐng)求,服務(wù)端提供應(yīng)答。
二、urllib結(jié)合Request用法
urllib2用一個(gè)Request對(duì)象來(lái)映射你提出的HTTP請(qǐng)求。在它最簡(jiǎn)單的使用形式中你將用你要請(qǐng)求的地址創(chuàng)建一個(gè)Request對(duì)象,通過(guò)調(diào)用urlopen并傳入Request對(duì)象,將返回一個(gè)相關(guān)請(qǐng)求response對(duì)象,這個(gè)應(yīng)答對(duì)象如同一個(gè)文件對(duì)象,所以你可以在Response中調(diào)用.read()客戶端提出請(qǐng)求,服務(wù)端提供應(yīng)答。

可以看到,以上兩種用法的輸出結(jié)果都是一致的。
三、HTTP請(qǐng)求的同時(shí)傳入?yún)?shù)data
設(shè)置Headers到http請(qǐng)求
有一些網(wǎng)站不喜歡被程序(非人為訪問(wèn))訪問(wèn),或者發(fā)送不同版本的內(nèi)容到不同的瀏覽器。默認(rèn)的urllib2把自己作為“Python-urllib/x.y”(x和y是Python主版本和次版本號(hào),例如Python-urllib/2.7),瀏覽器確認(rèn)自己身份是通過(guò)User-Agent頭,當(dāng)你創(chuàng)建了一個(gè)請(qǐng)求對(duì)象,你可以給他一個(gè)包含頭數(shù)據(jù)的字典。
