收到未定义 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'”?