繁体   English   中英

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

[英]HTTP Error 400: Bad Request (urllib)

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

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 状态代码的更多详细信息。

关于如何设置用户代理:用户代理设置在请求头中,基本上定义了发出请求的客户端。 这是公认的用户代理列表。 您将需要使用urllib2而不是urllib ,但urllib2也是一个内置包。 我将向您展示如何更新getBuilding函数以使用该模块设置标头。 但我建议查看请求库。 我只是发现这非常简单,并且得到了高度的采用/支持。

蟒蛇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)

蟒蛇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 语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM