【问题标题】:Scrapy: How to tell if robots.txt existsScrapy:如何判断 robots.txt 是否存在
【发布时间】:2021-07-26 02:00:31
【问题描述】:

我知道我可以自己检查是否存在 robots.txt 文件,使用 python 并触发 http(s) 请求。由于 Scrapy 正在检查和下载它以便让蜘蛛遵守其中的规则,蜘蛛类中是否有属性或方法或任何东西可以让我知道是否存在 robots.txt 以供抓取给定的网站?

尝试使用爬虫统计信息:

here

self.crawler.stats.inc_value(f'robotstxt/response_status_count/{response.status}')

我对有和没有 robots.txt 的网站进行了几次测试,我可以看到有关 robots.txt 存在的正确信息。例如,在我看到的 spider_close 信号处理程序的 Spider 类中记录 self.crawler.stats.__dict__

'robotstxt/response_status_count/200': 1 带有 robots.txt 的网站 'robotstxt/response_status_count/404': 1 没有robots.txt的网站

如果蜘蛛在抓取过程中遇到多个域,这将不起作用,并且统计结果将类似于:

"robotstxt/response_status_count/200": 1,
"robotstxt/response_status_count/301": 6,
"robotstxt/response_status_count/404": 9,
"robotstxt/response_status_count/403": 1

但我无法将 HTTP 状态代码响应映射到域...

【问题讨论】:

    标签: python scrapy robots.txt


    【解决方案1】:

    我不这么认为,您可能必须根据RobotsTxtMiddleware 制作自定义中间件。它有_parse_robots_robots_error这两个方法,你可以用它们来判断robots.txt是否存在。

    https://github.com/scrapy/scrapy/blob/e27eff47ac9ae9a9b9c43426ebddd424615df50a/scrapy/downloadermiddlewares/robotstxt.py

    【讨论】:

    • 谢谢菲利克斯。我已经用更多细节编辑了我的问题。你是对的,除了使用捕获 robots.txt 请求并最终在某处写入统计信息的自定义中间件之外,没有其他方法(在 Scrapy 内部)来拦截响应。我已经创建了那个简单的中间件并且它可以工作,但我不喜欢观察每一个 Scrapy 请求以实现我的目标的想法。可能在我的工具(其中 Scrapy 只是一个组件)中,我只会发出 HTTP(s) 请求,不会使用中间件。也许对原始 RobotsTxtMiddleware 进行 PR 以获取此信息可能会很有用。我会在 github 上给他们 bug :)
    猜你喜欢
    • 2013-05-12
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2010-12-30
    • 2011-07-14
    • 2023-03-19
    相关资源
    最近更新 更多