自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

通用爬蟲技術(shù):如何正確從 URL 中移除無(wú)效參數(shù)

網(wǎng)絡(luò) 通信技術(shù)
今天,我們不使用正則表達(dá)式,而使用 Python 自帶的 urllib 模塊中的幾個(gè)函數(shù)來(lái)實(shí)現(xiàn)安全完美的移除無(wú)效字段的方法。

我們知道,URL 由下面幾個(gè)部分組成:

 

其中Query部分,中文叫做查詢參數(shù)。它在 URL 中,是由等號(hào)連接的鍵值對(duì)。這些鍵值對(duì)有一些是有效的,例如:

  1. https://open.163.com/newview/movie/courseintro?newurl=MDAPTVFE8 

這個(gè)網(wǎng)址中的newurl=MDAPTVFE8是不能修改的,一旦你改了,那就不再是這個(gè)頁(yè)面了。

但還有一些網(wǎng)址,他們的查詢參數(shù)對(duì)網(wǎng)頁(yè)的顯示沒有任何影響,例如下面兩個(gè)網(wǎng)址:

  1. https://www.163.com/dy/article/G7NINAJS0514HDK6.html?from=nav 
  2. https://www.163.com/dy/article/G7NINAJS0514HDK6.html 

當(dāng)你訪問(wèn)這兩個(gè)網(wǎng)址,你會(huì)發(fā)現(xiàn)它們打開的是同一個(gè)頁(yè)面。因?yàn)檫@些參數(shù)是給網(wǎng)站用的。網(wǎng)站使用這些參數(shù)來(lái)統(tǒng)計(jì)用戶是從哪個(gè)頁(yè)面跳轉(zhuǎn)到這個(gè)頁(yè)面的。

在我們開發(fā)新聞通用爬蟲的時(shí)候,這種可有可無(wú)的查詢參數(shù)會(huì)對(duì)基于 URL 的去重導(dǎo)致嚴(yán)重干擾。同一篇新聞,可能因?yàn)閺牟煌捻?yè)面跳轉(zhuǎn)過(guò)來(lái),就有不同的查詢參數(shù),那么就可能會(huì)被當(dāng)做多篇不同的新聞。

我們?cè)趯?duì)新聞進(jìn)行去重的時(shí)候,一般會(huì)有一個(gè)三級(jí)去重邏輯:基于 URL 去重,基于新聞?wù)奈淖秩ブ?,基于正文語(yǔ)義去重。他們對(duì)資源的消耗逐漸增加,因此,如果能通過(guò) URL 確認(rèn)是重復(fù)的新聞,就沒有必要經(jīng)過(guò)文本去重;能夠經(jīng)過(guò)文本確認(rèn)是重復(fù)的新聞,就沒有必要使用語(yǔ)義去重。這種無(wú)效的參數(shù),會(huì)導(dǎo)致進(jìn)入第二級(jí)的新聞數(shù)量增加,從而消耗更多的服務(wù)器資源。

為了防止這種無(wú)效的參數(shù)干擾基于 URL 去重的邏輯,因此我們需要提前移除無(wú)效的 URL 參數(shù)。

假設(shè)現(xiàn)在有一個(gè)網(wǎng)址:https://www.kingname.info/article?docid=123&from=nav&output=json&ts=1849304323。我們通過(guò)人工標(biāo)注,已經(jīng)知道,對(duì)于https://www.kingname.info這個(gè)網(wǎng)站,docid和output參數(shù)是有效參數(shù),必須保留;from和ts參數(shù)是無(wú)效參數(shù),可以移除。那么,我們?nèi)绾握_移除這些不需要的參數(shù)字段呢?

肯定有同學(xué)會(huì)說(shuō)使用正則表達(dá)式來(lái)移除。那么你可以試一試,正則表達(dá)式應(yīng)該怎么寫。提示一下,有一些參數(shù)值里面也會(huì)有=符號(hào)、有一些必要字段的值,可能恰好包含無(wú)效字段的名字。

今天,我們不使用正則表達(dá)式,而使用 Python 自帶的 urllib 模塊中的幾個(gè)函數(shù)來(lái)實(shí)現(xiàn)安全完美的移除無(wú)效字段的方法。

這個(gè)方法,需要使用到urlparse parse_qs urlencode和urlunparse。我們來(lái)看一段代碼:

  1. from urllib.parse import urlparse, parse_qs, urlencode, urlunparse 
  2.  
  3. url = 'https://www.kingname.info/article?docid=123&from=nav&output=json&ts=1849304323' 
  4. useless_field = ['from''ts'
  5. parser = urlparse(url) 
  6. query = parser.query 
  7. query_dict = parse_qs(query) 
  8. for field in useless_field: 
  9.     if field in query_dict: 
  10.         query_dict.pop(field) 
  11.  
  12. new_query = urlencode(query_dict, doseq=True
  13. new_parser = parser._replace(query=new_query) 
  14. new_url = urlunparse(new_parser) 
  15. print(new_url) 

運(yùn)行效果如下圖所示:

 

其中urlparse和urlunparse是一對(duì)相反的函數(shù),其中前者把網(wǎng)址轉(zhuǎn)成ParseResult對(duì)象,后者把ParseResult對(duì)象轉(zhuǎn)回網(wǎng)址字符串。

ParseResult對(duì)象的.query屬性,是一個(gè)字符串,格式如下:

 

parse_qs與urlencode也是一對(duì)相反的方法。其中前者把 .query輸出的字符串轉(zhuǎn)成字典,而后者把字段轉(zhuǎn)成.query形式的字符串:

 

當(dāng)我們使用parse_qs把 query轉(zhuǎn)成字典以后,就可以使用字典的.pop方法,把無(wú)效的字段都移除,然后重新生成新的.query字符串。

由于ParseResult對(duì)象的.query屬性是只讀屬性,不能覆蓋,因此我們需要調(diào)用一個(gè)內(nèi)部方法parser._replace把新的.query字段替換上去,生成新的 ParseResult對(duì)象。最后再把它轉(zhuǎn)回網(wǎng)址。

使用這個(gè)方法,我們就可以安全地從 URL 中移除無(wú)效字段,而不用去寫復(fù)雜的正則表達(dá)式了。

本文轉(zhuǎn)載自微信公眾號(hào)「未聞Code」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系未聞Code公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: 未聞Code
相關(guān)推薦

2014-06-27 09:34:03

AngularJS

2020-10-28 08:10:27

URL域名https

2020-12-08 06:19:33

爬蟲Dom樹組件

2024-09-19 20:59:49

2011-08-05 09:17:47

蘋果MySQL移除

2023-03-29 10:58:24

互聯(lián)技術(shù)醫(yī)療保健

2020-12-04 06:39:25

爬蟲網(wǎng)頁(yè)

2021-06-03 09:36:38

鴻蒙HarmonyOS應(yīng)用

2010-01-05 14:49:03

JSON格式

2021-06-08 21:36:24

PyCharm爬蟲Scrapy

2016-12-23 09:51:27

Windows 10OneDrive管理器

2012-01-01 19:30:37

Siri

2021-01-05 05:24:47

Python

2022-11-24 10:24:32

2021-06-01 10:49:41

醫(yī)療技術(shù)數(shù)字醫(yī)療數(shù)字技術(shù)

2022-05-27 12:25:57

智慧城市人工智能

2022-09-14 23:06:45

2018-05-14 15:27:06

Python網(wǎng)絡(luò)爬蟲爬蟲架構(gòu)

2010-05-11 14:30:39

2021-12-31 18:20:44

數(shù)據(jù)云端數(shù)據(jù)遷移
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)