【新三板年报文本分析】第一辑:python+selium模拟浏览器,批量实现上市公司年报链接

目录

  • 序言
  • 函数模块介绍
    • 创建模拟浏览器对象
    • 只需要执行一次的部分
    • 需要批量执行的重复操作部分(信息录入excel)
    • 换页操作
    • 主函数
  • 本地文件结构
  • 全部代码
  • 结果预览

如果直接需要结果的,可以直接见文末,获取资源。

序言

新三板年报链接:https://www.neeq.com.cn/disclosure/announcement.html

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

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

一定不要图快,目前我是2s左右完成一次。建议在网络环境较好的情况下运行

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

函数模块介绍

创建模拟浏览器对象

# 返回虚拟浏览器对象
def openUrl(url):driver = webdriver.Chrome()driver.get(url)time.sleep(2)return driver

只需要执行一次的部分

xpath如何获取百度一下即可

# 只运行一次,避免重复操作影响效率
def onceClick(driver):driver.find_element_by_xpath('//*[@id="root"]/div[4]/div/div/div[1]/div[1]/div/div[4]/div/div[2]/span[5]').click()    time.sleep(2)

需要批量执行的重复操作部分(信息录入excel)

# 每一页的XPATH都是一样的,只需处理好一页即可
def judge(driver,df): global firmNofor i in range(1,21):element=driver.find_element_by_xpath(f'//*[@id="table"]/table/tbody/tr[{i}]/td[3]/a')text=element.textif '年度报告' in text and '年度报告摘要' not in text:firmNo=firmNo+1# 根据图片名称判断是创新层还是基础层try:stageelement = driver.find_element_by_xpath(f'//*[@id="table"]/table/tbody/tr[{i}]/td[1]/img')srcname=stageelement.get_attribute('src')          if 'jj' in srcname:df['stage'][firmNo]='基础层'elif 'cy' in srcname:df['stage'][firmNo]='创新层'except:print('跳过层次认定')continue# 公司代码codeelement = driver.find_element_by_xpath(f'//*[@id="table"]/table/tbody/tr[{i}]/td[1]/a')code=codeelement.textdf['code'][firmNo]=code# 公司简称firmelement = driver.find_element_by_xpath(f'//*[@id="table"]/table/tbody/tr[{i}]/td[2]')firm=firmelement.textdf['firm'][firmNo]=firm# 报告年份index=text.index(':')year=text[index+1:index+5]df['year'][firmNo]=year# 年报链接urlelement = driver.find_element_by_xpath(f'//*[@id="table"]/table/tbody/tr[{i}]/td[4]/a')url=urlelement.get_attribute('href')  df['url'][firmNo]=url# 发布日期dateelement = driver.find_element_by_xpath(f'//*[@id="table"]/table/tbody/tr[{i}]/td[5]')date=dateelement.textdf['date'][firmNo]=date              df.to_csv('url.csv')

换页操作

由于年报链接在不同的页,需要模拟浏览器点击进行换页操作

# 换页
def turn_to_page(driver,page):   if page==2:driver.find_element_by_xpath('//*[@id="root"]/div[4]/div/div/div[1]/div[3]/div/a[1]').click()elif page>=3 and page<=5:driver.find_element_by_xpath(f'//*[@id="root"]/div[4]/div/div/div[1]/div[3]/div/a[{page}]').click()if page>6:driver.find_element_by_xpath('//*[@id="root"]/div[4]/div/div/div[1]/div[3]/div/a[6]').click()print(f'已跳转至{page}页')

主函数

#主函数
if __name__ =='__main__':driver=openUrl('https://www.neeq.com.cn/disclosure/announcement.html')onceClick(driver)df=pd.DataFrame(columns=['stage','code','firm','year','url','date'],index=range(1,20000))for i in range(2,4000):judge(driver,df)turn_to_page(driver,i)time.sleep(2.5)driver.close()

本地文件结构

只需要将excel文件和代码文件放一起即可,或者用绝对路径也可
在这里插入图片描述

全部代码

from selenium import webdriver 
import time 
import pandas as pdfirmNo=0# 返回虚拟浏览器对象
def openUrl(url):driver = webdriver.Chrome()driver.get(url)time.sleep(2)return driver# 只运行一次,避免重复操作影响效率
def onceClick(driver):driver.find_element_by_xpath('//*[@id="root"]/div[4]/div/div/div[1]/div[1]/div/div[4]/div/div[2]/span[5]').click()    time.sleep(2)# 每一页的XPATH都是一样的,只需处理好一页即可
def judge(driver,df): global firmNofor i in range(1,21):element=driver.find_element_by_xpath(f'//*[@id="table"]/table/tbody/tr[{i}]/td[3]/a')text=element.textif '年度报告' in text and '年度报告摘要' not in text:firmNo=firmNo+1# 根据图片名称判断是创新层还是基础层try:stageelement = driver.find_element_by_xpath(f'//*[@id="table"]/table/tbody/tr[{i}]/td[1]/img')srcname=stageelement.get_attribute('src')          if 'jj' in srcname:df['stage'][firmNo]='基础层'elif 'cy' in srcname:df['stage'][firmNo]='创新层'except:print('跳过层次认定')continue# 公司代码codeelement = driver.find_element_by_xpath(f'//*[@id="table"]/table/tbody/tr[{i}]/td[1]/a')code=codeelement.textdf['code'][firmNo]=code# 公司简称firmelement = driver.find_element_by_xpath(f'//*[@id="table"]/table/tbody/tr[{i}]/td[2]')firm=firmelement.textdf['firm'][firmNo]=firm# 报告年份index=text.index(':')year=text[index+1:index+5]df['year'][firmNo]=year# 年报链接urlelement = driver.find_element_by_xpath(f'//*[@id="table"]/table/tbody/tr[{i}]/td[4]/a')url=urlelement.get_attribute('href')  df['url'][firmNo]=url# 发布日期dateelement = driver.find_element_by_xpath(f'//*[@id="table"]/table/tbody/tr[{i}]/td[5]')date=dateelement.textdf['date'][firmNo]=date              df.to_csv('url.csv')# 换页
def turn_to_page(driver,page):   if page==2:driver.find_element_by_xpath('//*[@id="root"]/div[4]/div/div/div[1]/div[3]/div/a[1]').click()elif page>=3 and page<=5:driver.find_element_by_xpath(f'//*[@id="root"]/div[4]/div/div/div[1]/div[3]/div/a[{page}]').click()if page>6:driver.find_element_by_xpath('//*[@id="root"]/div[4]/div/div/div[1]/div[3]/div/a[6]').click()print(f'已跳转至{page}页')#主函数
if __name__ =='__main__':driver=openUrl('https://www.neeq.com.cn/disclosure/announcement.html')onceClick(driver)df=pd.DataFrame(columns=['stage','code','firm','year','url','date'],index=range(1,20000))for i in range(2,4000):judge(driver,df)turn_to_page(driver,i)time.sleep(2.5)driver.close()

结果预览

在这里插入图片描述
我获取的是2018-2022五年的所有年报的链接,文件放在下方链接,有需求自取,就无需在运行上述代码了。

https://download.csdn.net/download/weixin_43956523/88870592

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

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

相关文章

emoji选择器

emoji表情 功能描述 这款聊天对话时选择表情的UI插件&#xff0c;是为了提升用户在聊天过程中的互动体验而设计的。它提供了一个直观且易于操作的界面&#xff0c;使用户能够快速地选择并插入各种表情符号&#xff0c;从而丰富他们的聊天内容&#xff0c;增加情感表达的多样性…

Unity3D 使用 Proto

一. 下载与安装 这里下载Google Protobuff下载 1. 源码用来编译CSharp 相关配置 2. win64 用于编译 proto 文件 二. 编译 1. 使用VS 打开 2. 点击最上面菜单栏 工具>NuGet 包管理器>管理解决方案的NuGet 管理包 版本一定要选择咱们一开始下载的对应版本否则不兼容&am…

C语言第三十一弹---自定义类型:结构体(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 目录 1、结构体内存对齐 1.1、为什么存在内存对齐? 1.2、修改默认对齐数 2、结构体传参 3、结构体实现位段 3.1、什么是位段 3.2、位段的内存分配 3.3、…

leetcode-hot100-hash表

leetcode-hot100-hash表 1. 两数之和49. 字母异位次分组128. 最长连续序列 hash表主要功能是&#xff1a;记录&#xff0c;当做查找表&#xff0c;时间换空间的一种策略。 1. 两数之和 nums [2,7,11,15], target 9 输出&#xff1a;[0,1] **解释&#xff1a;因为 nums[0] …

幻兽帕鲁服务器多少钱?有买过的吗?

幻兽帕鲁服务器多少钱&#xff1f;太卷了&#xff0c;降价到24元1个月&#xff0c;阿里云4核16G10M游戏服务器26元1个月、149元半年&#xff0c;腾讯云4核16G游戏服务器32元、312元一年&#xff0c;华为云26元&#xff0c;京东云主机也是26元起。云服务器吧yunfuwuqiba.com给大…

VUE3环境搭建开发准备

VUE3 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0c;Vu…

【Prometheus】概念和工作原理介绍

目录 一、概述 1.1 prometheus简介 1.2 prometheus特点 1.3 prometheus架构图 1.4 prometheus组件介绍 1、Prometheus Server 2、Client Library 3、pushgateway 4、Exporters 5、Service Discovery 6、Alertmanager 7、grafana 1.5 Prometheus 数据流向 1.6 Pro…

100天精通Python(实用脚本篇)——第117天:基于selenium实现反反爬策略之代码输入账号信息登录网站

文章目录 专栏导读1. 前言2. 实现步骤3. 基础补充4. 代码实战4.1 创建连接4.2 添加请求头伪装浏览器4.3 隐藏浏览器指纹4.4 最大化窗口4.5 启动网页4.6 点击密码登录4.7 输入账号密码4.8 点击登录按钮4.9 完整代码4.10 GIF动图展示 五、总结 专栏导读 &#x1f525;&#x1f5…

httpx.InvalidURL: Invalid port

httpx.InvalidURL: Invalid port 介绍解决方案总结 介绍 httpx包的bug&#xff0c;使用GPT-SoVITS时无法运行报的错 解决方案 改源码的这个文件lib/python3.9/site-packages/httpx/_urlparse.py&#xff1a;149行左右&#xff1a; def urlparse(url: str "", **…

IDEA安装配置以及安装配置Maven

IEDA官方下载地址&#xff0c;有专业版&#xff08;收费&#xff0c;破解&#xff09;&#xff0c;社区版&#xff08;免费&#xff09; 下载 IntelliJ IDEA – 领先的 Java 和 Kotlin IDE 安装配置Maven 1.解压apache-maven-3.6.3-bin.zip&#xff0c;安装maven到D盘softwar…

台湾旺泓-WH4530A三合一光距感 接近传感芯片

WH4530A是一款集成了环境光传感器&#xff08;PS&#xff09;接近传感器&#xff08;ALS&#xff09;和红外LED灯三合一为一体的光距感传感芯片&#xff0c;可以测距从0到100厘米以内范围&#xff1b;并采用I2C接口具有超高的灵敏度和精准的测距检测范围。 该WH4530A​​​​​…

真香!NineData SQL开发全面适配 GaiaDB

2 月&#xff0c;新年伊始&#xff0c;NineData 重磅发布&#xff0c;提供了对百度云原生关系型数据库 GaiaDB 的支持。 这一次的发布不仅仅是简单的数据源支持&#xff0c;而是覆盖了整个 SQL 开发能力的重要发布&#xff0c;意味着您已经可以完整地使用 NineData SQL 开发的…

MySQL 事务原理分析

事务 前提&#xff1a;并发连接访问。定义&#xff1a;事务是用户定义的一系列操作&#xff0c;这些操作要么都做&#xff0c;要么都不做&#xff0c;是一个不可分割的单位。目的&#xff1a;事务将数据库从一种一致性状态转换为另一种一致性状态&#xff0c;保证系统始终处于…

半导体物理基础-笔记(续)

源内容参考&#xff1a;https://www.bilibili.com/video/BV11U4y1k7zn/?spm_id_from333.337.search-card.all.click&vd_source61654d4a6e8d7941436149dd99026962 掺杂半导体的费米能级与温度及杂质浓度的关系图 在温度一定的条件下&#xff0c;施主杂质浓度越高&#xff0…

接口测试实战--读取yaml用例

一、yaml模块用法 使用场景: 配置文件、测试用例文件等 语法: 大小写敏感 使用缩进表示层级关系 缩进时不允许用tab键,只能使用空格 缩进的空格数目不重要,只要相同层级的元素左对齐 #表示注释 基本数据类型:字符串、整型、列表、null(可使用~表示)、布尔型、时间 1)…

Redis操作

1、KEY操作 1.1 exists 1.2 expire 设置过期时间 expire name 5 1.3 ttl 如果不过期返回-1 1.4 del 2、字符串值&#xff08;String&#xff09; 2.1 set 2.2 get 2.3 setnx 当且仅当key不存在时才新增 不存在时返回1&#xff0c;存在返回0 2.4 setex 设置key的存活时间&am…

Oracle EBS GL 外币折算逻辑

背景 由于公司财务在10月份期间某汇率维护错误,导致帐套折算以后并合传送至合并帐套生成合并日记帐凭证的借贷金额特别大,但是财务核对的科目余额有没有问题,始终觉得合并日记帐生成会计分发有问题,需要我们给出外币折算逻辑。 基础设置 汇率 Path: GL->设置->币种-&…

pclpy 最小二乘法拟合平面

pclpy 最小二乘法拟合平面 一、算法原理二、代码三、结果1.左边原点云、右边最小二乘法拟合平面后点云投影 四、相关数据 一、算法原理 平面方程的一般表达式为&#xff1a; A x B y C z D 0 ( C ≠ 0 ) Ax By Cz D 0 \quad (C\neq0) AxByCzD0(C0) 即&#xff1a; …

【JSON详细讲解】

JSON讲解 1. 介绍2. JSON的基本规则3. JSON中的数据类型4. JSON的基本结构5. 在不同的语言中使用JSON 1. 介绍 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它是基于JavaScript的一个子集&#xff0c;但它是独立于语言的&a…

矢量扩散模型初探

import paddle from matplotlib import pyplot as plt import numpy as np from tqdm import tqdm# 从零开始构建一个简单的扩散模型 # 首先是扩散过程 # loss=label-net(sqrt(alpha_prod[t])*x0+sqrt(1-alpha_prod[t])*label) # label =正太分布采样 # alpha 是 一个斜边为1 的…