爬虫获取接口数据
上一讲讲的是获取静态网页数据的教程,适用于我们要爬取的数据在网页源代码中出现,但是还是有很多的数据是源代码中没有的,需要通过接口访问服务器来获得,下面我就来讲讲如何爬取这类数据。
以巨潮资讯网爬取比亚迪企业年报为例。
正常人的操作
-
打开巨潮资讯网官网
-
找到比亚迪的公告

-
在分类里面选择筛选信息,找到自己想要的信息
爬虫的思路
获取请求信息
在正常人的操作第三步,当我们选择一个类别时,毫无疑问浏览器肯定会对服务器发送请求信息,服务器返回信息后我们才能看到想要的信息,看一下怎么获取这个请求:
-
按下F12或者是右键检查,进入网络,先清空乱七八糟的网络信息

-
当我们选择一个类别时会看到右边多出一个query请求,这个就是我们向服务器发出的请求

-
我们可以查看query这条请求的信息
请求转换为代码
上一步我们获取到了请求信息,我们就可以使用python造一个请求头,主要包含请求头和请求负载,我们荡当然可以使用比较奔的方法一个一个的复制粘贴,把东西搬到代码上,这里推荐一个工具能自动帮我们把请求格式化我们想要的
-
把请求复制下来

-
在Curl命令转代码工具 (sbox.cn)这个在线网站可以直接转换为python代码
请求返回信息
请求信息在调试窗口响应上查看,当然也可以通过上一步通过代码获取的返回打印出来查看。
可以看到,一个个报告主要是在"announcements"数组里,通过直觉"adjunctUrl"可能是报告的存放地址,来验证一下,随便打开一个报告,还是按照老方法查看网络请求,可以看到pdf的请求,是不是就是"adjunctUrl"加上前缀,通过查看多个报告,发现都是这个情况,就可以大胆地去操作了。
请求url为:‘http://static.cninfo.com.cn/’ + “adjunctUrl”
保存的文件名称:‘tileSecName’+‘-’+‘announcementTitle’
完整代码
import requests
from urllib import request
cookies = {'JSESSIONID': 'F5C5C5CD40FE076E6139580808BEC6E3','cninfo_user_browse': '002594,gshk0001211,%E6%AF%94%E4%BA%9A%E8%BF%AA','_sp_ses.2141': '*','routeId': '.uc2','insert_cookie': '45380249','SID': 'add3de6c-70ed-4c9b-a201-723fbc753673','_sp_id.2141': 'f35a90ce-a735-4c68-a000-1eb385b581af.1694435068.2.1694520662.1694435105.3aee65c9-094e-48f8-af1d-67b97c9655a9',
}headers = {'Accept': 'application/json, text/javascript, */*; q=0.01','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','Connection': 'keep-alive','Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',# 'Cookie': 'JSESSIONID=F5C5C5CD40FE076E6139580808BEC6E3; cninfo_user_browse=002594,gshk0001211,%E6%AF%94%E4%BA%9A%E8%BF%AA; _sp_ses.2141=*; routeId=.uc2; insert_cookie=45380249; SID=add3de6c-70ed-4c9b-a201-723fbc753673; _sp_id.2141=f35a90ce-a735-4c68-a000-1eb385b581af.1694435068.2.1694520662.1694435105.3aee65c9-094e-48f8-af1d-67b97c9655a9','Origin': 'http://www.cninfo.com.cn','Referer': 'http://www.cninfo.com.cn/new/disclosure/stock?plate=&stockCode=002594&orgId=gshk0001211','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.76','X-Requested-With': 'XMLHttpRequest',
}data = {'stock': '002594,gshk0001211','tabName': 'fulltext','pageSize': '30','pageNum': '1','column': 'szse','category': 'category_ndbg_szsh;','plate': 'sz','seDate': '','searchkey': '','secid': '','sortName': '','sortType': '','isHLtitle': 'true',
}response = requests.post('http://www.cninfo.com.cn/new/hisAnnouncement/query',cookies=cookies,headers=headers,data=data,verify=False,
).json()
#print(response.find("totalRecordNum"))
for i in response['announcements']:reportName=i['tileSecName']+'-'+i['announcementTitle']print(reportName)reportUrl = 'http://static.cninfo.com.cn/' + i['adjunctUrl']print(reportUrl)request.urlretrieve(reportUrl, r'./AnnualReport/'+reportName+'.pdf')
有的分类不只有一页数据
可以看到"totalpages"这个字段跟页数有关,当只有一页的时候为0,两页的时候为1,请求头只有’pageNum’不一样,请求头’pageNum’与响应‘totalpages’是对应的,我们就可以这样写程序:
import requests
from urllib import request
cookies = {'JSESSIONID': '5606FC5CD576740918585289AE035EF6','cninfo_user_browse': '002594,gshk0001211,%E6%AF%94%E4%BA%9A%E8%BF%AA','routeId': '.uc1','SID': 'ebbaf14c-1c51-48b5-8a56-e67112c85c8e','_sp_ses.2141': '*','_sp_id.2141': 'f35a90ce-a735-4c68-a000-1eb385b581af.1694435068.5.1694942471.1694940568.9c03aa1e-99d7-4c7b-95a5-0475f67ce2dc',
}headers = {'Accept': 'application/json, text/javascript, */*; q=0.01','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','Connection': 'keep-alive','Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',# 'Cookie': 'JSESSIONID=5606FC5CD576740918585289AE035EF6; cninfo_user_browse=002594,gshk0001211,%E6%AF%94%E4%BA%9A%E8%BF%AA; routeId=.uc1; SID=ebbaf14c-1c51-48b5-8a56-e67112c85c8e; _sp_ses.2141=*; _sp_id.2141=f35a90ce-a735-4c68-a000-1eb385b581af.1694435068.5.1694942471.1694940568.9c03aa1e-99d7-4c7b-95a5-0475f67ce2dc','Origin': 'http://www.cninfo.com.cn','Referer': 'http://www.cninfo.com.cn/new/disclosure/stock?tabName=data&orgId=gshk0001211&stockCode=002594',#'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.81','X-Requested-With': 'XMLHttpRequest',
}data = {'stock': '002594,gshk0001211','tabName': 'fulltext','pageSize': '30','pageNum': '1','column': 'szse','category': 'category_sf_szsh;','plate': 'sz','seDate': '','searchkey': '','secid': '','sortName': '','sortType': '','isHLtitle': 'true',
}proxies = {'http': 'http://60.182.197.86:8888','https': 'https://60.182.197.86:8888'
}response = requests.post('http://www.cninfo.com.cn/new/hisAnnouncement/query',cookies=cookies,headers=headers,data=data,#proxies=proxies, #使用代理ip,防止反爬verify=False,
).json()print('总的页数:'+str(response['totalpages']))
print('总的数目:'+str(response['totalRecordNum']))
num=0
for i in range(1,2+response['totalpages']):#print(i)data['pageNum']=iresponse = requests.post('http://www.cninfo.com.cn/new/hisAnnouncement/query',cookies=cookies,headers=headers,data=data,#proxies=proxies, # 使用代理ip,防止反爬verify=False,)if response.status_code==200:print(response.text)response=response.json()for j in response['announcements']:reportName=j['tileSecName']+'-'+j['shortTitle']#print(reportName)reportUrl = 'http://static.cninfo.com.cn/' + j['adjunctUrl']#print(reportUrl)request.urlretrieve(reportUrl, r'./AnnualReport/'+reportName.replace("/","-")+'.pdf')print(num)num=num+1print(r'./AnnualReport/'+reportName+'.pdf'+'下载完成')
相关文章:
爬虫获取接口数据
上一讲讲的是获取静态网页数据的教程,适用于我们要爬取的数据在网页源代码中出现,但是还是有很多的数据是源代码中没有的,需要通过接口访问服务器来获得,下面我就来讲讲如何爬取这类数据。 以巨潮资讯网爬取比亚迪企业年报为例。…...
私域流量的变现方式,你知道多少?
私域流量的变现方式是指通过有效的管理和运营自有的用户群体,将流量转化为实际收益的过程。私域流量的变现方式多样,下面将介绍其中几种常见的方式。 1. 电商平台入驻 通过将自有流量引导到电商平台,开设店铺进行商品销售,从中获…...
Webpack配置entry修改入口文件或打包多个文件
当我们使用Webpack进行文件打包时,默认打包的文件是src文件下的index.js文件 一、修改Webpack打包入口 如果我们想要在其他文件下打包指定的js文件就需要在webpack.config.js文件中进行entry配置 二、将指定的多个文件打包为一个文件 现在有两个文件,…...
Mac mini2014(装的windows)重装回MacOS
Mac mini2014(装的windows)重装回MacOS 制作macos的启动U盘,我的是32G的 第一步下载你的硬件能使用的系统,建议最好低一个版本,因为我安装的时候出现问题。 下载地址:https://blog.csdn.net/netgc/article/details/130641479下载…...
珠海建筑模板厂家-能强优品木业:为您提供优质建筑模板解决方案
在珠海这座美丽的沿海城市,建筑行业蓬勃发展,对于高质量的建筑模板需求也日益增加。在这里,有一家备受赞誉的建筑模板厂家,那就是能强优品木业。作为一家专业的建筑模板供应商,他们以优质的产品和卓越的服务在业界享有…...
图像识别技术如何改变智能家居的体验?
图像识别技术在智能家居中的应用正在改变我们的生活体验。通过图像识别技术,智能家居可以更准确地识别用户,并自动调整环境以适应用户的需求。以下是图像识别技术在智能家居中的一些应用: 人脸识别:通过人脸识别技术,智…...
前端中blob文件流和base64的区别
在前端中,base64 和 fileBlob 是用于处理文件数据的两种不同方式。 1. Base64 编码 Base64 是一种将二进制数据转换为文本字符串的编码方式。它将文件数据转换为一串由 ASCII 字符组成的字符串。在前端中,可以使用 JavaScript 的 btoa() 和 atob() 函数…...
MySQL详解六:备份与恢复
文章目录 1. 数据库备份的分类1.1 从物理和逻辑上分类1.1.1 物理备份1.1.2 逻辑备份 1.2 从数据库的备份策略角度上分类1.2.1 完全备份1.2.2 差异备份1.2.3 增量备份 1.3 常见的备份方法 2. MySQL完全备份2.1 完全备份简介2.2 优点与缺点2.3 实现物理冷备份与恢复2.3.1 实现流程…...
什么样的应用程序适合使用Flutter开发桌面?
桌面应用开发的现状 在过去,桌面应用程序的开发通常需要使用特定于操作系统的工具和语言,如C、C#、Java等。这导致了高昂的开发成本和维护困难。尽管有一些跨平台桌面开发工具,如Electron和Qt,但它们在性能、用户体验和开发效率方…...
02强化学习基本概念
强化学习基本概念 前言1、State、Action、Policy等① State② Action③ State transition④ State transition probability⑤ Polity 2、Reward、Return、MDP等① Reward② Trajectory and return③ Discounted return④ Episode⑤ MDP 总结: 前言 本文来自西湖大学…...
笔记2.2:网络应用基本原理
一. 网络应用的体系结构 (1)客户机/服务器结构(Client-Server, C/S) (2)点对点结构(Peer-to-Peer,P2P) (3)混合结构(Hybrid&#x…...
生活垃圾数据集(YOLO版)
文章目录 1、数据集介绍1.1、数据集图片组成2.1、获取数据集方式 2、扩展代码2.1、文件结构树2.2、划分数据集2.3、获取数据集文件名字2.4、文件成功对应检测 3、其他文章 1、数据集介绍 1.1、数据集图片组成 【有害垃圾】:电池(1 号、2 号、5 号&…...
操作系统篇之虚拟内存
虚拟内存是什么? 虚拟内存是计算机操作系统中的一种技术,它将每个进程的内存空间划分成若干个固定大小的页,并通过页面映射技术将这些页与物理内存或磁盘上的页面文件进行交换 虚拟内存能干什么? 扩展了实际物理内存容量:虚拟内存使得每个…...
浅谈SpringMVC的请求流程
目录标题 浅谈SpringMVC的请求流程SpringMVC的介绍SpringMVC的逻辑概念运行图解知识总结 浅谈SpringMVC的请求流程 对于SpringMVC而言重点是了解它的底层运行逻辑,从而可以根据其逻辑来进行实际业务的操作或者是利用原理增强业务的功能性,最终达到项目预…...
2309json.nlohmann数格示例1
参考 示例 下面是一些示例,可让你了解如何使用该类. 除了以下示例之外,你可能还需要: ->检查文档 ->浏览独立示例文件 每个API函数(记录在API文档中)都有相应独立示例文件.如,emplace()函数有一个匹配的emplace.cpp示例文件. 从文件中读取JSON json类提供了操作JSON…...
你知道 delete 删除属性时的一些细节吗?
探究 delete 的一些细节,起源于刚刚做过的一道笔试,原题如下: a 1; const b 2; console.log(delete a); console.log(delete b); // 输出结果是? // 答:true false我可从来没用过 delete 的返回值,但凡…...
Blender入门——快捷键
视角控制 旋转视角:鼠标中键摁住即可旋转平移视角:shift中远近视角:中键滚动 物体控制 移动物体:G旋转物体:R缩放物体:S回复变换:AltG,R,S新建物体:shiftA复制物体:shiftD删除物体&a…...
实例讲解Spring boot动态切换数据源
前言 在公司的系统里,由于数据量较大,所以配置了多个数据源,它会根据用户所在的地区去查询那一个数据库,这样就产生了动态切换数据源的场景。 今天,就模拟一下在主库查询订单信息查询不到的时候,切换数据…...
调整网络时需要注意的事项
这段时间调整网络,涉及的计算机多,Vlan也多,不小心的动作会给自己造成很大的麻烦,因为毕竟我也只是一个网络的初学者,平时虽然是网管,只是作为一项普通的工作。 准备工作做得不细致,可能出现的问…...
OpenCV自学笔记二十二:绘图及交互
一、绘图基础 下面是关于OpenCV绘图基础函数的说明和举例: 1. cv2.line():绘制直线 cv2.line(img, pt1, pt2, color, thickness, lineType) - img: 需要绘制直线的图像。 - pt1: 直线起始点坐标。 - pt2: 直线结束点坐标。 - color: 直线颜色&…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
python基础语法Ⅰ
python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器,来进行一些算术…...
python读取SQLite表个并生成pdf文件
代码用于创建含50列的SQLite数据库并插入500行随机浮点数据,随后读取数据,通过ReportLab生成横向PDF表格,包含格式化(两位小数)及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...
