在Python中通過導入urllib2組件,來完成網頁的抓取工作。在python3.x中被改為urllib.request。
爬取具體的過程類似於使用程序模擬IE瀏覽器的功能,把URL作為HTTP請求的內容發送到服務器端, 然后讀取服務器端的響應資源。
實現過程:
1 import urllib2 2 3 response=urllib2.urlopen('http://gs.ccnu.edu.cn/') 4 html=response.read() 5 print html
將返回的html信息打印出來,這和在網站上右鍵,查看源碼看到的內容是一樣的。瀏覽器通過這些源碼,將要現實的內容渲染出來。

除了"http:",URL同樣可以使用"ftp:","file:"等等來替代。
HTTP是基於請求和應答機制的:
客戶端提出請求,服務端提供應答。
同樣urllib2,可以通過模擬一個請求,然后將這個請求作為參數傳入urlopen中,在讀取返回的內容。
1 import urllib2 2 3 req=urllib2.Request('http://gs.ccnu.edu.cn/') 4 response2=urllib2.urlopen(req) 5 page=response2.read() 6 print page
模擬ftp請求:
1 req=urllib2.Request("ftp://example.com/")
在進行http請求的時候可以做兩件事
1.發送data表單數據
有時候我們在爬取網頁的時候,需要提交一個表單,模擬登陸或者注冊的操作。
通常http中通過post操作完成, 而在request時,提交的data表單需要講過urllib中encode編碼成標准的方式。
1 import urllib 2 import urllib2 3 4 url = 'http://www.someserver.com/register.cgi' 5 6 values = {"input1": "SeeKHit", 7 "input2": "123456", 8 "__EVENTTARGET": "btnLogin", 9 "__EVENTARGUMENT": "" } 10 11 data = urllib.urlencode(values) # 編碼工作 12 req = urllib2.Request(url, data) # 發送請求同時傳data表單 13 response = urllib2.urlopen(req) #接受反饋的信息 14 the_page = response.read() #讀取反饋的內容
2.設置Header到http請求
有時候建立http連接后,服務器會根據瀏覽器傳過去的User-Agent頭來,返回不同的內容給客戶端。已達到不同的顯示效果。(如安卓上的uc瀏覽器,就有一個設置設備標識的,如手機版,電腦版,ipad)
Python支持可以自定義的發送過去的User-Agent頭,將自定義的字典作為User-Agent頭作為一個參數,創建一個請求。
以下代碼,講User-Agent偽裝成IE瀏覽器來,進行訪問。
1. 應用程序版本“Mozilla/4.0”表示:你使用Maxthon 2.0 瀏覽器使用 IE8 內核;
2. 版本標識“MSIE 8.0”
3. 平台自身的識別信息“Windows NT ”表示“操作系統為 Windows”
1 url = 'http://www.someserver.com/register.cgi' 2 user_agent = 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT)' 3 headers = { 'User-Agent' : user_agent } 4 values = {"input1": "SeeKHit", 5 "input2": "123456", 6 "__EVENTTARGET": "btnLogin", 7 "__EVENTARGUMENT": "" } 8 9 data = urllib.urlencode(values) # 編碼工作 10 req = urllib2.Request(url, data, headers) # 發送請求,傳data表單,模擬User- 11 response = urllib2.urlopen(req) #接受反饋的信息 12 the_page = response.read() #讀取反饋的內容
