摘要:上一篇文章網絡爬蟲實戰使用處理異常下一篇文章網絡爬蟲實戰使用分析協議庫里還提供了這個模塊,它定義了處理的標準接口,例如實現各部分的抽取,合并以及鏈接轉換。上一篇文章網絡爬蟲實戰使用處理異常下一篇文章網絡爬蟲實戰使用分析協議
上一篇文章:Python3網絡爬蟲實戰---21、使用Urllib:處理異常
下一篇文章:Python3網絡爬蟲實戰---23、使用Urllib:分析Robots協議
Urllib 庫里還提供了 parse 這個模塊,它定義了處理 URL 的標準接口,例如實現 URL 各部分的抽取,合并以及鏈接轉換。它支持如下協議的 URL 處理:file、ftp、gopher、hdl、http、https、imap、mailto、 mms、news、nntp、prospero、rsync、rtsp、rtspu、sftp、shttp、 sip、sips、snews、svn、svn+ssh、telnet、wais,本節我們介紹一下該模塊中常用的方法來感受一下它的便捷之處。
1. urlparse()urlparse() 方法可以實現 URL 的識別和分段,我們先用一個實例來感受一下:
from urllib.parse import urlparse result = urlparse("http://www.baidu.com/index.html;user?id=5#comment") print(type(result), result)
在這里我們利用了 urlparse() 方法進行了一個 URL 的解析,首先輸出了解析結果的類型,然后將結果也輸出出來。
運行結果:
ParseResult(scheme="http", netloc="www.baidu.com", path="/index.html", params="user", query="id=5", fragment="comment")
觀察可以看到,返回結果是一個 ParseResult 類型的對象,它包含了六個部分,分別是 scheme、netloc、path、params、query、fragment。
觀察一下實例的URL:
http://www.baidu.com/index.html;user?id=5#comment
urlparse() 方法將其拆分成了六部分,大體觀察可以發現,解析時有特定的分隔符,比如 :// 前面的就是 scheme,代表協議,第一個 / 前面便是 netloc,即域名,分號 ; 前面是 params,代表參數。
所以可以得出一個標準的鏈接格式如下:
scheme://netloc/path;parameters?query#fragment
一個標準的 URL 都會符合這個規則,利用 urlparse() 方法我們可以將它解析拆分開來。
除了這種最基本的解析方式,urlopen() 方法還有其他配置嗎?接下來看一下它的 API 用法:
urllib.parse.urlparse(urlstring, scheme="", allow_fragments=True)
可以看到它有三個參數:
urlstring,是必填項,即待解析的 URL。
scheme,是默認的協議(比如http、https等),假如這個鏈接沒有帶協議信息,會將這個作為默認的協議。
我們用一個實例感受一下:
from urllib.parse import urlparse result = urlparse("www.baidu.com/index.html;user?id=5#comment", scheme="https") print(result)
運行結果:
ParseResult(scheme="https", netloc="", path="www.baidu.com/index.html", params="user", query="id=5", fragment="comment")
可以發現,我們提供的 URL 沒有包含最前面的 scheme 信息,但是通過指定默認的 scheme 參數,返回的結果是 https。
假設我們帶上了 scheme 呢?
result = urlparse("http://www.baidu.com/index.html;user?id=5#comment", scheme="https")
結果如下:
ParseResult(scheme="http", netloc="www.baidu.com", path="/index.html", params="user", query="id=5", fragment="comment")
可見 scheme 參數只有在 URL 中不包含 scheme 信息時才會生效,如果 URL 中有 scheme 信息,那就返回解析出的 scheme。
allow_fragments,即是否忽略 fragment,如果它被設置為 False,fragment 部分就會被忽略,它會被解析為 path、parameters 或者 query 的一部分,fragment 部分為空。
下面我們用一個實例感受一下:
from urllib.parse import urlparse result = urlparse("http://www.baidu.com/index.html;user?id=5#comment", allow_fragments=False) print(result)
運行結果:
ParseResult(scheme="http", netloc="www.baidu.com", path="/index.html", params="user", query="id=5#comment", fragment="")
假設 URL 中不包含 parameters 和 query 呢?
再來一個實例看下:
from urllib.parse import urlparse result = urlparse("http://www.baidu.com/index.html#comment", allow_fragments=False) print(result)
運行結果:
ParseResult(scheme="http", netloc="www.baidu.com", path="/index.html#comment", params="", query="", fragment="")
可以發現當 URL 中不包含 params 和 query 時, fragment 便會被解析為 path 的一部分。
返回結果 ParseResult 實際上是一個元組,我們可以用索引順序來獲取,也可以用屬性名稱獲取,實例如下:
from urllib.parse import urlparse result = urlparse("http://www.baidu.com/index.html#comment", allow_fragments=False) print(result.scheme, result[0], result.netloc, result[1], sep=" ")
在這里我們分別用索引和屬性名獲取了 scheme 和 netloc,運行結果如下:
http http www.baidu.com www.baidu.com
可以發現二者結果是一致的,兩種方法都可以成功獲取。
2. urlunparse()有了 urlparse() 那相應地就有了它的對立方法 urlunparse()。
它接受的參數是一個可迭代對象,但是它的長度必須是 6,否則會拋出參數數量不足或者過多的問題。
先用一個實例感受一下:
from urllib.parse import urlunparse data = ["http", "www.baidu.com", "index.html", "user", "a=6", "comment"] print(urlunparse(data))
參數 data 用了列表類型,當然你也可以用其他的類型如元組或者特定的數據結構。
運行結果如下:
http://www.baidu.com/index.html;user?a=6#comment
這樣我們就成功實現了 URL 的構造。
3. urlsplit()這個和 urlparse() 方法非常相似,只不過它不會多帶帶解析 parameters 這一部分,只返回五個結果。上面例子中的 parameters 會合并到 path中,用一個實例感受一下:
from urllib.parse import urlsplit result = urlsplit("http://www.baidu.com/index.html;user?id=5#comment") print(result)
運行結果:
SplitResult(scheme="http", netloc="www.baidu.com", path="/index.html;user", query="id=5", fragment="comment")
可以發現返回結果是 SplitResult,其實也是一個元組類型,可以用屬性獲取值也可以用索引來獲取,實例如下:
from urllib.parse import urlsplit result = urlsplit("http://www.baidu.com/index.html;user?id=5#comment") print(result.scheme, result[0])
運行結果:
http http4. urlunsplit()
與 urlunparse() 類似,也是將鏈接的各個部分組合成完整鏈接的方法,傳入的也是一個可迭代對象,例如列表、元組等等,唯一的區別是,長度必須為 5。
用一個實例來感受一下:
from urllib.parse import urlunsplit data = ["http", "www.baidu.com", "index.html", "a=6", "comment"] print(urlunsplit(data))
運行結果:
http://www.baidu.com/index.html?a=6#comment
同樣可以完成鏈接的拼接生成。
5. urljoin()有了 urlunparse() 和 urlunsplit() 方法,我們可以完成鏈接的合并,不過前提必須要有特定長度的對象,鏈接的每一部分都要清晰分開。
生成鏈接還有另一個方法,利用 urljoin() 方法我們可以提供一個 base_url(基礎鏈接),新的鏈接作為第二個參數,方法會分析 base_url 的 scheme、netloc、path 這三個內容對新鏈接缺失的部分進行補充,作為結果返回。
我們用幾個實例來感受一下:
from urllib.parse import urljoin print(urljoin("http://www.baidu.com", "FAQ.html")) print(urljoin("http://www.baidu.com", "https://cuiqingcai.com/FAQ.html")) print(urljoin("http://www.baidu.com/about.html", "https://cuiqingcai.com/FAQ.html")) print(urljoin("http://www.baidu.com/about.html", "https://cuiqingcai.com/FAQ.html?question=2")) print(urljoin("http://www.baidu.com?wd=abc", "https://cuiqingcai.com/index.php")) print(urljoin("http://www.baidu.com", "?category=2#comment")) print(urljoin("www.baidu.com", "?category=2#comment")) print(urljoin("www.baidu.com#comment", "?category=2"))
運行結果:
http://www.baidu.com/FAQ.html https://cuiqingcai.com/FAQ.html https://cuiqingcai.com/FAQ.html https://cuiqingcai.com/FAQ.html?question=2 https://cuiqingcai.com/index.php http://www.baidu.com?category=2#comment www.baidu.com?category=2#comment www.baidu.com?category=2
可以發現,base_url 提供了三項內容,scheme、netloc、path,如果這三項在新的鏈接里面不存在,那么就予以補充,如果新的鏈接存在,那么就使用新的鏈接的部分。base_url 中的 parameters、query、fragments 是不起作用的。
通過如上的函數,我們可以輕松地實現鏈接的解析,拼合與生成。
6. urlencode()我們再介紹一個常用的 urlencode() 方法,它在構造 GET 請求參數的時候非常有用,我們用實例感受一下:
from urllib.parse import urlencode params = { "name": "germey", "age": 22 } base_url = "http://www.baidu.com?" url = base_url + urlencode(params) print(url)
我們首先聲明了一個字典,將參數表示出來,然后調用 urlencode() 方法將其序列化為 URL 標準 GET 請求參數。
運行結果:
http://www.baidu.com?name=germey&age=22
可以看到參數就成功由字典類型轉化為 GET 請求參數了。
這個方法非常常用,有時為了更加方便地構造參數,我們會事先用字典來表示,要轉化為 URL 的參數時只需要調用該方法即可。
7. parse_qs()有了序列化必然就有反序列化,如果我們有一串 GET 請求參數,我們利用 parse_qs() 方法就可以將它轉回字典,我們用一個實例感受一下:
from urllib.parse import parse_qs
query = "name=germey&age=22"
print(parse_qs(query))
運行結果:
{"name": ["germey"], "age": ["22"]}
可以看到這樣就成功轉回為字典類型了。
8. parse_qsl()另外還有一個 parse_qsl() 方法可以將參數轉化為元組組成的列表,實例如下:
from urllib.parse import parse_qsl query = "name=germey&age=22" print(parse_qsl(query))
運行結果:
[("name", "germey"), ("age", "22")]
可以看到運行結果是一個列表,列表的每一個元素都是一個元組,元組的第一個內容是參數名,第二個內容是參數值。
9. quote()quote() 方法可以將內容轉化為 URL 編碼的格式,有時候 URL 中帶有中文參數的時候可能導致亂碼的問題,所以我們可以用這個方法將中文字符轉化為 URL 編碼,實例如下:
from urllib.parse import quote keyword = "壁紙" url = "https://www.baidu.com/s?wd=" + quote(keyword) print(url
在這里我們聲明了一個中文的搜索文字,然后用 quote() 方法對其進行 URL 編碼,最后得到的結果如下:
https://www.baidu.com/s?wd=%E...
這樣我們就可以成功實現URL編碼的轉換。
10. unquote()有了 quote() 方法當然還有 unquote() 方法,它可以進行 URL 解碼,實例如下:
from urllib.parse import unquote url = "https://www.baidu.com/s?wd=%E5%A3%81%E7%BA%B8" print(unquote(url))
這是上面得到的 URL 編碼后的結果,我們在這里利用 unquote() 方法進行還原,結果如下:
https://www.baidu.com/s?wd=壁紙
可以看到利用 unquote() 方法可以方便地實現解碼。
11. 結語本節介紹了 parse 模塊的一些常用 URL 處理方法,有了這些方法我們可以方便地實現 URL 的解析和構造,建議熟練掌握。
上一篇文章:Python3網絡爬蟲實戰---21、使用Urllib:處理異常
下一篇文章:Python3網絡爬蟲實戰---23、使用Urllib:分析Robots協議
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44071.html
摘要:比如我們可以設置這就代表我們設置的規則對百度爬蟲是有效的。上一篇文章網絡爬蟲實戰使用解析鏈接下一篇文章網絡爬蟲實戰基本使用 上一篇文章:Python3網絡爬蟲實戰---22、使用Urllib:解析鏈接下一篇文章:Python3網絡爬蟲實戰---24、requests:基本使用 利用 Urllib 的 robotparser 模塊我們可以實現網站 Robots 協議的分析,本節我們來簡...
摘要:最后用來處理正常的邏輯,這是一個較好的異常處理寫法。上一篇文章網絡爬蟲實戰使用發送請求下一篇文章網絡爬蟲實戰使用解析鏈接 上一篇文章:Python3網絡爬蟲實戰---20、使用Urllib:發送請求下一篇文章:Python3網絡爬蟲實戰---22、使用Urllib:解析鏈接 在前面一節我們了解了 Request 的發送過程,但是在網絡情況不好的情況下,出現了異常怎么辦呢?這時如果我們...
摘要:上一篇文章網絡爬蟲實戰使用分析協議下一篇文章在前面一節我們了解了的基本用法,但是其中確實有不方便的地方。發送之后,得到的自然就是,在上面的實例中我們使用了和獲取了內容,不過還有很多屬性和方法可以獲取其他的信息,比如狀態碼等信息。 上一篇文章:Python3網絡爬蟲實戰---23、使用Urllib:分析Robots協議下一篇文章: 在前面一節我們了解了 Urllib 的基本用法,但是其中...
摘要:在前面我們講到了和的概念,我們向網站的服務器發送一個,返回的的便是網頁源代碼。渲染頁面有時候我們在用或抓取網頁時,得到的源代碼實際和瀏覽器中看到的是不一樣的。所以使用基本請求庫得到的結果源代碼可能跟瀏覽器中的頁面源代碼不太一樣。 上一篇文章:Python3網絡爬蟲實戰---16、Web網頁基礎下一篇文章:Python3網絡爬蟲實戰---18、Session和Cookies 爬蟲,即網...
摘要:上一篇文章網絡爬蟲實戰數據爬取下一篇文章網絡爬蟲實戰動態渲染頁面抓取本節我們以今日頭條為例來嘗試通過分析請求來抓取網頁數據的方法,我們這次要抓取的目標是今日頭條的街拍美圖,抓取完成之后將每組圖片分文件夾下載到本地保存下來。 上一篇文章:Python3網絡爬蟲實戰---35、 Ajax數據爬取下一篇文章:Python3網絡爬蟲實戰---37、動態渲染頁面抓取:Selenium 本節我們...
閱讀 3478·2023-04-25 22:45
閱讀 1281·2021-11-11 16:54
閱讀 2789·2019-08-30 15:44
閱讀 3188·2019-08-30 15:44
閱讀 1645·2019-08-30 13:55
閱讀 940·2019-08-29 18:45
閱讀 1194·2019-08-29 17:25
閱讀 1006·2019-08-29 12:59