收到未定义 USER_AGENT 的错误(Python 3)

Posted

技术标签:

【中文标题】收到未定义 USER_AGENT 的错误(Python 3)【英文标题】:Getting error that USER_AGENT is not defined (Python 3) 【发布时间】:2018-10-04 04:21:37 【问题描述】:

我正在尝试抓取“iframe”标签内的信息。当我执行此代码时,它说未定义“USER_AGENT”。我该如何解决这个问题?

import requests
from bs4 import BeautifulSoup

page = requests.get("https://etherscan.io/token/0x168296bb09e24a88805cb9c33356536b980d3fc5#balances" + "/token/generic-tokenholders2?a=0x168296bb09e24a88805cb9c33356536b980d3fc5&s=100000000000000000", headers=USER_AGENT, timeout=5)
soup = BeautifulSoup(page.content, "html.parser")
test = soup.find_all('iframe')

【问题讨论】:

【参考方案1】:

错误清楚地告诉你哪里出了问题。您作为标头 USER_AGENT 传入,您之前没有在代码中定义。看看this post如何在方法中使用标头。

文档声明您必须为请求传入一个 HTTP 标头字典,而您传入​​了一个未定义的变量 USER_AGENT

来自Requests Library API:

标题 =

响应标头不区分大小写。

例如,headers['content-encoding'] 将返回 'Content-Encoding' 响应标头的值。

编辑:

有关 Content-Type 标头的更好解释,请参阅 this SO post. 另请参阅 this WebMasters post,它解释了 Accept 和 Content-Type HTTP 标头之间的区别。

由于您似乎只对抓取 iframe 标记感兴趣,因此您可以完全省略 headers 参数,如果您在代码中打印出 test 对象,您应该会看到结果。

import requests
from bs4 import BeautifulSoup

page = requests.get("https://etherscan.io/token/0x168296bb09e24a88805cb9c33356536b980d3fc5#balances" + "/token/generic-tokenholders2?a=0x168296bb09e24a88805cb9c33356536b980d3fc5&s=100000000000000000", timeout=10)
soup = BeautifulSoup(page.content, "lxml")
test = soup.find_all('iframe')

for tag in test:
    print(tag)

【讨论】:

如果我必须将标题作为 "content-type":"text" 传递,在我的情况下,我会为“content-type”和“text”输入什么? 参见 this post 的 Content-Type 标头。根据我收集的信息,他们告诉服务器您期望什么类型的响应。由于您似乎只是对抓取“iframe”标签的内容感兴趣,因此您可以省略 headers 参数。我已经编辑了我的回复以反映这一点。 @MihaiChelaru 你的解释太过分了。如果 OP 知道如何阅读文档,他可能不会出现在 *** 上,请省去他的详细信息,并告诉他他的实际代码有什么问题。即USER_AGENT 是一个变量,他错过了它。他可以删除它,因为它不是必需的,也可以添加一个虚假的用户代理。感谢您的贡献@Mihai !! @Elivir 感谢您的反馈。我会尽量在我的回答中更简洁明了。我还是新手,所以我还在学习什么才是好的答案。 @MihaiChelaru 正是我只是建议的原因,你做得很好,我非常感谢你参与帮助人们解决问题。也许你的知识更先进,这个主题对你来说似乎很容易,这就是为什么你必须尽可能地简化它。大多数简短的答案和链接(和/或示例)就足够了。保重!【参考方案2】:

我们必须提供一个用户代理,HERE's 一个指向假用户代理的链接。

import requests
from bs4 import BeautifulSoup


USER_AGENT = 
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/53'
url = "https://etherscan.io/token/0x168296bb09e24a88805cb9c33356536b980d3fc5#balances"
token = "/token/generic-tokenholders2?a=0x168296bb09e24a88805cb9c33356536b980d3fc5&s=100000000000000000"


page = requests.get(url + token, headers=USER_AGENT, timeout=5)
soup = BeautifulSoup(page.content, "html.parser")
test = soup.find_all('iframe')

您可以简单地使用用户代理,代码:

import requests
from bs4 import BeautifulSoup


url = "https://etherscan.io/token/0x168296bb09e24a88805cb9c33356536b980d3fc5#balances"
token = "/token/generic-tokenholders2?a=0x168296bb09e24a88805cb9c33356536b980d3fc5&s=100000000000000000"


page = requests.get(url + token, timeout=5)
soup = BeautifulSoup(page.content, "html.parser")
test = soup.find_all('iframe')

为了便于阅读,我已将您的 URL 分为 URL 和令牌。这就是为什么有两个变量 URL 和令牌

【讨论】:

以上是关于收到未定义 USER_AGENT 的错误(Python 3)的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会收到“未捕获的类型错误:无法读取未定义的属性 'body'”?

收到“未定义无参数构造函数”错误,不知道为啥

收到此错误:无法读取未定义的属性“0”

为啥在使用 AJAX/PHP 时收到未定义索引错误?

为啥我在 AngularJS 中收到错误“ReferenceError:未定义类别”?

我收到“未定义的引用”错误,我不明白为啥(C++ OO)