东方财富网股票数据爬虫

废话不多说 , 直接上源码

import csv  # 用于读写 CSV 文件
import json  # 用于解析 JSON 数据
import requests  # 用于发送 HTTP 请求
from lxml import etree  # 用于解析 HTML 文档# 定义 DataScraper 类,实现数据抓取功能
class DataScraper:# 初始化函数def __init__(self):# 定义一个字典,用于存储页面名称和页面英文名称的对应关系self.pagename_type = {"业绩报表": "RPT_LICO_FN_CPD","业绩快报": "RPT_FCI_PERFORMANCEE","业绩预告": "RPT_PUBLIC_OP_NEWPREDICT","预约披露时间": "RPT_PUBLIC_BS_APPOIN","资产负债表": "RPT_DMSK_FN_BALANCE","利润表": "RPT_DMSK_FN_INCOME","现金流量表": "RPT_DMSK_FN_CASHFLOW"}self.pagename_en = {"业绩报表": "yjbb","业绩快报": "yjkb","业绩预告": "yjyg","预约披露时间": "yysj","资产负债表": "zcfz","利润表": "lrb","现金流量表": "xjll"}# 定义一个列表,用于存储英文列名self.en_list = []# 定义一个抓取数据的 URLself.url = 'https://datacenter-web.eastmoney.com/api/data/v1/get'# 定义请求头self.headers = {'Accept': '*/*','Accept-Language': 'zh-CN,zh;q=0.9','Connection': 'closed','Referer': 'https://data.eastmoney.com/','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36','sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"Windows"'}# 定义一个函数,用于获取指定页面的表格数据def get_table(self, page):# 定义一个参数字典,用于传递抓取参数params = {'sortTypes': '-1,-1',  # 用于指定排序方式,这里设置为降序'reportName': self.table_type,  # 用于指定要抓取的报表类型'columns': 'ALL',  # 用于指定要抓取的列名'filter': f'(REPORT_DATE=\'{self.timePoint}\')'  # 用于指定查询条件,这里设置为查询指定日期范围的数据}# 如果要抓取的报表类型为 "RPT_LICO_FN_CPD",则需要修改查询条件if self.table_type in ['RPT_LICO_FN_CPD']:params['filter'] = f'(REPORTDATE=\'{self.timePoint}\')'# 添加分页参数params['pageNumber'] = str(page)# 使用 requests 库发送 GET 请求,获取数据response = requests.get(url=self.url, params=params, headers=self.headers)# 使用 json 模块解析响应数据data = json.loads(response.text)# 如果数据抓取成功,则返回数据if data['result']:return data['result']['data']else:return# 定义一个函数,用于获取指定页面的表头信息def get_header(self, all_en_list):# 创建一个空列表,用于存储中文列名ch_list = []# 定义一个页面的 URLurl = f'https://data.eastmoney.com/bbsj/{self.pagename_en[self.pagename]}.html'# 使用 requests 库发送 GET 请求,获取页面数据response = requests.get(url)# 使用 lxml 模块解析 HTML 文档res = etree.HTML(response.text)# 遍历所有英文列名,获取对应的中文列名for en in all_en_list:ch = ''.join([i.strip() for i in res.xpath(f'//div[@class="dataview"]//table[1]//th[@data-field="{en}"]//text()')])# 如果找到了中文列名,则将其添加到列表中if ch:ch_list.append(ch)# 将英文列名添加到列表中self.en_list.append(en)# 返回中文列名列表return ch_list# 定义一个函数,用于将抓取的数据写到 CSV 文件中def write_header(self, table_data):# 打开一个 CSV 文件,用于写数据with open(self.filename, 'w', encoding='utf-8', newline='') as f:# 创建一个 CSV 写器writer = csv.writer(f)# 获取表头信息headers = self.get_header(list(table_data[0].keys()))# 使用 CSV 写器写表头writer.writerow(headers)# 定义一个函数,用于将抓取的数据写到 CSV 文件中def write_table(self, table_data):# 打开一个 CSV 文件,用于追加写数据with open(self.filename, 'a', encoding='utf-8', newline='') as csvfile:# 创建一个 CSV 写器writer = csv.writer(csvfile)# 遍历所有数据,并将其写到 CSV 文件中for item in table_data:# 创建一个空列表,用于存储一行的数据row = []# 遍历所有列名,获取对应的数据for key in item.keys():# 如果列名在英文列名列表中,则将其添加到列表中if key in self.en_list:row.append(str(item[key]))# 使用 CSV 写器写一行数据print(row)writer.writerow(row)# 定义一个函数,用于获取时间列表def get_timeList(self):# 定义一个请求头,用于模拟浏览器请求headers = {'Referer': 'https://data.eastmoney.com/bbsj/202312.html'}# 使用 requests 库发送 GET 请求,获取页面数据response = requests.get('https://data.eastmoney.com/bbsj/202312.html', headers=headers)# 使用 lxml 模块解析 HTML 文档res = etree.HTML(response.text)# 使用xpath获取时间列表return res.xpath('//*[@id="filter_date"]//option/text()')# 定义一个运行函数,用于启动数据抓取程序def run(self):# 使用 get_timeList 函数获取时间列表self.timeList = self.get_timeList()# 遍历时间列表,打印时间for index, value in enumerate(self.timeList):if (index + 1) % 5 == 0:print(value)else:print(value, end=' ; ')# 输入要抓取的时间点self.timePoint = str(input('\n请选择时间(可选项如上):'))# 输入要抓取的报表类型self.pagename = str(input('请输入报表类型(业绩报表;业绩快报;业绩预告;预约披露时间;资产负债表;利润表;现金流量表):'))# 判断输入的时间点和报表类型是否正确assert self.timePoint in self.timeList, '时间输入错误'assert self.pagename in list(self.pagename_type.keys()), '报表类型输入错误'# 根据输入的报表类型获取对应的表格类型self.table_type = self.pagename_type[self.pagename]self.filename = f'{self.pagename}_{self.timePoint}.csv'self.write_header(self.get_table(1))page = 1while True:table = self.get_table(page)if table:self.write_table(table)else:breakpage += 1if __name__ == '__main__':scraper = DataScraper()scraper.run()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/787061.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云2023: 容器与函数计算实践精选,引领Serverless与Docker容器新趋势

引言 在云计算领域,容器和函数计算技术的迅猛发展正引领着企业架构的新变革。尤其是在2023年,随着技术的成熟和应用场景的拓展,腾讯云发布的《2023腾讯云容器和函数计算技术实践精选集》为我们提供了一窗口,深入了解这一领域的最…

C#多线程编程详细教学

在C#中,多线程编程是一种非常重要的技术,它允许程序同时执行多个任务,从而提高了应用程序的响应性和整体性能。本文将详细介绍C#中的多线程编程,包括基本概念、线程创建、线程同步以及相关的代码示例。 一、基本概念 线程是操作…

【新手适用】手把手教你从零开始实现一个基于Pytorch的卷积神经网络CNN二: 如何训练模型,内附详细损失、准确率、均值计算

手把手教你从零开始实现一个基于Pytorch的卷积神经网络CNN(新手适用)一: model.py:创建模块-CSDN博客 从零开始实现一个基于Pytorch的卷积神经网络 - 知乎 目录 1 设备device定义 2 训练模型定义 3 开始训练 3.1 step、batch…

4.机器学习-十大算法之一线性回归算法(LinearRegression)案例讲解

机器学习-十大算法之一线性回归算法案例讲解 一摘要二个人简介三什么是线性回归四LinearRegression使用方法五糖尿病数据线性回归预测1.数据说明2.导包3.导入数据4.脱敏处理5.抽取训练数据和预测数据6.创建模型7.预测8.线性回归评估指标9.研究每个特征和标记结果之间的关系.来分…

职场成功的关键:提升软实力,成就非凡事业

在竞争激烈的职场中,专业技能固然重要,但软实力同样不可或缺。要想在职场中脱颖而出,实现事业上的成功,我们需要在提升软实力上下功夫。本文将探讨职场软实力的内涵及其在职场成功中的作用,并提供一些建议,…

解决Quartus与modelsim联合仿真问题:# Error loading design解决,是tb文件中没加:`timescale 1ns/1ns

解决Quartus与modelsim联合仿真问题:# Error loading design解决,是tb文件中没加:timescale 1,一直走下来,在modelsim中出现了下面问题2,rtl文件、tb文件2.1,rtl代码2.2,tb测试2.3&a…

java Web实现用户登录功能

文章目录 一、纯JSP方式实现用户登录功能(一)实现思路1、创建Web项目2、创建登录页面3、创建登录处理页面4、创建登录成功页面5、创建登录失败页面6、编辑项目首页 (三)测试结果 二、JSPServlet方式实现用户登录功能(一…

校园通勤车可视化系统的设计与实现

1.需求分析: 校园通勤车可视化系统的设计与实现,不用管什么可视化,就是一个小程序就是可以知道校园车的路线,然后往简单了弄就可以。 校园通勤车可视化系统的设计与实现,不用管什么可视化,就是一个小程序…

【C/C++】C++学籍信息管理系统(源码+报告)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

【threejs】较大物体或shape的贴图较小问题处理方法

问题 有的场景内相对体型差距过大的物体(如山地 海洋等)由于尺寸问题,加载贴图过于小,同时shader也无法完全展示,如图 我们可以获取物体的uv,进行缩放使得贴图可以完全展开 如果uv是乱的 可以用xyz坐标最…

【Redis】MISCONF Redis is configured to save RDB snapshots报错解决方案

【Redis】MISCONF Redis is configured to save RDB snapshots报错解决方案 大家好 我是寸铁👊 总结了一篇【Redis】MISCONF Redis is configured to save RDB snapshots报错解决方案✨ 喜欢的小伙伴可以点点关注 💝 前言 今天在登录redis时&#xff0c…

matlab函数化简和函数极限

文章目录 化简求函数极限泰勒公式泰勒公式求解 化简 simplify 函数是MATLAB中符号计算工具箱提供的一个函数,用于简化数学表达式。它可以根据预定义的简化规则,对给定的数学表达式进行简化和转化。 以下是simplify 函数的一些常用用法: 简…

[蓝桥杯 2022 省 B] 李白打酒加强版

题目链接 [蓝桥杯 2022 省 B] 李白打酒加强版 题目描述 话说大诗人李白,一生好饮。幸好他从不开车。 一天,他提着酒壶,从家里出来,酒壶中有酒 2 2 2 斗。他边走边唱: 无事街上走,提壶去打酒。 逢店加一倍…

python_绘图_多条折线图绘制_显示与隐藏

1. 需求 给定一个二维数组 100行, 5列, 每一列绘制一条折线, 横轴为行索引, 纵轴为对应位置的值, 绘制在一个子图里面, 使用python plot, 使用随机颜色进行区别添加显示和隐藏按钮, 可以对每条折线进行显示和隐藏 2. 代码 import numpy as np import matplotlib.pyplot as p…

为什么说FMEA是最主要的可靠性设计工具?——FMEA软件

免费试用FMEA软件-免费版-SunFMEA FMEA,即故障模式与影响分析(Failure Modes and Effects Analysis),是一种预防性的质量工具,广泛应用于各种工程领域,特别是在产品设计和制造过程中。它通过对产品或过程中…

工具_git提交时忽略某些文件或者目录,git提交排除某些文件或目录

git 提交时如果想忽略某些文件或者目录: 1.在根目录下创建 .gitignore 文件 2.在该文件中直接添加内容,如: 忽略.mdb、.sln、.sln,.config 文件,不忽视 .txt 文件 *.mdb *.ldb *.sln .config !.txt 忽略Debug目录及文件&#…

4月2日 qt密码生成小程序(可选择生成密码的格式),基于Python框架下的pyqt6

4月2日 密码生成小程序 代码展示: import stringfrom PyQt6.QtWidgets import (QApplication, QDialog,QMessageBox ) from untitled import Ui_PasswordGender import sys import string # py模块含有字符 import randomclass MyPasswordGenerate(Ui_Password…

快速入门Linux,Linux岗位有哪些?(一)

文章目录 Linux与Linux运维操作系统?操作系统图解 认识LinuxLinux受欢迎的原因什么是Linux运维Linux运维岗位Linux运维岗位职责Linux运维架构师岗位职责Linux运维职业发展路线计算机硬件分类运维人员的三大核心职责 运维人员工作(服务器)什么…

python爬虫----了解爬虫(十一天)

🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天…

6000000IOPS!FASS×kunpeng920全新突破

实测数据详见下文 网络环境 前端和后端网均采用100GE网络,管理网采用1Gbps以太网。 前端网和后端网通过不同网段隔离,与管理网物理隔离。 软硬件配置 存储端配置: 客户端配置: 软件配置: 存储集群配置: …