需求分析

http://www.cninfo.com.cn/ 巨潮网,沪深两市的上市公司公告都能找到,我这里需要爬取所有上市券商的年报文件。
公告搜索页面网页大概长这样,右边搜索框应该是个单页应用,url不发生变化,所以得用抓包工具看看。

这里我随便设置了几个筛选条件看一下。

抓包

我们在Raw这一栏可以看到网页是需要用post方法的。所以需要去看webform。

fiddler可以看到几个关键参数,webform这里的参数是需要用post方法上传的,不然无法正确返回需要的信息。
pageNum是页码,category这里代表年报,stock第一个数字是证券代码,第二个字符串不知道是什么。

在json里面找了找,发现是下面这个orgId。那么基本需要上传的data我们就知道了。

思路

先做一个需要的上市公司的列表,一列证券代码,一列证券简称。大概长这样:

code name
600030 中信证券
600061 国投资本

然后先构造stock字段,就需要先爬所有目标公司的orgId。这里的Namelist就是准备好的上市公司列表。

###巨潮要获取数据,需要ordid字段,具体post的形式是'stock':'证券代码,ordid;'
def get_orgid(Namelist):orglist = []url = 'http://www.cninfo.com.cn/new/information/topSearch/detailOfQuery'hd = {'Host': 'www.cninfo.com.cn','Origin': 'http://www.cninfo.com.cn','Pragma': 'no-cache','Accept-Encoding': 'gzip,deflate','Connection': 'keep-alive','Content-Length': '70','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36','Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8','Accept': 'application/json,text/plain,*/*','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8'}for name in Namelist:data = {'keyWord': name,'maxSecNum': 10,'maxListNum': 5,}r = requests.post(url, headers=hd, data=data)org_id = r.json()['keyBoardList'][0]['orgId']#print(org_id+'****'+name)orglist.append(org_id)##对列表去重formatlist = list(set(orglist))formatlist.sort(key=orglist.index)return formatlist

然后构造stock字段:

##按行遍历
for rows in Sec.iterrows():stock = str(rows[1]['code'])+','+str(rows[1]['orgid'])+';'

然后就可以正常爬取了。

完整代码

import requests
import random
import time
import pandas as pddownload_path = 'http://static.cninfo.com.cn/'
saving_path = 'D:/2020年报'User_Agent = [###这里自建一个User_Agent列表
]  # User_Agent的集合headers = {'Accept': 'application/json, text/javascript, */*; q=0.01',"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8","Accept-Encoding": "gzip, deflate","Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-HK;q=0.6,zh-TW;q=0.5",'Host': 'www.cninfo.com.cn','Origin': 'http://www.cninfo.com.cn','Referer': 'http://www.cninfo.com.cn/new/commonUrl?url=disclosure/list/notice','X-Requested-With': 'XMLHttpRequest'}###巨潮要获取数据,需要ordid字段,具体post的形式是'stock':'证券代码,ordid;'
def get_orgid(Namelist):orglist = []url = 'http://www.cninfo.com.cn/new/information/topSearch/detailOfQuery'hd = {'Host': 'www.cninfo.com.cn','Origin': 'http://www.cninfo.com.cn','Pragma': 'no-cache','Accept-Encoding': 'gzip,deflate','Connection': 'keep-alive','Content-Length': '70','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36','Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8','Accept': 'application/json,text/plain,*/*','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8'}for name in Namelist:data = {'keyWord': name,'maxSecNum': 10,'maxListNum': 5,}r = requests.post(url, headers=hd, data=data)org_id = r.json()['keyBoardList'][0]['orgId']#print(org_id+'****'+name)orglist.append(org_id)##对列表去重formatlist = list(set(orglist))formatlist.sort(key=orglist.index)return formatlistdef single_page(stock):query_path = 'http://www.cninfo.com.cn/new/hisAnnouncement/query'headers['User-Agent'] = random.choice(User_Agent)  # 定义User_Agentprint(stock)query = {'pageNum': 1,  # 页码'pageSize': 30,'tabName': 'fulltext','column': 'szse',  'stock': stock,'searchkey': '','secid': '','plate': '',   'category': 'category_ndbg_szsh;',  # 年度报告'trade': '',   #行业'seDate': '2020-11-27~2021-05-28'  # 时间区间}namelist = requests.post(query_path, headers=headers, data=query)single_page = namelist.json()['announcements']print(len(single_page))return single_page  # json中的年度报告信息def saving(single_page):  # 下载年报headers = {'Host': 'static.cninfo.com.cn','Connection': 'keep-alive','Upgrade-Insecure-Requests': '1','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36 Edg/90.0.818.66','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','Accept-Encoding': 'gzip, deflate','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','Cookie': 'routeId=.uc1'}for i in single_page:if ('2020年年度报告(更新后)' in i['announcementTitle'])  or ('2020年年度报告' in i['announcementTitle']) or ('2020年年度报告(修订版)' in i['announcementTitle']) :download = download_path + i["adjunctUrl"]name = i["secCode"] + '_' + i['secName'] + '_' + i['announcementTitle'] + '.pdf'file_path = saving_path + '/' + nameprint(file_path)time.sleep(random.random() * 2)headers['User-Agent'] = random.choice(User_Agent)r = requests.get(download, headers=headers)time.sleep(10)print(r.status_code)f = open(file_path, "wb")f.write(r.content)f.close()else:continueif __name__ == '__main__':Sec = pd.read_excel('D:/dict.xlsx',dtype = {'code':'object'})  #读取excel,证券代码+证券简称Seclist = list(Sec['code'])  #证券代码转换成listNamelist = list(Sec['name'])org_list = get_orgid(Namelist)Sec['orgid'] = org_listSec.to_excel('D:/dict.xlsx',sheet_name='sheet-2',index=False)stock = ''count = 0##按行遍历for rows in Sec.iterrows():stock = str(rows[1]['code'])+','+str(rows[1]['orgid'])+';'try:page_data = single_page(stock)except :print('page error, retrying')try:page_data = single_page(stock)except:print('page error!') saving(page_data)count = count + 1print('共有',count,'家券商')

【python爬虫】Python爬取下载巨潮网指定公司的年报pdf相关推荐

  1. Python爬虫项目实例——爬取【乐彩网】双色球历史获奖红蓝球数据

    爬取[乐彩网]双色球历史获奖红蓝球数据 最终存到excel中 爬取数据要求为: 代码如下: import requests from lxml.html import etree import rec ...

  2. python中国大学排名爬虫写明详细步骤-Python爬虫——定向爬取“中国大学排名网”...

    内容整理自中国大学MOOC--北京理工大学-蒿天-Python网络爬虫与信息提取 相关实战章节 我们预爬取的url如下 网页节选 在浏览器中读取网页源代码 可以 发现表格数据信息是直接写入HTML页面 ...

  3. python爬虫之爬取《贵州农经网》信息

    前言:期待已久的科研项目终于有眉目了,这是第一次去找研究生老师做项目,由于时间关系,老师没能给我安排上任务,叫我和一个研究生学长交接工作.第一个叫我解决的网站就是<贵州农经网>,由于有一个 ...

  4. Python爬虫:爬取我爱我家网二手房源信息

    # xpath爬取 # 爬取小区名称.户型.地区.售价.总价 1.导入模块 import requests import csv from lxml import etree 2.创建类 # 创建我爱 ...

  5. python爬虫下载小说_用PYTHON爬虫简单爬取网络小说

    用PYTHON爬虫简单爬取网络小说. 这里是17K小说网上,随便找了一本小说,名字是<千万大奖>. 里面主要是三个函数: 1.get_download_url() 用于获取该小说的所有章节 ...

  6. python爬虫实战-爬取视频网站下载视频至本地(selenium)

    #python爬虫实战-爬取视频网站下载视频至本地(selenium) import requests from lxml import etree import json from selenium ...

  7. Python爬虫 - scrapy - 爬取妹子图 Lv1

    0. 前言 这是一个利用python scrapy框架爬取网站图片的实例,本人也是在学习当中,在这做个记录,也希望能帮到需要的人.爬取妹子图的实例打算分成三部分来写,尝试完善实用性. 系统环境 Sys ...

  8. python爬虫爬取音乐_利用python爬虫实现爬取网易云音乐热歌榜

    利用python爬虫实现爬取网易云音乐热歌榜 发布时间:2020-11-09 16:12:28 来源:亿速云 阅读:102 作者:Leah 本篇文章给大家分享的是有关利用python爬虫实现爬取网易云 ...

  9. python爬虫实战---爬取大众点评评论

    python爬虫实战-爬取大众点评评论(加密字体) 1.首先打开一个店铺找到评论 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多 ...

  10. python爬虫之爬取网页基础知识及环境配置概括

    记:python爬虫是爬取网页数据.统计数据必备的知识体系,当我们想统计某个网页的部分数据时,就需要python爬虫进行网络数据的爬取,英文翻译为 spider 爬虫的核心 1.爬取网页:爬取整个网页 ...

最新文章

  1. c语言排班系统设计报告,C语言课程设计关于排班系统的一些问题
  2. AI面试官也太好骗了!用书架图片做视频背景,能提高15%好感度
  3. 安装mysql8.0.20,报错“找不到VCRUNTIME140_1.dll”
  4. 简述控制反转ioc_讲一下你理解的 DI 、IoC、DIP ?
  5. React开发(275):dva debugger对应的值
  6. 只因“薪水过高”!被欠薪三个月后遭解雇,程序员删库反击
  7. matlab数字信号处理 王彬,MATLAB数字信号处理
  8. echarts 3d饼图_Echarts 使用教程 1 基本使用方法
  9. Visual Assist X Options 注释设置-类
  10. sql怎么注销当前登录状态_4种方法教你获取Oracle数据库当前会话/进程的session id...
  11. 【转】mysql触发器的实战(触发器执行失败,sql会回滚吗)
  12. 去掉iPhone、iPad的默认按钮样式
  13. 家用计算机 阵列,家用电脑如何建立RAID?
  14. 详解使用可道云Kodbox快速在云服务器上搭建云盘
  15. 学生用计算机怎么恢复出厂设置,电脑怎么恢复出厂设置
  16. 数据挖掘 - 二手车交易价格预测(阿里天池)
  17. 计算机把C盘无法扩展,c盘不能扩展卷【解决教程】
  18. 适合零基础学习Python的书籍
  19. 通用Mapper注解方式实现动态SQL
  20. UVA 1455 Kingdom 线段树+并查集

热门文章

  1. 闷声发大财,中国 App 出海编年史及方法论
  2. bios中基本开机设置
  3. win10下ipv6安装与设置
  4. linux安装系统时安装多路径包,红帽子linux安装配置多路径
  5. 聊天室应用开发实践(二):实现基于 Web 的聊天室
  6. Android密码明文显示和星号显示切换
  7. 《缠中说禅108课》79:分型的辅助操作与一些问题的再解答
  8. 腾讯2021校园招聘-技术研究类和数据分析-第一次笔试20200823
  9. 中国石油大学奥鹏《大学英语三》第一次在线作业
  10. EDGEX FOUNDRY配置参数 --- sys-mgmt-agent