1.项目分析

  • 数据来源:巨潮资讯
  • 项目需求:按照股票代码,公司名称,年报全称,年份,下载链接等要素写入excel表
  • 使用语言:python
  • 第三方库:requests, re , time等

成品展示: 


2. 快速上手

废话就到这里,直接开干!

1.寻找接口

众所周知,爬取网页数据一般可以通过寻找网页结构规律和爬取接口两种方式,简单起见,笔者直接使用了搜索接口。

下图为巨潮资讯网首页。

小手一点,年报直接出现,这是针对具体公司的年报可以直接搜索,那么该如何爬取所有的记录呢?

F12打开开发者工具,进行简单的网络抓包。

通过切换页面,发现网络上有响应,发现搜索接口。

没错,就是这段链接!

searchkey:搜索内容;pageNum:当前页码; type = shj:沪深京主板……

当然,也可以加入参数&sdate=2015-01-01&edate=2022-01-01&来指定搜索链接。

直接get,返回一个json文件,也包含股票代码,公司名称,还有关键的下载链接!


2.获取数据

既然找到了json文件,那么就很好入手,直接打开pycharm。

先根据接口,写好访问参数。

import requests
import re
import openpyxl
import time# 设置搜索参数
search_key = "年报"
url_template = "http://www.cninfo.com.cn/new/fulltextSearch/full?searchkey={}&sdate=2016-01-01&edate=2017-01-01&isfulltext=false&sortName=pubdate&sortType=desc&pageNum={}&type=shj"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Language': 'en-US,en;q=0.5','Accept-Encoding': 'gzip, deflate, br','Connection': 'keep-alive','Upgrade-Insecure-Requests': '1'}

然后使用request进行访问,注意程序的稳健性!爬取众多文件很容易报错,所以要做好异常机制处理,笔者做了失败重试以及多次失败后直接跳过的机制。

# 发送HTTP请求并获取响应
all_results = []
page_num =1 #设置首页
total_pages = 1 #初始化最大页面
max_retries = 2 #最大重试次数
retry_count = 0while page_num <= total_pages:url = url_template.format(search_key, page_num)response = None# 重试机制while retry_count <= max_retries:# 发送请求try:response = requests.get(url,headers=headers)response.raise_for_status()breakexcept requests.exceptions.RequestException as e:print(f"出现错误!: {e}")print(f"5秒后重试...")time.sleep(5)retry_count += 1if retry_count > max_retries:print(f"{max_retries} 次重试后均失败. 跳过第 {page_num}页.")page_num += 1retry_count = 0continue

然后就是不断循环,将每次得到的json文件合并到all_result中

# 解析数据try:data = response.json()all_results.extend(data["announcements"])total_pages = data["totalpages"]print(f"正在下载第 {page_num}/{total_pages}页")page_num += 1retry_count = 0except (ValueError, KeyError) as e:print(f"Error parsing response data: {e}")print(f"5秒后重试...")time.sleep(5)retry_count += 1continue

这一部是关键!json文件如果处理过程中报错,很容易前功尽弃!又需要重头开始。

经过笔者测试,该接口最大页数为2000,大于该数字必定报错,因此爬取时可以限定时间范围。


3.保存数据

当json文件合并好后,就是对数据的分析和保存了!

笔者使用了openpyxl库来创建excel表格。

由于json文件数据过于杂乱,因此必须做好剔除工作。


# 创建Excel文件并添加表头
workbook = openpyxl.Workbook()
worksheet = workbook.active
worksheet.title = "Search Results"
worksheet.append(["公司代码", "公司简称", "标题", "发布日期", "年报链接"])# 定义需要剔除的标题关键词
exclude_keywords = ["摘要", "英文版", "披露", "风险提示", "督导","反馈","回复","业绩","说明会","意见","审核","独立董事","半年","已取消","补充","提示性","制度","规程","审计","ST","公告","声明","说明","受托"]# 解析搜索结果并添加到Excel表格中
for item in all_results:company_code = item["secCode"]company_name = item["secName"]title = item["announcementTitle"].strip()# 剔除不需要的样式和特殊符号,并重新组合标题title = re.sub(r"<.*?>", "", title)title = title.replace(":", "")title = f"《{title}》"adjunct_url = item["adjunctUrl"]year = re.search(r"\d{4}", adjunct_url).group()publish_time = f"{year}"#拼串,将PDF文件的下载链接拼完整!announcement_url = f"http://static.cninfo.com.cn/{adjunct_url}"# 检查标题是否包含排除关键词exclude_flag = Falsefor keyword in exclude_keywords:if keyword in title:exclude_flag = Truebreak# 如果标题不包含排除关键词,则将搜索结果添加到Excel表格中if not exclude_flag:worksheet.append([company_code, company_name, title, publish_time, announcement_url])

最后只需要将数据全部保存,就大功告成了!

workbook.save(f"上市企业年报链接_2015.xlsx")

笔者已将部分年报打包,关注同名公众号回复「年报」即可获取哦~

【Python爬虫实战】1.爬取A股上市公司年报链接并存入Excel相关推荐

  1. Python爬虫实战 | (12) 爬取万方数据库文献摘要并存入MongoDB

    之前在Python爬虫实战(7)中曾爬取过万方,本篇博客的爬取解析过程和之前几乎完全一样,不同的是数据存储方式,之前是存储到文件中(csv,txt,json,excel等),这次我们将提取的论文信息存 ...

  2. 携程ajax,Python爬虫实战之爬取携程评论

    一.分析数据源 这里的数据源是指html网页?还是Aajx异步.对于爬虫初学者来说,可能不知道怎么判断,这里辰哥也手把手过一遍. 提示:以下操作均不需要登录(当然登录也可以) 咱们先在浏览器里面搜索携 ...

  3. Python爬虫实战之爬取糗事百科段子

    Python爬虫实战之爬取糗事百科段子 完整代码地址:Python爬虫实战之爬取糗事百科段子 程序代码详解: Spider1-qiushibaike.py:爬取糗事百科的8小时最新页的段子.包含的信息 ...

  4. Python爬虫实战之爬取百度贴吧帖子

    Python爬虫实战之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 对百度贴吧的 ...

  5. Python爬虫实战(1) | 爬取豆瓣网排名前250的电影(下)

    在Python爬虫实战(1) | 爬取豆瓣网排名前250的电影(上)中,我们最后爬出来的结果不是很完美,这对于"精益求精.追求完美的"程序猿来说怎么能够甘心 所以,今天,用pyth ...

  6. Python爬虫实战之爬取网站全部图片(一)

    Python爬虫实战之爬取网站全部图片(二) Python爬虫实战之通过ajax获得图片地址实现全站图片下载(三) 一.获得图片地址 和 图片名称 1.进入网址之后 按F12  打开开发人员工具点击e ...

  7. Python爬虫实战:爬取解放日报新闻文章

    上一篇<Python 网络爬虫实战:爬取人民日报新闻文章>发布之后,确实帮到了不少朋友. 前几天,我好哥们问我:我想爬另一个日报新闻网站,网页结构几乎跟人民日报几乎一模一样,但是我用你的那 ...

  8. Python爬虫实战之 爬取全国理工类大学数量+数据可视化

    上次爬取高考分数线这部分收了个尾,今天咱们来全面爬取全国各省有多少所理工类大学,并简单实现一个数据可视化.话不多说,咱们开始吧. 第一步,拿到url地址 第二步,获取高校数据 第三步,地图可视化 第四 ...

  9. Python爬虫实战之爬取web网易云音乐——解析

    找到存储歌曲地址的url界面 首先我们要进入网易云的web页面在页面中我们随意选择一首歌曲,打开开发者工具查看响应的界面. 在这些页面中我们需要查找存储有音乐文件的url,这是我们可以打开全局搜索直接 ...

最新文章

  1. Ether-channel 以太网通道
  2. [leetcode]203. Remove Linked List Elements链表中删除节点
  3. java 截串_java字符串截取
  4. GWT(Google Web Tookit) Eclipse Plugin的zip下载地址(同时提供GWT Designer下载地址)
  5. 要闻君说:Intel要“起底”新任CEO了?微软停止支持Win 7?OPPO加入WPC无线充电联盟,15W无线闪充技术呼之欲出!...
  6. 正则表达式,验证字符串由:中文、数字、英文、空格组成
  7. JavaScript面向对象之构造函数
  8. 深度学习2.0-30.卷积神经网络之池化与采样
  9. 【TDA4系列】向 PSDKRA 添加新的图像传感器
  10. mysql免安装 配置_MySql免安装版配置方法
  11. JZOJ5946. 【NOIP2018模拟11.02】时空幻境(braid)
  12. 苹果修改wifi密码登陆服务器密码,iphone手机修改wifi密码
  13. 超好玩的css3-3d效果
  14. Xcode—新建/配置pch文件
  15. 想把语音转成文字,就这样做
  16. CDA LEVEL 1 考试,知识点《机器学习基本概念》
  17. navicat 16安装 注册机path报错
  18. 泼辣修图服务器没有响应,泼辣修图使用常见问题整理,为你答疑解惑
  19. Unity3D学习:飞碟游戏进化版
  20. 关于手机验证码的获取与验证方法

热门文章

  1. java公告栏js资源_javascript公告栏跑马灯效果代码
  2. HTTP1.0和HTTP2.0的区别,以及HTTP和HTTPS的区别
  3. 软件:快速共享win10文件夹
  4. input中文输入多次触发oninput事件
  5. 串联两个路由器互相访问路由表设置记录
  6. 一年赚一百万的思路—别做大多数的傻瓜
  7. 征文:中秋,你愿意和她一起打地(月)鼠(饼)吗?
  8. Java-routine
  9. 一季度跳槽图鉴:6成人想跳槽,降薪也要跳!
  10. Gradle 依赖与 Plugin