文章目錄
#(免費學習推薦:python影片教學)
urllib
#urllib
是Python中用來處理URL的工具包,原始碼位於/Lib/下。它包含了幾個模組:用於開啟及讀寫的urls的request
模組、由request
模組引起異常的error
模組、用於解析urls的parse
模組、用於回應處理的response
模組、分析robots.txt檔案的robotparser
模組。
注意版本差異。 urllib
有3個版本:Python2.X包含urllib
、urllib2
模組,Python3.X把urllib
、urllib2
以及urlparse
合成到urllib
套件中,而urllib3
是新增的第三方工具包。若遇到"No module named urllib2"等問題幾乎都是Python版本不同導致的。
urllib3
是一個功能強大、條例清晰、用於HTTP客戶端的Python函式庫。它提供了許多Python標準庫裡所沒有的特性:壓縮編碼、連線池、執行緒安全性、SSL/TLS驗證、HTTP和SCOCKS代理程式等。安裝可以透過pip:pip install urllib3
# 也可以透過GitHub下載最新程式碼:
1 2 |
|
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()
1 |
|
Request物件)其餘參數都有預設值。
1 2 3 |
|
如果向伺服器發送數據,那麼data參數必須是一個有數據的
byes對象,否則為None。在Python3.2之後可以是一個iterable物件。若是,則
headers中必須帶有Content-Length參數。 HTTP請求使用
POST方法時,data必須有資料;使用
GET方法時,data寫None即可。
1 2 |
|
POST請求,需要轉碼
bytes類型或
iterable類型。這裡透過
bytes()進行位元組轉換,考慮到第一個參數為字串,所以需要利用parse模組(下面會講)的
urlencode()方法對上傳的資料進行字串轉換,同時指定編碼格式為utf8。測試網址httpbin.org可以提供HTTP測試,從傳回的內容可以看出提交以表單form為屬性、以字典為屬性值。
此參數是可選的,以秒為單位指定一個逾時時間,若超過該時間則任何操作都會被阻止,如果沒有指定,那麼預設會取
sock .GLOBAL_DEFAULT_TIMEOUT對應的值。此參數僅對http、https、ftp連接有效。
1 2 |
|
除了前三個
urlopen()常用參數外,該函數傳回用作context manager(上下文管理器)的類別文件對象,並包含以下方法:
1 2 |
|
附:狀態碼對應狀態
二、build_opener()
1 |
|
该函数不支持验证、cookie及其他HTTP高级功能。要支持这些功能必须使用build_opener()
函数自定义OpenerDirector对象,称之为Opener。
build_opener()
函数返回的是OpenerDirector实例,而且是按给定的顺序链接处理程序的。作为OpenerDirector实例,可以从OpenerDirector类的定义看出他具有addheaders、handlers、handle_open、add_handler()、open()、close()等属性或方法。open()方法与urlopen()函数的功能相同。
上述代码通过修改http报头进行HTTP高级功能操作,然后利用返回对象open()进行请求,返回结果与urlopen()一样,只是内存位置不同而已。
实际上urllib.request.urlopen()方法只是一个Opener,如果安装启动器没有使用urlopen启动,调用的就是OpenerDirector.open()方法。那么如何设置默认全局启动器呢?就涉及下面的install_opener
函数。
三、install_opener()
1 |
|
安装OpenerDirector实例作为默认全局启动器。
首先导入request
模块,实例化一个HTTPBasicAuthHandler对象,然后通过利用add_password()
添加用户名和密码来创建一个认证处理器,利用urllib.request.build_opener()方法来调用该处理器以构建Opener,并使其作为默认全局启动器,这样Opener在发生请求时具备了认证功能。通过Opener的open()
方法打开链接完成认证。
当然了,CSDN不需要账号密码也可以访问,读者还可以在其他网站上用自己的账号进行测试。
除了上述方法外,还有将路径转换为URL的pathname2url(path)
、将URL转换为路径的url2pathname(path)
,以及返回方案至代理服务器URL映射字典的getproxies()
等方法。
Request类
前面介绍的urlopen()
方法可以满足一般基本URL请求,如果需要添加headers信息,就要考虑更为强大的Request
类了。Request
类是URL请求的抽象,包含了许多参数,并定义了一系列属性和方法。
一、定义
1 |
|
urlopen()
方法中一样,data参数也是。add_header()
以键值进行调用。通常用于爬虫爬取数据时或者Web请求时更改User-Agent标头值参数来进行请求。代码示例:
1 2 |
|
注意data参数和前面一样需是字节流类型的,不同的是调用Request
类进行请求。
二、属性方法
①Request.full_url
full_url属性包含setter、getter和deleter。如果原始请求URL片段存在,那么得到的full_url将返回原始请求的URL片段,通过添加修饰器@property
将原始URL传递给构造函数。
②Request.type:获取请求对象的协议类型。
③Request.host:获取URL主机,可能含有端口的主机。
④Request.origin_req_host:发出请求的原始主机,没有端口。
⑤Request.get_method():返回显示HTTP请求方法的字符串。
(插播反爬信息 )博主CSDN地址:https://wzlodq.blog.csdn.net/
⑥Request.add_header(key,val):向请求中添加标头。
1 2 |
|
上述代码中,通过add_header()
传入了User-Agent,在爬虫过程中,常常通过循环调用该方法来添加不同的User-Agent进行请求,避免服务器针对某一User-Agent的禁用。
其他类
BaseHandler
为所有注册处理程序的基类,并且只处理注册的简单机制,从定义上看,BaseHandler
提供了一个添加基类的add_parent()
方法,后面介绍的类都是继承该类操作的。
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
举个栗子:
1 |
|
需要注意的是urlparse
有时并不能很好地识别netloc,它会假定相对URL以路径分量开始,将其取值放在path中。
二、urllib.parse.urlunparse
(parts)
是urlparse()
的逆操作,即将urlparse()
返回的原则构建一个URL。
三、urllib.parse.urlsplit
(urlstring,scheme=’’.allow_fragments=True)
类似urlparse()
,但不会分离参数,即返回的元组对象没有params元素,是一个五元组,对应下标指数也发生了改变。
1 |
|
四、urllib.parse.urlunsplit
(parts)
类似urlunparse()
,是urlsplit()
的逆操作,不再赘述。
五、urllib.parse.urljoin
(base,url,allow_fragments=True)
该函数主要组合基本网址(base)与另一个网址(url)以构建新的完整网址。
相对路径和绝对路径的url组合是不同的,而且相对路径是以最后部分路径进行替换处理的:
六、urllib.parse.urldefrag
(url)
根据url进行分割,如果url包含片段标识符,就返回url对应片段标识符前的网址,fragment取片段标识符后的值。如果url没有片段标识符,那么fragment为空字符串。
转义URL
URL转义可以避免某些字符引起歧义,通过引用特殊字符并适当编排非ASCII文本使其作为URL组件安全使用。同时也支持反转这些操作,以便从URL组件内容重新创建原始数据。
一、urllib.parse.quote
(string,safe=’/’,encoding=None,errors=None)
使用%xx转义替换string中的特殊字符,其中字母、数字和字符’_.-‘不会进行转义。默认情况下,此函数用于转义URL的路径部分,可选的safe参数指定不应转义的其他ASCII字符——其默认值为’/’。
特别注意的是若string是bytes,encoding和errors就无法指定,否则报错TypeError。
二、urllib.parse.unquote
(string,encoding=‘utf-8’,errors=‘replace’)
该函数时quote()
的逆操作,即将%xx转义为等效的单字符。参数encoding和errors用来指定%xx编码序列解码为Unicode字符,同bytes.decode()
方法。
三、urllib.parse.quote_plus
(string,safe=’’,encoding=None,errors=None)
该函数时quote()
的增强版,与之不同的是用+替换空格,而且如果原始URL有字符,那么+将被转义。
四、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请求传递的数据进行编码时使用。
robots.txt文件
robotparser
模块很简单,仅定义了3个类(RobotFileParser
、RuleLine
、Entry
)。从__all__
属性来看也就RobotFileParser
一个类(用于处理有关特定用户代理是否可以发布robots.txt文件的网站上提前网址内容)。
robots文件类似一个协议文件,搜索引擎访问网站时查看的第一个文件,会告诉爬虫或者蜘蛛程序在服务器上可以查看什么文件。
RobotFileParser
类有一个url参数,常用以下方法:
大量免費學習推薦,請造訪python教學(影片)
以上是詳解Python之urllib爬蟲、request模組和parse模組的詳細內容。更多資訊請關注PHP中文網其他相關文章!