Python HTTP错误400:错误请求(urllib)

Python HTTP错误400:错误请求(urllib),python,beautifulsoup,urllib,Python,Beautifulsoup,Urllib,我正在写一个脚本来获取有关纽约市建筑物的信息。我知道我的代码可以工作并返回我想要的结果。我以前做的是手工输入,它工作正常。现在,我试图让它从文本文件中读取地址,并使用该信息访问网站,但我发现以下错误: urllib.error.HTTPError:HTTP错误400:请求错误 我相信这与网站不喜欢非浏览器的大量访问有关。我听说过一些关于用户代理的事情,但不知道如何使用它们。这是我的密码: from bs4 import BeautifulSoup import urllib.request f

我正在写一个脚本来获取有关纽约市建筑物的信息。我知道我的代码可以工作并返回我想要的结果。我以前做的是手工输入,它工作正常。现在,我试图让它从文本文件中读取地址,并使用该信息访问网站,但我发现以下错误:

urllib.error.HTTPError:HTTP错误400:请求错误

我相信这与网站不喜欢非浏览器的大量访问有关。我听说过一些关于用户代理的事情,但不知道如何使用它们。这是我的密码:

from bs4 import BeautifulSoup
import urllib.request

f = open("FILE PATH GOES HERE")

def getBuilding(link):
    r = urllib.request.urlopen(link).read()
    soup = BeautifulSoup(r, "html.parser")
    print(soup.find("b",text="KEYWORDS IM SEARCHING FOR GO HERE:").find_next("td").text)


def main():
    for line in f:
        num, name = line.split(" ", 1)
        newName = name.replace(" ", "+")
        link = "LINK GOES HERE (constructed from num and newName variables)"
        getBuilding(link)      
    f.close()

if __name__ == "__main__":
    main()

400错误表示服务器无法理解您的请求(例如,语法错误)。也就是说,由开发人员决定他们想要返回什么状态代码,不幸的是,并不是每个人都严格遵守他们的意图

有关HTTP状态代码的更多详细信息,请查看此文件

关于如何设置用户代理: 用户代理设置在请求头中,基本上定义发出请求的客户端。这是一份公认的清单。 您将需要使用
urlib2
,而不是
urlib
,但是
urlib2
也是一个内置包。我将向您展示如何使用该模块更新
getBuilding
函数来设置标题。但我建议你去图书馆看看。我只是觉得这是非常直截了当的,它被高度采纳/支持

Python 2:

from urllib2 import Request, urlopen

def getBuilding(link):        
    q = Request(link)
    q.add_header('User-Agent', 'Mozilla/5.0')
    r = urlopen(q).read()
    soup = BeautifulSoup(r, "html.parser")
    print(soup.find("b",text="KEYWORDS IM SEARCHING FOR GO HERE:").find_next("td").text)
Python 3:

from urllib.request import Request, urlopen

def getBuilding(link):        
    q = Request(link)
    q.add_header('User-Agent', 'Mozilla/5.0')
    r = urlopen(q).read()
    soup = BeautifulSoup(r, "html.parser")
    print(soup.find("b",text="KEYWORDS IM SEARCHING FOR GO HERE:").find_next("td").text)

注意:Python v2和v3之间唯一的区别是import语句。

您单独运行代码的事实让我怀疑服务器是否仅基于您的用户代理停止请求。更可能的情况是,这限制了您的客户端的速率,或者是您构建请求的方式中的错误。。。你能为你的链接和文件中的样本行输入真实代码吗?明天早上我会回复你的!它告诉我没有名为urllib2的模块。这是因为我使用了Python3,对吗?是的,我更新了我的答案来演示Python2和3导入语句。或者,您可以像@cees timmerman提供的解决方案那样,让导入语句与两个版本兼容导入错误:无法导入名称“请求”?我已经通过在链接传递到函数之前打印链接进行了测试,出于某种原因,链接在两个单独的行上形成。。。我解决了!错误的请求是由于链接的语法不正确造成的。我必须去掉创建链接的一个字符串,因为后面有空格,导致链接有两行长。