首页 > 其他分享 >股票数据爬虫

股票数据爬虫

时间:2024-04-23 22:00:36浏览次数:20  
标签:CODE Data 股票 Excel 爬虫 flag SECURITY 数据 def

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

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 的精神支持

标签:CODE,Data,股票,Excel,爬虫,flag,SECURITY,数据,def
From: https://www.cnblogs.com/Sundar-2022/p/18153857

相关文章

  • 数据结构的练习day2(未完待续)
    数据结构线性结构之单向循环链表的基本操作/***********************************************************************************************************设计单向循环链表的接口****Copyright(c)[email protected]......
  • Google Play App Store API 采集谷歌安卓应用商城app的数据接口 - 2024最新
    iDataRiver平台https://www.idatariver.com/zh-cn/提供开箱即用的谷歌安卓应用商城googleplayappstore数据采集API,供用户按需调用。接口使用详情请参考GooglePlayAppStore接口文档接口列表1.获取指定app的基础信息参数类型是否必填默认值示例值描述apik......
  • python爬虫—学习笔记-4
    课堂内容:删除原导出文件的venv,pycham打开此文夹,重新创建本地虚拟编译器。安装依赖库,打开pycham终端输入pipinstall-ryilaiku.txt,安装依赖库中的库。继续安装bs4、lxml库,命令为:pipinstallbs4和pipinstalllxml。安装好后,pycham来到spiders目录下,新建Python......
  • 数据清洗
    石家庄铁道大学2024年春季  2022级课堂测试试卷—数据同步练习课程名称: 大数据库技术与应用  任课教师:王建民  考试时间: 120分钟  一、 数据结构分析:(1)京津冀三省的2015年度的科技成果数据原始表,为Access数据库,; (2)要求将三省的科技成果数据汇总到同一表中(要......
  • C++ 访问说明符详解:封装数据,控制访问,提升安全性
    C++访问说明符访问说明符是C++中控制类成员(属性和方法)可访问性的关键字。它们用于封装类数据并保护其免受意外修改或滥用。三种访问说明符:public:允许从类外部的任何地方访问成员。private:仅允许在类内部访问成员。protected:允许在类内部及其派生类中访问成员。示例:cla......
  • 数据结构:单循环链表的创建插入与删除
    数据结构:单循环链表的创建·插入·删除/***@filename: 单循环链表的创建·插入·删除*@brief实现单循环链表的创建删除插入的功能*@[email protected]*@date2024/04/23*@version1.0:版本*@notenoone*CopyRight(c)2023-2024liuliu@......
  • MYSQL使用binlog恢复数据
    要使用MySQL的二进制日志(binlog)恢复被删除的数据,你需要确保二进制日志功能已经开启,并且已经有足够的日志记录来恢复数据。以下是恢复数据的基本步骤和示例代码:1、确认二进制日志功能已经开启:查看my.cnf(或my.ini)配置文件,确保log_bin变量设置为非空值,或者使用以下SQL命令SHOWVAR......
  • 如何画数据库ER图
    ER图基本概念ER图分为实体、属性、关系三个核心部分。在ER图中,实体是长方形,属性是椭圆形,关系为菱形。实体(entity):即数据模型中的数据对象(即数据表),用长方体来表示,每个实体都有自己的实体成员(entitymember)或者说实体对象(entityinstance),例如学生实体里包括张三、李四等。实体还......
  • 前端编程另一种数据传输方法,window.postMessage 技术
    window.postMessage是一项非常实用的浏览器技术,它允许不同窗口或框架之间进行安全的消息传递。一、技术介绍window.postMessage可以在不同的源之间传递消息,包括跨域的情况。这为跨文档通信提供了一种强大而灵活的方式。二、使用方法举例假设有两个页面,一个是发送方页面send......
  • Blob数据转String
    importjava.io.InputStream;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;publicclassTest{   /**    *@paramargs    */   @SuppressWarnings("unused......