爬蟲筆記2:urllib庫的使用
urllib概述
urllib是Python內建的HTTP請求庫,是Python自帶的庫,只要安裝了Python就有了。urllib主要包含4個模組:request,error,parse,robotparser。
request模組
request是提供了實現請求的方法:urlopen(),返回的是HTTPResponse物件。
urlopen()通過傳參可以構造一個完整的請求,比較常用的引數有url,data,timeout:
1. url就是我們要求請的超連結的地址;
2. data引數是可選的,主要用於模擬表單提交,但是傳遞前需要將引數轉化為位元組流的格式:dict = { 'name' : 'Tom', 'age' : 20 } data = bytes(parse.urlencode(dict),encoding='utf-8') respnse = request.urlopen(url='',data=data)
3.timeout用於設定超時時間,單位是秒,如果請求超過了設定時間,就會丟擲一個URLError異常;
4.其他引數如context是設定SSL,cafile設定CA證書,capath設定CA證書路徑。
HTTPResponse物件有很多方法和屬性,常見的有:
1.read(),返回網頁的內容;
2.getheaders(),返回響應頭資訊;
3.getheader(),與getheaders()類似,只是要指定引數獲取某一響應頭的資訊:response = urllib.request.urlopen('https://baidu.com') print(response.getheader('server')) 輸出結果為BWS/1.1
4.msg:請求是否成功;
5.status:請求狀態碼;
request模組還有一個重要就是Request(),Request()主要是構建一個更加強大的請求:主要在於引數headers上,我們可以通過向headers傳遞一個字典,偽裝成瀏覽器實現爬蟲,其他引數和urlopen差不多。
error模組
error模組定義了請求是產生的異常,如果在請求時發生錯誤,就會丟擲一個error模組定義的異常。捕獲異常的作用是,當我們的程式發生錯誤時,不會因此程式的終止,同時也能夠捕獲異常的原因。
URLError:URLError繼承了OSError類,是Error模組的基類;
HTTPError:是URLError的子類,專門用來處理HTTP請求錯誤。
若是請求一個不存在的頁面,就會報出Not found的資訊。try: response = request.urlopen('https://zhihu.com/notfound.html') except error.URLError as e: print(e.reason)
parse模組
parse模組提供了多種處理URL的API:
1.urlparse():實現對URL的分段;result = parse.urlparse('https://www.baidu.com/s;user?wd=爬蟲&rsv_spt=1&issp=1') print(result) 輸出結果:ParseResult(scheme='https', netloc='www.baidu.com', path='/s', params='user', query='wd=爬蟲&rsv_spt=1&issp=1', fragment='')
2.urlunparse():可以理解為urlparse()的逆過程;
3.urlsplit():與urlparse()類似,只是分段結果將params合併到path裡去了;
4.urlunsplit():urlsplit()的逆過程;
5.urljoin():實現連結的合併;
6.urlencode():將引數字典序列化為連結:params = { 'name' : 'Tom', 'age' : 20 } url = 'https:baidu.com?' url = url + parse.urlencode(params) print(url) 輸出結果為:https:baidu.com?name=Tom&age=20
7.parse_qs():urlencode()的逆過程,將引數轉化為字典;
8.parse_qsl():也是urlencode()的逆過程,只是將引數轉化為列表與元組;
9.quote():我們開啟百度搜索中文欄位時,會發現連結的搜尋內容被編碼了,利用quote()可以達到此效果,同時,這也是防止亂碼的有效手段:keyword = '爬蟲' url = 'https://www.baidu.com/s?wd=' + parse.quote(keyword) print(url) 輸出結果為:https://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB
10.unquote():quote()的逆過程。
一個小案例:
from urllib import request
from urllib import error
from urllib import parse
base_url = 'https://www.baidu.com/s?'
data_dict = {
'wd' : '爬蟲'
}
url = base_url + parse.urlencode(data_dict)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'
}
try:
req = request.Request(url,headers=headers)
response = request.urlopen(req)
print(response.read().decode('utf-8'))
except error.HTTPError as e:
if e.code == 404:
print('Not Found!')