Python RobotFileParser挂起读取

问题描述

我正在尝试读取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()上,不会引发任何异常。

解决方法

根据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()