我想从这个网站上抓取数据。 “ IBVC:IND”下的数据 加拉加斯证券交易所股票市场指数”需要取消。我正在使用精美的汤料并提出要求。
使用了漂亮的汤和要求
import requests
from bs4 import BeautifulSoup as bs
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/58.0.3029.110 Safari/537.36 '
}
res = requests.get("https://www.bloomberg.com/quote/IBVC:IND", headers=headers)
soup = bs(res.content, 'html.parser')
# print(soup)
itmes = soup.find("div", {"class": "snapshot__0569338b snapshot"})
open_ = itmes.find("span", {"class": "priceText__1853e8a5"}).text
print(open_)
prev_close = itmes.find("span", {"class": "priceText__1853e8a5"}).text
我在html中找不到所需的值。我应该使用哪个库来处理该问题。
答案 0 :(得分:2)
由于该页面不是静态页面,因此您需要向Bloomberg API发出请求。要了解操作方法,请转到该页面,检查元素并选择“网络”,然后按“ XHR”过滤并查找JSON类型。重新加载页面。我做到了,并相信这就是您想要的:link
答案 1 :(得分:1)
如其他答案所示,内容是通过JavaScript生成的,因此不在纯HTML内。针对给定的问题,提出了两种不同的攻角
Selenium
,又名 The Big Guns :这将使您可以自动在浏览器中执行 any 任务。尽管在速度方面要付出一定的代价。API Request
又名思考:这并不总是可行的。但是,在这种情况下,它的效率会大大提高。我详细介绍第二个。 @ViniciusDAvila已经为这种解决方案制定了典型的蓝图:导航到该站点,检查 Network 并找出哪个请求负责提取数据。
完成后,剩下的就是执行问题了:
抓取工具
import requests
import json
from urllib.parse import quote
# Constants
HEADERS = {
'Host': 'www.bloomberg.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0',
'Accept': '*/*',
'Accept-Language': 'de,en-US;q=0.7,en;q=0.3',
'Accept-Encoding': 'gzip, deflate, br',
'Referer': 'https://www.bloomberg.com/quote/',
'DNT': '1',
'Connection': 'keep-alive',
'TE': 'Trailers'
}
URL_ROOT = 'https://www.bloomberg.com/markets2/api/datastrip'
URL_PARAMS = 'locale=en&customTickerList=true'
VALID_TYPE = {'currency', 'index'}
# Scraper
def scraper(object_id: str = None, object_type: str = None, timeout: int = 5) -> list:
"""
Get the Bloomberg data for the given object.
:param object_id: The Bloomberg identifier of the object.
:param object_type: The type of the object. (Currency or Index)
:param timeout: Maximal number of seconds to wait for a response.
:return: The data formatted as dictionary.
"""
object_type = object_type.lower()
if object_type not in VALID_TYPE:
return list()
# Build headers and url
object_append = '%s:%s' % (object_id, 'IND' if object_type == 'index' else 'CUR')
headers = HEADERS
headers['Referer'] += object_append
url = '%s/%s?%s' % (URL_ROOT, quote(object_append), URL_PARAMS)
# Make the request and check response status code
response = requests.get(url=url, headers=headers)
if response.status_code in range(200, 230):
return response.json()
return list()
测试
# Index
object_id, object_type = 'IBVC', 'index'
data = scraper(object_id=object_id, object_type=object_type)
print('The open price for %s %s is: %d' % (object_type, object_id, data[0]['openPrice']))
# The open price for index IBVC is: 50094
# Exchange rate
object_id, object_type = 'EUR', 'currency'
data = scraper(object_id=object_id, object_type=object_type)
print('The open exchange rate for USD per {} is: {}'.format(object_id, data[0]['openPrice']))
# The open exchange rate for USD per EUR is: 1.0993
答案 2 :(得分:0)
动态加载所需的值。在这种情况下,您可以尝试使用硒和BeautifulSoup。这是示例代码供您参考:
import time
import os
from selenium import webdriver
from bs4 import BeautifulSoup
# put the driver in the folder of this code
driver = webdriver.Chrome(os.getcwd() + '/chromedriver')
driver.get("https://www.bloomberg.com/quote/IBVC:IND")
time.sleep(3)
real_soup = BeautifulSoup(driver.page_source, 'html.parser')
open_ = real_soup.find("span", {"class": "priceText__1853e8a5"}).text
print(f"Price: {open_}")
time.sleep(3)
driver.quit()
输出:
Price: 50,083.00
您可以搜索chromedriver并根据您的chrome版本下载一个。