成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---22、使用Urllib:解析鏈接

betacat / 1486人閱讀

摘要:上一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)使用處理異常下一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)使用分析協(xié)議庫(kù)里還提供了這個(gè)模塊,它定義了處理的標(biāo)準(zhǔn)接口,例如實(shí)現(xiàn)各部分的抽取,合并以及鏈接轉(zhuǎn)換。上一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)使用處理異常下一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)使用分析協(xié)議

上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---21、使用Urllib:處理異常
下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---23、使用Urllib:分析Robots協(xié)議

Urllib 庫(kù)里還提供了 parse 這個(gè)模塊,它定義了處理 URL 的標(biāo)準(zhǔn)接口,例如實(shí)現(xiàn) URL 各部分的抽取,合并以及鏈接轉(zhuǎn)換。它支持如下協(xié)議的 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,本節(jié)我們介紹一下該模塊中常用的方法來(lái)感受一下它的便捷之處。

1. urlparse()

urlparse() 方法可以實(shí)現(xiàn) URL 的識(shí)別和分段,我們先用一個(gè)實(shí)例來(lái)感受一下:

from urllib.parse import urlparse

result = urlparse("http://www.baidu.com/index.html;user?id=5#comment")
print(type(result), result)

在這里我們利用了 urlparse() 方法進(jìn)行了一個(gè) URL 的解析,首先輸出了解析結(jié)果的類(lèi)型,然后將結(jié)果也輸出出來(lái)。

運(yùn)行結(jié)果:


ParseResult(scheme="http", netloc="www.baidu.com", path="/index.html", params="user", query="id=5", fragment="comment")

觀察可以看到,返回結(jié)果是一個(gè) ParseResult 類(lèi)型的對(duì)象,它包含了六個(gè)部分,分別是 scheme、netloc、path、params、query、fragment。

觀察一下實(shí)例的URL:

http://www.baidu.com/index.html;user?id=5#comment

urlparse() 方法將其拆分成了六部分,大體觀察可以發(fā)現(xiàn),解析時(shí)有特定的分隔符,比如 :// 前面的就是 scheme,代表協(xié)議,第一個(gè) / 前面便是 netloc,即域名,分號(hào) ; 前面是 params,代表參數(shù)。

所以可以得出一個(gè)標(biāo)準(zhǔn)的鏈接格式如下:

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

一個(gè)標(biāo)準(zhǔn)的 URL 都會(huì)符合這個(gè)規(guī)則,利用 urlparse() 方法我們可以將它解析拆分開(kāi)來(lái)。

除了這種最基本的解析方式,urlopen() 方法還有其他配置嗎?接下來(lái)看一下它的 API 用法:

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

可以看到它有三個(gè)參數(shù):

urlstring,是必填項(xiàng),即待解析的 URL。

scheme,是默認(rèn)的協(xié)議(比如http、https等),假如這個(gè)鏈接沒(méi)有帶協(xié)議信息,會(huì)將這個(gè)作為默認(rèn)的協(xié)議。

我們用一個(gè)實(shí)例感受一下:

from urllib.parse import urlparse

result = urlparse("www.baidu.com/index.html;user?id=5#comment", scheme="https")
print(result)

運(yùn)行結(jié)果:

ParseResult(scheme="https", netloc="", path="www.baidu.com/index.html", params="user", query="id=5", fragment="comment")

可以發(fā)現(xiàn),我們提供的 URL 沒(méi)有包含最前面的 scheme 信息,但是通過(guò)指定默認(rèn)的 scheme 參數(shù),返回的結(jié)果是 https。

假設(shè)我們帶上了 scheme 呢?

result = urlparse("http://www.baidu.com/index.html;user?id=5#comment", scheme="https")

結(jié)果如下:

ParseResult(scheme="http", netloc="www.baidu.com", path="/index.html", params="user", query="id=5", fragment="comment")

可見(jiàn) scheme 參數(shù)只有在 URL 中不包含 scheme 信息時(shí)才會(huì)生效,如果 URL 中有 scheme 信息,那就返回解析出的 scheme。

allow_fragments,即是否忽略 fragment,如果它被設(shè)置為 False,fragment 部分就會(huì)被忽略,它會(huì)被解析為 path、parameters 或者 query 的一部分,fragment 部分為空。

下面我們用一個(gè)實(shí)例感受一下:

from urllib.parse import urlparse

result = urlparse("http://www.baidu.com/index.html;user?id=5#comment", allow_fragments=False)
print(result)

運(yùn)行結(jié)果:

ParseResult(scheme="http", netloc="www.baidu.com", path="/index.html", params="user", query="id=5#comment", fragment="")

假設(shè) URL 中不包含 parameters 和 query 呢?

再來(lái)一個(gè)實(shí)例看下:

from urllib.parse import urlparse

result = urlparse("http://www.baidu.com/index.html#comment", allow_fragments=False)
print(result)

運(yùn)行結(jié)果:

ParseResult(scheme="http", netloc="www.baidu.com", path="/index.html#comment", params="", query="", fragment="")

可以發(fā)現(xiàn)當(dāng) URL 中不包含 params 和 query 時(shí), fragment 便會(huì)被解析為 path 的一部分。

返回結(jié)果 ParseResult 實(shí)際上是一個(gè)元組,我們可以用索引順序來(lái)獲取,也可以用屬性名稱(chēng)獲取,實(shí)例如下:

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,運(yùn)行結(jié)果如下:

http
http
www.baidu.com
www.baidu.com

可以發(fā)現(xiàn)二者結(jié)果是一致的,兩種方法都可以成功獲取。

2. urlunparse()

有了 urlparse() 那相應(yīng)地就有了它的對(duì)立方法 urlunparse()。

它接受的參數(shù)是一個(gè)可迭代對(duì)象,但是它的長(zhǎng)度必須是 6,否則會(huì)拋出參數(shù)數(shù)量不足或者過(guò)多的問(wèn)題。

先用一個(gè)實(shí)例感受一下:

from urllib.parse import urlunparse

data = ["http", "www.baidu.com", "index.html", "user", "a=6", "comment"]
print(urlunparse(data))

參數(shù) data 用了列表類(lèi)型,當(dāng)然你也可以用其他的類(lèi)型如元組或者特定的數(shù)據(jù)結(jié)構(gòu)。

運(yùn)行結(jié)果如下:

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

這樣我們就成功實(shí)現(xiàn)了 URL 的構(gòu)造。

3. urlsplit()

這個(gè)和 urlparse() 方法非常相似,只不過(guò)它不會(huì)多帶帶解析 parameters 這一部分,只返回五個(gè)結(jié)果。上面例子中的 parameters 會(huì)合并到 path中,用一個(gè)實(shí)例感受一下:

from urllib.parse import urlsplit

result = urlsplit("http://www.baidu.com/index.html;user?id=5#comment")
print(result)

運(yùn)行結(jié)果:

SplitResult(scheme="http", netloc="www.baidu.com", path="/index.html;user", query="id=5", fragment="comment")

可以發(fā)現(xiàn)返回結(jié)果是 SplitResult,其實(shí)也是一個(gè)元組類(lèi)型,可以用屬性獲取值也可以用索引來(lái)獲取,實(shí)例如下:

from urllib.parse import urlsplit

result = urlsplit("http://www.baidu.com/index.html;user?id=5#comment")
print(result.scheme, result[0])

運(yùn)行結(jié)果:

http http
4. urlunsplit()

與 urlunparse() 類(lèi)似,也是將鏈接的各個(gè)部分組合成完整鏈接的方法,傳入的也是一個(gè)可迭代對(duì)象,例如列表、元組等等,唯一的區(qū)別是,長(zhǎng)度必須為 5。

用一個(gè)實(shí)例來(lái)感受一下:

from urllib.parse import urlunsplit

data = ["http", "www.baidu.com", "index.html", "a=6", "comment"]
print(urlunsplit(data))

運(yùn)行結(jié)果:

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

同樣可以完成鏈接的拼接生成。

5. urljoin()

有了 urlunparse() 和 urlunsplit() 方法,我們可以完成鏈接的合并,不過(guò)前提必須要有特定長(zhǎng)度的對(duì)象,鏈接的每一部分都要清晰分開(kāi)。

生成鏈接還有另一個(gè)方法,利用 urljoin() 方法我們可以提供一個(gè) base_url(基礎(chǔ)鏈接),新的鏈接作為第二個(gè)參數(shù),方法會(huì)分析 base_url 的 scheme、netloc、path 這三個(gè)內(nèi)容對(duì)新鏈接缺失的部分進(jìn)行補(bǔ)充,作為結(jié)果返回。

我們用幾個(gè)實(shí)例來(lái)感受一下:

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"))

運(yùn)行結(jié)果:

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

可以發(fā)現(xiàn),base_url 提供了三項(xiàng)內(nèi)容,scheme、netloc、path,如果這三項(xiàng)在新的鏈接里面不存在,那么就予以補(bǔ)充,如果新的鏈接存在,那么就使用新的鏈接的部分。base_url 中的 parameters、query、fragments 是不起作用的。

通過(guò)如上的函數(shù),我們可以輕松地實(shí)現(xiàn)鏈接的解析,拼合與生成。

6. urlencode()

我們?cè)俳榻B一個(gè)常用的 urlencode() 方法,它在構(gòu)造 GET 請(qǐng)求參數(shù)的時(shí)候非常有用,我們用實(shí)例感受一下:

from urllib.parse import urlencode

params = {
    "name": "germey",
    "age": 22
}
base_url = "http://www.baidu.com?"
url = base_url + urlencode(params)
print(url)

我們首先聲明了一個(gè)字典,將參數(shù)表示出來(lái),然后調(diào)用 urlencode() 方法將其序列化為 URL 標(biāo)準(zhǔn) GET 請(qǐng)求參數(shù)。

運(yùn)行結(jié)果:

http://www.baidu.com?name=germey&age=22

可以看到參數(shù)就成功由字典類(lèi)型轉(zhuǎn)化為 GET 請(qǐng)求參數(shù)了。

這個(gè)方法非常常用,有時(shí)為了更加方便地構(gòu)造參數(shù),我們會(huì)事先用字典來(lái)表示,要轉(zhuǎn)化為 URL 的參數(shù)時(shí)只需要調(diào)用該方法即可。

7. parse_qs()

有了序列化必然就有反序列化,如果我們有一串 GET 請(qǐng)求參數(shù),我們利用 parse_qs() 方法就可以將它轉(zhuǎn)回字典,我們用一個(gè)實(shí)例感受一下:

from urllib.parse import parse_qs

query = "name=germey&age=22"
print(parse_qs(query))

運(yùn)行結(jié)果:

{"name": ["germey"], "age": ["22"]}

可以看到這樣就成功轉(zhuǎn)回為字典類(lèi)型了。

8. parse_qsl()

另外還有一個(gè) parse_qsl() 方法可以將參數(shù)轉(zhuǎn)化為元組組成的列表,實(shí)例如下:

from urllib.parse import parse_qsl

query = "name=germey&age=22"
print(parse_qsl(query))

運(yùn)行結(jié)果:

[("name", "germey"), ("age", "22")]

可以看到運(yùn)行結(jié)果是一個(gè)列表,列表的每一個(gè)元素都是一個(gè)元組,元組的第一個(gè)內(nèi)容是參數(shù)名,第二個(gè)內(nèi)容是參數(shù)值。

9. quote()

quote() 方法可以將內(nèi)容轉(zhuǎn)化為 URL 編碼的格式,有時(shí)候 URL 中帶有中文參數(shù)的時(shí)候可能導(dǎo)致亂碼的問(wèn)題,所以我們可以用這個(gè)方法將中文字符轉(zhuǎn)化為 URL 編碼,實(shí)例如下:

from urllib.parse import quote

keyword = "壁紙"
url = "https://www.baidu.com/s?wd=" + quote(keyword)
print(url

在這里我們聲明了一個(gè)中文的搜索文字,然后用 quote() 方法對(duì)其進(jìn)行 URL 編碼,最后得到的結(jié)果如下:

https://www.baidu.com/s?wd=%E...

這樣我們就可以成功實(shí)現(xiàn)URL編碼的轉(zhuǎn)換。

10. unquote()

有了 quote() 方法當(dāng)然還有 unquote() 方法,它可以進(jìn)行 URL 解碼,實(shí)例如下:

from urllib.parse import unquote

url = "https://www.baidu.com/s?wd=%E5%A3%81%E7%BA%B8"
print(unquote(url))

這是上面得到的 URL 編碼后的結(jié)果,我們?cè)谶@里利用 unquote() 方法進(jìn)行還原,結(jié)果如下:

https://www.baidu.com/s?wd=壁紙

可以看到利用 unquote() 方法可以方便地實(shí)現(xiàn)解碼。

11. 結(jié)語(yǔ)

本節(jié)介紹了 parse 模塊的一些常用 URL 處理方法,有了這些方法我們可以方便地實(shí)現(xiàn) URL 的解析和構(gòu)造,建議熟練掌握。

上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---21、使用Urllib:處理異常
下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---23、使用Urllib:分析Robots協(xié)議

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44071.html

相關(guān)文章

  • Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---23、使用Urllib:分析Robots協(xié)議

    摘要:比如我們可以設(shè)置這就代表我們?cè)O(shè)置的規(guī)則對(duì)百度爬蟲(chóng)是有效的。上一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)使用解析鏈接下一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)基本使用 上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---22、使用Urllib:解析鏈接下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---24、requests:基本使用 利用 Urllib 的 robotparser 模塊我們可以實(shí)現(xiàn)網(wǎng)站 Robots 協(xié)議的分析,本節(jié)我們來(lái)簡(jiǎn)...

    kaka 評(píng)論0 收藏0
  • Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---21、使用Urllib:處理異常

    摘要:最后用來(lái)處理正常的邏輯,這是一個(gè)較好的異常處理寫(xiě)法。上一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)使用發(fā)送請(qǐng)求下一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)使用解析鏈接 上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---20、使用Urllib:發(fā)送請(qǐng)求下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---22、使用Urllib:解析鏈接 在前面一節(jié)我們了解了 Request 的發(fā)送過(guò)程,但是在網(wǎng)絡(luò)情況不好的情況下,出現(xiàn)了異常怎么辦呢?這時(shí)如果我們...

    hlcfan 評(píng)論0 收藏0
  • Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---24、requests:基本使用

    摘要:上一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)使用分析協(xié)議下一篇文章在前面一節(jié)我們了解了的基本用法,但是其中確實(shí)有不方便的地方。發(fā)送之后,得到的自然就是,在上面的實(shí)例中我們使用了和獲取了內(nèi)容,不過(guò)還有很多屬性和方法可以獲取其他的信息,比如狀態(tài)碼等信息。 上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---23、使用Urllib:分析Robots協(xié)議下一篇文章: 在前面一節(jié)我們了解了 Urllib 的基本用法,但是其中...

    lentrue 評(píng)論0 收藏0
  • Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---17、爬蟲(chóng)基本原理

    摘要:在前面我們講到了和的概念,我們向網(wǎng)站的服務(wù)器發(fā)送一個(gè),返回的的便是網(wǎng)頁(yè)源代碼。渲染頁(yè)面有時(shí)候我們?cè)谟没蜃ト【W(wǎng)頁(yè)時(shí),得到的源代碼實(shí)際和瀏覽器中看到的是不一樣的。所以使用基本請(qǐng)求庫(kù)得到的結(jié)果源代碼可能跟瀏覽器中的頁(yè)面源代碼不太一樣。 上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---16、Web網(wǎng)頁(yè)基礎(chǔ)下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---18、Session和Cookies 爬蟲(chóng),即網(wǎng)...

    hellowoody 評(píng)論0 收藏0
  • Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---36、分析Ajax爬取今日頭條街拍美圖

    摘要:上一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)數(shù)據(jù)爬取下一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)動(dòng)態(tài)渲染頁(yè)面抓取本節(jié)我們以今日頭條為例來(lái)嘗試通過(guò)分析請(qǐng)求來(lái)抓取網(wǎng)頁(yè)數(shù)據(jù)的方法,我們這次要抓取的目標(biāo)是今日頭條的街拍美圖,抓取完成之后將每組圖片分文件夾下載到本地保存下來(lái)。 上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---35、 Ajax數(shù)據(jù)爬取下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---37、動(dòng)態(tài)渲染頁(yè)面抓取:Selenium 本節(jié)我們...

    Leck1e 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<