Python3 使用 urllib 編寫爬蟲
什麽是爬蟲
爬蟲,也叫蜘蛛(Spider),如果把互聯網比喻成一個蜘蛛網,Spider就是一只在網上爬來爬去的蜘蛛。網絡爬蟲就是根據網頁的地址來尋找網頁的,也就是URL。舉一個簡單的例子,我們在瀏覽器的地址欄中輸入的字符串就是URL,例如:https://www.baidu.com
URL就是同意資源定位符(Uniform Resource Locator),它的一般格式如下(帶方括號[]的為可選項):
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
URL的格式主要由三部分組成:
- protocol:
- hostname[:port]:第二部分就是主機名(還有端口號為可選參數),一般網站默認的端口號為80,例如百度的主機名就是www.baidu.com,這個就是服務器的地址;
- path:第三部分就是主機資源的具體地址,如目錄和文件名等。
- protocol:
爬蟲就是根據URL來獲取網頁信息的。
Python3的urllib包
urllib包提供的模塊可以用來使Python代碼訪問url。
從Python3官方的urllib包介紹可以知道,在Python3中的內置庫中把Python2 的urllib、urllib2兩個庫整合成了urllib包。
在urllib包中只提供了4個模塊:
- urllib.request:用來打開或者讀取Urls
- urllib.error:包含urllib.request的異常信息
- urllib.parse:包含Urls需要的參數信息
- urllib.robotparser:配置robots.txt文件的相關功能
相對於Python 2中的變化
- 在Pytho2.x中使用
import urllib2 --->
在Python3.x中會使用import urllib.request
,urllib.error
。 - 在Pytho2.x中使用
import urllib --->
在Python3.x中會使用import urllib.request
,urllib.error
, - 在Pytho2.x中使用
import urlparse --->
在Python3.x中會使用import urllib.parse
。 - 在Pytho2.x中使用
import urlopen --->
在Python3.x中會使用import urllib.request.urlopen
。 - 在Pytho2.x中使用
import urlencode --->
在Python3.x中會使用import urllib.parse.urlencode
。 - 在Pytho2.x中使用
import urllib.quote --->
對應的,在Python3.x中會使用import urllib.request.quote
。 - 在Pytho2.x中使用
cookielib.CookieJar --->
對應的,在Python3.x中會使用http.CookieJar
。 - 在Pytho2.x中使用
urllib2.Request --->
在Python3.x中會使用urllib.request.Request
。
基本使用
urllib.request.urlopen():訪問一個URL,返回一個包含網頁信息的對象
response.read():獲取返回對象的內容
response.getcode():獲取返回的HTTP Code
response.info():獲取返回的元數據信息,例如HTTP Header
response.geturl():獲取訪問的url
# 使用Python訪問博客園,獲取網頁信息 import urllib.request response = urllib.request.urlopen(‘http://www.cnblogs.com/dachenzi‘) data = response.read().decode(‘utf-8‘) print(data)
利用Python下載一個圖片
import urllib.request url = ‘http://img.lenovomm.com/s3/img/app/app-img-lestore/2370-2015-07-16035439-1437033279327.jpg?isCompress=true&width=320&height=480&quantity=1&rotate=true‘ response = urllib.request.urlopen(url) data = response.read() with open(‘img.jpg‘,‘wb‘) as f: # 圖片輸入二進制文件,所以只需要使用b模式打開寫入即可 f.write(data)
註意:這裏urlopen可以接受一個str,或者一個request對象
小練習
使用Python完成翻譯小程序,輸入中文返回英文信息,反正亦然。
# 1、使用瀏覽器訪問,查看Network,確定提交數據訪問的地址以及提交的data
定制HTTP header
HTTP Header,表示在瀏覽器在進行訪問(HTTP請求)時攜帶的頭部信息,什麽叫定制HTTP請求頭呢,舉個栗子:其實每天活躍在網上的爬蟲太多了,如果網站不進行限制的話,那麽訪問流量會很高,所以站點基本都會對爬蟲進行基本的限制,而利用User-Agent (瀏覽器標示)是最常用的方式,使用瀏覽器和使用Python代碼來訪問站點時,瀏覽器標示時不同的。
本人的google瀏覽器是:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36
python代碼是:Python 3.6.3 ..
這裏既然說定制,那麽就是說可以對User-Agent等頭部參數進行修改。
修改User-Agent
修改請求的User-Agent就需要先定制request對象了,然後把對象傳給urlopen進行訪問
import urllib.request url = ‘http://img.lenovomm.com/s3/img/app/app-img-lestore/2370-2015-07-16035439-1437033279327.jpg?isCompress=true&width=320&height=480&quantity=1&rotate=true‘ head = {} head[‘User-Agent‘] = ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36‘ request = urllib.request.Request(url,headers=head) # 創建Request對象,並設置headers response = urllib.request.urlopen(request) data = response.read() with open(‘img.jpg‘,‘wb‘) as f: f.write(data)
1 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", 2 "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)", 3 "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", 4 "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)", 5 "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", 6 "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)", 7 "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)", 8 "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)", 9 "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6", 10 "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1", 11 "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0", 12 "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5", 13 "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6", 14 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11", 15 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20", 16 "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",更多的User-Agent
添加heades的另一種方法
除了在代碼中通過字典定義header以外,還可以使用request對象的add_header()方法,進行添加
import urllib.request url = ‘http://img.lenovomm.com/s3/img/app/app-img-lestore/2370-2015-07-16035439-1437033279327.jpg?isCompress=true&width=320&height=480&quantity=1&rotate=true‘ # head = {} # head[‘User-Agent‘] = ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36‘ request = urllib.request.Request(url) # 創建Request對象,並設置headers request.add_header(‘User-Agent‘,‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36‘) response = urllib.request.urlopen(request) data = response.read() with open(‘img.jpg‘,‘wb‘) as f: f.write(data)
Python3 使用 urllib 編寫爬蟲