股票数据爬虫

· 浏览次数 : 0

小编点评

**0x00 代码:** ```python import requests import openpyxl # 获取所有数据包链接 data_urls = [] for number in range(1, 51): url = "https://datacenter-web.eastmoney.com/api/data/v1/get?callback=jQuery112305044442743842579_1713445654977&sortColumns=SECURITY_CODE&sortTypes=1&pageSize=" + str(number) + "&pageNumber=" + str(number) + "&reportName=RPT_DMSK_TS_STOCKNEW&quoteColumns=f2~01~SECURITY_CODE~CLOSE_PRICE%2Cf8~01~SECURITY_CODE~TURNOVERRATE%2Cf3~01~SECURITY_CODE~CHANGE_RATE%2Cf9~01~SECURITY_CODE~PE_DYNAMIC&quoteType=0&columns=ALL&filter=&token=894050c76af8597a853f5b408b759f5d" data_urls.append(url) # 创建 Excel 工作簿 workbook = openpyxl.Workbook() sheet = workbook.active # 设置 Excel 工作表标题 sheet.title = "Eastmoney Stock Data" # 写入数据 for i, url in enumerate(data_urls): sheet.append([url]) # 保存 Excel 文件 workbook.save("GP.xlsx") ``` **0x01 代码:** ```python import openpyxl # 打开 Excel 文件 workbook = openpyxl.load_workbook("GP.xlsx") # 获取 Excel 工作表 sheet = workbook.active # 遍历 Excel 工作表中的所有行 for row in sheet.rows: # 获取当前行的值 data = [cell.value for cell in row] # 打印数据 print(",".join(data)) ``` **注意:** * 0x00 代码需要安装 `requests` 和 `openpyxl` 模块。 * 0x01 代码需要安装 `openpyxl` 模块。 * 此代码假设数据文件名为 `GP.xlsx`。如果文件名不同,请更改 `openpyxl.load_workbook()` 函数的参数。

正文

东方财富网-数据中心 —— 爬虫项目

0x00 起因

MaMa 看到别人有个软件,可以直接把一个网站上的数据全部爬进一个 Excel 里边,但是那个人不给这个软件,所以她怂恿我写一个。。。

0x01 需求

千股千评 _ 数据中心 _ 东方财富网 (eastmoney.com)

对于里边的00~60开头的股票,把股票代码、涨跌幅、换手率、机构参与度给搞到一个 Excel 里边。

0x02 先看看数据包长啥样

进入网站,打开 F12 里边的“网络”,多改几次页码,发现每一次都会有几个数据包。

我们选中刷新第一页时候的几个数据包,发现两个图片,一个不知道啥东西,我们凭直觉知道,图片大概率没啥用,于是不管他,点开那个不知道啥文件。

发现一个奇怪的 URL,我们把这玩意输进地址栏里边,一个 txt 出来了:

对比一下原始数据:

真不错,现在数据有了,我们也可以以此得出我们需要的数据在 txt 里边叫啥:

TXTname Name
SECURITY_CODE 股票代码
CHANGE_RATE 涨跌幅
TURNOVERRATE 换手率
ORG_PARTICIPATE 机构参与度

看一看请求数据包的 URL,看看有啥特点:

datacenter-web.eastmoney.com/api/data/v1/get?callback=jQuery112305044442743842579_1713445654977&sortColumns=SECURITY_CODE&sortTypes=1&pageSize=50&pageNumber=1&reportName=RPT_DMSK_TS_STOCKNEW&quoteColumns=f2~01~SECURITY_CODE~CLOSE_PRICE%2Cf8~01~SECURITY_CODE~TURNOVERRATE%2Cf3~01~SECURITY_CODE~CHANGE_RATE%2Cf9~01~SECURITY_CODE~PE_DYNAMIC&quoteType=0&columns=ALL&filter=&token=894050c76af8597a853f5b408b759f5d

里面有一个 pageSize,用来调整每页显示多少,但是这个值不可以太大。

里面有一个 pageNumber,用来调整显示第几页。

我们可以使用 ... pageSize=1&pageNumber=1 ...... pageSize=1&pageNumber=2 ... 来一个个的搞数据。

然后就完了,简化一下需求:

你需要对于几千个 txt 中的每一个,干如下的事情:

  • 分离股票代码
  • 根据 ... ,"SECUCODE":"_NUM_", ...,分离出股票代码
    • 如果里边出现了 60+ 开头的股票,就停止
  • 分离其他三个数据,格式为 ... ,"_NAME_":"_NUM_", ...
  • 输出为 Excel

0x03 先把数据包给搞下来

让我们一通百度-Google-Bing-Cnblogs-CSDN-知乎(没学过网络)

决定:跨语言编程绝对不是因为我C++菜搞不懂类型转换

使用 python 的 requests 把文件搞下来:pip install requests

先下载一个试试看,URL太长,我用__PATH__替代掉了:

可谓是十分好的成功了啊。

我们爬个 \(5000\)​ 条,一条一条爬,发现慢的要死,得爬个 30min。

所以说还是 \(100\) 条一起爬罢。

注意 python range 不包含最大值。。。

后面交给 C++ 去做了。

0x04 数据处理

比较的基础。

0x05 输出为 Excel

再次祭出 python 小宝贝。

感觉看看好像 openpyxl 库比较好写一些,装一个罢:pip install openpyxl

Python向Excel写入内容的方法大全_python写入excel单元格-CSDN博客

0x06 客户投诉

电脑上没装 MinGW,导致没法运行 C++ 的 exe。

只好强行翻译了。

顺便加一个删除上一次文件的功能。

0x07 最终 python 代码

import requests
import openpyxl
import sys
import os


# 创建文件夹
def MakeDir(Name):os.makedirs(Name)


# 删除旧版数据
def Delete_Old():
    os.system("rmdir /S /Q Files")
    os.system("del Data.txt")
    os.system("del GP.xlsx")


# 下载所有数据包
def Download():
    MakeDir("Files")
    print("All: 50 Datas")
    for Number in range(1,51):
        print("Download: No."+str(Number))
        URL="https://datacenter-web.eastmoney.com/api/data/v1/get?callback=jQuery112305044442743842579_1713445654977&sortColumns=SECURITY_CODE&sortTypes=1&pageSize=100&pageNumber="+str(Number)+"&reportName=RPT_DMSK_TS_STOCKNEW&quoteColumns=f2~01~SECURITY_CODE~CLOSE_PRICE%2Cf8~01~SECURITY_CODE~TURNOVERRATE%2Cf3~01~SECURITY_CODE~CHANGE_RATE%2Cf9~01~SECURITY_CODE~PE_DYNAMIC&quoteType=0&columns=ALL&filter=&token=894050c76af8597a853f5b408b759f5d"
        File=requests.get(URL)
        with open ("Files/"+str(Number)+".txt","wb") as f:
            f.write(File.content)
            f.close


# 处理所有数据
Data=""

def Equals(x,s):
    global Data
    for i in range(0,len(s)):
        if Data[x+i]!=s[i]:
            return False
    return True

def Get_string(x):
    global Data
    res=""
    while Data[x]!='"' and Data[x]!=',' :
        res=res+Data[x]
        x+=1;
    return res

def Get_double(x):
    res=Get_string(x)
    return float(res)

def Have(x):
    global Data
    return Data[x]!='-' or Data[x+1]!='"'

def Next_Start(x):
    while Data[x]!=':':x+=1
    x+=1
    if Data[x]=='"': x+=1
    return x

def Search():
    global Data
    Cnt=0
    for i in range(0,len(Data)):
        
        if Equals(i,"SECURITY_CODE"):
            flag=Next_Start(i);
            Number=int(Get_string(flag));
            if Number>=680000:
                print("EOF")
                break
            print(Get_string(flag))

        if Equals(i,"CHANGE_RATE"):
            flag=Next_Start(i);
            if not Have(flag):
                print("-")
            else:
                print(Get_double(flag))

        if Equals(i,"TURNOVERRATE"):
            flag=Next_Start(i);
            if not Have(flag):
                print("-")
            else:
                print(Get_double(flag))

        if Equals(i,"ORG_PARTICIPATE"):
            flag=Next_Start(i);
            if not Have(flag):
                print("-")
            else:
                print(Get_double(flag))
            Cnt+=1
            if Cnt==100:
                break

def Input(i):
    sys.stdin=open("Files/"+str(i)+".txt","r",encoding="utf-8")
    res=input()
    return res

def Process():
    print("Process...")
    sys.stdout=open("Data.txt","w",encoding="utf-8")
    for i in range(1,51):
        global Data
        Data=Input(i)
        Search()


# 数据输出至 Excel
def To_Excel():
    sys.stdin=open("Data.txt","r",encoding="utf-8")
    Excel=openpyxl.Workbook()
    Sheet=Excel.active
    while True:
        a=input()
        if a=="EOF": break
        b=input()
        c=input()
        d=input()
        Sheet.append([a,b,c,d])
    Excel.save('GP.xlsx')


Delete_Old()
Download()
Process()
To_Excel()

0xff 特别鸣谢

  • CnblogsLuogu 提供了伟大的博客平台!
  • Typora 提供的 Markdown 排版
  • ImgTP 提供免费的图床服务
  • 来自 Mother 的精神支持

与股票数据爬虫相似的内容:

股票数据爬虫

东方财富网-数据中心 —— 爬虫项目 0x00 起因 MaMa 看到别人有个软件,可以直接把一个网站上的数据全部爬进一个 Excel 里边,但是那个人不给这个软件,所以她怂恿我写一个。。。 0x01 需求 千股千评 _ 数据中心 _ 东方财富网 (eastmoney.com) 对于里边的00~60开

[转帖]Redis学习笔记--Redis数据过期策略详解

本文对Redis的过期机制简单的讲解一下 讲解之前我们先抛出一个问题,我们知道很多时候服务器经常会用到redis作为缓存,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了(比如暂存session,又或者只存放日行情股票数据)那么就会出现一下几个问题了 Redis会自己回收清理不用的数据吗?

实用教程丨如何将实时数据显示在前端电子表格中(一)

本文由葡萄城技术团队于博客园原创并首发转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 数据(包括股票、天气和体育比分)在不断更新为新信息时最为有用。比较通用的 JavaScript 电子表格组件,可以轻松地使用、显示并通过数据绑定提供实时数据更新。

金融量化项目案例 -- 股票分析

博客地址:https://www.cnblogs.com/zylyehuo/ 股票分析 使用tushare包获取某股票的历史行情数据。 输出该股票所有收盘比开盘上涨3%以上的日期。 输出该股票所有开盘比前日收盘跌幅超过2%的日期。 开发环境 anaconda 集成环境:集成好了数据分析和机器学习中所

如何使用Tushare+ Backtrader进行股票量化策略回测

更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流。 典型股票量化回测流程 典型的股票量化策略回测流程包括以下几个步骤: 数据获取:首先需要获取所需的股票市场数据,包括股票价格、交易量、财务数据等。这些数据可以从金融数据供应商、交易所、财经网站或者专门的数据

[转帖]博睿数据披露2022年半年报 实现营收6255.04万元

https://baijiahao.baidu.com/s?id=1742458714721254460&wfr=spider&for=pc 8月26日,A股上市公司博睿数据(代码:688229.SH)发布2022年半年度业绩报告。 2022年1月1日-2022年6月30日,公司实现营业收入6255

大类资产轮动策略

更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流。 大类资产轮动的概念 大类资产轮动,从定义上来说, 就是债券、股票、商品的轮动。从典型的学院派理论来讲,上述资产之间的轮动顺序往往是债券先走牛,然后股票牛市,股票走牛之后商品开始火爆,等商品行情结束后,最后

如何使用CCXT交易数字货币现货

更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流。 数字货币现货标准化接口 数字货币市场与股票、期货市场最大的不同点在于数字货币主流交易所数量很多。举个例子,如果我们需要交易螺纹钢期货(RB),我们只能选择上海期货交易所。然而,如果我们想交易比特币,有币安

二八轮动策略:基础与改进

更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流。 二八轮动策略原理 二八轮动策略,通俗的来讲就是大小盘股的轮动策略。 其中“二”代表数量占比20%左右的大盘权重股,“八”代表数量占比80%左右的中小盘股票。如果我们仔细观察股市,经常会看到这样的现象,市场

[转帖]信创国家队,太极股份,领航建设数字中国

https://xueqiu.com/1256808809/238810705 太极股份控股股东为中电科,深耕中国数字化建设三十年,是国内数字政府、智慧城市、关键行业信息化的领军企业,围绕产业数字化转型,形成了系统集成服务、网络安全服务、智慧应用与服务、云服务四大业务体系。 一、自主可控+数字经济的