Urllib中基本使用一(發送請求)

日常生活中我們瀏覽的那些網頁例如:淘寶,百度,京東等等的網頁,表面上看有各種特效和動畫,實際上都是由後臺的代碼(HTML,CSS,JS等)經過瀏覽器解釋才呈現出來的。
今天我們要做的就是爬取網頁的源碼。

1.urlopen:
import urllib.request

response = urllib.request.urlopen("https://www.taobao.com/")
data = response.read().decode('utf-8')
#這裏獲取的數據“response”的數據類型是  http.client.HTTPResponse
#所以這裏需要將“response”轉化,下面我會對這裏進行更細一點的講解
with open("test_one.html", "w", encoding="utf-8") as f:
    f.write(data)
#這裏爲了方便所以將數據寫入文件中

運行結果:
(這裏只是一部分截圖)

在這裏插入圖片描述

在這裏插入圖片描述
這裏我們輸出一下獲取的“response”

import urllib.request

response = urllib.request.urlopen("https://www.taobao.com/")
data = response.read().decode('utf-8')
with open("test_one.html", "w", encoding="utf-8") as f:
    f.write(data)
print(type(response))

運行結果:

<class 'http.client.HTTPResponse'>

通過輸出結果可以發現它是一個 HTTPResposne 類型的對象,
它主要包含的方法有 read()、readinto()、getheader(name)、getheaders()、fileno() 等方法和 msg、version、status、reason、debuglevel、closed 等屬性。
得到這個對象之後,我們把它賦值爲變量,然後就可以調用這些方法和屬性,得到返回結果的一系列信息了

實例:

import urllib.request

response = urllib.request.urlopen('https://www.taobao.com')
print(response.status)
print(response.getheaders())
print(response.getheader('Server'))

運行結果:

200
[('Server', 'Tengine'), ('Content-Type', 'text/html; charset=utf-8'), ('Transfer-Encoding', 'chunked'), ('Connection', 'close'), ('Date', 'Tue, 17 Mar 2020 10:50:57 GMT'), ('Vary', 'Accept-Encoding'), ('Vary', 'Ali-Detector-Type'), ('Cache-Control', 'max-age=60, s-maxage=90'), ('X-Snapshot-Age', '2'), ('Content-MD5', 'm5cIuBeU1Bcwxv76OSJ6Vw=='), ('ETag', 'W/"2c5d-170bae03cc4"'), ('Via', 'cache17.l2nu16-1[0,304-0,H], cache28.l2nu16-1[1,0], cache15.cn1247[0,200-0,H], cache15.cn1247[1,0], cache19.cn1624[132,0]'), ('Ali-Swift-Global-Savetime', '1584348288'), ('Age', '11'), ('X-Cache', 'HIT TCP_MEM_HIT dirn:13:867073462'), ('X-Swift-SaveTime', 'Tue, 17 Mar 2020 10:50:46 GMT'), ('X-Swift-CacheTime', '90'), ('Timing-Allow-Origin', '*, *'), ('EagleId', 'dea1d52715844422576844173e, dea1d52715844422576844173e'), ('Set-Cookie', 'thw=cn; Path=/; Domain=.taobao.com; Expires=Wed, 17-Mar-21 10:50:57 GMT;'), ('Strict-Transport-Security', 'max-age=31536000')]
Tengine

三個輸出分別輸出了響應的狀態碼,響應的頭信息,以及通過調用 getheader() 方法並傳遞一個參數 Server 獲取了 headers 中的 Server 值,結果是 Tengine,意思就是服務器是 Tengine 搭建的。

這裏如果我們要給鏈接傳遞一些參數怎麼辦?
我們先看下urlopen的參數說明:

def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
            *, cafile=None, capath=None, cadefault=False, context=None):

其中url是必填的其他都是選填的,下面我們說一下這些參數的用法:

url 網絡地址,是str類型。也可以是一個Request對象。這裏我們需要了解url中如果出現了中文或者其他字符,必須進行url編碼,當然瀏覽器默認爲我們做了這件事情。否則就會報錯。
data 這個是發送求請需要傳遞的參數。如果要傳遞data參數,urlopen將使用post方式請求。
timeout 這個是求請超時時長。我們可以設置時長,如果請求時間過長,則會拋出異常。
cafile 這個是CA證書。
capath 這個是CA證書路徑。
cadefault=Flase 這個已經被棄用了,不用關注這個了。
context 這個可以指定SSL安裝驗證設置,比如我們可以設置忽略證書驗證等等。

2.Request

經過上面的講解我們知道通過urlopen()方法我們可以實現最基本的請求的發起,但是這幾個簡單的參數並不足以構建一個完整的請求,這時我們就需要使用resquest類來構建一個更加完整的請求。
例子:

import urllib.request

request = urllib.request.Request('https://www.taobao.com/')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

這裏我們發現我們仍然是使用 urlopen()方法發起請求,但是urlopen()的參數不在是一個路徑,而是一個resquest類型的對象。
構建這個對象的優點:一方面我們可以將請求獨立成一個對象,另一方面可配置參數更加豐富和靈活。

接下看我們看看request()的參數:

def __init__(self, url, data=None, headers={},
                 origin_req_host=None, unverifiable=False,
                 method=None):

1.url Request結構中的URL字段用於表示請求行中包含的URL
2.data 參數如果要傳必須傳 bytes(字節流)類型的,如果是一個字典,可以先用 urllib.parse 模塊裏的 urlencode() 編碼。
3.headers 參數是一個字典,這個就是 Request Headers 了,你可以在構造 Request 時通過 headers 參數直接構造,也可以通過調用 Request 實例的 add_header() 方法來添加, Request Headers 最常用的用法就是通過修改 User-Agent 來僞裝瀏覽器,默認的 User-Agent 是 Python-urllib,我們可以通過修改它來僞裝瀏覽器。
4.origin_req_host 參數指的是請求方的 host 名稱或者 IP 地址。
5.unverifiable 參數指的是這個請求是否是無法驗證的,默認是False。意思就是說用戶沒有足夠權限來選擇接收這個請求的結果。例如我們請求一個 HTML 文檔中的圖片,但是我們沒有自動抓取圖像的權限,這時 unverifiable 的值就是 True。
6.method 參數是一個字符串,它用來指示請求使用的方法,比如GET,POST,PUT等等。

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