溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python3爬蟲是如何發(fā)送請(qǐng)求的

發(fā)布時(shí)間:2020-08-05 14:00:05 來源:億速云 閱讀:121 作者:小新 欄目:編程語(yǔ)言

小編給大家分享一下Python3爬蟲是如何發(fā)送請(qǐng)求的,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

使用urllib的request模塊,我們可以方便地實(shí)現(xiàn)請(qǐng)求的發(fā)送并得到響應(yīng),本節(jié)就來看下它的具體用法。

1. urlopen()

urllib.request模塊提供了最基本的構(gòu)造HTTP請(qǐng)求的方法,利用它可以模擬瀏覽器的一個(gè)請(qǐng)求發(fā)起過程,同時(shí)它還帶有處理授權(quán)驗(yàn)證(authenticaton)、重定向(redirection)、瀏覽器Cookies以及其他內(nèi)容。

下面我們來看一下它的強(qiáng)大之處。這里以Python官網(wǎng)為例,我們來把這個(gè)網(wǎng)頁(yè)抓下來:

import urllib.request
response = urllib.request.urlopen('https://www.python.org')
print(response.read().decode('utf-8'))

運(yùn)行結(jié)果如圖3-1所示。

Python3爬蟲是如何發(fā)送請(qǐng)求的

                                                                     圖3-1 運(yùn)行結(jié)果

這里我們只用了兩行代碼,便完成了Python官網(wǎng)的抓取,輸出了網(wǎng)頁(yè)的源代碼。得到源代碼之后呢?我們想要的鏈接、圖片地址、文本信息不就都可以提取出來了嗎?

接下來,看看它返回的到底是什么。利用type()方法輸出響應(yīng)的類型:

import urllib.request
response = urllib.request.urlopen('https://www.python.org')
print(type(response))

輸出結(jié)果如下:

<class 'http.client.HTTPResponse'>

可以發(fā)現(xiàn),它是一個(gè)HTTPResposne類型的對(duì)象。它主要包含read()、readinto()、getheader(name)、getheaders()、fileno()等方法,以及msg、version、status、reason、debuglevel、closed等屬性。

得到這個(gè)對(duì)象之后,我們把它賦值為response變量,然后就可以調(diào)用這些方法和屬性,得到返回結(jié)果的一系列信息了。

例如,調(diào)用read()方法可以得到返回的網(wǎng)頁(yè)內(nèi)容,調(diào)用status屬性可以得到返回結(jié)果的狀態(tài)碼,如200代表請(qǐng)求成功,404代表網(wǎng)頁(yè)未找到等。

下面再通過一個(gè)實(shí)例來看看:

import urllib.request
response = urllib.request.urlopen('https://www.python.org')
print(response.status)
print(response.getheaders())
print(response.getheader('Server'))

運(yùn)行結(jié)果如下:

200
[('Server', 'nginx'), ('Content-Type', 'text/html; charset=utf-8'), ('X-Frame-Options', 'SAMEORIGIN'), 
('X-Clacks-Overhead', 'GNU Terry Pratchett'), ('Content-Length', '47397'), ('Accept-Ranges', 'bytes'), 
('Date', 'Mon, 01 Aug 2016 09:57:31 GMT'), ('Via', '1.1 varnish'), ('Age', '2473'), ('Connection', 'close'), 
('X-Served-By', 'cache-lcy1125-LCY'), ('X-Cache', 'HIT'), ('X-Cache-Hits', '23'), ('Vary', 'Cookie'), 
('Strict-Transport-Security', 'max-age=63072000; includeSubDomains')]
nginx

可見,前兩個(gè)輸出分別輸出了響應(yīng)的狀態(tài)碼和響應(yīng)的頭信息,最后一個(gè)輸出通過調(diào)用getheader()方法并傳遞一個(gè)參數(shù)Server獲取了響應(yīng)頭中的Server值,結(jié)果是nginx,意思是服務(wù)器是用Nginx搭建的。

利用最基本的urlopen()方法,可以完成最基本的簡(jiǎn)單網(wǎng)頁(yè)的GET請(qǐng)求抓取。

如果想給鏈接傳遞一些參數(shù),該怎么實(shí)現(xiàn)呢?首先看一下urlopen()函數(shù)的API:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

可以發(fā)現(xiàn),除了第一個(gè)參數(shù)可以傳遞URL之外,我們還可以傳遞其他內(nèi)容,比如data(附加數(shù)據(jù))、timeout(超時(shí)時(shí)間)等。

下面我們?cè)敿?xì)說明下這幾個(gè)參數(shù)的用法。

data參數(shù)

data參數(shù)是可選的。如果要添加該參數(shù),并且如果它是字節(jié)流編碼格式的內(nèi)容,即bytes類型,則需要通過bytes()方法轉(zhuǎn)化。另外,如果傳遞了這個(gè)參數(shù),則它的請(qǐng)求方式就不再是GET方式,而是POST方式。

下面用實(shí)例來看一下:

import urllib.parse
import urllib.request
data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding='utf8')
response = urllib.request.urlopen('http://httpbin.org/post', data=data)
print(response.read())

這里我們傳遞了一個(gè)參數(shù)word,值是hello。它需要被轉(zhuǎn)碼成bytes(字節(jié)流)類型。其中轉(zhuǎn)字節(jié)流采用了bytes()方法,該方法的第一個(gè)參數(shù)需要是str(字符串)類型,需要用urllib.parse模塊里的urlencode()方法來將參數(shù)字典轉(zhuǎn)化為字符串;第二個(gè)參數(shù)指定編碼格式,這里指定為utf8。

這里請(qǐng)求的站點(diǎn)是httpbin.org,它可以提供HTTP請(qǐng)求測(cè)試。本次我們請(qǐng)求的URL為http://httpbin.org/post,這個(gè)鏈接可以用來測(cè)試POST請(qǐng)求,它可以輸出請(qǐng)求的一些信息,其中包含我們傳遞的data參數(shù)。

運(yùn)行結(jié)果如下:

{
     "args": {},
     "data": "",
     "files": {},
     "form": {
         "word": "hello"
     },
     "headers": {
         "Accept-Encoding": "identity",
         "Content-Length": "10",
         "Content-Type": "application/x-www-form-urlencoded",
         "Host": "httpbin.org",
         "User-Agent": "Python-urllib/3.5"
     },
     "json": null,
     "origin": "123.124.23.253",
     "url": "http://httpbin.org/post"
}

我們傳遞的參數(shù)出現(xiàn)在了form字段中,這表明是模擬了表單提交的方式,以POST方式傳輸數(shù)據(jù)。

timeout參數(shù)

timeout參數(shù)用于設(shè)置超時(shí)時(shí)間,單位為秒,意思就是如果請(qǐng)求超出了設(shè)置的這個(gè)時(shí)間,還沒有得到響應(yīng),就會(huì)拋出異常。如果不指定該參數(shù),就會(huì)使用全局默認(rèn)時(shí)間。它支持HTTP、HTTPS、FTP請(qǐng)求。

下面用實(shí)例來看一下:

import urllib.request
response = urllib.request.urlopen('http://httpbin.org/get', timeout=1)
print(response.read())

運(yùn)行結(jié)果如下:

During handling of the above exception, another exception occurred:
Traceback (most recent call last): File "/var/py/python/urllibtest.py", line 4, in <module> response = urllib.
request.urlopen('http://httpbin.org/get', timeout=1)
...
urllib.error.URLError: <urlopen error timed out>

這里我們?cè)O(shè)置超時(shí)時(shí)間是1秒。程序1秒過后,服務(wù)器依然沒有響應(yīng),于是拋出了URLError異常。該異常屬于urllib.error模塊,錯(cuò)誤原因是超時(shí)。

因此,可以通過設(shè)置這個(gè)超時(shí)時(shí)間來控制一個(gè)網(wǎng)頁(yè)如果長(zhǎng)時(shí)間未響應(yīng),就跳過它的抓取。這可以利用try except語(yǔ)句來實(shí)現(xiàn),相關(guān)代碼如下:

import socket
import urllib.request
import urllib.error
try:
    response = urllib.request.urlopen('http://httpbin.org/get', timeout=0.1)
except urllib.error.URLError as e:
    if isinstance(e.reason, socket.timeout):
        print('TIME OUT')

這里我們請(qǐng)求了http://httpbin.org/get測(cè)試鏈接,設(shè)置超時(shí)時(shí)間是0.1秒,然后捕獲了URLError異常,接著判斷異常是socket.timeout類型(意思就是超時(shí)異常),從而得出它確實(shí)是因?yàn)槌瑫r(shí)而報(bào)錯(cuò),打印輸出了TIME OUT。

運(yùn)行結(jié)果如下:

TIME OUT

按照常理來說,0.1秒內(nèi)基本不可能得到服務(wù)器響應(yīng),因此輸出了TIME OUT的提示。

通過設(shè)置timeout這個(gè)參數(shù)來實(shí)現(xiàn)超時(shí)處理,有時(shí)還是很有用的。

其他參數(shù)

除了data參數(shù)和timeout參數(shù)外,還有context參數(shù),它必須是ssl.SSLContext類型,用來指定SSL設(shè)置。

此外,cafile和capath這兩個(gè)參數(shù)分別指定CA證書和它的路徑,這個(gè)在請(qǐng)求HTTPS鏈接時(shí)會(huì)有用。

cadefault參數(shù)現(xiàn)在已經(jīng)棄用了,其默認(rèn)值為False。

前面講解了urlopen()方法的用法,通過這個(gè)最基本的方法,我們可以完成簡(jiǎn)單的請(qǐng)求和網(wǎng)頁(yè)抓取。若需更加詳細(xì)的信息,可以參見官方文檔:https://docs.python.org/3/library/urllib.request.html。

2. Request

我們知道利用urlopen()方法可以實(shí)現(xiàn)最基本請(qǐng)求的發(fā)起,但這幾個(gè)簡(jiǎn)單的參數(shù)并不足以構(gòu)建一個(gè)完整的請(qǐng)求。如果請(qǐng)求中需要加入Headers等信息,就可以利用更強(qiáng)大的Request類來構(gòu)建。

首先,我們用實(shí)例來感受一下Request的用法:

import urllib.request
request = urllib.request.Request('https://python.org')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

可以發(fā)現(xiàn),我們依然是用urlopen()方法來發(fā)送這個(gè)請(qǐng)求,只不過這次該方法的參數(shù)不再是URL,而是一個(gè)Request類型的對(duì)象。通過構(gòu)造這個(gè)數(shù)據(jù)結(jié)構(gòu),一方面我們可以將請(qǐng)求獨(dú)立成一個(gè)對(duì)象,另一方面可更加豐富和靈活地配置參數(shù)。

下面我們看一下Request可以通過怎樣的參數(shù)來構(gòu)造,它的構(gòu)造方法如下:

class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

第一個(gè)參數(shù)url用于請(qǐng)求URL,這是必傳參數(shù),其他都是可選參數(shù)。

第二個(gè)參數(shù)data如果要傳,必須傳bytes(字節(jié)流)類型的。如果它是字典,可以先用urllib.parse模塊里的urlencode()編碼。

第三個(gè)參數(shù)headers是一個(gè)字典,它就是請(qǐng)求頭,我們可以在構(gòu)造請(qǐng)求時(shí)通過headers參數(shù)直接構(gòu)造,也可以通過調(diào)用請(qǐng)求實(shí)例的add_header()方法添加。

添加請(qǐng)求頭最常用的用法就是通過修改User-Agent來偽裝瀏覽器,默認(rèn)的User-Agent是Python-urllib,我們可以通過修改它來偽裝瀏覽器。比如要偽裝火狐瀏覽器,你可以把它設(shè)置為:

Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11

第四個(gè)參數(shù)origin_req_host指的是請(qǐng)求方的host名稱或者IP地址。

第五個(gè)參數(shù)unverifiable表示這個(gè)請(qǐng)求是否是無(wú)法驗(yàn)證的,默認(rèn)是False,意思就是說用戶沒有足夠權(quán)限來選擇接收這個(gè)請(qǐng)求的結(jié)果。例如,我們請(qǐng)求一個(gè)HTML文檔中的圖片,但是我們沒有自動(dòng)抓取圖像的權(quán)限,這時(shí)unverifiable的值就是True`。

第六個(gè)參數(shù)method是一個(gè)字符串,用來指示請(qǐng)求使用的方法,比如GET、POST和PUT等。

下面我們傳入多個(gè)參數(shù)構(gòu)建請(qǐng)求來看一下:

from urllib import request, parse
url = 'http://httpbin.org/post'
headers = {
    'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
    'Host': 'httpbin.org'
}
dict = {
    'name': 'Germey'
}
data = bytes(parse.urlencode(dict), encoding='utf8')
req = request.Request(url=url, data=data, headers=headers, method='POST')
response = request.urlopen(req)
print(response.read().decode('utf-8'))

這里我們通過4個(gè)參數(shù)構(gòu)造了一個(gè)請(qǐng)求,其中url即請(qǐng)求URL,headers中指定了User-Agent和Host,參數(shù)data用urlencode()和bytes()方法轉(zhuǎn)成字節(jié)流。另外,指定了請(qǐng)求方式為POST。

運(yùn)行結(jié)果如下:

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "name": "Germey"
  }, 
  "headers": {
    "Accept-Encoding": "identity", 
    "Content-Length": "11", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"
  }, 
  "json": null, 
  "origin": "219.224.169.11", 
  "url": "http://httpbin.org/post"
}

觀察結(jié)果可以發(fā)現(xiàn),我們成功設(shè)置了data、headers和method。

另外,headers也可以用add_header()方法來添加:

req = request.Request(url=url, data=data, method='POST')
req.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')

如此一來,我們就可以更加方便地構(gòu)造請(qǐng)求,實(shí)現(xiàn)請(qǐng)求的發(fā)送啦。

3. 高級(jí)用法

在上面的過程中,我們雖然可以構(gòu)造請(qǐng)求,但是對(duì)于一些更高級(jí)的操作(比如Cookies處理、代理設(shè)置等),我們?cè)撛趺崔k呢?

接下來,就需要更強(qiáng)大的工具Handler登場(chǎng)了。簡(jiǎn)而言之,我們可以把它理解為各種處理器,有專門處理登錄驗(yàn)證的,有處理Cookies的,有處理代理設(shè)置的。利用它們,我們幾乎可以做到HTTP請(qǐng)求中所有的事情。

首先,介紹一下urllib.request模塊里的BaseHandler類,它是所有其他Handler的父類,它提供了最基本的方法,例如default_open()、protocol_request()等。

接下來,就有各種Handler子類繼承這個(gè)BaseHandler類,舉例如下。

HTTPDefaultErrorHandler:用于處理HTTP響應(yīng)錯(cuò)誤,錯(cuò)誤都會(huì)拋出HTTPError類型的異常。

HTTPRedirectHandler:用于處理重定向。

HTTPCookieProcessor:用于處理Cookies。

ProxyHandler:用于設(shè)置代理,默認(rèn)代理為空。

HTTPPasswordMgr:用于管理密碼,它維護(hù)了用戶名和密碼的表。

HTTPBasicAuthHandler:用于管理認(rèn)證,如果一個(gè)鏈接打開時(shí)需要認(rèn)證,那么可以用它來解決認(rèn)證問題。

另外,還有其他的Handler類,這里就不一一列舉了,詳情可以參考官方文檔:https://docs.python.org/3/library/urllib.request.html#urllib.request.BaseHandler。

關(guān)于怎么使用它們,現(xiàn)在先不用著急,后面會(huì)有實(shí)例演示。

另一個(gè)比較重要的類就是OpenerDirector,我們可以稱為Opener。我們之前用過urlopen()這個(gè)方法,實(shí)際上它就是urllib為我們提供的一個(gè)Opener。

那么,為什么要引入Opener呢?因?yàn)樾枰獙?shí)現(xiàn)更高級(jí)的功能。之前使用的Request和urlopen()相當(dāng)于類庫(kù)為你封裝好了極其常用的請(qǐng)求方法,利用它們可以完成基本的請(qǐng)求,但是現(xiàn)在不一樣了,我們需要實(shí)現(xiàn)更高級(jí)的功能,所以需要深入一層進(jìn)行配置,使用更底層的實(shí)例來完成操作,所以這里就用到了Opener。

Opener可以使用open()方法,返回的類型和urlopen()如出一轍。那么,它和Handler有什么關(guān)系呢?簡(jiǎn)而言之,就是利用Handler來構(gòu)建Opener。

下面用幾個(gè)實(shí)例來看看它們的用法。

驗(yàn)證

有些網(wǎng)站在打開時(shí)就會(huì)彈出提示框,直接提示你輸入用戶名和密碼,驗(yàn)證成功后才能查看頁(yè)面,如圖3-2所示。

Python3爬蟲是如何發(fā)送請(qǐng)求的

                                                                     圖3-2 驗(yàn)證頁(yè)面

那么,如果要請(qǐng)求這樣的頁(yè)面,該怎么辦呢?借助HTTPBasicAuthHandler就可以完成,相關(guān)代碼如下:

from urllib.request import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler, build_opener
from urllib.error import URLError
username = 'username'
password = 'password'
url = 'http://localhost:5000/'
p = HTTPPasswordMgrWithDefaultRealm()
p.add_password(None, url, username, password)
auth_handler = HTTPBasicAuthHandler(p)
opener = build_opener(auth_handler)
try:
    result = opener.open(url)
    html = result.read().decode('utf-8')
    print(html)
except URLError as e:
    print(e.reason)

這里首先實(shí)例化HTTPBasicAuthHandler對(duì)象,其參數(shù)是HTTPPasswordMgrWithDefaultRealm對(duì)象,它利用add_password()添加進(jìn)去用戶名和密碼,這樣就建立了一個(gè)處理驗(yàn)證的Handler。

接下來,利用這個(gè)Handler并使用build_opener()方法構(gòu)建一個(gè)Opener,這個(gè)Opener在發(fā)送請(qǐng)求時(shí)就相當(dāng)于已經(jīng)驗(yàn)證成功了。

接下來,利用Opener的open()方法打開鏈接,就可以完成驗(yàn)證了。這里獲取到的結(jié)果就是驗(yàn)證后的頁(yè)面源碼內(nèi)容。

代理

在做爬蟲的時(shí)候,免不了要使用代理,如果要添加代理,可以這樣做:

from urllib.error import URLError
from urllib.request import ProxyHandler, build_opener
proxy_handler = ProxyHandler({
    'http': 'http://127.0.0.1:9743',
    'https': 'https://127.0.0.1:9743'
})
opener = build_opener(proxy_handler)
try:
    response = opener.open('https://www.baidu.com')
    print(response.read().decode('utf-8'))
except URLError as e:
    print(e.reason)

這里我們?cè)诒镜卮罱艘粋€(gè)代理,它運(yùn)行在9743端口上。

這里使用了ProxyHandler,其參數(shù)是一個(gè)字典,鍵名是協(xié)議類型(比如HTTP或者HTTPS等),鍵值是代理鏈接,可以添加多個(gè)代理。

然后,利用這個(gè)Handler及build_opener()方法構(gòu)造一個(gè)Opener,之后發(fā)送請(qǐng)求即可。

Cookies

Cookies的處理就需要相關(guān)的Handler了。

我們先用實(shí)例來看看怎樣將網(wǎng)站的Cookies獲取下來,相關(guān)代碼如下:

import http.cookiejar, urllib.request
cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
for item in cookie:
    print(item.name+"="+item.value)

首先,我們必須聲明一個(gè)CookieJar對(duì)象。接下來,就需要利用HTTPCookieProcessor來構(gòu)建一個(gè)Handler,最后利用build_opener()方法構(gòu)建出Opener,執(zhí)行open()函數(shù)即可。

運(yùn)行結(jié)果如下:

BAIDUID=2E65A683F8A8BA3DF521469DF8EFF1E1:FG=1
BIDUPSID=2E65A683F8A8BA3DF521469DF8EFF1E1
H_PS_PSSID=20987_1421_18282_17949_21122_17001_21227_21189_21161_20927
PSTM=1474900615
BDSVRTM=0
BD_HOME=0

可以看到,這里輸出了每條Cookie的名稱和值。

不過既然能輸出,那可不可以輸出成文件格式呢?我們知道Cookies實(shí)際上也是以文本形式保存的。

答案當(dāng)然是肯定的,這里通過下面的實(shí)例來看看:

filename = 'cookies.txt'
cookie = http.cookiejar.MozillaCookieJar(filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True, ignore_expires=True)

這時(shí)CookieJar就需要換成MozillaCookieJar,它在生成文件時(shí)會(huì)用到,是CookieJar的子類,可以用來處理Cookies和文件相關(guān)的事件,比如讀取和保存Cookies,可以將Cookies保存成Mozilla型瀏覽器的Cookies格式。

運(yùn)行之后,可以發(fā)現(xiàn)生成了一個(gè)cookies.txt文件,其內(nèi)容如下:

# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This is a generated file!  Do not edit.
.baidu.com    TRUE    /    FALSE    3622386254    BAIDUID    05AE39B5F56C1DEC474325CDA5
22D44F:FG=1
.baidu.com    TRUE    /    FALSE    3622386254    BIDUPSID    05AE39B5F56C1DEC474325CDA522D44F
.baidu.com    TRUE    /    FALSE        H_PS_PSSID    19638_1453_17710_18240_21091_18560
_17001_21191_21161
.baidu.com    TRUE    /    FALSE    3622386254    PSTM    1474902606
www.baidu.com    FALSE    /    FALSE        BDSVRTM    0
www.baidu.com    FALSE    /    FALSE        BD_HOME    0

另外,LWPCookieJar同樣可以讀取和保存Cookies,但是保存的格式和MozillaCookieJar不一樣,它會(huì)保存成libwww-perl(LWP)格式的Cookies文件。

要保存成LWP格式的Cookies文件,可以在聲明時(shí)就改為:

cookie = http.cookiejar.LWPCookieJar(filename)

此時(shí)生成的內(nèi)容如下:

#LWP-Cookies-2.0
Set-Cookie3: BAIDUID="0CE9C56F598E69DB375B7C294AE5C591:FG=1"; path="/"; domain=".baidu.com"; path_spec; domain_dot; 
expires="2084-10-14 18:25:19Z"; version=0
Set-Cookie3: BIDUPSID=0CE9C56F598E69DB375B7C294AE5C591; path="/"; domain=".baidu.com"; path_spec; domain_dot; 
expires="2084-10-14 18:25:19Z"; version=0
Set-Cookie3: H_PS_PSSID=20048_1448_18240_17944_21089_21192_21161_20929; path="/"; domain=".baidu.com"; path_spec; 
domain_dot; discard; version=0
Set-Cookie3: PSTM=1474902671; path="/"; domain=".baidu.com"; path_spec; domain_dot; expires="2084-10-14 18:25:19Z"; 
version=0
Set-Cookie3: BDSVRTM=0; path="/"; domain="www.baidu.com"; path_spec; discard; version=0
Set-Cookie3: BD_HOME=0; path="/"; domain="www.baidu.com"; path_spec; discard; version=0

由此看來,生成的格式還是有比較大差異的。

那么,生成了Cookies文件后,怎樣從文件中讀取并利用呢?

下面我們以LWPCookieJar格式為例來看一下:

cookie = http.cookiejar.LWPCookieJar()
cookie.load('cookies.txt', ignore_discard=True, ignore_expires=True)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
print(response.read().decode('utf-8'))

可以看到,這里調(diào)用load()方法來讀取本地的Cookies文件,獲取到了Cookies的內(nèi)容。不過前提是我們首先生成了LWPCookieJar格式的Cookies,并保存成文件,然后讀取Cookies之后使用同樣的方法構(gòu)建Handler和Opener即可完成操作。

運(yùn)行結(jié)果正常的話,會(huì)輸出百度網(wǎng)頁(yè)的源代碼。

通過上面的方法,我們可以實(shí)現(xiàn)絕大多數(shù)請(qǐng)求功能的設(shè)置了。

這便是urllib庫(kù)中request模塊的基本用法

以上是Python3爬蟲是如何發(fā)送請(qǐng)求的的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI