国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
Python 爬蟲(chóng)之urllib庫(kù),及urllib庫(kù)的4個(gè)模塊的基本了解和使用

一:Python urllib庫(kù)

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

Python3 的 urllib。

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

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

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

二:urllib.request模塊

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

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

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

1、urlopen函數(shù)

語(yǔ)法格式如下:

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

示例:

import urllib.request#導(dǎo)入urllib.request模塊url=urllib.request.urlopen('https://www.baidu.com')#打開(kāi)讀取baidu信息print(url.read().decode('utf-8'))#read獲取所有信息,并decode()命令將網(wǎng)頁(yè)的信息進(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對(duì)象是http.client. HTTPResponse類(lèi)型,主要包含 read、readinto、getheader、getheaders、fileno 等方法,以及 msg、version、status、reason、debuglevel、closed 等屬性。

常用方法:

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

2、Request類(lèi)

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

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

示例:

import urllib.request#導(dǎo)入模塊url = 'https://www.baidu.com'#網(wǎng)頁(yè)連接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,模擬瀏覽器訪問(wèn)req = urllib.request.Request(url=url,headers=headers)#模擬瀏覽器發(fā)送,訪問(wèn)網(wǎng)頁(yè)response = urllib.request.urlopen(req)#獲取頁(yè)面信息print(response.read().decode('utf-8'))

三:urllib.error模塊

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

urllib.error 包含了兩個(gè)方法,URLError 和 HTTPError。

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

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

區(qū)別:

URLError封裝的錯(cuò)誤信息一般是由網(wǎng)絡(luò)引起的,包括url錯(cuò)誤

HTTPError封裝的錯(cuò)誤信息一般是服務(wù)器返回了錯(cuò)誤狀態(tài)碼

關(guān)系:

URLError是OSERROR的子類(lèi),HTTPError是URLError的子類(lèi)

1、URLError 示例

from urllib import requestfrom urllib import errorif __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
  • reason:

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

2、HTTPError示例

from urllib import requestfrom urllib import errorif __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)

返回結(jié)果:

404
  • code

一個(gè) HTTP 狀態(tài)碼,具體定義見(jiàn) RFC 2616。 這個(gè)數(shù)字的值對(duì)應(yīng)于存放在
http.server.BaseHTTPRequestHandler.responses 代碼字典中的某個(gè)值。

  • reason

這通常是一個(gè)解釋本次錯(cuò)誤原因的字符串。

  • headers

導(dǎo)致 HTTPError 的特定 HTTP 請(qǐng)求的 HTTP 響應(yīng)頭。

3、URLError和HTTPError混合使用

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

示例:

from urllib import requestfrom urllib import errorif __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 requestfrom urllib import errorif __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)

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

HTTPError404

四:urllib.parse模塊

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

1、URL 解析

1.1 urlparse()

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

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

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

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

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

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

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

示例:

from urllib.parse import urlparseo = 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)

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

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

以上還可以通過(guò)索引獲取,如通過(guò)

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

1.2 urlunparse()

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

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

示例:

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

結(jié)果:

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

1.3 urlsplit()

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

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

1.4 urlsplit()

urlunsplit()與 urlunparse()類(lèi)似,(構(gòu)造URL),傳入對(duì)象必須是可迭代對(duì)象,且長(zhǎng)度必須是5。

示例:

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

結(jié)果:

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

1.5 urljoin()

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

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

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

2、URL 轉(zhuǎn)碼

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

2.1、編碼quote(string)

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

語(yǔ)法:

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

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

string 可以是 str 或 bytes 對(duì)象。

示例:

from urllib import parseurl = 'http://www.baidu.com/s?wd={}'words = '爬蟲(chóng)'#quote()只能對(duì)字符串進(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

2.2、編碼urlencode()

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

# 導(dǎo)入parse模塊from urllib import parse#調(diào)用parse模塊的urlencode()進(jìn)行編碼query_string = {'wd':'爬蟲(chóng)'}result = parse.urlencode(query_string)# format函數(shù)格式化字符串,進(jìn)行url拼接url = 'http://www.baidu.com/s?{}'.format(result)print(url)

結(jié)果:

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

2.3、解碼unquote(string)

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

示例:

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

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

爬蟲(chóng)

五:urllib.robotparser模塊

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

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

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

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

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

urllib.robotparser 提供了 RobotFileParser 類(lèi),語(yǔ)法如下:

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

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

  • set_url(url) - 設(shè)置 robots.txt 文件的 URL。
  • read() - 讀取 robots.txt URL 并將其輸入解析器。
  • parse(lines) - 解析行參數(shù)。
  • can_fetch(useragent, url) - 如果允許 useragent 按照被解析 robots.txt 文件中的規(guī)則來(lái)獲取 url 則返回 True。
  • mtime() -返回最近一次獲取 robots.txt 文件的時(shí)間。 這適用于需要定期檢查 robots.txt 文件更新情況的長(zhǎng)時(shí)間運(yùn)行的網(wǎng)頁(yè)爬蟲(chóng)。
  • modified() - 將最近一次獲取 robots.txt 文件的時(shí)間設(shè)置為當(dāng)前時(shí)間。
  • crawl_delay(useragent) -為指定的 useragent 從 robots.txt 返回 Crawl-delay 形參。 如果此形參不存在或不適用于指定的 useragent 或者此形參的 robots.txt 條目存在語(yǔ)法錯(cuò)誤,則返回 None。
  • request_rate(useragent) -以 named tuple RequestRate(requests, seconds) 的形式從 robots.txt 返回 Request-rate 形參的內(nèi)容。 如果此形參不存在或不適用于指定的 useragent 或者此形參的 robots.txt 條目存在語(yǔ)法錯(cuò)誤,則返回 None。
  • site_maps() - 以 list() 的形式從 robots.txt 返回 Sitemap 形參的內(nèi)容。 如果此形參不存在或者此形參的 robots.txt 條目存在語(yǔ)法錯(cuò)誤,則返回 None。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
python-13:異常處理
Python如何使用urllib2獲取網(wǎng)絡(luò)資源[轉(zhuǎn)] - python中的網(wǎng)絡(luò)編程 - 不...
urllib與urllib2的學(xué)習(xí)總結(jié)(python2.7.X)
【轉(zhuǎn)帖】使用python爬蟲(chóng)抓站的一些技巧總結(jié):進(jìn)階篇
第 56 天:Python 爬蟲(chóng)之 urllib 包基本使用
Python 3 抓取網(wǎng)頁(yè)資源的 N 種方法
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服