【年报文本分析】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://xiahunao.cn/news/3267264.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Android 生成Excel并导出全流程

前言 最近接到需求,要在安卓上离线完成根据数据生成Excel文件,但搜到了都不是能立马使用 例如 // implementation org.apache.poi:poi:3.17 // implementation com.alibaba:easyexcel:4.0.1 这两最大的问题是专用于java的,如果And…

git sendemail使用

教程参考: git-send-email - 以电子邮件形式发送补丁集 1、安装git-email 2、配置 SMTP 服务器 git config --global sendemail.smtpserver smtp.163.com git config --global sendemail.smtpserverport 465 git config --global sendemail.smtpuser xxxxxx163.c…

恒创科技:如何排查和解决服务器高负载问题?

服务器负载过高是业务正常运行的主要威胁之一。高平均负载意味着系统或服务器超载,许多进程正在等待 CPU 时间。因此将有许多进程等待完成,这些进程将进入队列,导致服务器负载增加。 高负载的主要原因 1.服务器超载 2.垃圾邮件 3.硬盘性能 4.…

Navicat Premium Lite数据库管理软件

首先我们大家可以通过下面的地址下载我们的Navicat Premium Lite: https://www.navicat.com.cn/products/navicat-premium-lite 1、Navicat精简版 2、下载 3、运行界面 。。。

前端面试项目细节重难点分享(十三)

面试题提问:分享你最近做的这个项目,并讲讲该项目的重难点? 答:最近这个项目是一个二次迭代开发项目,迭代周期一年,在做这些任务需求时,确实有很多值得分享的印象深刻的点,我讲讲下面…

【Linux】基本指令1

文章目录 1. find2. which3. alias4.whereis5.grep6. sort 、uniq7. linux怎么编辑文件中的内容 1. find 1.1 find: 查找文件所在的位置。(当我们进行find搜索的时候,可能需要访问磁盘进而导致效率低下。) 1.2 find / file.txt 在Linux系统是…

Qt自定义MessageToast

效果&#xff1a; 文字长度自适应&#xff0c;自动居中到parent&#xff0c;会透明渐变消失。 CustomToast::MessageToast(QS("最多添加50张图片"),this);1. CustomToast.h #pragma once#include <QFrame>class CustomToast : public QFrame {Q_OBJECT pub…

MinIO存储桶通知 - Kafka小测

概述 公司的某个项目需要用上这玩意&#xff0c;所以在本地搭建测试环境&#xff0c;经过一番折腾&#xff0c;测试通过&#xff0c;博文记录&#xff0c;用以备忘 MinIO安装 该节不做说明&#xff0c;网络有很多现成的帖子&#xff0c;自行搜索去 配置步骤 控制台添加事件…

ROS2入门到精通—— 2-11 ROS2实战:实现基于voronoi_planner的全局规划(一)!!!保姆级教程

实现基于voronoi_planner的全局规划将分为两篇博文进行讲解 本文参考该大佬代码: https://github.com/nkuwenjian/voronoi_planner.githttps://github.com/nkuwenjian/voronoi_layer.git将上面的ROS1代码移植到ROS2,移植不易,中间遇到很多坑 0 前言 针对一些狭窄区域,可能…

海山数据库(He3DB)性能优化方案解析

前端优化是一个永恒的话题&#xff0c;每个前端开发者都希望自己的页面能够快速加载&#xff0c;给用户良好的体验。但往往事与愿违。因此&#xff0c;本文从编码优化、构建优化、部署优化三方面入手进行web页面性能优化。 1. 编码优化 1.1. Css优化 1.1.1. 合理使用css选择…

谷粒商城实战笔记-60-商品服务-API-品牌管理-效果优化与快速显示开关

文章目录 一&#xff0c;显示状态列改为switch开关二&#xff0c;监听状态改变 首先&#xff0c;把ESLint语法检查关掉&#xff0c;因为这个语法检查过于严格&#xff0c;在控制台输出很多错误信息&#xff0c;干扰开发。 在build目录下下webpack.base.conf.js中&#xff0c;把…

python基础巩固

基本数据类型 可以用isinstance来判断 a111 isinstance(a,int) True数值运算&#xff1a; >>> 2 / 4 # 除法&#xff0c;得到一个浮点数 0.5 >>> 2 // 4 # 除法&#xff0c;得到一个整数 0 >>> 17 % 3 # 取余 2Python 字符串不能被改变。向一个…

【LLM】-08-搭建问答系统-语言模型,提问范式与 Token

目录 1、语言模型 1.1、训练过程&#xff1a; 1..2、大型语言模型分类&#xff1a; 1.3、指令微调模型训练过程&#xff1a; 2、Tokens 3、Helper function辅助函数 (提问范式) 4、计算token数量 1、语言模型 大语言模型&#xff08;LLM&#xff09;是通过预测下一个词…

由bext安装“异常”引出的话题:windows上转义字符的工作原理

由bext安装“异常”引出的话题&#xff1a;Windows上转义字符的工作原理&#xff0c;与ai“闲扯”不经意学习知识点。 (笔记模板由python脚本于2024年07月25日 19:21:13创建&#xff0c;本篇笔记适合喜欢用ai学习的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff…

【Ubuntu】安装 Snipaste 截图软件

Snipaste 下载安装并使用 Snipastefor more information报错解决方案每次启动软件需要输入的命令如下添加开机自启动 下载 下载地址 安装并使用 Snipaste 进入终端输入命令 # 1、进入到 Snipaste-2.8.9-Beta-x86_64.AppImage 所在目录&#xff08;根据自己的下载目录而定&…

pythonGame-实现简单的贪食蛇游戏

通过python简单复现贪食蛇游戏。 使用到的库函数&#xff1a; import pygame import time import random 游戏源码&#xff1a; import pygame import time import randompygame.init()white (255, 255, 255) yellow (255, 255, 102) black (0, 0, 0) red (213, 50, 80…

数据结构(5):树和二叉树

1 树的定义 1.1 树的基本概念 分支可以称为边&#xff0c;结点可以用于存放数据结构。 除了根节点&#xff0c;其他节点只有一个前驱&#xff01;&#xff01;&#xff01;&#xff01; 互不相交也就是 只有一个前驱结点&#xff01; 树应用的很广的 1.2 结点之间的关系 直接…

DBeaver Ultimate 22.1.0 连接数据库(MySQL+Mongo+Clickhouse)

前言 继续书接上文 Docker Compose V2 安装常用数据库MySQLMongo&#xff0c;部署安装好之后我本来是找了一个web端的在线连接数据库的工具&#xff0c;但是使用过程中并不丝滑&#xff0c;最终还是选择了使用 DBeaver &#xff0c;然后发现 mongo 还需要许可&#xff0c;又折…

为什么idea建议使用“+”拼接字符串

今天在敲代码的时候&#xff0c;无意间看到这样一个提示&#xff1a; 英文不太好&#xff0c;先问问ChatGPT&#xff0c;这个啥意思&#xff1f; IDEA 提示你&#xff0c;可以将代码中的 StringBuilder 替换为简单的字符串连接方式。 提示信息中说明了使用 StringBuilder 进行…

专业视频拍摄与编辑SDK,定制专属视频解决方案

无论是社交媒体营销、产品展示、教育培训还是直播电商&#xff0c;高质量的视频内容都是吸引眼球、传递信息的关键。美摄科技&#xff0c;作为视频编辑处理领域的佼佼者&#xff0c;以其强大的视频拍摄与编辑SDK&#xff0c;为企业开启了视觉创意的新篇章。 【专业级功能&…