数据爬虫:获取申万一级行业数据

目录

[1. 获取访问接口](#1. 获取访问接口)

[2. 链接网址](#2. 链接网址)

[3. 链接名单](#3. 链接名单)

免责声明:本文由作者参考相关资料,并结合自身实践和思考独立完成,对全文内容的准确性、完整性或可靠性不作任何保证。同时,文中提及的数据仅作为举例使用,不构成推荐;文中所有观点均不构成任何投资建议。请读者仔细阅读本声明,若读者阅读此文章,默认知晓此声明。本文使用爬虫获取相关网站公开数据,仅作为技术分享使用,数据不涉及商用和盈利。

申万一级行业数据,对于行业的统计分析非常重要,本文主要是分享,如何通过爬虫获取其历史收盘价数值。

1. 获取访问接口

此方法由一位昵称为'富贵'的大佬分享,在此对其表示感谢。

许多数据源使用的是json传输到网页,使用xpath或者bs4均无法提取数据,因此需要使用直接访问传输文件对应的接口。

首先根据网址名称申万宏源证券咨询网 (swhyresearch.com),F12获取相应的网页信息。

根据网页信息,可以发现trend文件中包含所需数据 ,接下来复制该文本为URL(bash)。

将获取的数据粘贴到 https://curlconverter.com/中,并切换语言为python。

这样一来,就可以获取类似于接口的代码:

复制代码
import requests

cookies = {
    'i18next': 'zh-CN',
}

headers = {
    'Accept': '*/*',
    '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',
    # 'Cookie': 'i18next=zh-CN',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
    'X-Access-Token': 'null',
    'clientType': '4',
    'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Microsoft Edge";v="120"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
    'token': '',
}

params = {
    'swindexcode': '801001',
    'period': 'DAY',
}

response = requests.get(
    'https://www.swhyresearch.com/institute-sw/api/index_publish/trend/',
    params=params,
    cookies=cookies,
    headers=headers,
)

2. 链接网址

根据上述的代码,调整所需参数(参数位于params中,即申万一级行业对应的编码和数据频率),然后解析,即可获得数据(本文仅获取日期和收盘价)。

复制代码
import requests
import pandas as pd
import sys

def get_sw_data(code, period=None):
    '''
    获取单个申万一级行业指数的收盘价
    code:str,指数编码,例如'801001'
    period:str,数据频率,例如'DAY',默认为日度;DAY-日度,WEEK-周度,MONTH-月度
    -------
    返回DataFrame,列名为日期和收盘价
    '''
    cookies = {'i18next': 'zh-CN', }
    headers = {
        'Accept': '*/*',
        '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',
        # 'Cookie': 'i18next=zh-CN',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'same-origin',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
        'X-Access-Token': 'null',
        'clientType': '4',
        'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Microsoft Edge";v="120"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
        'token': '',
    }
    params = {'swindexcode': code, 'period': period or 'DAY'}
    response = requests.get('https://www.swhyresearch.com/institute-sw/api/index_publish/trend/',
                            params=params, cookies=cookies, headers=headers)
    # 判断是否提取到数据,若未拿到数据,自动退出
    if response.status_code == 200:
        print('链接成功!开始获取数据')
    else:
        print('链接失败!自动退出', response.status_code)
        sys.exit()

    # 解码并将数据转换为DataFrame,然后对所需字段进行转换
    text_json = response.json()
    data = pd.DataFrame(text_json["data"])
    # 日期转化为str,格式如'20200101'
    data['date'] = data['bargaindate'].apply(lambda x: pd.to_datetime(str(x)).strftime("%Y%m%d"))
    out_df = pd.DataFrame({'日期': data['date'], '收盘价': data['closeindex']})
    return out_df


if __name__ == '__main__':
    code = '801001'
    data = get_sw_data(code, 'MONTH')

运行后,得到的结果为:

3. 链接名单

第二节分享了如何获取单个申万行业指数的数据,本节主要分享如何获取申万行业的名单和编码,方法和之前一样。网址为申万宏源证券咨询网 (swhyresearch.com)

对应的代码为:

复制代码
import requests
import pandas as pd

cookies = {'i18next': 'zh-CN', }
headers = {
    'Accept': '*/*',
    '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',
    # 'Cookie': 'i18next=zh-CN',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
    'X-Access-Token': 'null',
    'clientType': '4',
    'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Microsoft Edge";v="120"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
    'token': '', }
# page--页数;page_size--单页展示多少条数据,最大50条
# 由于申万行业当前共有30多个,因此此处直接设置为50,不进行循环page的操作
params = {'page': '1', 'page_size': '50', 'indextype': '一级行业', 'sortField': '', 'rule': '', }
response = requests.get('https://www.swhyresearch.com/institute-sw/api/index_publish/current/',
                        params=params, cookies=cookies, headers=headers)
text_json = response.json()
data = pd.DataFrame(text_json["data"]['results'])
out_df = pd.DataFrame({'申万代码': data['swindexcode'],
                       '指数名称': data['swindexname']})

对应的结果为:

结合第二节,是用循环,就可以获取所有申万一级行业的指数 数据,需要注意的是,循环时尽可能设置一下访问的时间间隔,不要过度和过快的去访问。许多可优化的点,本文就不再深究。

本期分享结束,有何问题欢迎交流。

免责声明:本文由作者参考相关资料,并结合自身实践和思考独立完成,对全文内容的准确性、完整性或可靠性不作任何保证。同时,文中提及的数据仅作为举例使用,不构成推荐;文中所有观点均不构成任何投资建议。请读者仔细阅读本声明,若读者阅读此文章,默认知晓此声明。本文使用爬虫获取相关网站公开数据,仅作为技术分享使用,数据不涉及商用和盈利。

相关推荐
Clown9512 分钟前
Go语言爬虫系列教程 实战项目JS逆向实现CSDN文章导出教程
javascript·爬虫·golang
小oo呆24 分钟前
【学习心得】Jupyter 如何在conda的base环境中其他虚拟环境内核
python·jupyter·conda
小白学大数据1 小时前
Scrapy框架下地图爬虫的进度监控与优化策略
开发语言·爬虫·python·scrapy·数据分析
浊酒南街1 小时前
TensorFlow之微分求导
人工智能·python·tensorflow
立秋67891 小时前
用Python绘制梦幻星空
开发语言·python·pygame
alpszero2 小时前
YOLO11解决方案之对象裁剪探索
人工智能·python·计算机视觉·yolo11
白云千载尽2 小时前
相机、雷达标定工具,以及雷达自动标定的思路
python·自动驾驶·ros
咕噜咕噜啦啦2 小时前
python爬虫实战训练
爬虫·python
盛夏绽放2 小时前
Python字符串常用内置函数详解
服务器·开发语言·python
我想睡觉2612 小时前
Python训练营打卡DAY27
开发语言·python·机器学习