1. 程式人生 > 其它 >Python urllib庫的基本使用

Python urllib庫的基本使用

1.基本介紹

Python urllib 庫用於操作網頁 URL,並對網頁的內容進行抓取處理。

urllib 庫主要包含以下幾個模組:

  • urllib.request # 開啟和讀取url
  • urllib.error #包含了該庫丟擲的異常
  • urllib.parse #解析url
  • urllib.robotparser #解析 robots.txt 檔案

robots.txt 檔案:當蜘蛛訪問網站時,首先會去訪問網站根目錄下的robots.txt檔案,會按照這個檔案中指定的robots協議不去抓取網站中的部分內容。簡單概括的話,robots檔案就是控制搜尋引擎的蜘蛛抓取網站內容的協議。

2.簡單使用

urllib.request 可以模擬瀏覽器的一個請求發起的過程。

urllib.request.urlopen方法來開發一個URL,語法格式如下:

def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
            *, cafile=None, capath=None, cadefault=False, context=None):
  • url:url 地址。
  • data:傳送到伺服器的其他資料物件,預設為 None。
  • timeout:設定訪問超時時間。
  • cafilecapath:cafile 為 CA 證書, capath 為 CA 證書的路徑,使用 HTTPS 需要用到。
  • cadefault:已經被棄用。
  • context:ssl.SSLContext型別,用來指定 SSL 設定。

http://www.httpbin.org 是一個可以檢測請求的一個網站工具

發起一個簡單get請求

import urllib.request

url = "http://www.httpbin.org/get"
result = urllib.request.urlopen(url)
print(result.read().decode('utf-8')) #對獲取到的網頁進行utf-8解碼
print(result.getcode()) # 200,返回狀態碼
print(result.getheaders()) # 獲取所有responseHeader
print(result.getheader("Server")) # 獲取responseHeader中的Server引數

發一個簡單的post請求,當存在data值的時候,就是post請求

import urllib.parse

url = "http://www.httpbin.org/post"
params = {"hello": "world"}
data = urllib.parse.urlencode(params).encode("utf-8") # 對json引數進行編碼
result = urllib.request.urlopen(url=url, data=data)
print(result.read().decode())

超時 timeout

try:
    url = "http://www.httpbin.org/get"
    result = urllib.request.urlopen(url, timeout=0.01) # 單位:秒
    print(result.read().decode())
except urllib.error.URLError as e:
    print("Time out! ==> {0}".format(e))

傳送複雜請求

url = "http://www.httpbin.org/post"
headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36",
    "X-Amzn-Trace-Id": "Root=1-60d6a949-50a80ada4a3a35b9521a5e6d"}
req = urllib.request.Request(url=url, headers=headers, method="POST")
result = urllib.request.urlopen(req)
print(result.read().decode('utf-8'))
class Request:
    def __init__(self, url, data=None, headers={},origin_req_host=None, unverifiable=False,method=None):

構建Request物件,然後把該物件放入urllib.request.urlopen(req);

  • url:請求路徑
  • headers:請求頭
  • method:請求方式,GET,POST,PUT...

注意:

  • 當傳送請求的時候,如果返回的錯誤碼是418,這表示你請求的網站知道你是從urllib傳送的請求,不允許你請求,所以我們需要新增headers請求頭,偽裝自己是瀏覽器發起的請求,如上的header的請求頭。
  • 當出現如下異常時,是因為Python 2.7.9 之後版本引入了一個新特性:當你urllib.urlopen一個 https 的時候會驗證一次 SSL 證書 ,當目標使用的是自簽名的證書時就會爆出該錯誤訊息。
<urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)>

解決辦法:

import ssl
ssl._create_default_https_context = ssl._create_unverified_context