最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python爬蟲中urllib3與urllib的區(qū)別是什么

 更新時間:2021年07月19日 10:51:43   作者:李元靜  
Urllib3是一個功能強大,條理清晰,用于HTTP客戶端的Python庫。那么Python爬蟲中urllib3與urllib的區(qū)別是什么,本文就詳細的來介紹一下

urllib庫

urllib 是一個用來處理網(wǎng)絡(luò)請求的python標準庫,它包含4個模塊。

  • urllib.request---請求模塊,用于發(fā)起網(wǎng)絡(luò)請求
  • urllib.parse---解析模塊,用于解析URL
  • urllib.error---異常處理模塊,用于處理request引起的異常
  • urllib.robotparser robots.tx---用于解析robots.txt文件

urllib.request模塊

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

  • 發(fā)起網(wǎng)絡(luò)請求
  • 操作cookie
  • 添加Headers
  • 使用代理

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

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

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

先寫一個簡單的例子:

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

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

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è)置時間,則拋出異常。timeout沒有指定則用系統(tǒng)默認設(shè)置,timeout只對,http,https以及ftp連接起作用。它以秒為單位,比如可以設(shè)置timeout=0.1 超時時間為0.1秒。

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

Request對象

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

1 . 請求頭添加

通過urllib發(fā)送的請求會有一個默認的Headers: “User-Agent”:“Python-urllib/3.6”,指明請求是由urllib發(fā)送的。所以遇到一些驗證User-Agent的網(wǎng)站時,需要我們自定義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ā)爬蟲過程中,對cookie的處理非常重要,urllib的cookie的處理如下案例

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

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

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

print(cookies.cookiejar)

3. 設(shè)置代理

運行爬蟲的時候,經(jīng)常會出現(xiàn)被封IP的情況,這時我們就需要使用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對象
opener = request.build_opener(proxies)

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

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

  • read() 獲取響應返回的數(shù)據(jù),只能用一次
  • readline() 讀取一行
  • info() 獲取響應頭信息
  • geturl() 獲取訪問的url
  • getcode() 返回狀態(tài)碼

urllib.parse模塊

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

from urllib import parse
params = {'wd':'測試', '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模塊主要負責處理異常,如果請求出現(xiàn)錯誤,我們可以用error模塊進行處理 主要包含URLError和HTTPError

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

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

  • Code:請求的狀態(tài)碼
  • reason:錯誤的原因
  • headers:響應的報頭
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模塊主要負責處理爬蟲協(xié)議文件,robots.txt.的解析。

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

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

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

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

  • 支持HTTP和SOCKS代理
  • 支持壓縮編碼
  • 100%測試覆蓋率
  • 具有鏈接池
  • 線程安全
  • 客戶端SLL/TLS驗證
  • 協(xié)助處理重復請求和HTTP重定位
  • 使用multipart編碼上傳文件

因為urllib3并不是Python的標準庫,所以我們使用之前,需要進行下載安裝,具體命令如下所示:

pip install urllib3
#或
conda install urllib3

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

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

GET請求

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

下面,我們來通過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': '機器學習'}, headers=headers)
result = response.data.decode('UTF-8')
print(result)

運行之后,效果如下:

GET請求

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

POST請求

如果需要向服務器提交表單或者比較復雜的數(shù)據(jù),就需要使用到POST請求。POST請求比較簡單,僅僅只是將請求的第一個參數(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)

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

Post請求

HTTP響應頭

使用urllib3庫進行網(wǎng)絡(luò)訪問時,其返回的HTTPResponse。默認有一些攜帶的參數(shù),其中就包括info方法。它能返回響應頭數(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': '機器學習'}, headers=headers)
for key in response.info().keys():
    print('key:',response.info()[key])

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

響應頭數(shù)據(jù)

上傳文件

首先,我們需要簡單的實現(xiàn)一個文件上傳的服務器代碼,這里我們使用Flask搭建一個簡單的服務器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()

運行之后,它會一直等待客戶端上傳文件。

這個時候,我們再來實現(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'))

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

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

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

超時處理

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

其中,連接超時表示在連接的過程中,由于服務器的問題或域名弄錯了,而導致的無法連接的情況拋出的異常。

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

通常,我們超時的設(shè)置有2種,一種是通過http.request(timeout)進行設(shè)置,一種是通過PoolManager()連接池進行設(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進行設(shè)置的超時,是全局超時時間,哪怕你后邊的請求不設(shè)置,也是默認使用的這個超時。如果同時設(shè)置了request的超時,那么以request為準。

到此這篇關(guān)于Python爬蟲中urllib3與urllib的區(qū)別是什么的文章就介紹到這了,更多相關(guān)Python urllib3 urllib內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python操作MySQL數(shù)據(jù)庫的三種方法總結(jié)

    Python操作MySQL數(shù)據(jù)庫的三種方法總結(jié)

    下面小編就為大家分享一篇Python操作MySQL數(shù)據(jù)庫的三種方法總結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Python 套接字 Accept 超時問題解析

    Python 套接字 Accept 超時問題解析

    本文討論了 Python 中套接字的超時功能,該功能對于緩解無限期等待套接字接受的問題是必要的,下面通過本文給大家大家介紹Python 套接字 Accept 超時問題,需要的朋友可以參考下
    2023-06-06
  • 利用Python循環(huán)(包括while&for)各種打印九九乘法表的實例

    利用Python循環(huán)(包括while&for)各種打印九九乘法表的實例

    下面小編就為大家?guī)硪黄肞ython循環(huán)(包括while&for)各種打印九九乘法表的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望對大家有所幫助
    2017-11-11
  • Python子進程subpocess原理及用法解析

    Python子進程subpocess原理及用法解析

    這篇文章主要介紹了Python子進程subpocess原理及用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • 關(guān)于python常見異常以及處理方法

    關(guān)于python常見異常以及處理方法

    這篇文章主要介紹了關(guān)于python常見異常以及處理方法,python用異常對象(exception object)來表示異常情況。遇到錯誤后,會引發(fā)異常,需要的朋友可以參考下
    2023-04-04
  • Python實現(xiàn)半角轉(zhuǎn)全角的方法示例

    Python實現(xiàn)半角轉(zhuǎn)全角的方法示例

    本文介紹了使用Python實現(xiàn)半角字符到全角字符的轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-01-01
  • Python自動化處理日常任務的示例代碼

    Python自動化處理日常任務的示例代碼

    這篇文章主要為大家詳細介紹了如何使用Python自動化處理日常任務,例如自動化文件管理,自動化定時任務,自動化發(fā)送郵件等,有需要的小伙伴可以參考一下
    2025-01-01
  • Python報錯之如何解決matplotlib繪圖中文顯示成框框問題

    Python報錯之如何解決matplotlib繪圖中文顯示成框框問題

    這篇文章主要介紹了Python報錯之如何解決matplotlib繪圖中文顯示成框框問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • dataframe 按條件替換某一列中的值方法

    dataframe 按條件替換某一列中的值方法

    今天小編就為大家分享一篇dataframe 按條件替換某一列中的值方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python實現(xiàn)數(shù)據(jù)濾波的示例詳解

    Python實現(xiàn)數(shù)據(jù)濾波的示例詳解

    這篇文章主要為大家詳細介紹了Python實現(xiàn)數(shù)據(jù)濾波的相關(guān)知識,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以跟隨小編一起學習一下
    2024-03-03

最新評論

大新县| 自治县| 两当县| 延吉市| 留坝县| 繁昌县| 固始县| 尼勒克县| 蕉岭县| 绥中县| 建瓯市| 安塞县| 石家庄市| 新巴尔虎左旗| 尼勒克县| 怀仁县| 玛纳斯县| 开远市| 望谟县| 独山县| 龙南县| 龙泉市| 化德县| 宁陕县| 百色市| 永川市| 孙吴县| 赫章县| 息烽县| 贵港市| 潜江市| 双鸭山市| 兴仁县| 滁州市| 汾阳市| 石渠县| 石门县| 平和县| 河北区| 内江市| 台州市|