python - HTTP 错误 400 : Bad Request (urllib)

标签 python beautifulsoup 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 错误意味着服务器无法理解您的请求(例如,格式错误的语法)。也就是说,这取决于开发人员想要返回什么状态代码,不幸的是,并不是每个人都严格遵循其预期含义。

看看这个 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/

相关文章:

Python 3,urllib POST 提交

python - python 3.4.3 中 urllib.httperror 的语法错误

python - 了解装饰器

python - 这个 Python 表达式是什么意思?

python - python中href url中的正则表达式编号

python-3.x - 从 beautifulsoup4 网络抓取结果中删除特定的 <h2 类>

python - 使用 Google App Engine 和 Python 读取网站 XML

python - 从经过身份验证的站点获取文件(使用 python urllib、urllib2)

python - 成对绘制线条

python - Numba 中的生成器参数