【发布时间】:2022-01-04 07:01:12
【问题描述】:
根据我的问题here,我对网站finance.yahoo.com 上的请求还有一些疑问。
没有用户代理请求的我的请求给了我想要从网站收集一些数据的 html 代码。
以“ALB”为参数的调用工作正常,我得到了请求的数据:
import bs4 as bs
import requests
def yahoo_summary_stats(stock):
response = requests.get(f"https://finance.yahoo.com/quote/{stock}")
#response = requests.get(f"https://finance.yahoo.com/quote/{stock}", headers={'User-Agent': 'Custom user agent'})
soup = bs.BeautifulSoup(response.text, 'lxml')
table = soup.find('p', {'class': 'D(ib) Va(t)'})
sector = table.findAll('span')[1].text
industry = table.findAll('span')[3].text
print(f"{stock}: {sector}, {industry}")
return sector, industry
web.yahoo_summary_stats('ALB')
输出:
ALB: Basic Materials, Specialty Chemicals
调用yahoo_summary_stats('AEE') 不能以这种方式工作,所以我需要激活标头以成功请求站点。
但是现在使用参数headers={'User-Agent': 'Custom user agent'},代码不起作用,他找不到类'D(ib) Va(t)'的段落p。
我该如何解决这个问题?
【问题讨论】:
-
这些页面可能是(部分)使用 Javascript 生成的。如果是这种情况,BeautifulSoup 很可能会“错过”您正在寻找的项目。也可能是每只股票都不存在具有这些类别的段落。在使用基于 Javascript 的网站时尝试 selenium。
-
首先,您应该在浏览器中检查当您关闭 JavaScript(并重新加载页面)时是否可以看到页面,然后您可以显示
response.text以查看您是否没有收到机器人/垃圾邮件发送者的警告/黑客/等。 - 它可能会通知该页面需要 cookie 或 JavaScript 或发送给您ReCaptcha。第三:检查两个页面是否使用相同的类等。某些服务器可能为不同的用户使用不同的(随机)类。
标签: python html python-requests request-headers