<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Python urllib
庫用於操作網頁URL
,並對網頁的內容進行抓取處理。
urllib
包 包含以下幾個模組:
urllib.request
- 開啟和讀取URL
。urllib.error
- 包含urllib.request
丟擲的異常。urllib.parse
- 解析URL
。urllib.robotparser
- 解析robots.txt
檔案。需要用的就是每個模組的內建方法和函數。大概方法如下圖:
urllib.request
定義了一些開啟URL
的函數和類,包含授權驗證、重定向、瀏覽器cookies
等。
urllib.request
可以模擬瀏覽器的一個請求發起過程。
這裡主要介紹兩個常用方法,urlopen
和Request
。
語法格式如下:
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
url
:url
地址。data
:傳送到伺服器的其他資料物件,預設為None
。timeout
:設定存取超時時間。cafile
和 capath
:cafile
為CA
證書,capath
為CA
證書的路徑,使用HTTPS
需要用到。cadefault
:已經被棄用。context
:ssl.SSLContext
型別,用來指定SSL
設定。範例:
import urllib.request #匯入urllib.request模組 url=urllib.request.urlopen("https://www.baidu.com") #開啟讀取baidu資訊 print(url.read().decode('utf-8')) #read獲取所有資訊,並decode()命令將網頁的資訊進行解碼
執行結果
<!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
、version
、status
、reason
、debuglevel
、closed
等屬性。
常用方法:
read()
:是讀取整個網頁內容,也可以指定讀取的長度,如read(300)
。獲取到的是二進位制的亂碼,所以需要用到decode()
命令將網頁的資訊進行解碼。readline()
: 讀取檔案的一行內容。readlines()
: 讀取檔案的全部內容,它會把讀取的內容賦值給一個列表變數。info()
:返回HTTPMessage
物件,表示遠端伺服器返回的頭資訊。getcode()
:返回Http
狀態碼。如果是http
請求,200請求成功完成;404網址未找到。geturl()
:返回請求的連結。我們抓取網頁一般需要對headers
(網頁頭資訊)進行模擬,否則網頁很容易判定程式為爬蟲,從而禁止存取。這時候需要使用到urllib.request.Request
類:
class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
url
:url
地址。data
:傳送到伺服器的其他資料物件,預設為None
。headers
:HTTP
請求的頭部資訊,字典格式。origin_req_host
:請求的主機地址,IP
或域名。unverifiable
:很少用整個引數,用於設定網頁是否需要驗證,預設是False
。method
:請求方法, 如 GET
、POST
、DELETE
、PUT
等。範例:
import urllib.request #匯入模組 url = "https://www.baidu.com" #網頁連線 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) #模擬瀏覽器傳送,存取網頁 response = urllib.request.urlopen(req) #獲取頁面資訊 print(response.read().decode("utf-8"))
urllib.error
模組為urllib.request
所引發的異常定義了異常類,基礎異常類是URLError
。
urllib.error
包含了兩個方法,URLError
和HTTPError
。
URLError
是OSError
的一個子類,用於處理程式在遇到問題時會引發此異常(或其派生的異常),包含的屬性reason
為引發異常的原因。
HTTPError
是URLError
的一個子類,用於處理特殊HTTP
錯誤例如作為認證請求的時候,包含的屬性code
為HTTP
的狀態碼,reason
為引發異常的原因,headers
為導致HTTPError
的特定HTTP
請求的HTTP
響應頭。
區別:
URLError
封裝的錯誤資訊一般是由網路引起的,包括url
錯誤。HTTPError
封裝的錯誤資訊一般是伺服器返回了錯誤狀態碼。關係:
URLError
是OSERROR
的子類,HTTPError
是URLError
的子類。
from urllib import request from urllib import error if __name__ == "__main__": #一個不存在的連線 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)
返回結果
[Errno -2] Name or service not known
此錯誤的原因。它可以是一個訊息字串或另一個異常範例。
from urllib import request from urllib import error if __name__ == "__main__": #網站伺服器上不存在資源 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
注意:由於HTTPError
是URLError
的子類,所以捕獲的時候HTTPError
要放在URLError
的上面。
範例:
from urllib import request from urllib import error if __name__ == "__main__": #網站伺服器上不存在資源 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__": #網站伺服器上不存在資源 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
模組定義的函數可分為兩個主要門類:URL
解析和URL
轉碼。
urllib.parse
用於解析URL
,格式如下:
urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)
urlstring
為字串的url
地址,scheme
為協定型別。
allow_fragments
引數為false
,則無法識別片段識別符號。相反,它們被解析為路徑,引數或查詢元件的一部分,並fragment
在返回值中設定為空字串。
標準連結格式為:
scheme://netloc/path;params?query#fragment
物件中包含了六個元素,分別為:協定(scheme)、域名(netloc)、路徑(path)、路徑引數(params)、查詢引數(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()
可以實現URL
的構造。(構造URL
)
urlunparse()
接收一個是一個長度為6的可迭代物件,將URL
的多個部分組合為一個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()
函數也能對 URL
進行拆分,所不同的是,urlsplit()
並不會把 路徑引數(params) 從 路徑(path) 中分離出來。
當URL
中路徑部分包含多個引數時,使用urlparse()
解析是有問題的,這時可以使用urlsplit()
來解析.
urlunsplit()
與urlunparse()
類似,(構造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
同樣可以構造URL
。
傳遞一個基礎連結,根據基礎連結可以將某一個不完整的連結拼接為一個完整連結.
注:連線兩個引數的url
, 將第二個引數中缺的部分用第一個引數的補齊,如果第二個有完整的路徑,則以第二個為主。
python
中提供urllib.parse
模組用來編碼和解碼,分別是urlencode()
與unquote()
。
URL
轉碼函數的功能是接收程式資料並通過對特殊字元進行轉碼並正確編碼非ASCII
文字來將其轉為可以安全地用作URL
組成部分的形式。它們還支援逆轉此操作以便從作為URL
組成部分的內容中重建原始資料,如果上述的URL
解析函數還未覆蓋此功能的話
語法:
urllib.parse.quote(string, safe='/', encoding=None, errors=None)
使用%xx
跳脫符替換string
中的特殊字元。字母、數位和 '_.-~' 等字元一定不會被轉碼。在預設情況下,此函數只對URL
的路徑部分進行轉碼。可選的safe
形參額外指定不應被轉碼的ASCII
字元 --- 其預設值為 '/'。
string
可以是str
或bytes
物件。
範例:
from urllib import parse url = "http://www.baidu.com/s?wd={}" words = "爬蟲" #quote()只能對字串進行編碼 query_string = parse.quote(words) url = url.format(query_string) print(url)
執行結果:
http://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB
quote()
只能對字串編碼,而urlencode()
可以對查詢字串進行編碼。
# 匯入parse模組 from urllib import parse #呼叫parse模組的urlencode()進行編碼 query_string = {'wd':'爬蟲'} result = parse.urlencode(query_string) # format函數格式化字串,進行url拼接 url = 'http://www.baidu.com/s?{}'.format(result) print(url)
output
http://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB
解碼就是對編碼後的url
進行還原。
範例:
from urllib import parse string = '%E7%88%AC%E8%99%AB' result = parse.unquote(string) print(result)
執行結果:
爬蟲
(在網路爬蟲中基本不會用到,使用較少,僅作了解)
urllib.robotparser
用於解析robots.txt
檔案。
robots.txt
(統一小寫)是一種存放於網站根目錄下的robots
協定,它通常用於告訴搜尋引擎對網站的抓取規則。
Robots
協定也稱作爬蟲協定,機器人協定,網路爬蟲排除協定,用來告訴爬蟲哪些頁面是可以爬取的,哪些頁面是不可爬取的。它通常是一個robots.txt
的文字檔案,一般放在網站的根目錄上。
當爬蟲存取一個站點的時候,會首先檢查這個站點目錄是否存在robots.txt
檔案,如果存在,搜尋爬蟲會根據其中定義的爬取範圍進行爬取。如果沒有找到這個檔案,搜尋爬蟲會存取所有可直接存取的頁面。
urllib.robotparser
提供了RobotFileParser
類,語法如下:
class urllib.robotparser.RobotFileParser(url='')
這個類提供了一些可以讀取、解析robots.txt
檔案的方法:
set_url(url)
- 設定robots.txt
檔案的URL
。read()
- 讀取robots.txt URL
並將其輸入解析器。parse(lines)
- 解析行引數。can_fetch(useragent, url)
- 如果允許useragent
按照被解析robots.txt
檔案中的規則來獲取url
則返回True
。mtime()
- 返回最近一次獲取robots.txt
檔案的時間。這適用於需要定期檢查robots.txt
檔案更新情況的長時間執行的網頁爬蟲。modified()
- 將最近一次獲取robots.txt
檔案的時間設定為當前時間。crawl_delay(useragent)
- 為指定的useragent
從robots.txt
返回Crawl-delay
形參。如果此形參不存在或不適用於指定的useragent
或者此形參的robots.txt
條目存在語法錯誤,則返回None
。request_rate(useragent)
-以 named tuple RequestRate(requests, seconds)
的形式從robots.txt
返回Request-rate
形參的內容。如果此形參不存在或不適用於指定的useragent
或者此形參的robots.txt
條目存在語法錯誤,則返回None
。site_maps()
- 以list()
的形式從robots.txt
返回Sitemap
形參的內容。如果此形參不存在或者此形參的robots.txt
條目存在語法錯誤,則返回None
。以上就是Python爬蟲庫urllib的使用教學詳解的詳細內容,更多關於Python爬蟲庫urllib的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45