经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python3 » 查看文章
股票数据爬虫
来源:cnblogs  作者:Sundar_2022  时间:2024/4/23 22:04:15  对本文有异议

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

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 代码

  1. import requests
  2. import openpyxl
  3. import sys
  4. import os
  5. # 创建文件夹
  6. def MakeDir(Name):os.makedirs(Name)
  7. # 删除旧版数据
  8. def Delete_Old():
  9. os.system("rmdir /S /Q Files")
  10. os.system("del Data.txt")
  11. os.system("del GP.xlsx")
  12. # 下载所有数据包
  13. def Download():
  14. MakeDir("Files")
  15. print("All: 50 Datas")
  16. for Number in range(1,51):
  17. print("Download: No."+str(Number))
  18. 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"
  19. File=requests.get(URL)
  20. with open ("Files/"+str(Number)+".txt","wb") as f:
  21. f.write(File.content)
  22. f.close
  23. # 处理所有数据
  24. Data=""
  25. def Equals(x,s):
  26. global Data
  27. for i in range(0,len(s)):
  28. if Data[x+i]!=s[i]:
  29. return False
  30. return True
  31. def Get_string(x):
  32. global Data
  33. res=""
  34. while Data[x]!='"' and Data[x]!=',' :
  35. res=res+Data[x]
  36. x+=1;
  37. return res
  38. def Get_double(x):
  39. res=Get_string(x)
  40. return float(res)
  41. def Have(x):
  42. global Data
  43. return Data[x]!='-' or Data[x+1]!='"'
  44. def Next_Start(x):
  45. while Data[x]!=':':x+=1
  46. x+=1
  47. if Data[x]=='"': x+=1
  48. return x
  49. def Search():
  50. global Data
  51. Cnt=0
  52. for i in range(0,len(Data)):
  53. if Equals(i,"SECURITY_CODE"):
  54. flag=Next_Start(i);
  55. Number=int(Get_string(flag));
  56. if Number>=680000:
  57. print("EOF")
  58. break
  59. print(Get_string(flag))
  60. if Equals(i,"CHANGE_RATE"):
  61. flag=Next_Start(i);
  62. if not Have(flag):
  63. print("-")
  64. else:
  65. print(Get_double(flag))
  66. if Equals(i,"TURNOVERRATE"):
  67. flag=Next_Start(i);
  68. if not Have(flag):
  69. print("-")
  70. else:
  71. print(Get_double(flag))
  72. if Equals(i,"ORG_PARTICIPATE"):
  73. flag=Next_Start(i);
  74. if not Have(flag):
  75. print("-")
  76. else:
  77. print(Get_double(flag))
  78. Cnt+=1
  79. if Cnt==100:
  80. break
  81. def Input(i):
  82. sys.stdin=open("Files/"+str(i)+".txt","r",encoding="utf-8")
  83. res=input()
  84. return res
  85. def Process():
  86. print("Process...")
  87. sys.stdout=open("Data.txt","w",encoding="utf-8")
  88. for i in range(1,51):
  89. global Data
  90. Data=Input(i)
  91. Search()
  92. # 数据输出至 Excel
  93. def To_Excel():
  94. sys.stdin=open("Data.txt","r",encoding="utf-8")
  95. Excel=openpyxl.Workbook()
  96. Sheet=Excel.active
  97. while True:
  98. a=input()
  99. if a=="EOF": break
  100. b=input()
  101. c=input()
  102. d=input()
  103. Sheet.append([a,b,c,d])
  104. Excel.save('GP.xlsx')
  105. Delete_Old()
  106. Download()
  107. Process()
  108. To_Excel()

0xff 特别鸣谢

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

原文链接:https://www.cnblogs.com/Sundar-2022/p/18153857

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号