【年报文本分析】Python+Selium获取互动易平台投资者提问与上市公司回应文本数据

目录

  • 序言
  • excel文件准备
  • 全部代码

序言

互动易平台链接:https://irm.cninfo.com.cn/views/interactiveAnswer

需要提前下载好三个库,都可以用pip install轻松下载,稍微麻烦点儿的是需要去下载个对应版本的chromedriver.exe驱动,放到python或者Anaconda的文件夹目录下,然后添加环境变量(这部分报错了自行百度即可,操作起来不麻烦的)

注意time.sleep()是必要的,一是为了避免频繁操作被浏览器提醒,二是在网络不好的情况下让网页加载完全,否则都会导致报错,一定不要图快,建议在网络环境较好的情况下运行

这之中还会遇到诸多问题,在代码的注释里也都写到了,其他需求可以做参考。

excel文件准备

文件名建议直接命名为info.xlsx,读取时使用该路径,文件需要至少包括code(股票代码)和year(年份)

在这里插入图片描述

全部代码

详细解释已写在注释中

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys
import time 
import pandas as pd
import requests
from urllib.request import urlopen
from bs4 import BeautifulSoupindex1=1 # 数据所在行
index2=1 # 数据所在行
dtype={'code':str,'year':str}
dfInfo=pd.read_excel('info.xlsx',sheet_name='Sheet1',dtype=dtype)#导入基础信息表
#创建已回复空表
df1=pd.DataFrame(columns=['code','name','year','url','Answer','Atime','Question','Qtime'],index=range(1,30001))
#创建未回复空表
df2=pd.DataFrame(columns=['code','name','year','Question','Qtime'],index=range(1,5001))# 创建浏览器对象,并全屏,进入互动易平台
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://irm.cninfo.com.cn/views/interactiveAnswer')
time.sleep(4)# 根据行序号,对sourcedf进行遍历
# 如果信息较多,建议可以分批运行,支持中断
startRow=1
endRow=100
for i in range(startRow,endRow+1):#在新表中保存信息code=dfInfo['code'][i]name=dfInfo['name'][i]year=dfInfo['year'][i]print(str(i)+' '+code+' '+name+' '+year)###一系列的点击输入操作driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[1]').click()time.sleep(0.5)#根据是否首次输入,调整输入内容if i==startRow:driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[3]/div/div/input[1]').send_keys('20'+year[2:]+'-01-01')time.sleep(0.5)driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[3]/div/div/input[2]').send_keys('20'+year[2:]+'-12-31')time.sleep(0.5)driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[2]/div/input').click()time.sleep(0.5)driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[1]/div/div[1]/input').send_keys(code)time.sleep(1)else:driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[3]/div/div/input[1]').send_keys(8*Keys.BACKSPACE)time.sleep(0.5)  driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[3]/div/div/input[1]').send_keys(year[2:]+'-01-01')time.sleep(0.5)driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[3]/div/div/input[2]').send_keys(8*Keys.BACKSPACE)time.sleep(0.5)driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[3]/div/div/input[2]').send_keys(year[2:]+'-12-31')time.sleep(0.5)driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[2]/div/input').click()time.sleep(0.5)driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[1]/div/div[1]/input').send_keys(6*Keys.BACKSPACE)time.sleep(0.5)driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[1]/div/div[1]/input').send_keys(code)time.sleep(1)#点击确定driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[4]/button[1]').click()time.sleep(1)#点击进入已回复界面driver.find_element_by_xpath('//*[@id="tab-11"]').click()time.sleep(1)   #收集已回复的信息for j in range(200):for k in range(1,11):#如果当页有十条数据,就获取并写入信息,如果不足十条就跳出当前循环try: Question=driver.find_element_by_xpath(f'//*[@id="pane-11"]/div[{k}]/span/span/a/div[1]/span').textAnswer=driver.find_element_by_xpath(f'//*[@id="pane-11"]/div[{k}]/span/span/a/div[2]/span[1]/span').textAtime=driver.find_element_by_xpath(f'//*[@id="pane-11"]/div[{k}]/a/span/span[2]/span[2]').textelement=driver.find_element_by_xpath(f'//*[@id="pane-11"]/div[{k}]/span/span/a')               url=element.get_attribute('href')df1['code'][index1]=codedf1['name'][index1]=namedf1['year'][index1]=yeardf1['url'][index1]=url          df1['Question'][index1]=Questiondf1['Answer'][index1]=Answerdf1['Qtime'][index1]=Atimeindex1+=1except:break    #如果有下一页按钮就点击,否则跳出当前循环try:driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[2]/div/button[2]').click()time.sleep(1)except:break#点击进入未回复界面driver.find_element_by_xpath('//*[@id="tab-1"]').click()time.sleep(1)     #收集未回复的信息for a in range(200):for b in range(1,11):#如果当页有十条数据,就获取并写入信息,如果不足十条就跳出当前循环try: Question=driver.find_element_by_xpath(f'//*[@id="pane-1"]/div[{b}]/span/span/a/div/span').textQtime=driver.find_element_by_xpath(f'//*[@id="pane-1"]/div[{b}]/a/span/span[2]/span[2]').textdf2['code'][index2]=codedf2['name'][index2]=namedf2['year'][index2]=year       df2['Question'][index2]=Questiondf2['Qtime'][index2]=Qtimeindex2+=1except:break    #如果有下一页按钮就点击,否则跳出当前循环try:driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[2]/div/button[2]').click()time.sleep(1)except:break# 每隔100个保存一次,防止中途断网或报错导致前边运行完成的数据丢失if i%100 == 0:df1.to_excel('result1.xlsx')df2.to_excel('result2.xlsx')
# 保存最终版,如果不是一次性运行完,可以将结果复制到新表中后关闭,随后调整startrow和endrow进行下一阶段的运行
df1.to_excel('result1.xlsx')
df2.to_excel('result2.xlsx') 

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

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

相关文章

路由表与IP数据报的转发

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、相关知识 1、路由类型 路由表中有3类路由:直连路由、静态路由、动态路由 直连路由:一般指去往路由器接口直接连接网络的…

mysql中You can’t specify target table for update in FROM clause错误

mysql中You can’t specify target table for update in FROM clause错误 You cannot update a table and select directly from the same table in a subquery. mysql官网中有这句话,我们不能在一个语句中先在子查询中从某张表查出一些值,再update这张表…

Python 变量与基本数据类型

重点内容 1 掌握变量及厂里在数据输入、输出及计算中的应用; 2 熟练使用datetime模块来处理日期和时间问题; 3 熟练掌握abs()、round()、pow()、sum()、min()、max()等的应用; 4 利用变量、字符等知识模拟开发中一些场景的输入与输出&…

day22——homework

作业 1、使用fgets统计给定文件的行号 #include <myhead.h>int main() {FILE *file NULL;char line[256];int line_number 0;int k 0;file fopen("1.txt", "r");if (file NULL){printf("无法打开文件\n");return -1;}while (fgets(…

【ffmpeg命令入门】视频剪切,倍速与倒放

文章目录 前言1. 视频剪切2. 视频倍速公式说明例子 3. 视频倒放总结 前言 在视频编辑中&#xff0c;剪切、倍速和倒放是常见的操作&#xff0c;能够帮助我们调整视频的长度、播放速度以及播放顺序。掌握 FFmpeg 命令中的相关参数和用法将使视频处理变得更加高效。在这篇文章中…

ViT中的池化知识

1. 输出池化策略 输出池化策略&#xff08;Output Pooling Strategy&#xff09;是指在模型&#xff0c;特别是像 Vision Transformer (ViT) 这样的视觉模型中&#xff0c;如何从网络的输出中选择或聚合信息以获得最终的表示。 1.1 常见的输出池化策略 CLS Token Pooling: 在…

pytest使用

主要技术内容 1.pytest设计 接口测试 框架设想 common—公共的东西封装 1.request请求 2.Session 3.断言 4.Log 5.全局变量 6.shell命令 ❖ config---配置文件及读取 ❖ Log— ❖ payload—请求参数—*.yaml及读取 ❖ testcases—conftest.py; testcase1.py…….可…

2024年【熔化焊接与热切割】考试题及熔化焊接与热切割考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 熔化焊接与热切割考试题是安全生产模拟考试一点通生成的&#xff0c;熔化焊接与热切割证模拟考试题库是根据熔化焊接与热切割最新版教材汇编出熔化焊接与热切割仿真模拟考试。2024年【熔化焊接与热切割】考试题及熔化…

vue-plugin-hiprint 打印 预览打印+静默打印

1.安装 npm install vue-plugin-hiprint npm i socket.io-client --save //为了静默打印 &#xff08;为此还需安装客户端&#xff09; 2…html页面 引入css <link rel"stylesheet" type"text/css" media"print" href"https://cdn.jsde…

深入解析:如何使用Nmap绕过防火墙和欺骗IDS规则

在现代网络安全领域&#xff0c;防火墙和入侵检测系统&#xff08;IDS&#xff09;是保护网络免受攻击的关键组件。Nmap作为一款强大的网络扫描工具&#xff0c;不仅用于网络探测和安全审计&#xff0c;还能在合法渗透测试中发挥重要作用。本指南将详细介绍如何使用Nmap绕过防火…

观察者模式(C++实现)

观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心思想 观察者模式通过分离观察者和被观察…

RxJava 面试题及其答案

以下是一个全面的 RxJava 面试题及其答案&#xff0c;涵盖了 RxJava 的各个方面&#xff0c;包括基本概念、操作符、线程管理、错误处理、背压处理等&#xff1a; 基本概念 1. RxJava 的基本概念和原理是什么&#xff1f; 答案&#xff1a; RxJava 是一个用于响应式编程的库…

随记0000——从0、1 到 C语言

C语言的发展历程是计算机科学史上的一个重要里程碑。 下面是从最早的机器语言到汇编语言&#xff0c;再到高级语言如 C 语言的简化演进过程&#xff1a; 1. 机器语言 定义与特点 机器语言是最底层的编程语言&#xff0c;由一系列二进制代码组成。直接被CPU执行&#xff0c;…

创新大赛中财务预测的策略与技巧

创新大赛中财务预测的策略与技巧 前言财务预测的重要性财务预测的步骤财务预测的关键要素注意事项结语 前言 在当今快节奏、竞争激烈的商业环境中&#xff0c;创新不仅是推动企业成长的动力&#xff0c;更是衡量一个项目能否在市场中脱颖而出的关键。创新大赛作为展示这些创新成…

星耀巴黎,竞猜有礼!为运动健儿加油,让世界看见中国力量

即将高燃来袭首金荣耀&#xff0c;让我们拭目以待&#xff01; 当象征着“更快、更高、更强”的号角再次吹响&#xff0c;谁又能在这场全球瞩目的体育盛宴中&#xff0c;率先触碰那份至高无上的荣耀&#xff1f;“首金”不仅是一个国家或地区体育实力的象征&#xff0c;更是运…

1台solidworks图形工作站同时给5人一起使用

在日益发展的科技环境中&#xff0c;团队协作已成为各个行业不可或缺的一一部分。对于工程设计和图形处理领域而言&#xff0c;SolidWorks等强 大的三维建模和仿真软件成为了日常工作的重要工具。 随着团队规模的扩大和项目复杂性的增加&#xff0c;如何高效、稳定地为多人提供…

Java入门:05.Java中的数组002

通过上篇文章&#xff0c;相信大家对数组应该有了一个简单的了解&#xff0c;并对Java中的数据类型有了一个基本的认识&#xff0c;不仅如此我们还明白了怎样定义一个数组类型的变量&#xff0c;在这之后&#xff0c;让我们一起来更加深入的了解一下数组吧。 三、如何创建一个…

Axure软件新功能解析与应用技巧分享

Axure是一种用于创建原型和交互设计的软件工具&#xff0c;广泛应用于操作界面。&#xff08;UI&#xff09;和客户体验&#xff08;UX&#xff09;为了展示和测试应用程序、网站或其他数据产品的性能和操作界面&#xff0c;设计帮助产品经理、设计师和开发者制作具有交互性的原…

Ghost Buster Pro for Mac:系统优化的得力助手

Ghost Buster Pro for Mac是一款功能强大的系统优化工具&#xff0c;专为Mac用户设计&#xff0c;旨在提供全方位的系统清理、优化和维护服务。 这款软件拥有出色的垃圾清理能力&#xff0c;能够深度扫描并清除Mac上的无效目录、文件、系统日志、下载历史记录、缓存和临时文件…

每日任务:TCP/IP模型和OSI模型的区别

介绍一下TCP/IP模型和OSI模型的区别&#xff1f; OSI模型由国标准化组织提出&#xff0c;而TCP/IP模型是由美国国防部开发的&#xff1b; OSI模型由七个层次组成&#xff0c;从下到上依次为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。而TCP/IP模型只有四层…