真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python爬蟲中urllib3與urllib的區(qū)別有哪些

這篇文章主要介紹“Python爬蟲中urllib3與urllib的區(qū)別有哪些”,在日常操作中,相信很多人在Python爬蟲中urllib3與urllib的區(qū)別有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Python爬蟲中urllib3與urllib的區(qū)別有哪些”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

站在用戶的角度思考問題,與客戶深入溝通,找到安次網(wǎng)站設(shè)計(jì)與安次網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站建設(shè)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋安次地區(qū)。

urllib庫(kù)

urllib 是一個(gè)用來處理網(wǎng)絡(luò)請(qǐng)求的python標(biāo)準(zhǔn)庫(kù),它包含4個(gè)模塊。

  • urllib.request---請(qǐng)求模塊,用于發(fā)起網(wǎng)絡(luò)請(qǐng)求

  • urllib.parse---解析模塊,用于解析URL

  • urllib.error---異常處理模塊,用于處理request引起的異常

  • urllib.robotparser robots.tx---用于解析robots.txt文件

urllib.request模塊

request模塊主要負(fù)責(zé)構(gòu)造和發(fā)起網(wǎng)絡(luò)請(qǐng)求,并在其中添加Headers,Proxy等。 利用它可以模擬瀏覽器的請(qǐng)求發(fā)起過程。

  • 發(fā)起網(wǎng)絡(luò)請(qǐng)求

  • 操作cookie

  • 添加Headers

  • 使用代理

關(guān)于urllib.request.urlopen參數(shù)的介紹

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

urlopen是一個(gè)簡(jiǎn)單發(fā)送網(wǎng)絡(luò)請(qǐng)求的方法。它接收一個(gè)字符串格式的url,它會(huì)向傳入的url發(fā)送網(wǎng)絡(luò)請(qǐng)求,然后返回結(jié)果。

先寫一個(gè)簡(jiǎn)單的例子:

from urllib import request
response = request.urlopen(url="http://www.httpbin.org/get")
print(response.read().decode())

urlopen默認(rèn)會(huì)發(fā)送get請(qǐng)求,當(dāng)傳入data參數(shù)時(shí),則會(huì)發(fā)起POST請(qǐng)求。data參數(shù)是字節(jié)類型、者類文件對(duì)象或可迭代對(duì)象。

from urllib import request
response = request.urlopen(url="http://www.httpbin.org/post",
                           data=b"username=q123&password=123")
print(response.read().decode())

還才可以設(shè)置超時(shí),如果請(qǐng)求超過設(shè)置時(shí)間,則拋出異常。timeout沒有指定則用系統(tǒng)默認(rèn)設(shè)置,timeout只對(duì),http,https以及ftp連接起作用。它以秒為單位,比如可以設(shè)置timeout=0.1 超時(shí)時(shí)間為0.1秒。

from urllib import request
response = request.urlopen(url="https://www.baidu.com/",timeout=0.1)

Request對(duì)象

利用openurl可以發(fā)起最基本的請(qǐng)求,但這幾個(gè)簡(jiǎn)單的參數(shù)不足以構(gòu)建一個(gè)完整的請(qǐng)求,可以利用更強(qiáng)大的Request對(duì)象來構(gòu)建更加完整的請(qǐng)求。

1 . 請(qǐng)求頭添加

通過urllib發(fā)送的請(qǐng)求會(huì)有一個(gè)默認(rèn)的Headers: “User-Agent”:“Python-urllib/3.6”,指明請(qǐng)求是由urllib發(fā)送的。所以遇到一些驗(yàn)證User-Agent的網(wǎng)站時(shí),需要我們自定義Headers把自己偽裝起來。

from urllib import request
headers ={
    "Referer": "https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&tn=baidu&wd=python%20urllib%E5%BA%93&oq=python%2520urllib%25E5%25BA%2593&rsv_pq=947af0af001c94d0&rsv_t=66135egC273yN5Uj589q%2FvA844PvH9087sbPe9ZJsjA8JA10Z2b3%2BtWMpwo&rqlang=cn&rsv_enter=0&prefixsug=python%2520urllib%25E5%25BA%2593&rsp=0",
     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36"
}
response = request.Request(url="https://www.baidu.com/",headers=headers)
response = request.urlopen(response)
print(response.read().decode())

2. 操作cookie

在開發(fā)爬蟲過程中,對(duì)cookie的處理非常重要,urllib的cookie的處理如下案例

from urllib import request
from http import cookiejar
# 創(chuàng)建一個(gè)cookie對(duì)象
cookie = cookiejar.CookieJar()

# 創(chuàng)一個(gè)cookie處理器
cookies = request.HTTPCookieProcessor(cookie)

# 以它為參數(shù),創(chuàng)建opener對(duì)象
opener = request.build_opener(cookies)
# 使用這個(gè)opener 來發(fā)請(qǐng)求
res =opener.open("https://www.baidu.com/")

print(cookies.cookiejar)

3. 設(shè)置代理

運(yùn)行爬蟲的時(shí)候,經(jīng)常會(huì)出現(xiàn)被封IP的情況,這時(shí)我們就需要使用ip代理來處理,urllib的IP代理的設(shè)置如下:

from urllib import request
url ="http://httpbin.org/ip"

#代理地址
proxy ={"http":"172.0.0.1:3128"}

# 代理處理器
proxies =request.ProxyBasicAuthHandler(proxy)

# 創(chuàng)建opener對(duì)象
opener = request.build_opener(proxies)

res =opener.open(url)
print(res.read().decode())

urlib庫(kù)中的類或或者方法,在發(fā)送網(wǎng)絡(luò)請(qǐng)求后,都會(huì)返回一個(gè)urllib.response的對(duì)象。它包含了請(qǐng)求回來的數(shù)據(jù)結(jié)果。它包含了一些屬性和方法,供我們處理返回的結(jié)果

  • read() 獲取響應(yīng)返回的數(shù)據(jù),只能用一次

  • readline() 讀取一行

  • info() 獲取響應(yīng)頭信息

  • geturl() 獲取訪問的url

  • getcode() 返回狀態(tài)碼

urllib.parse模塊

parse.urlencode() 在發(fā)送請(qǐng)求的時(shí)候,往往會(huì)需要傳遞很多的參數(shù),如果用字符串方法去拼接會(huì)比較麻煩,parse.urlencode()方法就是用來拼接url參數(shù)的。

from urllib import parse
params = {"wd":"測(cè)試", "code":1, "height":188}
res = parse.urlencode(params)
print(res)

打印結(jié)果為wd=%E6%B5%8B%E8%AF%95&code=1&height=188

也可以通過parse.parse_qs()方法將它轉(zhuǎn)回字典

print(parse.parse_qs("wd=%E6%B5%8B%E8%AF%95&code=1&height=188"))

urllib.error模塊

error模塊主要負(fù)責(zé)處理異常,如果請(qǐng)求出現(xiàn)錯(cuò)誤,我們可以用error模塊進(jìn)行處理 主要包含URLError和HTTPError

URLError:是error異常模塊的基類,由request模塊產(chǎn)生的異常都可以用這個(gè)類來處理

HTTPError:是URLError的子類,主要包含三個(gè)屬性

  • Code:請(qǐng)求的狀態(tài)碼

  • reason:錯(cuò)誤的原因

  • headers:響應(yīng)的報(bào)頭

from urllib import request,error
try:
    response = request.urlopen("http://pythonsite.com/1111.html")
except error.HTTPError as e:
    print(e.reason)
    print(e.code)
    print(e.headers)
except error.URLError as e:
    print(e.reason)

else:
    print("reqeust successfully")

urllib.robotparse模塊 

robotparse模塊主要負(fù)責(zé)處理爬蟲協(xié)議文件,robots.txt.的解析。

Robots協(xié)議(也稱為爬蟲協(xié)議、機(jī)器人協(xié)議等)的全稱是“網(wǎng)絡(luò)爬蟲排除標(biāo)準(zhǔn)”(Robots Exclusion Protocol),網(wǎng)站通過Robots協(xié)議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取

網(wǎng)絡(luò)庫(kù)urllib3

urllib3是比urllib庫(kù)更強(qiáng)大的存在,目前已經(jīng)有許多的原生系統(tǒng)已經(jīng)開始使用urllib3。

urllib3具有如下優(yōu)點(diǎn):

  • 支持HTTP和SOCKS代理

  • 支持壓縮編碼

  • 100%測(cè)試覆蓋率

  • 具有鏈接池

  • 線程安全

  • 客戶端SLL/TLS驗(yàn)證

  • 協(xié)助處理重復(fù)請(qǐng)求和HTTP重定位

  • 使用multipart編碼上傳文件

因?yàn)閡rllib3并不是Python的標(biāo)準(zhǔn)庫(kù),所以我們使用之前,需要進(jìn)行下載安裝,具體命令如下所示:

pip install urllib3
#或
conda install urllib3

下面,我們來講解urllib3庫(kù)的使用方式。

網(wǎng)絡(luò)請(qǐng)求

GET請(qǐng)求

首先,在我們使用urllib3庫(kù)進(jìn)行網(wǎng)絡(luò)請(qǐng)求時(shí),需創(chuàng)建PoolManager類的實(shí)例,該類用于管理線程池。

下面,我們來通過urllib訪問百度,并返回查詢的結(jié)果,示例如下:

import urllib3

http = urllib3.PoolManager()
url = "http://www.baidu.com/s"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
response = http.request("GET", url, fields={"wd": "機(jī)器學(xué)習(xí)"}, headers=headers)
result = response.data.decode("UTF-8")
print(result)

運(yùn)行之后,效果如下:

Python爬蟲中urllib3與urllib的區(qū)別有哪些

這里,我們通過fields參數(shù)指定GET的請(qǐng)求字段。不過,這里先一步講解了請(qǐng)求頭,其實(shí)是百度有安全機(jī)制,讀者可以去掉headers參數(shù)試試。會(huì)返回百度的安全驗(yàn)證頁面。

POST請(qǐng)求

如果需要向服務(wù)器提交表單或者比較復(fù)雜的數(shù)據(jù),就需要使用到POST請(qǐng)求。POST請(qǐng)求比較簡(jiǎn)單,僅僅只是將請(qǐng)求的第一個(gè)參數(shù)改為“POST”即可。

示例如下:

import urllib3

http = urllib3.PoolManager()
url = "http://httpbin.org/post"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
response = http.request("POST", url, fields={"username": "name", "age": "123456"}, headers=headers)
result = response.data.decode("UTF-8")
print(result)

運(yùn)行之后,返回如下數(shù)據(jù):

Python爬蟲中urllib3與urllib的區(qū)別有哪些

HTTP響應(yīng)頭

使用urllib3庫(kù)進(jìn)行網(wǎng)絡(luò)訪問時(shí),其返回的HTTPResponse。默認(rèn)有一些攜帶的參數(shù),其中就包括info方法。它能返回響應(yīng)頭數(shù)據(jù),示例如下:

import urllib3

http = urllib3.PoolManager()
url = "http://www.baidu.com/s"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
response = http.request("POST", url, fields={"wd": "機(jī)器學(xué)習(xí)"}, headers=headers)
for key in response.info().keys():
    print("key:",response.info()[key])

運(yùn)行之后,返回的響應(yīng)數(shù)據(jù)如下:

Python爬蟲中urllib3與urllib的區(qū)別有哪些

上傳文件

首先,我們需要簡(jiǎn)單的實(shí)現(xiàn)一個(gè)文件上傳的服務(wù)器代碼,這里我們使用Flask搭建一個(gè)簡(jiǎn)單的服務(wù)器Python程序,代碼如下:

import flask
import os

UPLOAD_FILE = "uploads"
app = flask.Flask(__name__)
@app.route("/", methods=["POST"])
def upload_file():
    file = flask.request.files["file"]
    if file:
        file.save(os.path.join(UPLOAD_FILE, os.path.basename(file.filename)))
        return "文件上傳成功"
    else:
        return "文件上傳失敗"

if __name__ == "__main__":
    app.run()

運(yùn)行之后,它會(huì)一直等待客戶端上傳文件。

這個(gè)時(shí)候,我們?cè)賮韺?shí)現(xiàn)urllib3是如何上傳文件的,示例如下:

import urllib3

http = urllib3.PoolManager()
with open("1.jpg", "rb") as f:
    fileData = f.read()
url = "http://127.0.0.1:5000"
response = http.request("POST", url, fields={"file": ("1.jpg", fileData, "image/jpeg")})
print(response.data.decode("UTF-8"))

默認(rèn)flask搭建的服務(wù)器,其接口為5000,也就是通過127.0.0.1:5000進(jìn)行訪問。運(yùn)行之后,就會(huì)在uploads文件夾下創(chuàng)建一個(gè)1.jpg的圖片。

同時(shí),控制臺(tái)會(huì)輸出文件上傳成功,而服務(wù)器會(huì)返回狀態(tài)碼200。

這里,上傳文件就1一個(gè)鍵值對(duì),其中file代表服務(wù)器上傳文件的字段。值的元組里,fileData為文件的二進(jìn)制形式,"image/jpeg"代表上傳文件的格式(可以省略)。

超時(shí)處理

urllib3庫(kù)其HTTP的底層都是基于Socket實(shí)現(xiàn)的,而Socket超時(shí)又分為連接超時(shí)與讀超時(shí)。

其中,連接超時(shí)表示在連接的過程中,由于服務(wù)器的問題或域名弄錯(cuò)了,而導(dǎo)致的無法連接的情況拋出的異常。

讀超時(shí)表示從服務(wù)器讀取數(shù)據(jù)時(shí)由于服務(wù)器的問題,導(dǎo)致長(zhǎng)時(shí)間無法正常讀取數(shù)據(jù)而導(dǎo)致的異常。

通常,我們超時(shí)的設(shè)置有2種,一種是通過http.request(timeout)進(jìn)行設(shè)置,一種是通過PoolManager()連接池進(jìn)行設(shè)置。示例如下:

from urllib3 import *

http = PoolManager(timeout=Timeout(connect=2.0, read=2.0))
with open("1.jpg", "rb") as f:
    fileData = f.read()
url = "http://127.0.0.1:5000"
try:
    response = http.request("POST", url, timeout=Timeout(connect=2.0, read=4.0))
    print(response.data.decode("UTF-8"))
except Exception as e:
    print(e)

需要注意的是,通過連接池PoolManager進(jìn)行設(shè)置的超時(shí),是全局超時(shí)時(shí)間,哪怕你后邊的請(qǐng)求不設(shè)置,也是默認(rèn)使用的這個(gè)超時(shí)。如果同時(shí)設(shè)置了request的超時(shí),那么以request為準(zhǔn)。

到此,關(guān)于“Python爬蟲中urllib3與urllib的區(qū)別有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!


當(dāng)前文章:Python爬蟲中urllib3與urllib的區(qū)別有哪些
當(dāng)前路徑:http://weahome.cn/article/psjpgd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部