我正在编写一个脚本来获取有关纽约市建筑物的信息。我知道我的代码可以工作并返回我想要的结果。我之前是手动输入的,效果很好。现在我试图让它从文本文件中读取地址并使用该信息访问网站,但我收到此错误:
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 错误意味着服务器无法理解您的请求(例如,格式错误的语法)。也就是说,这取决于开发人员想要返回什么状态代码,不幸的是,并不是每个人都严格遵循其预期含义。
看看这个 page有关 HTTP 状态代码的更多详细信息。
关于如何设置用户代理:
用户代理设置在请求 header 中,基本上定义了发出请求的客户端。这是公认的列表 User Agents 。
您将需要使用 urllib2
,而不是 urllib
,但 urllib2
也是一个内置包。我将向您展示如何更新 getBuilding
函数以使用该模块设置 header 。但我建议查看 requests图书馆。我只是发现这是 super 直接的,并且它被高度采用/支持。
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 语句。
关于python - HTTP 错误 400 : Bad Request (urllib),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37900758/