python + selenium实现巨潮资讯网指定范围年报下载

这篇具有很好参考价值的文章主要介绍了python + selenium实现巨潮资讯网指定范围年报下载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大家好!第一次写文章,紧张滴捏!

巨潮资讯网年报怎么下载,selenium,测试工具,python,网络爬虫  

这段时间在做课设,课设里需要下载沪市600000到601000号的年报原文做数字化关键词的词频分析,想着用程序帮我批量下载一下,但是找了一下貌似没有类似的代码,就写了一个应用selenium库来做模拟下载的python代码。

写的很烂,爬的很慢,稳定性也不太好,但总算还是爬出来了!下面先上代码,边看代码边讲解!

(注:使用这个方法要先安装selenium库与对应浏览器的驱动器哦!我这里下载的是Edge的驱动器)

首先是需要调用的各种python库~

#包含控制浏览器的类和方法
from selenium import webdriver

#用于执行复杂鼠标和键盘操作的类
from selenium.webdriver.common.action_chains import ActionChains

#用于添加延时或暂停
import time

#用于等待特定条件发生后再继续执行
from selenium.webdriver.support.ui import WebDriverWait

#定义用于等待的条件
from selenium.webdriver.support import expected_conditions as EC

#定义一组用于选择元素的方法
from selenium.webdriver.common.by import By

检测关键词的函数

下面,我写了一个用于判断可供选择的链接是年报还是年报摘要的函数。因为研究中需要的是年报,就把后文调用函数用到的关键词定为了“摘要”。

#定义一个check_world函数
def check_word(sentence, word):
    if word in sentence:  #如果关键词word在文本中,返回true,否则返回false
        return True
    else:
        return False

下载年报的函数

接下来就是用于自动化测试的函数啦!在这里,我定义了一个nianbao函数,当调用函数时,输入股票代码code,函数将会执行自动测试操作并下载网页。

def nianbao(code):

    # 启动Edge浏览器并加载选项
    browser = webdriver.Edge()
    url = 'http://www.cninfo.com.cn/new/commonUrl?url=disclosure/list/notice#sse'
    browser.get(url)
    browser.maximize_window()
    
    #输入时间
    #注:这段有没有都无所谓()因为我发现就算写了他也不会给我执行这段操作,但是因为网站的自动检索年报的范围就是我需要的范围,所以没差()
    browser.find_element_by_xpath('//*[@id="main"]/div[2]/div[1]/div[2]/div[1]/div[2]/form/div[1]/div/div/input[1]').send_keys('2022-12-31')
    browser.find_element_by_xpath('//*[@id="main"]/div[2]/div[1]/div[2]/div[1]/div[2]/form/div[1]/div/div/input[2]').send_keys('2022-06-15')
    #browser.find_element_by_xpath("//body").click()
    #browser.find_element_by_xpath("//body").click()
    
    
    #输入年报,将检索范围锁定在年报中
    #第一段用于点击分类按钮
    browser.find_element_by_xpath('//*[@id="main"]/div[2]/div[1]/div[2]/div[1]/div[2]/form/div[2]/div[3]/div/div/span/button').click()
    #第二段用于点击年报选项
    browser.find_element_by_xpath('/html/body/div[6]/div[1]/label[1]/span[1]/span').click()
    
    #输入代码
    #第一段用于点击输入框
    browser.find_element_by_xpath('/html/body/div[2]/div/div[2]/div[1]/div[2]/div[1]/div[2]/form/div[2]/div[1]/div/div/div/div/input').send_keys(code)
    
    #这一段用于暂停页面操作,等待等待元素加载完成后继续执行操作(我设置的是三秒)
    time.sleep(3)
    
    #这一段用于点击搜索按钮,使用了更为稳健的模拟鼠标操作
    button_element = browser.find_element_by_xpath('/html/body/div[2]/div/div[2]/div[1]/div[2]/div[1]/div[2]/div[1]/button')
    actions = ActionChains(browser)
    actions.move_to_element(button_element).click().perform()
    
    # 等待页面元素加载完成
    time.sleep(3)

    
    #进入公告
    #写了一个try,因为有时候可能对应的代码没有公司
    try:
        #调用check_word函数,判断要进入具体页面的报告是摘要还是年报
        word = "摘要"
        #获取页面中第二个xpath对应的text内容(如600000号股票就会返回“上海浦东发展银行股份有限公司2022年年度报告(全文)”)
        browser_text = browser.find_element_by_xpath('/html/body/div[2]/div/div[2]/div[1]/div[1]/div[2]/div/div[3]/table/tbody/tr[2]/td[3]/div/span/a').text


        #如果是摘要,返回true,执行第一个xpath
        #注:有的页面可能有三个按钮,但是前两个按钮中一个有一个是年报或者年报修订版(确信)        
        if check_word(browser_text, word):
            browser.find_element_by_xpath('/html/body/div[2]/div/div[2]/div[1]/div[1]/div[2]/div/div[3]/table/tbody/tr[1]/td[3]/div/span/a').click()

            #上一步操作后会打开一个新的页面,我们要获取新页面的url用于下载,将browser变更为新页面
            window_handles = browser.window_handles
            latest_window_handle = window_handles[-1]
            browser.switch_to.window(latest_window_handle)

        #当不含有摘要,返回false,点击第二个xpath
        else:
            browser.find_element_by_xpath('/html/body/div[2]/div/div[2]/div[1]/div[1]/div[2]/div/div[3]/table/tbody/tr[2]/td[3]/div/span/a').click()
            window_handles = browser.window_handles
            latest_window_handle = window_handles[-1]
            browser.switch_to.window(latest_window_handle)        

        #获取网页url
        browser_url = browser.current_url

    #当所属公司code无法搜索出年报,那么这家公司可能是退市了,输出没有找到年报
    except Exception as e:
        print("没有找到",code,"的对应年报")
        browser.quit()
        
        #跳出方法
        return
        
    #这一段用于检测code有没有对应的公司,如果没有公司,那么点击搜索按钮只会停留在原来的页面上。这时执行上文获取的url就会下载错误的年报。
    #这里我用了暴力的解决方法,直接查看原有页面的前两个xpath具体页面的url内容,然后ban掉他们!这里在使用的时候一定要记得检查当日的前两位url
    if browser_url == "http://www.cninfo.com.cn/new/disclosure/detail?stockCode=688669&announcementId=1217087254&orgId=gfbj0833817&announcementTime=2023-06-17" or browser_url == "http://www.cninfo.com.cn/new/disclosure/detail?stockCode=603825&announcementId=1217085098&orgId=9900024448&announcementTime=2023-06-17":
        print("没有",code,"对应的公司")
        browser.quit()
    else: 
        browser2 = webdriver.Edge()
        browser2.get(browser_url)
        
        #进入url的页面,点击下载按钮,下载年报。其中,如果网不好+文件大的情况,就需要将time.sleep(10)的参数调大,不然下不完,网站就关了
        browser2.find_element_by_xpath('/html/body/div[1]/div/div[1]/div[3]/div[1]/button').click()
        time.sleep(10)
        print("已成功下载",code,"公司的年报")

        #关闭网站,防止资源浪费
        browser.quit()
        browser2.quit()
    

测试

写完函数,让我们调用它来测试一下:

code = "600000"
nianbao(code)

输出结果:

巨潮资讯网年报怎么下载,selenium,测试工具,python,网络爬虫

 在浏览器默认的下载路径中,已经出现了我们想要爬取的文件啦~

再来看看大批量调用的结果!毕竟我们写这个函数,最开始就是为了大面积自动下载文件嘛

for code in range(600301,601001):
    nianbao(code)

输出结果:

巨潮资讯网年报怎么下载,selenium,测试工具,python,网络爬虫

军火展示:

巨潮资讯网年报怎么下载,selenium,测试工具,python,网络爬虫 

C盘内存告急(

当然,这种方法并不是一个批量下载文件的好方法。一方面,它会大量占用时间占用电脑()刚考了个六级又吃了个饭回来下了大概600份不到,如果遇到网不好的情况那更是痛苦,隔三差五就要检查有没有中途崩溃()

同时,xpath也很难搞,在写代码时经常会遇到使用xpath但点击不了元素的情况。如上文中,我本想直接进入年报链接来下载,但是那个页面的下载按钮无论如何都没法点击。我就参考了王宇韬老师的《Python金额大数据挖掘与分析全流程详解》中第十章的内容,选择获取连接重新打开一个页面来下载,用了这个方法才能够正常下载。

结语

在使用代码的时候,最好检查一下xpath和缩进有没有错误哦。

第一次用python做这种大批量的文件下载,还在不断地学习中。写的不太好,大家多多包涵,如果有更好的方法欢迎大家讨论分享!

下一篇大概会写Android Studio的B站视频数据爬虫或者自制的LaTeX数模论文模板(?)

谢谢大家收看(鞠躬)

 文章来源地址https://www.toymoban.com/news/detail-752566.html

到了这里,关于python + selenium实现巨潮资讯网指定范围年报下载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python实现指定区域桌面变化监控并报警

    在这篇博客中,我们将使用Python编程语言和一些常用的库来实现一个简单的区域监控和变化报警系统。我们将使用Tkinter库创建一个图形界面,允许用户选择监控区域,并使用OpenCV库进行图像处理和相似性比较,以检测区域内的变化,并通过播放声音进行报警。 实现效果 运行

    2024年02月15日
    浏览(38)
  • python使用opencv实现识别指定区域的行人

    1、案例介绍         案例实现对视频中的行人进行实时检测,并可在视频画面通过鼠标绘制矩形区域,行人经过区域内后,程序会进行判断行人已进入该区域,行人检测框颜色将变为蓝色。该程序主要使用python的opencv模块实现,实现流程:首先利用Haar分类器实现行人检测

    2024年02月09日
    浏览(31)
  • Python使用PyQt5实现指定窗口置顶

    工作中,同事随口提了一句:要是能让WPS窗口置顶就好了,老是将窗口切换来切换去的太麻烦了。 然后,这个奇怪的点子引起了本人的注意,那就试试能不能实现吧。 不知道是不是我手法或版本的缘故,用了网上找的代码都是窗口弹出而已,并没有把它置顶,可以参考以下

    2024年02月13日
    浏览(39)
  • 基于SpringBoot实现功能最全电影购票与信息资讯平台

    作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题库

    2024年02月04日
    浏览(34)
  • 基于SpringBoot+Vue的考研资讯平台设计与实现

     博主介绍 :  大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下进行项目开发,具有丰富的项目经验和开发技能。我的

    2024年02月08日
    浏览(90)
  • python -- 实现路径的匹配,剔除掉指定路径,并保存路径

    在处理nc数据时,由于部分数据在插值的过程中,存在过多的0值,使得在制作标签时该时刻的数据出现报错,但是对于一年的数据量来说,无关紧要,所以只是记录了出现报错的时刻的路径,方面在后续变量读取过程中进行剔除,报错后续文件的处理。 下面记录一下主要的代

    2024年02月10日
    浏览(26)
  • python实现监控指定进程的CPU利用率、内存占用

            因为需要一直关注被测软件的CPU利用率和内存占用,人工记录十分麻烦,所以想做一个应用程序来代替手工记录。 思路: 1.弹窗,输入进程号 2.获取进程对象 3.日志保存在一个csv文件中,文件命名方式为:进程名+Process+进程号 4.文件第一行写入进程名,第二行表

    2023年04月12日
    浏览(33)
  • 前端毕业设计|基于Vue+Nodejs实现游戏资讯平台

    作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路  关注作者有好处 文末获取源码   开发技术:Vue+No

    2024年02月07日
    浏览(75)
  • 基于微信小程序的经济新闻资讯的设计与实现

    文末获取源码 开发语言:Java 框架:Spring Boot JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序运行软件:微信开发者 目录 目录 前言 系统展示 用户信息管理 短视频信息管理 新闻信息管理 论坛信

    2024年02月20日
    浏览(36)
  • selenium窗口切换和关闭指定窗口

    但有一个问题就是它会默认关闭新打开的窗口而且close函数无法传入其他参数 那么该如何关闭其他窗口呢?以某度网站为例 点击百度图标打开另一窗口 使用如下代码进行关闭 会发现新窗口被关闭,如图一所示    将代码改成这样,就能做到关闭指定窗口的操作,效果如下

    2024年02月11日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包