当前位置:首页 > 每日看点 > 正文内容

Python的爬虫如何应对robots.txt里内容奇怪的网站?

卡卷网8个月前 (04-05)每日看点117

爬虫需谨慎

爬虫是我们日常获取网络资源的一种方式,但网络上盛行一句话叫做 “爬虫爬的好,l a o饭吃到老”

我们在爬虫获取资源的同时也在违法边缘疯狂试探,谁都不知道明天会不会有 船票 寄到家。

所以只有遵纪守法,安全爬虫才能够有美好未来。

robots.txt

那如何才能安全爬虫,那就得遵守我们的 “君子协议:robots.txt”

为什么是“君子协议”

每一个正规网站应该需要一份 robots.txt,但它没有真正禁止爬虫的能力,它只是告诉你我有一份文件,这份文件里有我的规则,你想要调用我的内容,请遵守我的规则,如果不遵守我也没办法。

正因如此,你爬虫时可能不会有什么阻碍,直到收到 船票 法院告诉你,这里有一份 君子协议 你没有遵守,不好意思,你违法了。

Python的爬虫如何应对robots.txt里内容奇怪的网站?  第1张

君子协议

robots.txt 如何获取

一般来讲,所有的 robots.txt 可以在网站根目录获取,例如:

百度的robots.txtbaidu.com/robots.txt

qq的robots.txtqq.com/robots.txt

淘宝的robots.txttaobao.com/robots.txt

很简单,只要 “域名+/+robots.txt”,你可以很容易就获取这份协议。

Python的爬虫如何应对robots.txt里内容奇怪的网站?  第2张

robots.txt

robots.txt长什么样

User-agent: * Allow: /list/* Allow: /list/*?* Disallow: /*?*

这个是从 淘宝 获取的 robots.txt ,可以看到它是按行来说明协议,其中最主要为两部分:

  • User-agent:适用的爬虫名称, * 号表示所有爬虫
  • Allow 或 Disallow:允许或禁止的爬取路径

其他 robots.txt 参数还有:

  • Crawl-delay:设置的爬虫延迟时间
  • Sitemap:指定的网站地图

具体含义

我们以 淘宝robots.txt 来说明具体含义:

  • User-agent:*:所有爬虫都应遵守
  • Allow: /list/*:允许爬取以 /list/ 开头的地址,例如/list/category、/list/123等等
  • Allow: /list/*?*:允许爬取以 /list/ 开头并且包含 查询参数(?后的内容),例如/list/123?sort=asc、/list/category?filter=price等等
  • Disallow: /*?*:禁止爬取任何包含 查询参数(?后的内容),例如/product/123?ref=abc、/search?q=example等等
需要注意虽然因为 Disallow: /*?* 禁止了 类似 /list/123?sort=asc 这样的地址,但因为上面存在 Allow: /list/*?*,所以 /list/123?sort=asc 其实是被允许的。

robots.txt 地址可爬取检测代码

现在我们知道了 robots.txt 文件,所以只要我们遵守这个 君子协议,那么我们就在安全范围内了。

现在我们可以利用 python 来编写一个工具,它可以通过分析 robots.txt 文件,只要输入一个 url,它就给我们返回一个是否可爬取的判断,这样我们就能安心爬取啦!

代码

# -*- coding: utf-8 -*- from urllib.robotparser import RobotFileParser from urllib.parse import urlparse import re def can_crawl(url, user_agent='*'): parsed_url = urlparse(url) # 创建 RobotFileParser 对象 rp = RobotFileParser() # 设置 robots.txt 文件的 URL robots_url = f'{parsed_url.scheme}://{parsed_url.netloc}/robots.txt' rp.set_url(robots_url) # 读取并解析 robots.txt 文件 rp.read() # 判断是否允许爬取 # 检查基础路径是否允许 if rp.can_fetch(user_agent, parsed_url.geturl()): # 这里需要自己通过正则来适配新的规则 # if xxxxxx: # return False return True return False if __name__ == '__main__': target_url = 'https://taobao.com/asda?asdas=232' if can_crawl(target_url, user_agent="MyBot"): print(f'可以爬取: {target_url}') else: print(f'禁止爬取: {target_url}')

RobotFileParser 是属于我们内置 urllib 标准库的一个类,它可以进行 robots.txt 解析并判断 url 的合法性。

RobotFileParser 的协议支持有限,大部分情况下我们可以使用,但也会出现一些规则无法判断的情况,例如 Disallow: /*?*,这些规则需要你自己重新使用正则进行判断。

Python的爬虫如何应对robots.txt里内容奇怪的网站?  第3张

结尾

安全爬虫,遵纪守法,这是我们每个公民的义务和准则。如果你喜欢这篇文章,请给我一个赞吧!

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2025/04/12273.html

分享给朋友:

相关文章

普通人一部手机用多久?

普通人一部手机用多久?

各位知友,你们的现在的手机用了多久了呢?回看国外分析机构TechInsights的报告,目前大家的用机周期是越来越长了,在国内,也达到了「40个月」,就是很多人至少三年半才会换一次手机。仔细想想,不对呀,现在新机不是一直出吗?为什么大家都不...

有了Istio,开发还需要微服务架构吗?

有了Istio,开发还需要微服务架构吗?

Istio 是一个开源的服务网格(Service Mesh),通过它可以实现对服务间通信的管理和监控。对于那些本身没有设计为具备安全功能的传统应用程序,Istio 可以提供一个“透明”的安全保护层,而不需要对应用本身进行任何代码修改。 I...

马云也搞不明白:为什么现在用户偏爱微信支付,而不是支付宝?

这题我会,我教马云一招。你直接把你那破比支付宝的代码全删了,重新写一个。打开支付宝直接就是一个大大的支付码,然后右上角按一下就是扫一扫。你要是还想保留你的其他那些乱七八糟的功能,麻烦将他们全部做到下拉菜单里。你这么设计我不说你能干死微信,但...

为什么神经网络可以解偏微分方程,是什么原理?

为什么神经网络可以解偏微分方程,是什么原理?

题主一直比较关心神经网络在其他科学领域的应用,比如数学、物理学还有生物学,比如AlphaFold。本次带来的这篇文章傅里叶神经网络算子解偏微分方程就是一个很有意思的方向,其实我自己去年在给美国一个客户做兼职预测数字货币期权价格的时候就用到过...

什么样的网站能快速捕获你的心?

什么样的网站能快速捕获你的心?

大家好,我是程序员鱼皮。大家如果平时使用网站或产品时出现了问题,一般都会去寻找 “联系客服” 的位置,从而获得人工的帮助。我们团队的面试刷题产品 - 面试鸭最近就遇到了这样一个难题:明明我们网站右下角就有联系客服按钮、而且我们每道面试题目下...

被网络诈骗了,钱还能追得回来吗?

我刷单被骗,当时不知道怎么办在百度上找个律师说他们能追回,还说不用报警,我傻的就信了,支付了费用签合同,我还是不信他们,报警了,报警没几天警官就连系我追回一笔钱让我注意银行卡到账通知,又过几天我第二笔钱到账了,律师说是他们追回的,要我支付后...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。