通用爬虫技术:如何正确从 URL 中移除无效参数

未闻Code

博主喜欢Python和爬虫,已经出了两本书。这里是他灵感的发源地。关注这个公众号,你的生产效率在三天内就会得到提高。P.S.: 这个公众号日更。
389篇原创内容
公众号

我们知道,URL 由下面几个部分组成:

其中Query部分,中文叫做查询参数。它在 URL 中,是由等号连接的键值对。这些键值对有一些是有效的,例如:

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

这个网址中的newurl=MDAPTVFE8是不能修改的,一旦你改了,那就不再是这个页面了。

但还有一些网址,他们的查询参数对网页的显示没有任何影响,例如下面两个网址:

https://www.163.com/dy/article/G7NINAJS0514HDK6.html?from=navhttps://www.163.com/dy/article/G7NINAJS0514HDK6.html

当你访问这两个网址,你会发现它们打开的是同一个页面。因为这些参数是给网站用的。网站使用这些参数来统计用户是从哪个页面跳转到这个页面的。

在我们开发新闻通用爬虫的时候,这种可有可无的查询参数会对基于 URL 的去重导致严重干扰。同一篇新闻,可能因为从不同的页面跳转过来,就有不同的查询参数,那么就可能会被当做多篇不同的新闻。

我们在对新闻进行去重的时候,一般会有一个三级去重逻辑:基于 URL 去重,基于新闻正文文字去重,基于正文语义去重。他们对资源的消耗逐渐增加,因此,如果能通过 URL 确认是重复的新闻,就没有必要经过文本去重;能够经过文本确认是重复的新闻,就没有必要使用语义去重。这种无效的参数,会导致进入第二级的新闻数量增加,从而消耗更多的服务器资源。

为了防止这种无效的参数干扰基于 URL 去重的逻辑,因此我们需要提前移除无效的 URL 参数。

假设现在有一个网址:https://www.kingname.info/article?docid=123&from=nav&output=json&ts=1849304323。我们通过人工标注,已经知道,对于https://www.kingname.info这个网站,docidoutput参数是有效参数,必须保留;fromts参数是无效参数,可以移除。那么,我们如何正确移除这些不需要的参数字段呢?

肯定有同学会说使用正则表达式来移除。那么你可以试一试,正则表达式应该怎么写。提示一下,有一些参数值里面也会有=符号、有一些必要字段的值,可能恰好包含无效字段的名字。

今天,我们不使用正则表达式,而使用 Python 自带的 urllib 模块中的几个函数来实现安全完美的移除无效字段的方法。

这个方法,需要使用到urlparse parse_qs urlencodeurlunparse。我们来看一段代码:

from urllib.parse import urlparse, parse_qs, urlencode, urlunparse

url = 'https://www.kingname.info/article?docid=123&from=nav&output=json&ts=1849304323'
useless_field = ['from', 'ts']
parser = urlparse(url)
query = parser.query
query_dict = parse_qs(query)
for field in useless_field:
    if field in query_dict:
        query_dict.pop(field)

new_query = urlencode(query_dict, doseq=True)
new_parser = parser._replace(query=new_query)
new_url = urlunparse(new_parser)
print(new_url)

运行效果如下图所示:

其中urlparseurlunparse是一对相反的函数,其中前者把网址转成ParseResult对象,后者把ParseResult对象转回网址字符串。

ParseResult对象的.query属性,是一个字符串,格式如下:

parse_qsurlencode也是一对相反的方法。其中前者把 .query输出的字符串转成字典,而后者把字段转成.query形式的字符串:

当我们使用parse_qsquery转成字典以后,就可以使用字典的.pop方法,把无效的字段都移除,然后重新生成新的.query字符串。

由于ParseResult对象的.query属性是只读属性,不能覆盖,因此我们需要调用一个内部方法parser._replace把新的.query字段替换上去,生成新的 ParseResult对象。最后再把它转回网址。

使用这个方法,我们就可以安全地从 URL 中移除无效字段,而不用去写复杂的正则表达式了。

(0)

相关推荐

  • icrawler:强大简单的图片爬虫库

    icrawler基本用法 内置爬虫 该框架包含6个内置的图像抓取工具. 谷歌 bing 百度 Flickr 通用网站图片爬虫(greedy) UrlList(抓取给定URL列表的图像) 以下是使用内置 ...

  • 成年人在工作中学习PLC技术的正确方式

    工作这么多年遇到过很多想学习PLC编程的人,学习了一段时间后来咨询: 为什么我学习了你推荐的教材,看了你给的资料,却还是没有办法完整编写一个项目的程序呢? 遇到这样的人多了促使我不得不思考,是不是我推 ...

  • 老司机的“操车技术”是不是正确的呢?

    现在的老司机是越来越多了,不知道这些老司机的"操车技术"是不是正确的呢? 很多人第一次开车的时候可能会严格按照教练教的秘法去做,那就是先踩离合,然后再踩刹车,最后再来换低挡位,但是 ...

  • 内旋转超声技术在换热器管束检测中的应用

    随着国民经济的快速发展,换热器是生产过程中重要的特种设备,起着能量转换和传递的作用,被广泛应用在炼油.炼化.石油.石化等化工领域,特别是在炼油.炼化的成套生产装置中.据统计成套生产装置日常的大量故障及 ...

  • 内侧支撑重建增强固定技术在肱骨近端骨折治疗中的研究进展

    常祖豪,张伟,唐佩福,陈华 中国人民解放军总医院骨科医学部 国家骨科与运动康复临床医学研究中心(北京  100853) 基金项目:国家自然科学基金资助项目(81772336) 通信作者:陈华,Emai ...

  • 园林植保技术交流会 (郑州) 精彩进行中

    普及技术.传播知识,郑州绿森园林设备公司会同北京琳海植保科技股份有限公司在河南郑州接连举办了多场关于园林病虫草害高工效防治的专场技术讲座,参会的人员多为园林植保技术人员和单位的养护主管.解决您的养护难 ...

  • 语法最简单的微博通用爬虫weibo_crawler

    weibo_crawle可以做轻度的微博数据采集. 一.支持爬虫 用户信息抓取 用户微博抓取(全量/指定时间段) 用户社交关系抓取(粉丝/关注) 微博评论抓取 基于关键词和时间段(粒度到小时)的微博抓 ...

  • 一文告诉你,爬虫技术到底违不违法,怎么用才合法?

    近几年来,因为开发者使用爬虫技术锒铛入狱的案例越来越多. 2015年,某公司授意五名程序员,利用网络爬虫获取一公司服务器的公交车行驶信息.到站信息等数据.这五名程序员需承担连带责任. 2019年,某公 ...

  • 新型预热预分解技术在硫铝酸盐水泥生产中的应用

    关键字:  预热预分解技术.硫铝酸盐水泥生产应用 摘要:硫铝酸盐水泥的生产除少数厂家采用预热器煅烧工艺,大部分企业仍采用干法中空窑生产工艺,煤耗高,排放超标,污染大,加上管理落后,生产质量不稳定.本文 ...

  • 荧光定量PCR技术在食品检测领域中应用

    随着生活水平提高,人们对食品质量要求越来越高,而目前广泛应用物理.化学.仪器等检测食品方法,由于存在某些局限,已不能满足现代食品安全检测需要.随着生物技术发展,尤其是自从发明聚合酶链式反应(polym ...