Urllib庫的使用一---基本使用

weixin_34214500發表於2018-10-03
urllib庫的基本使用 所謂網頁抓取,就是把URL地址中指定的網路資源從網路流中讀取出來,儲存到本地
urllib庫是python內建的HTTP請求庫,直接可以使用,包含如下三個模組:
  • request: 它是最基本的HTTP請求模組,可以用來模擬傳送請求,就像在瀏覽器中輸入網址,然後敲擊Enter鍵一樣,使用的時候只需要給庫方法傳入相關的URL和相關的引數即可.
  • error: 異常處理模組,如果出現請求錯誤,我們可以使用這個模組來捕獲異常,然後進行重試或者其他操作,保證程式不會意外終止.
  • parse: 這是一個工具模組,提供了許多url的處理方法,比如拆分,解析,合併等等.

傳送請求

使用request模組,可以方便的實現請求的傳送並且的得到響應.
(1) urlopen()

觀察如下程式碼:

#本人用的是vscode編輯器
# urllib_request.py
# 匯入urllib.request庫
import urllib.request
# 向指定的url傳送請求,並返回伺服器響應的類檔案物件
response = urllib.request.urlopen("http://www.baidu.com")
print(type(response))
# 類檔案物件支援檔案物件的操作方法,如read()方法讀取檔案全部內容,返回字串
html = response.read()
# 列印字串
print (html)
# 列印狀態碼
print (response.status)
# 獲取響應頭
print (response.getheaders())
# 獲取響應頭資訊
print (response.getheader('Server'))
# 獲取原因
print (response.reason)
執行python程式碼,將列印結果

python urllib_request.py

你會發現輸出的結果跟我們在瀏覽器上開啟百度"檢視原始碼"內容一模一樣,也就是說,上面的幾行程式碼就已經幫我們把百度的首頁的全部程式碼爬了下來。
利用最基本的urlopen()方法可以完成最基本的簡單網頁GET請求抓取,如下常用的幾個引數:
  • url:設定目標url
  • data:如果設定該引數,則請求預設為post請求
  • timeout:用於設定超時時間,單位為秒
  • context: 必須是一個ssl.SSLContext型別,用來指定SSL設定,忽略未認證的CA證照.

Request

在我們第一個例子裡,urlopen()的引數就是一個url地址;
但是如果需要執行更復雜的操作,比如增加HTTP報頭,必須建立一個 Request 例項來作為urlopen()的引數;而需要訪問的url地址則作為 Request 例項的引數。
  • 我們編輯urllib_request.py
# urllib_request.py
import urllib.request
# url 作為Request()方法的引數,構造並返回一個Request物件
request = urllib.request.Request("http://www.baidu.com")
# Request物件作為urlopen()方法的引數,傳送給伺服器並接收響應
response = urllib.request.urlopen(request)
html = response.read().decode()
print (html)
執行結果是完全一樣的: 新建Request例項,除了必須要有 url 引數之外,還可以設定另外兩個引數:
  • data(預設空):是伴隨 url 提交的資料(比如要post的資料),同時 HTTP 請求將從 "GET"方式 改為 "POST"方式。
  • headers(預設空):是一個字典,包含了需要傳送的HTTP報頭的鍵值對。

User-Agent

  • 但是這樣直接用urllib給一個網站傳送請求的話,確實略有些唐突了,就好比,人家每家都有門,你以一個路人的身份直接闖進去顯然不是很禮貌。而且有一些站點不喜歡被程式(非人為訪問)訪問,有可能會拒絕你的訪問請求。
    但是如果我們用一個合法的身份去請求別人網站,顯然人家就是歡迎的,所以我們就應該給我們的這個程式碼加上一個身份,就是所謂的User-Agent頭。

瀏覽器 就是網際網路世界上公認被允許的身份,如果我們希望我們的爬蟲程式更像一個真實使用者,那我們第一步,就是需要偽裝成一個被公認的瀏覽器。用不同的瀏覽器在傳送請求的時候,會有不同的User-Agent頭。 urllib預設的User-Agent頭為:Python-urllib/x.y(x和y是Python主版本和次版本號,例如 Python-urllib/3.5)

#urllib_request.py
import urllib.request
url = "http://www.itcast.cn"
#IE 9.0 的 User-Agent,包含在 ua_header裡
ua_header = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}
#  url 連同 headers,一起構造Request請求,這個請求將附帶 IE9.0 瀏覽器的User-Agent
request = urllib.request.Request(url, headers = ua_header)
# 向伺服器傳送這個請求
response = urllib.request.urlopen(request)
html = response.read()
print (html)

新增更多的Header資訊

在 HTTP Request 中加入特定的 Header,來構造一個完整的HTTP請求訊息。

  • 可以通過呼叫Request.add_header() 新增/修改一個特定的header
  • 也可以通過呼叫Request.get_header()來檢視已有的header。
新增一個特定的header
# urllib_headers.py
import urllib.request
url = "http://www.itcast.cn"
#IE 9.0 的 User-Agent
header = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}
request = urllib.request.Request(url, headers=header)
#也可以通過呼叫Request.add_header() 新增/修改一個特定的header
request.add_header("Connection", "keep-alive")
# 也可以通過呼叫Request.get_header()來檢視header資訊
# request.get_header(header_name="Connection")
response = urllib.request.urlopen(request)
print (response.code) #可以檢視響應狀態碼
html = response.read().decode()
print (html)

相關文章