使用 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
并从那里进行故障排除。
这不起作用的原因是您将 运行 陷入以下问题:
- 您将命中 Google 的机器人检测,这意味着当您执行
requests.get
时,您将不会返回 Google 结果,而是会收到回复来自机器人检测,要求您勾选一个方框以确认您是人类。
- 您搜索的class不存在
- 您正在使用默认值
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/
我尝试为比特币和其他加密货币或股票制作一个简单的价格跟踪器。我打算使用网络抓取从 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
并从那里进行故障排除。
这不起作用的原因是您将 运行 陷入以下问题:
- 您将命中 Google 的机器人检测,这意味着当您执行
requests.get
时,您将不会返回 Google 结果,而是会收到回复来自机器人检测,要求您勾选一个方框以确认您是人类。 - 您搜索的class不存在
- 您正在使用默认值
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/