1. 程式人生 > >Python 中利用urllib2簡單實現網頁抓取

Python 中利用urllib2簡單實現網頁抓取

         網頁抓取就是把URL地址中指定的網路資源從網路流中讀取出來,儲存到本地。

在Python中,可以使用urllib2這個模組來抓取網頁,模組提供了讀取web頁面資料的介面,我們可以像讀取本地檔案一樣讀取wwwftp上的資料.

HTTP是基於請求和應答機制的:客戶端提出請求,服務端提供應答。

以下實現了最簡單的urllib2抓取網頁。

1.獲取整個頁面資料

#!/usr/bin/env python
import urllib2
def GetHtml(url):
      response = urllib2.urlopen(url)
      HtmlPage = response.read()
      return HtmlPage
print GetHtml('http://www.baidu.com')
#!/usr/bin/env python
import urllib2
def GetHtml(url):
      req = urllib2.Request(url)
      response = urllib2.urlopen(req)
      HtmlPage = response.read()
      return HtmlPage
print GetHtml('http://www.baidu.com')
以上兩種形式一樣。urllib2用一個Request物件來對映提出的HTTP請求,將請求的地址建立一個Request物件,

通過呼叫urlopen並傳入Request物件,響應後將返回response檔案物件,再呼叫read()函式讀取抓取的網頁內容。

2.獲取頁面中特定的資料

假設我想要獲取這一網頁點選開啟連結的所有小黃人的圖片       

點選某一圖片的審查元素找到圖片的地址


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib
import re
def  GetHtml(url):
        response = urllib.urlopen(url)
        HtmlPage = response.read()
        return HtmlPage
def  GetImg( HtmlPage):
        Img=re.compile(r'src="(.+?\.img)" ')
        ImgList = re.findall(Img,HtmlPage)
        count = 1
        for ImgURL in ImgList:
              urllib.urlretrieve(ImgURL,'%s.img' % count)
              count+=1
HtmlPage = GetHtml(<span style="font-size:14px;">'http://www.3lian.com/gif/2014/09-17/60992.html</span>')
print GetImg(HtmlPage)
urllib.urlretrieve()方法,直接將遠端資料下載到本地。(注: urllib2沒有urlretrieve這個方法)

通過一個for迴圈對獲取的每個圖片的連線進行遍歷,儲存的位置預設為程式的存放目錄。

修改上面的程式新增迴圈可以爬多張網頁的圖。

# -*- coding: utf-8 -*-  
import urllib 
import re

def GetHtml(url):
      i=1
      count = 1
      for i in range(1,5):
           URL = url + str(i)
           response = urllib.urlopen(URL)
           HtmlPage = response.read()                            
           Img=re.compile(r'src="(.+?\.jpg)" ')  
           ImgList = re.findall(Img,HtmlPage)  
 
           for ImgURL in ImgList:
                 urllib.urlretrieve(ImgURL,'%s.jpg' % count)  
                 count+=1  
print GetHtml ('https://mm.taobao.com/json/request_top_list.htm?type=0&page=')  

若urllib.urlretrieve('http:' +ImgURL,'%s.jpg' % count)  變成urllib.urlretrieve(ImgURL,'%s.jpg' % count) 

則會出現以下錯誤,但是爬單張網頁不會出錯。


以上程式碼可稍微改變一點 實現任意頁面的圖片抓取。

# -*- coding: utf-8 -*-  
import urllib 
import re

def GetHtml(url,start_page,end_page):
      count = 1
      for i in range(start_page,end_page):
           URL = url + str(i)
           response = urllib.urlopen(URL)
           HtmlPage = response.read()                            
           Img=re.compile(r'src="(.+?\.jpg)" ')  
           ImgList = re.findall(Img,HtmlPage)  
 
           for ImgURL in ImgList:
                 urllib.urlretrieve('http:' +ImgURL,'%s.jpg' % count)  
                 count+=1  
start_page = int(raw_input(u'please input the start_page:\n'))
end_page = int (raw_input(u'please input the end_page:\n'))
print GetHtml ('https://mm.taobao.com/json/request_top_list.htm?type=0&page=',start_page,end_page)