Python爬虫实战:股票分时数据抓取与存储 (1)
在金融数据分析中,股票分时数据是投资者和分析师的重要资源。它能够帮助我们了解股票在交易日内的价格波动情况,从而为交易决策提供依据。然而,获取这些数据往往需要借助专业的金融数据平台,其成本较高。幸运的是,通过Python爬虫技术,我们可以低成本地抓取股票分时数据,并将其存储以便后续分析。本文将详细介绍如何使用Python实现股票分时数据的抓取与存储,同时结合代理服务器确保爬虫的稳定性和安全性。
一、技术选型与环境搭建
在开始之前,我们需要明确技术选型和环境搭建。Python作为一门强大的编程语言,拥有丰富的库支持,非常适合用于爬虫开发。以下是主要的技术选型:
- Python版本:推荐使用Python 3.9及以上版本,以确保兼容性和性能。
- 爬虫框架:虽然可以使用Scrapy等成熟框架,但为了保持代码简洁,本文将使用
requests
库进行HTTP请求和BeautifulSoup
库进行HTML解析。 - 数据存储:分时数据量较大,适合存储到数据库中。本文将使用SQLite作为轻量级数据库,便于本地存储和查询。
- 代理服务器:为了提高爬虫的稳定性和安全性,我们将使用代理服务器。代理服务器可以帮助我们隐藏真实IP地址,避免被目标网站封禁。
- 其他库:
pandas
用于数据处理,time
和datetime
用于时间处理。
二、代理服务器的配置
在爬虫开发中,代理服务器是不可或缺的工具。它可以隐藏爬虫的真实IP地址,避免因频繁访问被目标网站封禁。本文使用的代理服务器信息如下:
- 代理主机:
www.16yun.cn
- 代理端口:
5445
- 代理用户名:
16QMSOML
- 代理密码:
280651
为了在requests
中使用代理服务器,我们需要配置代理参数。以下是代理配置的代码示例:
Python复制
import requests
from requests.auth import HTTPProxyAuth
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"
proxies = {
"http": f"http://{proxyHost}:{proxyPort}",
"https": f"http://{proxyHost}:{proxyPort}"
}
auth = HTTPProxyAuth(proxyUser, proxyPass)
在后续的HTTP请求中,我们将通过proxies
和auth
参数将请求发送到代理服务器。
三、股票分时数据的抓取
股票分时数据通常可以通过股票交易平台的API或网页源码获取。以某知名股票交易平台为例,其分时数据可以通过访问特定的URL获取。以下是抓取过程的详细步骤:
1. 分析目标网站
通过浏览器开发者工具(F12)查看分时数据的请求URL和返回格式。假设目标网站的分时数据请求URL为:
https://example.com/stock/tick?code={股票代码}&date={日期}
返回的数据格式为JSON,包含时间、价格、成交量等字段。
2. 编写爬虫代码
以下是使用requests
和BeautifulSoup
实现的分时数据爬取代码:
Python复制
import requests
import json
import pandas as pd
from datetime import datetime, timedelta
from requests.auth import HTTPProxyAuth
# 代理服务器配置
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"
proxies = {
"http": f"http://{proxyHost}:{proxyPort}",
"https": f"http://{proxyHost}:{proxyPort}"
}
auth = HTTPProxyAuth(proxyUser, proxyPass)
def fetch_tick_data(stock_code, date):
"""
抓取指定股票代码的分时数据
:param stock_code: 股票代码,如"000001"
:param date: 日期,格式为"YYYY-MM-DD"
:return: 分时数据的DataFrame
"""
url = f"https://example.com/stock/tick?code={stock_code}&date={date}"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
try:
response = requests.get(url, headers=headers, proxies=proxies, auth=auth)
if response.status_code == 200:
data = json.loads(response.text)
# 将数据转换为DataFrame
df = pd.DataFrame(data["ticks"])
df["date"] = date
df["time"] = pd.to_datetime(df["time"], format="%H:%M:%S")
df.set_index("time", inplace=True)
return df
else:
print(f"Failed to fetch data for {stock_code} on {date}. Status code: {response.status_code}")
return None
except Exception as e:
print(f"Error occurred while fetching data for {stock_code} on {date}: {e}")
return None
3. 数据抓取示例
假设我们要抓取股票代码为“000001”的分时数据,日期为“2024-10-10”,可以调用上述函数:
Python复制
if __name__ == "__main__":
stock_code = "000001"
date = "2024-10-10"
tick_data = fetch_tick_data(stock_code, date)
if tick_data is not None:
print(tick_data.head())
运行代码后,tick_data
将包含分时数据,如下所示:
price volume date
time
2024-10-10 09:30:00 12.50 10000 2024-10-10
2024-10-10 09:31:00 12.52 15000 2024-10-10
2024-10-10 09:32:00 12.55 20000 2024-10-10
...
四、数据存储到SQLite数据库
抓取到的分时数据需要存储以便后续分析。SQLite是一个轻量级的数据库,适合本地存储。以下是将分时数据存储到SQLite数据库的代码实现:
1. 创建数据库和表
首先,我们需要创建一个SQLite数据库,并定义一个表来存储分时数据:
Python复制
import sqlite3
def create_database():
"""
创建SQLite数据库和分时数据表
"""
conn = sqlite3.connect("stock_tick_data.db")
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS tick_data (
id INTEGER PRIMARY KEY AUTOINCREMENT,
stock_code TEXT,
date TEXT,
time TEXT,
price REAL,
volume INTEGER
)
""")
conn.commit()
conn.close()
2. 存储数据到数据库
将抓取到的分时数据存储到数据库中:
Python复制
def save_to_database(df, stock_code):
"""
将分时数据存储到SQLite数据库
:param df: 分时数据的DataFrame
:param stock_code: 股票代码
"""
conn = sqlite3.connect("stock_tick_data.db")
cursor = conn.cursor()
for _, row in df.iterrows():
cursor.execute("""
INSERT INTO tick_data (stock_code, date, time, price, volume)
VALUES (?, ?, ?, ?, ?)
""", (stock_code, row["date"], row.name.strftime("%H:%M:%S"), row["price"], row["volume"]))
conn.commit()
conn.close()