爬蟲筆記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!')

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章