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

本文主要是介绍【新三板年报文本分析】第一辑: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

这篇关于【新三板年报文本分析】第一辑:python+selium模拟浏览器,批量实现上市公司年报链接的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/742554

相关文章

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

shell脚本批量导出redis key-value方式

《shell脚本批量导出rediskey-value方式》为避免keys全量扫描导致Redis卡顿,可先通过dump.rdb备份文件在本地恢复,再使用scan命令渐进导出key-value,通过CN... 目录1 背景2 详细步骤2.1 本地docker启动Redis2.2 shell批量导出脚本3 附录总

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的