【问题标题】:Python RobotFileParser hangs in readPython RobotFileParser 挂起读取
【发布时间】:2020-09-23 21:40:29
【问题描述】:

我正在尝试读取 robots.txt 文件并确定是否允许机器人读取特定页面。

import urllib.robotparser as urobot
import urllib.request

url = "https://example.com"
rp = urobot.RobotFileParser()
rp.set_url(url + "/robots.txt")
rp.read()
if rp.can_fetch("*", URL):
    #do something
else:
    # else do something

虽然上述程序对大多数 URL 运行良好,但它在 rp.read()

处挂起其中的几个

它只是在 read() 处挂起,不会抛出任何异常。

【问题讨论】:

    标签: python-3.x robots.txt


    【解决方案1】:

    根据read()函数的源代码,它主要由2个方法组成:urllib.request.urlopen(self.url)和读取此内容。

    看起来它可能以两种方式“挂起”——发出请求/等待响应以及读取和解析它的内容时。

    由于 robots.txt 的内容通常很小,所以解析不是问题。

    因此,最可能的情况是请求/响应执行时间较长。 您可以在浏览器中的开发者工具中查看哪个阶段“挂起”最多。

    您会看到类似的内容:network request phases(计时阶段explained


    处理挂起连接的一种方法是尝试设置默认超时:

    import urllib.robotparser as urobot
    import socket
    
    socket.setdefaulttimeout(1) # in seconds (float)
    
    url = "https://example.com"
    rp = urobot.RobotFileParser()
    rp.set_url(url + "/robots.txt")
    x = rp.read()
    

    【讨论】:

    • 浏览器能够加载 robots.txt 文件。它在阅读机器人时挂起,我了解网络问题,但由于我无法处理正在发生的事情。我不确定如何处理这种情况。知道如何优雅地处理这个问题吗?
    • @AmitSingh 可能设置默认超时有助于挂起连接。我用设置超时的例子更新了回答后的问题。 (我没有在悬挂连接上测试它,但我希望它应该可以工作)。如果你分享一些悬挂的链接,我可以和他们一起测试
    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 2023-04-10
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多