Python的爬虫如何应对robots.txt里内容奇怪的网站?
作者:卡卷网发布时间:2025-04-05 22:38浏览数量:28次评论数量:0次
爬虫需谨慎
爬虫是我们日常获取网络资源的一种方式,但网络上盛行一句话叫做 “爬虫爬的好,l a o饭吃到老”。
我们在爬虫获取资源的同时也在违法边缘疯狂试探,谁都不知道明天会不会有 船票 寄到家。
所以只有遵纪守法,安全爬虫才能够有美好未来。
robots.txt
那如何才能安全爬虫,那就得遵守我们的 “君子协议:robots.txt”。
为什么是“君子协议”
每一个正规网站应该需要一份 robots.txt,但它没有真正禁止爬虫的能力,它只是告诉你我有一份文件,这份文件里有我的规则,你想要调用我的内容,请遵守我的规则,如果不遵守我也没办法。
正因如此,你爬虫时可能不会有什么阻碍,直到收到 船票 法院告诉你,这里有一份 君子协议 你没有遵守,不好意思,你违法了。
robots.txt 如何获取
一般来讲,所有的 robots.txt 可以在网站根目录获取,例如:
百度的robots.txt :http://baidu.com/robots.txt
qq的robots.txt :https://www.qq.com/robots.txt
淘宝的robots.txt :https://www.taobao.com/robots.txt
很简单,只要 “域名+/+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: /*?*,这些规则需要你自己重新使用正则进行判断。
结尾
安全爬虫,遵纪守法,这是我们每个公民的义务和准则。如果你喜欢这篇文章,请给我一个赞吧!
免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。
- 上一篇:什么样的域名比较好?
- 下一篇:目前的点餐系统有那些?
相关推荐

你 发表评论:
欢迎