如何用Python刮擦Google Finance数据

评论: 0

当今的投资者和分析师正在使用Google财务信息,因为它是最新且准确的。 Google Finance似乎是拥有所有类型的当前财务数据的最喜欢的地方,尤其是对于股票以及指数和市场趋势,因为它提供了有关公司财务指标的更多详细信息。 Python是网络刮擦的最佳语言。这篇文章将帮助您学习如何从Google Finance收集数据,以便您可以拥有所有必要的财务分析工具。

安装所需库

在开始之前,请确保您在系统上安装了Python。您还需要库:提出HTTP请求和LXML的请求,以解析网页的HTML内容。要安装所需的库,请在命令行上使用以下命令:

pip install requests
pip install lxml

接下来,我们将探讨从Google Finance中提取数据的分步过程:

步骤1:了解HTML结构

要刮下Google Finance的数据,我们需要确定包含我们感兴趣的信息的特定HTML元素:

  • 标题:位于 //div[@class="zzDege"]/text()
  • 价格:在 //div[@class="YMlKec fxKbKc"]/text()
  • 日期:位于 //div[@class="ygUjEc"]/text()

这些XPath表达式将作为我们从Google Finance页面的HTML结构中导航和提取相关数据的指南。

标题:

1.png

价格:

2.png

日期:

3.png

步骤2:设置刮板功能

在设置刮板时,至关重要的是要专注于几个重要方面,以确保有效且安全的数据收集。

提出HTTP请求

要从Google Finance网站获取HTML内容,我们将采用请求库。此步骤通过加载我们打算从中提取数据的网页来启动该过程。

在刮擦中使用正确的标头的重要性

网络刮擦时使用正确的标头非常重要,最著名的是用户代理标头。标题的使用对于模拟真正的浏览器请求至关重要,该请求将阻止网站识别和停止自动脚本。他们确保服务器通过提供有关请求的相关信息来正确响应。没有适当的标头,请求可能会被拒绝,或者服务器可能会返回完全不同的内容,或者在可能限制Web刮擦活动的部分中传递内容。因此,设置标头适当地有助于维持对网站的访问,并确保刮板检索正确的数据。

import requests

# 定义标题以模仿浏览器访问并避免被服务器阻止
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',  # 请勿跟踪请求标题
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    'sec-ch-ua-arch': '"x86"',
    'sec-ch-ua-bitness': '"64"',
    'sec-ch-ua-full-version-list': '"Not/A)Brand";v="8.0.0.0", "Chromium";v="126.0.6478.114", "Google Chrome";v="126.0.6478.114"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-model': '""',
    'sec-ch-ua-platform': '"Linux"',
    'sec-ch-ua-platform-version': '"6.5.0"',
    'sec-ch-ua-wow64': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
}

# 定义BNP Paribas(股票BNP)的Google Finance页面的URL
url = "https://www.google.com/finance/quote/BNP:EPA?hl=en"

# 用指定的标题使HTTP获取向URL的请求
response = requests.get(url, headers=headers)

使用代理的重要性

在大规模刮擦Google Finance或任何网站时,使用代理至关重要。原因如下:

  • 避免使用IP禁令:Google Finance之类的网站通常会阻止或限制在短期内提出太多请求的IP地址访问。代理有助于在多个IP地址分发请求,从而减少了检测和禁令的机会。
  • 增强的隐私:使用代理增加一层匿名性,在刮擦数据时保护您的身份和意图。
# 定义代理设置
proxies = {
    'http': 'http://your_proxy_address:port',
    'https': 'https://your_proxy_address:port',
}

# 使用指定的标题和代理将HTTP获取到URL的请求
response = requests.get(url, headers=headers, proxies=proxies)

用LXML解析HTML

获取HTML内容后,我们需要使用LXML库来解析它。这将使我们能够浏览HTML结构并提取所需的数据:

从lxml.html的源功能导入将HTML内容解析为元素对象。从String方法解析响应。文本,网页中的RAW HTML,并返回存储在Parser变量中的元素对象,代表解析的HTML树的根。

from lxml.html import fromstring

# 使用LXML的string方法解析响应的HTML含量
parser = fromstring(response.text)

用XPATH提取数据

现在,让我们使用解析的HTML树中的XPath表达式提取特定数据:

标题从解析的HTML中检索金融工具的头衔。价格检索当前的股票价格。日期检索日期。 Finance_Data字典包含提取的标题,价格和日期。该词典附加到列表中。

# 列表以存储输出数据
finance_data_list = []

# 提取金融工具的标题
title = parser.xpath('//div[@class="zzDege"]/text()')[0]

# 提取股票的当前价格
price = parser.xpath('//div[@class="YMlKec fxKbKc"]/text()')[0]

# 提取日期
date = parser.xpath('//div[@class="ygUjEc"]/text()')[0]

# 创建一个词典来存储提取的数据
finance_data = {
    'title': title,
    'price': price,
    'date': date
}
#将数据附加到finance_data_list
finance_data_list.append(finance_data)

数据处理和存储

要处理刮擦数据,您可能需要进一步处理或以json这样的结构化格式存储它:

output_file 变量指定保存数据的 JSON 文件名(finance_data.json)。open(output_file,'w')以写入模式打开文件,json.dump(finance_data_list, f, indent=4)将 finance_data_list 以 4 格缩进的方式写入文件,以提高可读性。

#将 finance_data_list 保存为 JSON 文件
output_file = 'finance_data.json'
with open(output_file, 'w') as f:
    json.dump(finance_data_list, f, indent=4)

处理请求异常

在从网站抓取数据时,必须处理请求异常,以确保抓取脚本的可靠性和健壮性。这些请求可能由于各种原因而失败,例如网络问题、服务器错误或超时。如下所示,Python 中的请求库提供了一种有效处理这些类型异常的方法:

try:
    # 向 URL 发送 GET 请求
    response = requests.get(url)

    # 对不良响应(4xx 或 5xx 状态代码)引发 HTTPError
    response.raise_for_status()

except requests.exceptions.HTTPError as e:
    # 处理 HTTP 错误(如 404、500 等)
    print(f"HTTP error occurred: {e}")

except requests.exceptions.RequestException as e:
    # 处理请求过程中可能出现的任何其他异常情况
    print(f"An error occurred: {e}")

try 块封装了可能引发异常的代码。requests.get(url) 发送 GET 请求。response.raise_for_status()会检查响应状态代码,并在代码不成功时引发 HTTPError。except requests.exceptions.HTTPError as e: 捕获 HTTPError 异常并打印错误信息。except requests.exceptions.RequestException as e:捕获其他异常(如网络错误、超时)并打印错误信息。

完整代码

现在,让我们整合一切,创建我们的 scraper 函数,从多个 Google Finance URL 获取、解析和提取数据:

import requests
from lxml.html import fromstring
import json
import urllib3
import ssl

ssl._create_default_https_context = ssl._create_stdlib_context
urllib3.disable_warnings()


# 要搜索的 URL 列表
urls = [
    "https://www.google.com/finance/quote/BNP:EPA?hl=en",
    "https://www.google.com/finance/quote/SPY:NYSEARCA?hl=en",
    "https://www.google.com/finance/quote/SENSEX:INDEXBOM?hl=en"
]

# 定义标头以模拟浏览器访问
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    'sec-ch-ua-arch': '"x86"',
    'sec-ch-ua-bitness': '"64"',
    'sec-ch-ua-full-version-list': '"Not/A)Brand";v="8.0.0.0", "Chromium";v="126.0.6478.114", "Google Chrome";v="126.0.6478.114"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-model': '""',
    'sec-ch-ua-platform': '"Linux"',
    'sec-ch-ua-platform-version': '"6.5.0"',
    'sec-ch-ua-wow64': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
}

# 定义代理端点
proxies = {
    'http': 'http://your_proxy_address:port',
    'https': 'https://your_proxy_address:port',
}

# 用于存储刮擦数据的列表
finance_data_list = []

# 迭代每个 URL 并抓取数据
for url in urls:
    try:
        # 向 URL 发送 GET 请求
        response = requests.get(url, headers=headers, proxies=proxies, verify=False)
        
        # 对不良响应(4xx 或 5xx 状态代码)引发 HTTPError
        response.raise_for_status()
        
        # 使用 lxml 的 fromstring 方法解析响应的 HTML 内容
        parser = fromstring(response.text)
        
        # 提取标题、价格和日期
        title = parser.xpath('//div[@class="zzDege"]/text()')[0]
        price = parser.xpath('//div[@class="YMlKec fxKbKc"]/text()')[0]
        date = parser.xpath('//div[@class="ygUjEc"]/text()')[0]
        
        # 将提取的数据存储在字典中
        finance_data = {
            'title': title,
            'price': price,
            'date': date
        }
        
        # 将字典附加到列表中
        finance_data_list.append(finance_data)
    
    except requests.exceptions.HTTPError as e:
        # 处理 HTTP 错误(如 404、500 等)
        print(f"HTTP error occurred for URL {url}: {e}")
    except requests.exceptions.RequestException as e:
        # 处理请求过程中可能出现的任何其他异常情况
        print(f"An error occurred for URL {url}: {e}")

# 将 finance_data_list 保存为 JSON 文件
output_file = 'finance_data.json'
with open(output_file, 'w') as f:
    json.dump(finance_data_list, f, indent=4)

print(f"Scraped data saved to {output_file}")

输出:

4.png

本指南提供了使用 Python 以及 `lxml` 和 `requests` 等强大库从 Google Finance 搜刮数据的全面教程。它为创建复杂的金融数据抓取工具奠定了基础,这些工具可用于进行深入的市场分析、监控竞争对手的活动或支持明智的投资决策。

评论:

0 评论