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

Python爬蟲庫urllib的使用教程詳解

 更新時(shí)間:2022年11月19日 15:41:18   作者:關(guān)于數(shù)據(jù)分析與可視化  
Python?給人的印象是抓取網(wǎng)頁非常方便,提供這種生產(chǎn)力的,主要依靠的就是?urllib、requests這兩個(gè)模塊。本文主要給大家介紹一下urllib的使用,感興趣的可以了解一下

Python urllib庫

Python urllib庫用于操作網(wǎng)頁URL,并對網(wǎng)頁的內(nèi)容進(jìn)行抓取處理。

urllib包 包含以下幾個(gè)模塊:

  • urllib.request - 打開和讀取URL。
  • urllib.error - 包含urllib.request拋出的異常。
  • urllib.parse - 解析URL。
  • urllib.robotparser - 解析robots.txt文件。

需要用的就是每個(gè)模塊的內(nèi)置方法和函數(shù)。大概方法如下圖:

urllib.request模塊

urllib.request定義了一些打開URL的函數(shù)和類,包含授權(quán)驗(yàn)證、重定向、瀏覽器cookies等。

urllib.request可以模擬瀏覽器的一個(gè)請求發(fā)起過程。

這里主要介紹兩個(gè)常用方法,urlopenRequest

urlopen函數(shù)

語法格式如下:

urllib.request.urlopen(url,?data=None,?[timeout,?]*,?cafile=None,?capath=None,?cadefault=False,?context=None)
  • urlurl地址。
  • data:發(fā)送到服務(wù)器的其他數(shù)據(jù)對象,默認(rèn)為None。
  • timeout:設(shè)置訪問超時(shí)時(shí)間。
  • cafile 和 capathcafileCA證書,capathCA證書的路徑,使用HTTPS需要用到。
  • cadefault:已經(jīng)被棄用。
  • contextssl.SSLContext類型,用來指定SSL設(shè)置。

示例:

import?urllib.request
#導(dǎo)入urllib.request模塊
url=urllib.request.urlopen("https://www.baidu.com")
#打開讀取baidu信息
print(url.read().decode('utf-8'))
#read獲取所有信息,并decode()命令將網(wǎng)頁的信息進(jìn)行解碼

運(yùn)行結(jié)果

<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta content="always" name="
html{color:#000;overflow-y:scroll;overflow:-moz-scrollbars}
body,button,input,select,textarea{font-size:12px;font-family:Arial,sans-serif}  
h1,h2,h3,h4,h5,h6{font-size:100%}                  
em{font-style:normal}
small{font-size:12px}
ol,ul{list-style:none}
a{text-decoration:none}
a:hover{text-decoration:underline}
legend{color:#000}
fieldset,img{border:0}
button,input,select,textarea{font-size:100%} 
...

response對象是http.client.HTTPResponse類型,主要包含read、readinto、getheader、getheaders、fileno等方法,以及msg、versionstatus、reason、debuglevelclosed等屬性。

常用方法:

  • read():是讀取整個(gè)網(wǎng)頁內(nèi)容,也可以指定讀取的長度,如read(300)。獲取到的是二進(jìn)制的亂碼,所以需要用到decode()命令將網(wǎng)頁的信息進(jìn)行解碼。
  • readline(): 讀取文件的一行內(nèi)容。
  • readlines(): 讀取文件的全部內(nèi)容,它會把讀取的內(nèi)容賦值給一個(gè)列表變量。
  • info():返回HTTPMessage對象,表示遠(yuǎn)程服務(wù)器返回的頭信息。
  • getcode():返回Http狀態(tài)碼。如果是http請求,200請求成功完成;404網(wǎng)址未找到。
  • geturl():返回請求的鏈接。

Request 類

我們抓取網(wǎng)頁一般需要對headers(網(wǎng)頁頭信息)進(jìn)行模擬,否則網(wǎng)頁很容易判定程序?yàn)榕老x,從而禁止訪問。這時(shí)候需要使用到urllib.request.Request類:

class?urllib.request.Request(url,?data=None,?headers={},?origin_req_host=None,?unverifiable=False,?method=None)
  • urlurl地址。
  • data:發(fā)送到服務(wù)器的其他數(shù)據(jù)對象,默認(rèn)為None
  • headersHTTP請求的頭部信息,字典格式。
  • origin_req_host:請求的主機(jī)地址,IP或域名。
  • unverifiable:很少用整個(gè)參數(shù),用于設(shè)置網(wǎng)頁是否需要驗(yàn)證,默認(rèn)是False。
  • method:請求方法, 如 GET、POSTDELETE、PUT等。

示例:

import?urllib.request
#導(dǎo)入模塊
url?=?"https://www.baidu.com"
#網(wǎng)頁連接
headers?=?{
"User-Agent":?"Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/80.0.3987.122?Safari/537.36"
}
#定義headers,模擬瀏覽器訪問
req?=?urllib.request.Request(url=url,headers=headers)
#模擬瀏覽器發(fā)送,訪問網(wǎng)頁
response?=?urllib.request.urlopen(req)
#獲取頁面信息
print(response.read().decode("utf-8"))

urllib.error模塊

urllib.error模塊為urllib.request所引發(fā)的異常定義了異常類,基礎(chǔ)異常類是URLError。

urllib.error包含了兩個(gè)方法,URLErrorHTTPError

URLErrorOSError的一個(gè)子類,用于處理程序在遇到問題時(shí)會引發(fā)此異常(或其派生的異常),包含的屬性reason為引發(fā)異常的原因。

HTTPErrorURLError的一個(gè)子類,用于處理特殊HTTP錯(cuò)誤例如作為認(rèn)證請求的時(shí)候,包含的屬性codeHTTP的狀態(tài)碼,reason為引發(fā)異常的原因,headers為導(dǎo)致HTTPError的特定HTTP請求的HTTP響應(yīng)頭。

區(qū)別:

  • URLError封裝的錯(cuò)誤信息一般是由網(wǎng)絡(luò)引起的,包括url錯(cuò)誤。
  • HTTPError封裝的錯(cuò)誤信息一般是服務(wù)器返回了錯(cuò)誤狀態(tài)碼。

關(guān)系:

URLErrorOSERROR的子類,HTTPErrorURLError的子類。

URLError 示例

from?urllib?import?request
from?urllib?import?error

if?__name__?==?"__main__":
????#一個(gè)不存在的連接
????url?=?"http://www.baiiiduuuu.com/"
????req?=?request.Request(url)
????try:
????????response?=?request.urlopen(req)
????????html?=?response.read().decode('utf-8')
????????print(html)
????except?error.URLError?as?e:
????????print(e.reason)

返回結(jié)果

[Errno -2] Name or service not known

此錯(cuò)誤的原因。它可以是一個(gè)消息字符串或另一個(gè)異常實(shí)例。

HTTPError示例

from?urllib?import?request
from?urllib?import?error

if?__name__?==?"__main__":
????#網(wǎng)站服務(wù)器上不存在資源
????url?=?"http://www.baidu.com/no.html"
????req?=?request.Request(url)
????try:
????????response?=?request.urlopen(req)
????????html?=?response.read().decode('utf-8')
????????print(html)
????except?error.HTTPError?as?e:
????????print(e.code)

output

404

URLError和HTTPError混合使用

注意:由于HTTPErrorURLError的子類,所以捕獲的時(shí)候HTTPError要放在URLError的上面。

示例:

from?urllib?import?request
from?urllib?import?error

if?__name__?==?"__main__":
????#網(wǎng)站服務(wù)器上不存在資源
????url?=?"http://www.baidu.com/no.html"
????req?=?request.Request(url)
????try:
????????response?=?request.urlopen(req)
?#???????html?=?response.read().decode('utf-8')
????except?error.HTTPError?as?e:
????????print(e.code)
????except?error.URLError?as?e:
????????print(e.code)

如果不用上面的方法,可以直接用判斷的形式

from?urllib?import?request
from?urllib?import?error

if?__name__?==?"__main__":
????#網(wǎng)站服務(wù)器上不存在資源
????url?=?"http://www.baidu.com/no.html"
????req?=?request.Request(url)
????try:
????????response?=?request.urlopen(req)
?#???????html?=?response.read().decode('utf-8')
????except?error.URLError?as?e:
????????if?hasattr(e,?'code'):
????????????print("HTTPError")
????????????print(e.code)
????????elif?hasattr(e,?'reason'):
????????????print("URLError")
????????????print(e.reason)

output

HTTPError
404

urllib.parse模塊

模塊定義的函數(shù)可分為兩個(gè)主要門類:URL解析和URL轉(zhuǎn)碼。

urlparse()

urllib.parse用于解析URL,格式如下:

urllib.parse.urlparse(urlstring,?scheme='',?allow_fragments=True)

urlstring為字符串的url地址,scheme為協(xié)議類型。

allow_fragments參數(shù)為false,則無法識別片段標(biāo)識符。相反,它們被解析為路徑,參數(shù)或查詢組件的一部分,并fragment在返回值中設(shè)置為空字符串。

標(biāo)準(zhǔn)鏈接格式為:

scheme://netloc/path;params?query#fragment

對象中包含了六個(gè)元素,分別為:協(xié)議(scheme)、域名(netloc)、路徑(path)、路徑參數(shù)(params)、查詢參數(shù)(query)、片段(fragment)。

示例:

from?urllib.parse?import?urlparse

o?=?urlparse("https://docs.python.org/zh-cn/3/library/urllib.parse.html#module-urllib.parse")

print('scheme??:',?o.scheme)
print('netloc??:',?o.netloc)
print('path????:',?o.path)
print('params??:',?o.params)
print('query???:',?o.query)
print('fragment:',?o.fragment)
print('hostname:',?o.hostname)

output

scheme  : https
netloc  : docs.python.org
path    : /zh-cn/3/library/urllib.parse.html
params  :
query   :
fragment: module-urllib.parse
hostname: docs.python.org

以上還可以通過索引獲取,如通過

print(o[0])
...
print(o[5])

urlunparse()

urlunparse()可以實(shí)現(xiàn)URL的構(gòu)造。(構(gòu)造URL

urlunparse()接收一個(gè)是一個(gè)長度為6的可迭代對象,將URL的多個(gè)部分組合為一個(gè)URL。若可迭代對象長度不等于6,則拋出異常。

示例:

from?urllib.parse?import?urlunparse
url_compos?=?['http','www.baidu.com','index.html','user=?test','a=6','comment']
print(urlunparse(url_compos))

output

http://www.baidu.com/index.html;user= test?a=6#comment

urlsplit()

urlsplit()函數(shù)也能對 URL進(jìn)行拆分,所不同的是,urlsplit()并不會把 路徑參數(shù)(params) 從 路徑(path) 中分離出來。

當(dāng)URL中路徑部分包含多個(gè)參數(shù)時(shí),使用urlparse()解析是有問題的,這時(shí)可以使用urlsplit()來解析.

urlunsplit()urlunparse()類似,(構(gòu)造URL),傳入對象必須是可迭代對象,且長度必須是5。

示例:

from?urllib.parse?import?urlunsplit
url_compos?=?['http','www.baidu.com','index.html','user=?test','a?=?2']
print(urlunsplit(url_compos))urlunsplit()

output

http://www.baidu.com/index.html?user= test#a = 2

urljoin()

同樣可以構(gòu)造URL

傳遞一個(gè)基礎(chǔ)鏈接,根據(jù)基礎(chǔ)鏈接可以將某一個(gè)不完整的鏈接拼接為一個(gè)完整鏈接.

注:連接兩個(gè)參數(shù)的url, 將第二個(gè)參數(shù)中缺的部分用第一個(gè)參數(shù)的補(bǔ)齊,如果第二個(gè)有完整的路徑,則以第二個(gè)為主。

URL 轉(zhuǎn)碼

python中提供urllib.parse模塊用來編碼和解碼,分別是urlencode()unquote()

編碼quote(string)

URL轉(zhuǎn)碼函數(shù)的功能是接收程序數(shù)據(jù)并通過對特殊字符進(jìn)行轉(zhuǎn)碼并正確編碼非ASCII文本來將其轉(zhuǎn)為可以安全地用作URL組成部分的形式。它們還支持逆轉(zhuǎn)此操作以便從作為URL組成部分的內(nèi)容中重建原始數(shù)據(jù),如果上述的URL解析函數(shù)還未覆蓋此功能的話

語法:

urllib.parse.quote(string,?safe='/',?encoding=None,?errors=None)

使用%xx轉(zhuǎn)義符替換string中的特殊字符。字母、數(shù)字和 '_.-~' 等字符一定不會被轉(zhuǎn)碼。在默認(rèn)情況下,此函數(shù)只對URL的路徑部分進(jìn)行轉(zhuǎn)碼??蛇x的safe形參額外指定不應(yīng)被轉(zhuǎn)碼的ASCII字符 --- 其默認(rèn)值為 '/'。

string可以是strbytes對象。

示例:

from?urllib?import?parse

url?=?"http://www.baidu.com/s?wd={}"
words?=?"爬蟲"

#quote()只能對字符串進(jìn)行編碼
query_string?=?parse.quote(words)
url?=?url.format(query_string)
print(url)

執(zhí)行結(jié)果:

http://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB

編碼urlencode()

quote()只能對字符串編碼,而urlencode()可以對查詢字符串進(jìn)行編碼。

#?導(dǎo)入parse模塊
from?urllib?import?parse

#調(diào)用parse模塊的urlencode()進(jìn)行編碼
query_string?=?{'wd':'爬蟲'}
result?=?parse.urlencode(query_string)

#?format函數(shù)格式化字符串,進(jìn)行url拼接
url?=?'http://www.baidu.com/s?{}'.format(result)
print(url)

output

http://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB

解碼 unquote(string)

解碼就是對編碼后的url進(jìn)行還原。

示例:

from?urllib?import?parse
string?=?'%E7%88%AC%E8%99%AB'
result?=?parse.unquote(string)
print(result)

執(zhí)行結(jié)果:

爬蟲

urllib.robotparser模塊

(在網(wǎng)絡(luò)爬蟲中基本不會用到,使用較少,僅作了解)

urllib.robotparser用于解析robots.txt文件。

robots.txt(統(tǒng)一小寫)是一種存放于網(wǎng)站根目錄下的robots協(xié)議,它通常用于告訴搜索引擎對網(wǎng)站的抓取規(guī)則。

Robots協(xié)議也稱作爬蟲協(xié)議,機(jī)器人協(xié)議,網(wǎng)絡(luò)爬蟲排除協(xié)議,用來告訴爬蟲哪些頁面是可以爬取的,哪些頁面是不可爬取的。它通常是一個(gè)robots.txt的文本文件,一般放在網(wǎng)站的根目錄上。

當(dāng)爬蟲訪問一個(gè)站點(diǎn)的時(shí)候,會首先檢查這個(gè)站點(diǎn)目錄是否存在robots.txt文件,如果存在,搜索爬蟲會根據(jù)其中定義的爬取范圍進(jìn)行爬取。如果沒有找到這個(gè)文件,搜索爬蟲會訪問所有可直接訪問的頁面。

urllib.robotparser提供了RobotFileParser類,語法如下:

class?urllib.robotparser.RobotFileParser(url='')

這個(gè)類提供了一些可以讀取、解析robots.txt文件的方法:

  • set_url(url) - 設(shè)置robots.txt文件的URL。
  • read() - 讀取robots.txt URL并將其輸入解析器。
  • parse(lines) - 解析行參數(shù)。
  • can_fetch(useragent, url) - 如果允許useragent按照被解析robots.txt文件中的規(guī)則來獲取url則返回True。
  • mtime() - 返回最近一次獲取robots.txt文件的時(shí)間。這適用于需要定期檢查robots.txt文件更新情況的長時(shí)間運(yùn)行的網(wǎng)頁爬蟲。
  • modified() - 將最近一次獲取robots.txt文件的時(shí)間設(shè)置為當(dāng)前時(shí)間。
  • crawl_delay(useragent) - 為指定的useragentrobots.txt 返回Crawl-delay形參。如果此形參不存在或不適用于指定的useragent 或者此形參的robots.txt條目存在語法錯(cuò)誤,則返回None。
  • request_rate(useragent) -以 named tuple RequestRate(requests, seconds)的形式從robots.txt返回Request-rate形參的內(nèi)容。如果此形參不存在或不適用于指定的useragent或者此形參的robots.txt條目存在語法錯(cuò)誤,則返回None。
  • site_maps() - 以list()的形式從robots.txt返回Sitemap形參的內(nèi)容。如果此形參不存在或者此形參的robots.txt條目存在語法錯(cuò)誤,則返回None。

以上就是Python爬蟲庫urllib的使用教程詳解的詳細(xì)內(nèi)容,更多關(guān)于Python爬蟲庫urllib的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Pandas實(shí)現(xiàn)Excel文件讀取,增刪,打開,保存操作

    Pandas實(shí)現(xiàn)Excel文件讀取,增刪,打開,保存操作

    Pandas?是一種基于?NumPy?的開源數(shù)據(jù)分析工具,用于處理和分析大量數(shù)據(jù)。本文將通過Pandas實(shí)現(xiàn)對Excel文件進(jìn)行讀取、增刪、打開、保存等操作,需要的可以參考一下
    2023-04-04
  • Python命令行運(yùn)行文件的實(shí)例方法

    Python命令行運(yùn)行文件的實(shí)例方法

    在本篇文章里小編給大家整理的是一篇關(guān)于Python命令行運(yùn)行文件的實(shí)例方法,有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-03-03
  • windows下pycharm安裝、創(chuàng)建文件、配置默認(rèn)模板

    windows下pycharm安裝、創(chuàng)建文件、配置默認(rèn)模板

    這篇文章主要為大家詳細(xì)介紹了windows下pycharm安裝、創(chuàng)建文件、配置默認(rèn)模板,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • python調(diào)用tcpdump抓包過濾的方法

    python調(diào)用tcpdump抓包過濾的方法

    這篇文章主要為大家詳細(xì)介紹了python調(diào)用tcpdump抓包過濾的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Python中%r和%s的詳解及區(qū)別

    Python中%r和%s的詳解及區(qū)別

    這篇文章主要介紹了Python中%r和%s的詳解及區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • python讀取文件列表并排序的實(shí)現(xiàn)示例

    python讀取文件列表并排序的實(shí)現(xiàn)示例

    本文主要介紹了python讀取文件列表并排序的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 基于numpy.random.randn()與rand()的區(qū)別詳解

    基于numpy.random.randn()與rand()的區(qū)別詳解

    下面小編就為大家分享一篇基于numpy.random.randn()與rand()的區(qū)別詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • 詳解pytorch中squeeze()和unsqueeze()函數(shù)介紹

    詳解pytorch中squeeze()和unsqueeze()函數(shù)介紹

    這篇文章主要介紹了詳解pytorch中squeeze()和unsqueeze()函數(shù)介紹,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 基于Python實(shí)現(xiàn)音頻下載應(yīng)用程序

    基于Python實(shí)現(xiàn)音頻下載應(yīng)用程序

    這篇文章主要介紹了如何使用wxPython、yt_dlp和tqdm庫,開發(fā)一個(gè)簡單直觀的用戶界面,并具備高效的音頻下載功能,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-08-08
  • 原生python實(shí)現(xiàn)knn分類算法

    原生python實(shí)現(xiàn)knn分類算法

    這篇文章主要介紹了原生python實(shí)現(xiàn)knn分類算法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10

最新評論

凤台县| 安徽省| 六盘水市| 武川县| 阳新县| 玉环县| 南城县| 邵阳县| 土默特左旗| 龙胜| 五家渠市| 滁州市| 临清市| 怀仁县| 丹巴县| 文安县| 惠州市| 桑日县| 容城县| 威信县| 泾阳县| 景谷| 蒙自县| 仙游县| 平安县| 竹溪县| 浏阳市| 博白县| 惠水县| 霍城县| 阳城县| 青田县| 湖北省| 吉水县| 冀州市| 柞水县| 双桥区| 芦山县| 高密市| 兴国县| 石台县|