首頁 後端開發 Python教學 詳解Python之urllib爬蟲、request模組和parse模組

詳解Python之urllib爬蟲、request模組和parse模組

Mar 21, 2021 pm 03:15 PM
parse python request urllib

詳解Python之urllib爬蟲、request模組和parse模組

文章目錄

  • urllib
  • request模組
    • 存取URL
    • Request類別
    • 其他類別
  • #parse模組
    • 解析URL
    • 轉義URL
  • robots.txt檔案

#(免費學習推薦:python影片教學

urllib


#urllib是Python中用來處理URL的工具包,原始碼位於/Lib/下。它包含了幾個模組:用於開啟及讀寫的urls的request模組、由request模組引起異常的error模組、用於解析urls的parse模組、用於回應處理的response模組、分析robots.txt檔案的robotparser模組。

注意版本差異。 urllib有3個版本:Python2.X包含urlliburllib2模組,Python3.X把urlliburllib2以及urlparse合成到urllib套件中,而urllib3是新增的第三方工具包。若遇到"No module named urllib2"等問題幾乎都是Python版本不同導致的。

urllib3是一個功能強大、條例清晰、用於HTTP客戶端的Python函式庫。它提供了許多Python標準庫裡所沒有的特性:壓縮編碼、連線池、執行緒安全性、SSL/TLS驗證、HTTP和SCOCKS代理程式等。安裝可以透過pip:pip install urllib3
詳解Python之urllib爬蟲、request模組和parse模組
# 也可以透過GitHub下載最新程式碼:

git clone git://github.com/shazow/urllib3.git
python setup.py install
登入後複製

urllib3參考文件:https ://urllib3.readthedocs.io/en/latest/

request模組


##urllib.request模組定義了身分認證、重定向、cookies等應用程式中開啟url的函數和類別。

再簡單介紹下

request包,該包用於高級的非底層的HTTP客戶端接口,容錯能力比request模組強大。 request使用的是urllib3,它繼承了urllib2的特性,支援HTTP連接保持和連接池,支援使用cookie保持會話、檔案上傳、自動解壓縮、Unicode回應、HTTP(S)代理等。更多具體可參考文件http://requests.readthedocs.io。

以下將介紹

urllib.request模組常用函數和類別。

訪問URL


一、

urlopen()

urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=false,context=None)
登入後複製
此函數用於抓取URL數據,十分重要。帶有如上所示的參數,除了URL參數外(字串或

Request物件)其餘參數都有預設值。

①URL參數

from urllib import requestwith request.urlopen("http://www.baidu.com") as f:
    print(f.status)
    print(f.getheaders())#运行结果如下200[('Bdpagetype', '1'), ('Bdqid', '0x8583c98f0000787e'), ('Cache-Control', 'private'), ('Content-Type', 'text/html;charset=utf-8'), ('Date', 'Fri, 19 Mar 2021 08:26:03 GMT'), ('Expires', 'Fri, 19 Mar 2021 08:25:27 GMT'), ('P3p', 'CP=" OTI DSP COR IVA OUR IND COM "'), ('P3p', 'CP=" OTI DSP COR IVA OUR IND COM "'), ('Server', 'BWS/1.1'), ('Set-Cookie', 'BAIDUID=B050D0981EE3A706D726852655C9FA21:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-Cookie', 'BIDUPSID=B050D0981EE3A706D726852655C9FA21; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-Cookie', 'PSTM=1616142363; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-Cookie', 'BAIDUID=B050D0981EE3A706FA20DF440C89F27F:FG=1; max-age=31536000; expires=Sat, 19-Mar-22 08:26:03 GMT; domain=.baidu.com; path=/; version=1; comment=bd'), ('Set-Cookie', 'BDSVRTM=0; path=/'), ('Set-Cookie', 'BD_HOME=1; path=/'), ('Set-Cookie', 'H_PS_PSSID=33272_33710_33690_33594_33600_33624_33714_33265; path=/; domain=.baidu.com'), ('Traceid', '161614236308368819309620754845011048574'), ('Vary', 'Accept-Encoding'), ('Vary', 'Accept-Encoding'), ('X-Ua-Compatible', 'IE=Edge,chrome=1'), ('Connection', 'close'), ('Transfer-Encoding', 'chunked')]
登入後複製
②data參數

如果向伺服器發送數據,那麼data參數必須是一個有數據的
byes對象,否則為None。在Python3.2之後可以是一個iterable物件。若是,則headers中必須帶有Content-Length參數。 HTTP請求使用POST方法時,data必須有資料;使用GET方法時,data寫None即可。

from urllib import parsefrom urllib import request
data = bytes(parse.urlencode({"pro":"value"}),encoding="utf8")response = request.urlopen("http://httpbin.org/post",data=data)print(response.read())#运行结果如下b'{\n  "args": {}, \n  "data": "", \n  "files": {}, \n  "form": {\n    "pro": "value"\n  }, \n  "headers": {\n    "Accept-Encoding": "identity", \n    "Content-Length": "9", \n    "Content-Type": "application/x-www-form-urlencoded", \n    "Host": "httpbin.org", \n    "User-Agent": "Python-urllib/3.9", \n    "X-Amzn-Trace-Id": "Root=1-60545f5e-7428b29435ce744004d98afa"\n  }, \n  "json": null, \n  "origin": "112.48.80.243", \n  "url": "http://httpbin.org/post"\n}\n'
登入後複製
對資料進行

POST請求,需要轉碼bytes類型或iterable類型。這裡透過bytes()進行位元組轉換,考慮到第一個參數為字串,所以需要利用parse模組(下面會講)的urlencode()方法對上傳的資料進行字串轉換,同時指定編碼格式為​​utf8。測試網址httpbin.org可以提供HTTP測試,從傳回的內容可以看出提交以表單form為屬性、以字典為屬性值。

③timeout參數

此參數是可選的,以秒為單位指定一個逾時時間,若超過該時間則任何操作都會被阻止,如果沒有指定,那麼預設會取
sock .GLOBAL_DEFAULT_TIMEOUT對應的值。此參數僅對http、https、ftp連接有效。

逾時後會拋出urllib.error.URLError:異常,可以用try…except來處理異常。

from urllib import request
response = request.urlopen("http://httpbin.org/get",timeout=1)print(response.read())#运行结果如下b'{\n  "args": {}, \n  "headers": {\n    "Accept-Encoding": "identity", \n    "Host": "httpbin.org", \n    "User-Agent": "Python-urllib/3.9", \n    "X-Amzn-Trace-Id": "Root=1-605469dd-76a6d963171127c213d9a9ab"\n  }, \n  "origin": "112.48.80.243", \n  "url": "http://httpbin.org/get"\n}\n'
登入後複製
④傳回物件的常用方法和屬性

除了前三個
urlopen()常用參數外,該函數傳回用作context manager(上下文管理器)的類別文件對象,並包含以下方法:

    geturl():返回請求的URL,通常重定向後的URL照樣能取得到
  • info():返回httplib.HTTPMessage對象,表示遠端伺服器傳回的頭資訊
  • getcode():傳回回應後的HTTP狀態碼
  • status屬性:回傳回應後的HTTP狀態碼
  • msg屬性:請求結果
from urllib import request
response = request.urlopen("http://httpbin.org/get")print(response.geturl())print("===========")print(response.info())print("===========")print(response.getcode())print("===========")print(response.status)print("===========")print(response.msg)
登入後複製
執行結果:


詳解Python之urllib爬蟲、request模組和parse模組 附:狀態碼對應狀態

  • 1xx(informational):请求已经收到,正在进行中。
  • 2xx(successful):请求成功接收,解析,完成。
  • 3xx(Redirection):需要重定向。
  • 4xx(Client Error):客户端问题,请求存在语法错误,网址未找到。
  • 5xx(Server Error):服务器问题。

二、build_opener()

urllib.request.build_opener([handler1 [handler2, ...]])
登入後複製

该函数不支持验证、cookie及其他HTTP高级功能。要支持这些功能必须使用build_opener()函数自定义OpenerDirector对象,称之为Opener。

build_opener()函数返回的是OpenerDirector实例,而且是按给定的顺序链接处理程序的。作为OpenerDirector实例,可以从OpenerDirector类的定义看出他具有addheaders、handlers、handle_open、add_handler()、open()、close()等属性或方法。open()方法与urlopen()函数的功能相同。
詳解Python之urllib爬蟲、request模組和parse模組
上述代码通过修改http报头进行HTTP高级功能操作,然后利用返回对象open()进行请求,返回结果与urlopen()一样,只是内存位置不同而已。

实际上urllib.request.urlopen()方法只是一个Opener,如果安装启动器没有使用urlopen启动,调用的就是OpenerDirector.open()方法。那么如何设置默认全局启动器呢?就涉及下面的install_opener函数。

三、install_opener()

urllib.request.install_opener(opener)
登入後複製

安装OpenerDirector实例作为默认全局启动器。
首先导入request模块,实例化一个HTTPBasicAuthHandler对象,然后通过利用add_password()添加用户名和密码来创建一个认证处理器,利用urllib.request.build_opener()方法来调用该处理器以构建Opener,并使其作为默认全局启动器,这样Opener在发生请求时具备了认证功能。通过Opener的open()方法打开链接完成认证。

詳解Python之urllib爬蟲、request模組和parse模組
当然了,CSDN不需要账号密码也可以访问,读者还可以在其他网站上用自己的账号进行测试。

除了上述方法外,还有将路径转换为URL的pathname2url(path)、将URL转换为路径的url2pathname(path),以及返回方案至代理服务器URL映射字典的getproxies()等方法。

Request类


前面介绍的urlopen()方法可以满足一般基本URL请求,如果需要添加headers信息,就要考虑更为强大的Request类了。Request类是URL请求的抽象,包含了许多参数,并定义了一系列属性和方法。

一、定义

class urllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)
登入後複製
  • 参数url是有效网址的字符串,同urlopen()方法中一样,data参数也是。
  • headers是一个字典,可以通过add_header()以键值进行调用。通常用于爬虫爬取数据时或者Web请求时更改User-Agent标头值参数来进行请求。
  • origin_req_host是原始请求主机,比如请求的是针对HTML文档中的图像的,则该请求主机是包含图像页面所在的主机。
  • Unverifiable指示请求是否是无法验证的。
  • method指示使用的是HTTP请求方法。常用的有GET、POST、PUT、DELETE等,

代码示例:

from urllib import requestfrom urllib import parse
data = parse.urlencode({"name":"baidu"}).encode('utf-8')headers = {'User-Agent':'wzlodq'}req = request.Request(url="http://httpbin.org/post",data=data,headers=headers,method="POST")response = request.urlopen(req)print(response.read())#运行结果如下b'{\n  "args": {}, \n  "data": "", \n  "files": {}, \n  "form": {\n    "name": "baidu"\n  }, \n  "headers": {\n    "Accept-Encoding": "identity", \n    "Content-Length": "10", \n    "Content-Type": "application/x-www-form-urlencoded", \n    "Host": "httpbin.org", \n    "User-Agent": "wzlodq", \n    "X-Amzn-Trace-Id": "Root=1-605491a4-1fcf3df01a8b3c3e22b5edce"\n  }, \n  "json": null, \n  "origin": "112.48.80.34", \n  "url": "http://httpbin.org/post"\n}\n'
登入後複製

注意data参数和前面一样需是字节流类型的,不同的是调用Request类进行请求。

二、属性方法

①Request.full_url
full_url属性包含setter、getter和deleter。如果原始请求URL片段存在,那么得到的full_url将返回原始请求的URL片段,通过添加修饰器@property将原始URL传递给构造函数。
詳解Python之urllib爬蟲、request模組和parse模組

②Request.type:获取请求对象的协议类型。
③Request.host:获取URL主机,可能含有端口的主机。
④Request.origin_req_host:发出请求的原始主机,没有端口。
⑤Request.get_method():返回显示HTTP请求方法的字符串。
詳解Python之urllib爬蟲、request模組和parse模組

插播反爬信息 )博主CSDN地址:https://wzlodq.blog.csdn.net/

⑥Request.add_header(key,val):向请求中添加标头。

from urllib import requestfrom urllib import parse
data = bytes(parse.urlencode({'name':'baidu'}),encoding='utf-8')req = request.Request('http://httpbin.org/post',data,method='POST')req.add_header('User-agent','test')response = request.urlopen(req)print(response.read().decode('utf-8'))
登入後複製

詳解Python之urllib爬蟲、request模組和parse模組
上述代码中,通过add_header()传入了User-Agent,在爬虫过程中,常常通过循环调用该方法来添加不同的User-Agent进行请求,避免服务器针对某一User-Agent的禁用。

其他类


BaseHandler为所有注册处理程序的基类,并且只处理注册的简单机制,从定义上看,BaseHandler提供了一个添加基类的add_parent()方法,后面介绍的类都是继承该类操作的。

  • HTTPErrorProcessor:用于HTTP错误响应过程。
  • HTTPDefaultErrorHandler:用于处理HTTP响应错误。
  • ProxyHandler:用于设置代理。
  • HTTPRedirectHandler:用于设置重定向。
  • HTTPCookieProcessor:用于处理cookie。
  • HEEPBasicAuthHandler:用于管理认证。

parse模块


parse模块用于分解URL字符串为各个组成部分,包括寻址方案、网络位置、路径等,也可将这些部分组成URL字符串,同时可以对“相对URL"进行转换等。

解析URL


一、urllib.parse.urlparse(urlstring,scheme=’’,allow_fragments=True)
解析URL为6个部分,即返回一个6元组(tuple子类的实例),tuple类具有下标所示的属性:

属性 说明 对应下标指数 不存在时的取值
scheme URL方案说明符 0 scheme参数
netloc 网络位置部分 1 空字符串
path 分层路径 2 空字符串
params 最后路径元素的参数 3 空字符串
query 查询组件 4 空字符串
fragment 片段标识符 5 空字符串
username 用户名
None
password 密码
None
hostname 主机名
None
port 端口号
None

最后组成的URL结构为scheme://netloc/path;parameters?query#fragment
举个栗子:

from urllib.parse import *res = urlparse('https://wzlodq.blog.csdn.net/article/details/113597816')print(res)print(res.scheme)print(res.netloc)print(res.path)print(res.params)print(res.query)print(res.username)print(res.password)print(res.hostname)print(res.port)print(res.geturl())print(tuple(res))print(res[0])print(res[1])print(res[2])
登入後複製

詳解Python之urllib爬蟲、request模組和parse模組
需要注意的是urlparse有时并不能很好地识别netloc,它会假定相对URL以路径分量开始,将其取值放在path中。

二、urllib.parse.urlunparse(parts)
urlparse()的逆操作,即将urlparse()返回的原则构建一个URL。
詳解Python之urllib爬蟲、request模組和parse模組

三、urllib.parse.urlsplit(urlstring,scheme=’’.allow_fragments=True)
类似urlparse(),但不会分离参数,即返回的元组对象没有params元素,是一个五元组,对应下标指数也发生了改变。

from urllib.parse import *sp = urlsplit('https://wzlodq.blog.csdn.net/article/details/113597816')print(sp)#运行结果如下SplitResult(scheme='https', netloc='wzlodq.blog.csdn.net', path='/article/details/113597816', query='', fragment='')
登入後複製

四、urllib.parse.urlunsplit(parts)
类似urlunparse(),是urlsplit()的逆操作,不再赘述。

五、urllib.parse.urljoin(base,url,allow_fragments=True)
该函数主要组合基本网址(base)与另一个网址(url)以构建新的完整网址。
相对路径和绝对路径的url组合是不同的,而且相对路径是以最后部分路径进行替换处理的:
詳解Python之urllib爬蟲、request模組和parse模組

六、urllib.parse.urldefrag(url)
根据url进行分割,如果url包含片段标识符,就返回url对应片段标识符前的网址,fragment取片段标识符后的值。如果url没有片段标识符,那么fragment为空字符串。
詳解Python之urllib爬蟲、request模組和parse模組

转义URL


URL转义可以避免某些字符引起歧义,通过引用特殊字符并适当编排非ASCII文本使其作为URL组件安全使用。同时也支持反转这些操作,以便从URL组件内容重新创建原始数据。

一、urllib.parse.quote(string,safe=’/’,encoding=None,errors=None)
使用%xx转义替换string中的特殊字符,其中字母、数字和字符’_.-‘不会进行转义。默认情况下,此函数用于转义URL的路径部分,可选的safe参数指定不应转义的其他ASCII字符——其默认值为’/’。
詳解Python之urllib爬蟲、request模組和parse模組
特别注意的是若string是bytes,encoding和errors就无法指定,否则报错TypeError。

二、urllib.parse.unquote(string,encoding=‘utf-8’,errors=‘replace’)
该函数时quote()的逆操作,即将%xx转义为等效的单字符。参数encoding和errors用来指定%xx编码序列解码为Unicode字符,同bytes.decode()方法。
詳解Python之urllib爬蟲、request模組和parse模組

三、urllib.parse.quote_plus(string,safe=’’,encoding=None,errors=None)
该函数时quote()的增强版,与之不同的是用+替换空格,而且如果原始URL有字符,那么+将被转义。
詳解Python之urllib爬蟲、request模組和parse模組

四、urllib.parse.unquote_plus(string,encoding=‘utf-8’,errors=‘replace’)
类似unquote(),不再赘述。

五、urllib.parse.urlencode(query,doseq=False,safe=’’,encoding=None,errors=None,quote_via=quote_plus)
该函数前面提到过,通常在使用HTTP进行POST请求传递的数据进行编码时使用。
詳解Python之urllib爬蟲、request模組和parse模組

robots.txt文件


robotparser模块很简单,仅定义了3个类(RobotFileParserRuleLineEntry)。从__all__属性来看也就RobotFileParser一个类(用于处理有关特定用户代理是否可以发布robots.txt文件的网站上提前网址内容)。

robots文件类似一个协议文件,搜索引擎访问网站时查看的第一个文件,会告诉爬虫或者蜘蛛程序在服务器上可以查看什么文件。

RobotFileParser类有一个url参数,常用以下方法:

  • set_url():用來設定指向robots.txt檔案的網址。
  • read():讀取robots.txt網址,並將其提供給解析器。
  • parse():用來解析robots.txt檔案。
  • can_fetch():用來判斷是否可提前url。
  • mtime():傳回上次抓取robots.txt檔案的時間。
  • modified():將上次抓取robots.txt檔案的時間設定為目前時間。

詳解Python之urllib爬蟲、request模組和parse模組

大量免費學習推薦,請造訪python教學(影片)

以上是詳解Python之urllib爬蟲、request模組和parse模組的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

在PHP和Python之間進行選擇:指南 在PHP和Python之間進行選擇:指南 Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP和Python:深入了解他們的歷史 PHP和Python:深入了解他們的歷史 Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

vs code 可以在 Windows 8 中運行嗎 vs code 可以在 Windows 8 中運行嗎 Apr 15, 2025 pm 07:24 PM

VS Code可以在Windows 8上運行,但體驗可能不佳。首先確保系統已更新到最新補丁,然後下載與系統架構匹配的VS Code安裝包,按照提示安裝。安裝後,注意某些擴展程序可能與Windows 8不兼容,需要尋找替代擴展或在虛擬機中使用更新的Windows系統。安裝必要的擴展,檢查是否正常工作。儘管VS Code在Windows 8上可行,但建議升級到更新的Windows系統以獲得更好的開發體驗和安全保障。

sublime怎麼運行代碼python sublime怎麼運行代碼python Apr 16, 2025 am 08:48 AM

在 Sublime Text 中運行 Python 代碼,需先安裝 Python 插件,再創建 .py 文件並編寫代碼,最後按 Ctrl B 運行代碼,輸出會在控制台中顯示。

visual studio code 可以用於 python 嗎 visual studio code 可以用於 python 嗎 Apr 15, 2025 pm 08:18 PM

VS Code 可用於編寫 Python,並提供許多功能,使其成為開發 Python 應用程序的理想工具。它允許用戶:安裝 Python 擴展,以獲得代碼補全、語法高亮和調試等功能。使用調試器逐步跟踪代碼,查找和修復錯誤。集成 Git,進行版本控制。使用代碼格式化工具,保持代碼一致性。使用 Linting 工具,提前發現潛在問題。

vscode在哪寫代碼 vscode在哪寫代碼 Apr 15, 2025 pm 09:54 PM

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

See all articles