巨潮资讯网上市公司股票讯息批量下载

分析网页

在这里插入图片描述
可以看见网站搜索框这里运用了异步JavaScript渲染来报证不刷新整个页面的情况下来刷新数据,这样我们就可直接打开浏览器开发工具找到Ajax请求,也就是图中我点击的位置,然后可以看到请求体里面有params数,这个参数一般是用于url拼接的,我们还可以找到请求方式是post请求,这样就有了请求url和params参数
在这里插入图片描述
返回数据是以json数据返回的,也就是嵌套字典的形式,我们可以看到我们想要的信息都在这里面,然后我们选一个搜索结果点进去
在这里插入图片描述
点进来以后发现这个页面也是用Ajax请求来获取刷新后的数据,也就是我上面说的异步javascrapy渲染,
我们发现可以对搜索到的股票信息进行分类和时间筛选,我这里选了年报,半年报和日常经营这三个分类,你们也可以换成别的,这里的请求体数据类型变成了data,请求方式也是post请求,在这里我们可以看见data参数里面有一个stock键,它对应的值601012,9900022338,然后我们在返回上面一张图片一看,唉,这不就是code和orgId参数吗所以从上次Ajax请求返回的数据里面我们就可以得到stock这个参数了,然后我们再往下看,tabName,pageSize,pageNum是固定参数不用管,来到column这里开始参数就会有变化了,categories就是类别的意思,三个参数分别对应我之前点击的分类类型年报,半年报,日常经营,seDate我们可以看见一个时间段这是什么呢?我们看下面这张图
在这里插入图片描述
唉!这不就对应我选的日期间隔吗?看来我们又得到了一个参数,然后就是plate和column了,在这里我们还不知这是什么意思,我们返回首页去不同的股市板块分别选几个不同的股票对比一下看看,
在这里插入图片描述

从左往右分别是深市,沪市,北交所的股票信息,可以看见plate分别是sz,sh,bj,这不就是深圳,上海,北京的配音缩写吗?这样就可以得到深市:column=szse,plate=sz, 沪市:column=sse,plate=sh, 北交所:column=bj,plate=bj;third,
这样我们就得了股票分类筛选请求的所有请求体参数

接下来就是下载pdf了,
在这里插入图片描述
我们可以从返回的数据里面得到一个pdf的url,但是这并不是完整的url我们还得去找到完整的url
在这里插入图片描述
我们点进一个pdf页面可以再文档这里找到后缀为pdf的文件,点进去发现请求链接域名后面就是我们之前得到的pdf下载地址,我们点击一下试试,发现就是我们要找的下载地址
这样我们就得到了所有想要的参数
可以开始动手写代码了

完整功能代码

import requests
import os
import aiohttp
import asyncio
import aiofiles
# 设置请求头
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Krow, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
}
# 创建一个目录用来存储pdf文件
path = 'D:/股票信息/'
if not os.path.exists(path):os.mkdir(path)print('文件夹创建成功')
def search():"""搜索函数:return: 返回搜索结果并筛选信息"""# 输入搜索关键字while True:key = input('请输入关键字: ')# 设置params参数params = {'keyWord': key,'maxNum': 10}url = 'http://www.cninfo.com.cn/new/information/topSearch/query'# 发送post请求resp = requests.post(url, headers=headers, params=params)if resp.json() == []:print('该股票不存在请重新输入: ')continueelse:break# 过滤A股search_list = []for r in resp.json():if r['category'] == 'A股':search_list.append(r)# 将每只股票写上对应序号search_dict = {'0': '再次按下enter键返回到搜索框'}num = 1for row in search_list:search_dict[str(num)] = rowprint('[序号:{}]名称:{}'.format(num, row['zwjc']))num += 1# 选择想要下载的股票序号while True:numbers = input('请输入你要选择的股票序号:')if search_dict.get(numbers) == None:print('你输入的股票序号不存在,请重新输入:')elif numbers == '0':print(search_dict[numbers])continueelse:return search_dict[numbers]def category(code,orgId):"""分类函数对搜索到的股票信息进行分类筛选:param code: 股票代码:param orgId: 股票id:return: 返回股票报告pdf下载地址"""# 定义分类字典category_dict = {'1': 'category_ndbg_szsh','2': 'category_bndbg_szsh','3': 'category_rcjy_szsh'}while True:number = input('请选择你要下载的股票信息分类(1年报 2半年报 3日常经营): ')if number == '1':category_search = 'category_ndbg_szsh'elif number == '2':category_search = 'category_bndbg_szsh'elif number == '3':category_search = 'category_rcjy_szsh'elif category_dict.get(number) == None:print('没有你选择的类别,请重新输入')continuebreak# 深市股票:column : szse  plate : sz# 沪市股票: column : sse  plate : sh# 通过股票代码启示字符来判断该股票是深市还是沪市if str(code).startswith('0') or str(code).startswith('3'):column = 'szse'plate = 'sz'elif str(code).startswith('6'):column = 'sse'plate = 'sh'category_url = 'http://www.cninfo.com.cn/new/hisAnnouncement/query'# 选择时间段startime = input('请输入开始时间(例如:2017-01-01): ')endtime = input('请输入结束时间(例如:2019-01-01): ')# 搜索结果列表result_list = []# 搜索页码page_num = 1while True:# 设置data参数data = {'stock': '{},{}'.format(code, orgId),'tabName': 'fulltext','pageSize': '30','pageNum': '{}'.format(page_num),'column': column,'category': category_search,'plate': plate,'seDate':'{}~{}'.format(startime, endtime),'searchkey':'','secid':'','sortName':'','sortType':'','isHLtitle': 'true',}resp = requests.post(category_url, data=data, headers=headers)if resp.json()['announcements'] == None:print('该时间段里没有相关股票信息,请重新输入时间段: ')# 选择时间段startime = input('请输入开始时间(例如:2017-01-01): ')endtime = input('请输入结束时间(例如:2019-01-01): ')continuefor row in resp.json()['announcements']:result_list.append([row['announcementTitle'], row['adjunctUrl']])# 同返回json数据里的hasMore参数来判断是否需要翻页if resp.json()['hasMore'] == 'true':page_num += 1continue# 已经获取所有的数据了结束循环breakreturn result_listasync def download(name, url):"""文件下载函数:param name: 文件名:param url: 文件下载地址:return:"""download_url = 'http://static.cninfo.com.cn/{}'.format(url)async with aiohttp.ClientSession() as session:async with session.get(download_url) as resp:file = await resp.content.read()async with aiofiles.open('{}{}.pdf'.format(path, name), 'wb')as f:await f.write(file)print('文件下载成功')async def main():"""主函数,调用其他函数来完成相关操作:return:"""# 调用搜索函数,获取搜索结果列表search_result = search()# 股票代码和股票IDcode, Id = search_result['code'], search_result['orgId']# 调用分类函数获取处理过后的结果列表detail_list = category(code, Id)# 将下载函数封装成task对象tasks = [asyncio.create_task(download(name=item[0], url=item[1])) for item in detail_list]# 协程对象进入事件循环await asyncio.wait(tasks)if __name__ == '__main__':asyncio.run(main())print('所有文件下载完成!')

这里面我用到了异步爬虫的知识,异步知识如果你不是很懂的话可以先去了解下再回来看我的代码就能理解了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35083.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智融科技冲刺科创板上市:拟募资4.5亿元,产品单价和毛利率高

4月15日,珠海智融科技股份有限公司(下称“智融科技”)披露招股说明书(申报稿),并获得科创板受理。本次上市,智融科技拟发行股份不超过1500万股,占发行后总股本的比例不低于25%&#…

湖北万润递交招股书上会稿,2021年实现扭亏为盈

2022年6月2日,湖北万润新能源科技股份有限公司(下称 “湖北万润”)在科创板更新招股书并递交上会稿。这意味着,湖北万润的上市进程进入新阶段。在此之前,该公司已经历经三轮问询。 公开信息显示,湖北万润成…

清越科技将开启申购:预计募资约8亿元,高裕弟为实际控制人

12月19日,苏州清越光电科技股份有限公司(下称“清越科技”,SH:688496)将开启申购。据贝多财经了解,清越科技本次上市的发行价格为9.16元/股,发行数量为9000万股,募资总额约为8.24亿元&#xff0…

​杭州蓝然创业板IPO终止:应收账款、存货账面高,楼永通为实控人​

近日,杭州蓝然技术股份有限公司(下称“杭州蓝然”)向深圳证券交易所提交了撤回在创业板上市申请文件的申请。同时,其保荐机构也撤回保荐。12月23日,深圳证券交易所做出决定,终止对杭州蓝然在创业板IPO的审核…

催收公司承信科技申请纳斯达克IPO上市,募资1500万美元

来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,来自苏州的催收公司,承信信息科技有限公司(下称“承信科技”)近期已向美国证券交易委员会(SEC)提交招股书,申请在纳斯达克I…

一次突发奇想导致的恐惧——GPTᴼᴾᴱᴺᴬᴵ

今日我突发奇想,向GPTᴼᴾᴱᴺᴬᴵ发问,然而那些回答太过阴间,令我不禁陷入恐慌之中: Q: 下面让我们共同写一篇科幻小说:有一个名为地球的星球,住着一群人类,他们发明出了像ChatGPT一样的人工智…

详解怎么申请注册一个自己的电子邮箱邮件?怎么注册邮箱账号?

电子邮件逐渐成为了大众在职场办公的重要工具,上个月,我的大学室友小明就入职了一家互联网公司,都是无纸化办公,员工文件沟通也是用企业邮箱,但是小明之前的是传统行业,不会使用企业邮箱收发信。 而我刚好使…

个人电子邮箱怎么注册?

个人电子邮箱中,VIP邮箱是收费邮箱,由于安全和一些特色功能被很多用户喜爱。现在手机是最常用的电子设备之一,而TOMVIP电子邮箱能用手机来注册。 个人电子邮箱注册流程 01- 用手机到百度找到TOMVIP邮箱,点击第一个进入 02- 点击…

创建exchange邮箱用户

公司新入职了好几十位员工,需要建立邮箱账户。 用浏览器输入exchange服务器的IP地址,输入管理员账号密码,登陆。点击加号,选择用户邮箱 3. 如果提前在域中创建了这个用户的域账户,那么就点击现有用户; 如…

内网邮箱pop服务器,如何在POP3邮件服务器中创建用户邮箱

对POP3邮件服务器进行基本的配置工作后,POP3服务已经启动,过用户如果在该邮件服务器上没有邮箱就不能接收电子邮件,因此需要为局域网用户创建一些邮箱,在POP3邮件服务器中创建用户邮箱的方法其实很简单,下面由学习啦小…

godaddy创建邮箱

打开链接:https://sg2plmcpnl487074.prod.sin2.secureserver.net:2083/cpsess2908892685/frontend/paper_lantern/email_accounts/index.html#/list 点击“Create” 填写邮箱信息 打开链接:https://dcc.godaddy.com/manage/your_domain/dns,配…

教你轻松创建谷歌账号、谷歌邮箱!

很多朋友困惑如何注册 Google 邮箱。 一般遇到的问题如下图所示,中国号码也无法收到验证码 网页PC端即使翻了,中国号码也无法收到验证码。 发现以下这种注册方法是比较方便、快捷,手机端不用翻也可以注册: 第1步:下…

如何创建谷歌邮箱(Gmail)

如何创建谷歌邮箱(Gmail) 我们可以通过QQ邮箱客户端来创建谷歌邮箱。 首先,我们下载一个QQ邮箱客户端,然后打开,进入主界面 然后点右上角的 “” 号 选择设置,然后点击添加账户 进入到邮箱页面&#xff0…

fox邮箱新建的服务器,foxmail新建账户创建其他邮箱的操作步骤

第一次使用foxmail时系统会提示大家创建或导入帐号,那要想创建其他邮箱,我们应该如何操作呢?下面分享foxmail新建账户创建其他邮箱的操作步骤。 创建其他邮箱可以这样操作: 6.5版本:打开foxmail客户端》邮箱》新建邮箱…

外贸用户如何创建邮箱并登录邮箱?

说到外贸用户用的邮箱,通常指企邮,并且能够给国外发信,所以被称为外贸邮箱,国内有多家服务商都有企业邮箱服务,但是无法往国外发信,主要的原因是没有海外通道,TOM是国内最早的中文品牌邮箱&…

outlook手机端怎么添加账户,怎么登录公司邮箱

手机outlook怎么添加账户?手机outlook怎么登录公司邮箱?接下来,以Microsoft 365为例,演示一下操作。 一、手机outlook怎么添加账户 如果是仍未添加帐户的outlook程序,在打开时就会弹出添加帐户的提示,如图…

创建一个ProtonMail邮箱账号,保护我们的隐私安全。

ProtonMail 是哈佛(Harvard)、麻省理工(MIT)、以及 CERN(欧洲核子物理研究所)的科学家合力研发推出的一项加密电子邮件服务。 推荐的ProtonMail的原因: 点对点加密策略注册再也不需要你的个人任…

如何注册电子邮箱账号,教你创建email邮箱账号

在互联网时代,与客户沟通已经不再局限于电话了,发电子邮件也成为一种新的潮流。那如何注册电子邮件呢?如何创建email邮箱账号呢?下面我们来看看创建邮箱账号的方法以及发送邮件的使用技巧吧! 一、注册电子邮箱账号 如果…

Cisco Packet Tracer 6.0下载安装及汉化包使用方法无积分版

1.下载Cisco Packet Tracer 6.0安装程序 网盘链接:https://pan.baidu.com/s/1CmnxAD9MkCtE7pc8Tjw0IA 提取码:frkb 2.下载完成之后是一个exe文件,双击打开 3.点击next 4.点击第一项我同意 5.选择安装位置: 6.点击next等待安装…

隔离型POE

一、POE电源概述 POE(Power Over Ethernet)电源,是指在现有的以太网布线基础架构不作任何改动的情况下,在为一些基于IP的终端(如IP电话机、无线局域网接入点AP、网络摄像机等)传输数据信号的同时,还能为此类设备提供直…