爬虫获取接口数据

2023-09-18 19:41:53

上一讲讲的是获取静态网页数据的教程,适用于我们要爬取的数据在网页源代码中出现,但是还是有很多的数据是源代码中没有的,需要通过接口访问服务器来获得,下面我就来讲讲如何爬取这类数据。

以巨潮资讯网爬取比亚迪企业年报为例。

正常人的操作

  1. 打开巨潮资讯网官网

  2. 找到比亚迪的公告

  3. 在分类里面选择筛选信息,找到自己想要的信息

爬虫的思路

获取请求信息

在正常人的操作第三步,当我们选择一个类别时,毫无疑问浏览器肯定会对服务器发送请求信息,服务器返回信息后我们才能看到想要的信息,看一下怎么获取这个请求:

  1. 按下F12或者是右键检查,进入网络,先清空乱七八糟的网络信息

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

  3. 我们可以查看query这条请求的信息

请求转换为代码

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

  1. 把请求复制下来

  2. 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']=i
    response = 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+1
            print(r'./AnnualReport/'+reportName+'.pdf'+'下载完成')
更多推荐

win10如何把繁体字改成简体字

win10如何把繁体字改成简体字WBOY发布:2023-07-0913:17:05转载3431人浏览过win10客户在开展文字输入的时候遇到了字体变为繁体字的状况,那么如何把繁体字改成简体字呢?是否有快捷键呢?win10繁体字改简体字的快捷键是Ctrl+Shift+F,你也可以在系统的语言设置中进行操作,开启微软拼音的

线性搜索简介

概念:线性搜索(LinearSearch)是一种简单直观的搜索算法,用于在一个未排序或已排序的数组中查找目标元素。它从数组的第一个元素开始逐个比较,直到找到匹配的元素或搜索完整个数组。线性搜索解决的问题是在一个集合中查找特定元素的位置或判断元素是否存在。算法特点:简单直观:线性搜索是一种最基本的搜索算法,易于理解和实现

成都瀚网科技:抖音提供差异化​​亮点!

在抖音平台上,精选联盟是一个专门为优质品牌提供展示和推广机会的合作项目。对于斗店主来说,如何成功对接精选联盟并实现上市是一个重要目标。在这篇文章中,我们将分享一些豆点与精选联盟对接的方法,并提供上币指南。1、提升店铺品质精选联盟注重优质品牌的展示。因此,提升门店品质是成功对接精选联盟的关键。确保店铺拥有良好的信誉、优质

手机悬浮提词器怎么设置?分享三个简单的操作方法

在现代社会中,手机已成为人们生活中必不可少的一部分。随着科技的不断发展,手机的功能也越来越强大,如今手机悬浮提词器已成为许多人工作或学习时必备的工具。下面将分享三个简单的操作方法,帮助大家更好地设置手机悬浮提词器。打开悬浮窗口首先,我们可以在手机中打开书单视频王应用,进入首页后可以看到提词器功能,如果在面对手机发言时不

大模型RLHF算法更新换代,DeepMind提出自训练离线强化学习框架ReST

文章链接:https://arxiv.org/abs/2308.08998大模型(LLMs)爆火的背后,离不开多种不同基础算法技术的支撑,例如基础语言架构Transformer、自回归语言建模、提示学习和指示学习等等。这些技术造就了像GPT-3、PaLM等基座生成模型,在这些基座模型之上,研究人员通过引入人类反馈的强化

【大数据开发技术】实验05-HDFS目录与文件的创建删除与查询操作

文章目录一、实验目标二、实验要求三、实验内容四、实验步骤一、实验目标熟练掌握hadoop操作指令及HDFS命令行接口掌握HDFS目录与文件的创建方法和文件写入到HDFS文件的方法掌握HDFS目录与文件的删除方法掌握查询文件状态信息和目录下所有文件的元数据信息的方法二、实验要求给出主要实验步骤成功的效果截图。要求分别在本

【数字人】1、SadTalker | 使用语音驱动单张图片合成视频(CVPR2023)

SadTalker:使用一张图片和一段语音来生成口型和头、面部视频论文:SadTalker:LearningRealistic3DMotionCoefficientsforStylizedAudio-DrivenSingleImageTalkingFaceAnimation代码:https://github.com/W

计算机视觉与深度学习-卷积神经网络-卷积&图像去噪&边缘提取-卷积与边缘提取-[北邮鲁鹏]

目录标题参考学习链接什么是图像边缘?为什么研究边缘?有哪些边缘种类?表面法向不连续深度不连续表面颜色不连续光照不连续如何检测边缘?图像求导图像梯度图像梯度的方向图像梯度的模噪声的影响噪声影响带来的问题解决办法(先平滑处理)高斯核去噪高斯一阶偏导核高斯核vs高斯一阶偏导核边缘检测目标Canny边缘检测器高斯一阶偏导核卷积

如何从主机环境演变到云原生开发模式?

时代在发展,我们的知识,开发工具,以及相应的环境也随之进步,我们总是会趋向于向好的一面发展,期望我们自身能够更加优秀,更加高效,以及能够给周围的人带来更多的价值那么在我们平日开发过程中,你们的开发模式,以及开发环境是如何演变的呢?如下是我近一两年经历的变化,希望能给你们带来一些思考和收获混沌之初还是主机环境起初在接触g

Redis淘汰策略-架构案例2020(三十六)

上篇案例回顾:解释器,管道过滤,隐式调用优缺点?解释器则是独立的语法规则,可以通过解释器来解析,可扩展性很高,灵活性强。管道过滤则是侧重于数据的输入和输出,上一个模块的数据输出是下一个模块的输入,连接件事管道,过滤则是构件。隐式调用则强调触发和异步,多个构件会注册到一个模块里,当模块改变的时候,构件都会接收到消息从而跟

以酒为媒、以酒载道,五粮液携手首届“金熊猫奖”,讲好中国白酒故事

执笔|尼奥编辑|萧萧这是一次光影艺术与白酒酿造的和美之约,也是中国文化与世界多元文明的交融时刻,在影视与美酒的碰撞瞬间,共同擘画“美美与共,天下大同”的文明图景。9月19-20日,以“多彩文明·荣耀光影”为主题的首届“金熊猫奖”评选活动在成都举行。五粮液作为首届“金熊猫奖”全球战略合作伙伴亮相,深度融入金熊猫之夜、金熊

热文推荐