使用 Beautiful soup 获取股票价格

Using Beautiful soup to get the stock prices

我尝试为比特币和其他加密货币或股票制作一个简单的价格跟踪器。我打算使用网络抓取从 google finance 依赖 BeautifulSoup 获取价格并请求图书馆。

代码是这样的:

 from bs4 import BeautifulSoup
import requests
import time

def getprice():
    url = 'https://www.google.com/search?q=bitcoin+price'
    HTML = requests.get(url)
    soup = BeautifulSoup(HTML.text, 'html.parser')
    text = soup.find('div', attrs={'class':'BNeawe iBp4i AP7Wnd'}).find("div", attrs={'class':'BNeawe iBp4i AP7Wnd'}).text
    return text

if __name__ == "__main__":
    bitcoin = getprice()
    print(bitcoin)

我收到这个错误

     File "c:\Users\gabri\Visual Studio\crypto\bitcoinprice.py", line 19, in <module>
    bitcoin = getprice()
  File "c:\Users\gabri\Visual Studio\crypto\bitcoinprice.py", line 15, in getprice
    text = soup.find('div', attrs={'class':'BNeawe iBp4i AP7Wnd'}).find("div", attrs={'class':'BNeawe iBp4i AP7Wnd'}).text
AttributeError: 'NoneType' object has no attribute 'find'

我该如何解决?

soup 对象是 None,因此您不能对其调用 .find()。它在我的机器上工作,所以尝试打印 soup 并从那里进行故障排除。

这不起作用的原因是您将 运行 陷入以下问题:

  1. 您将命中 Google 的机器人检测,这意味着当您执行 requests.get 时,您将不会返回 Google 结果,而是会收到回复来自机器人检测,要求您勾选一个方框以确认您是人类。
  2. 您搜索的class不存在
  3. 您正在使用默认值 html.parser,这将毫无用处,因为 Google 不会将价格数据放入原始 HTML 代码中。相反,您想使用更高级的东西,例如 lxml 解析器。

根据您的尝试,您可以尝试通过使您的请求看起来更合法来欺骗 Google 的机器人检测,例如在用户代理中添加一个 Chrome浏览器通常会发送。此外,要获得价格,您似乎想要 span 元素中的 pclqee class。

试试这个:

首先安装lxml解析器: pip3 install lxml

然后改用下面的代码段:

from bs4 import BeautifulSoup
import requests
import time


def getprice():
    url = "https://www.google.com/search?q=bitcoin+price"
    HTML = requests.get(
        url,
        headers={
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36"
        },
    )
    soup = BeautifulSoup(HTML.text, "lxml")
    text = soup.find("span", attrs={"class": "pclqee"}).text
    return text


if __name__ == "__main__":
    bitcoin = getprice()
    print(bitcoin)

虽然上面修改过的代码片段可以工作,但我不建议使用它。 Google 仍然能够偶尔将您的请求检测为机器人,因此此代码不可靠。

如果你想要股票数据,我建议你尝试直接从网络上抓取一些 API 或使用已经为你完成的 API,例如看看 https://www.alphavantage.co/