当前位置:   article > 正文

python + selenium实现巨潮资讯网指定范围年报下载_爬虫下载巨潮公告

爬虫下载巨潮公告

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

  

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

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

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

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

  1. #包含控制浏览器的类和方法
  2. from selenium import webdriver
  3. #用于执行复杂鼠标和键盘操作的类
  4. from selenium.webdriver.common.action_chains import ActionChains
  5. #用于添加延时或暂停
  6. import time
  7. #用于等待特定条件发生后再继续执行
  8. from selenium.webdriver.support.ui import WebDriverWait
  9. #定义用于等待的条件
  10. from selenium.webdriver.support import expected_conditions as EC
  11. #定义一组用于选择元素的方法
  12. from selenium.webdriver.common.by import By

检测关键词的函数

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

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

下载年报的函数

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

  1. def nianbao(code):
  2. # 启动Edge浏览器并加载选项
  3. browser = webdriver.Edge()
  4. url = 'http://www.cninfo.com.cn/new/commonUrl?url=disclosure/list/notice#sse'
  5. browser.get(url)
  6. browser.maximize_window()
  7. #输入时间
  8. #注:这段有没有都无所谓()因为我发现就算写了他也不会给我执行这段操作,但是因为网站的自动检索年报的范围就是我需要的范围,所以没差()
  9. 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')
  10. 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')
  11. #browser.find_element_by_xpath("//body").click()
  12. #browser.find_element_by_xpath("//body").click()
  13. #输入年报,将检索范围锁定在年报中
  14. #第一段用于点击分类按钮
  15. 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()
  16. #第二段用于点击年报选项
  17. browser.find_element_by_xpath('/html/body/div[6]/div[1]/label[1]/span[1]/span').click()
  18. #输入代码
  19. #第一段用于点击输入框
  20. 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)
  21. #这一段用于暂停页面操作,等待等待元素加载完成后继续执行操作(我设置的是三秒)
  22. time.sleep(3)
  23. #这一段用于点击搜索按钮,使用了更为稳健的模拟鼠标操作
  24. 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')
  25. actions = ActionChains(browser)
  26. actions.move_to_element(button_element).click().perform()
  27. # 等待页面元素加载完成
  28. time.sleep(3)
  29. #进入公告
  30. #写了一个try,因为有时候可能对应的代码没有公司
  31. try:
  32. #调用check_word函数,判断要进入具体页面的报告是摘要还是年报
  33. word = "摘要"
  34. #获取页面中第二个xpath对应的text内容(如600000号股票就会返回“上海浦东发展银行股份有限公司2022年年度报告(全文)”)
  35. 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
  36. #如果是摘要,返回true,执行第一个xpath
  37. #注:有的页面可能有三个按钮,但是前两个按钮中一个有一个是年报或者年报修订版(确信)
  38. if check_word(browser_text, word):
  39. 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()
  40. #上一步操作后会打开一个新的页面,我们要获取新页面的url用于下载,将browser变更为新页面
  41. window_handles = browser.window_handles
  42. latest_window_handle = window_handles[-1]
  43. browser.switch_to.window(latest_window_handle)
  44. #当不含有摘要,返回false,点击第二个xpath
  45. else:
  46. 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()
  47. window_handles = browser.window_handles
  48. latest_window_handle = window_handles[-1]
  49. browser.switch_to.window(latest_window_handle)
  50. #获取网页url
  51. browser_url = browser.current_url
  52. #当所属公司code无法搜索出年报,那么这家公司可能是退市了,输出没有找到年报
  53. except Exception as e:
  54. print("没有找到",code,"的对应年报")
  55. browser.quit()
  56. #跳出方法
  57. return
  58. #这一段用于检测code有没有对应的公司,如果没有公司,那么点击搜索按钮只会停留在原来的页面上。这时执行上文获取的url就会下载错误的年报。
  59. #这里我用了暴力的解决方法,直接查看原有页面的前两个xpath具体页面的url内容,然后ban掉他们!这里在使用的时候一定要记得检查当日的前两位url
  60. 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":
  61. print("没有",code,"对应的公司")
  62. browser.quit()
  63. else:
  64. browser2 = webdriver.Edge()
  65. browser2.get(browser_url)
  66. #进入url的页面,点击下载按钮,下载年报。其中,如果网不好+文件大的情况,就需要将time.sleep(10)的参数调大,不然下不完,网站就关了
  67. browser2.find_element_by_xpath('/html/body/div[1]/div/div[1]/div[3]/div[1]/button').click()
  68. time.sleep(10)
  69. print("已成功下载",code,"公司的年报")
  70. #关闭网站,防止资源浪费
  71. browser.quit()
  72. browser2.quit()

测试

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

  1. code = "600000"
  2. nianbao(code)

输出结果:

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

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

  1. for code in range(600301,601001):
  2. nianbao(code)

输出结果:

军火展示:

 

C盘内存告急(

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

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

结语

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

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

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

谢谢大家收看(鞠躬)

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号