Python 中利用urllib2簡單實現網頁抓取
阿新 • • 發佈:2019-02-16
網頁抓取就是把URL地址中指定的網路資源從網路流中讀取出來,儲存到本地。
在Python中,可以使用urllib2這個模組來抓取網頁,模組提供了讀取web頁面資料的介面,我們可以像讀取本地檔案一樣讀取www和ftp上的資料.
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.獲取頁面中特定的資料
假設我想要獲取這一網頁點選開啟連結的所有小黃人的圖片
點選某一圖片的審查元素找到圖片的地址
urllib.urlretrieve()方法,直接將遠端資料下載到本地。(注: urllib2沒有urlretrieve這個方法)#!/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)
通過一個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)