朋友股票亏惨了,我一怒用Python爬取了证券最新数据

五包辣条! 2021-10-26 05:38:46
Python 股票 朋友 惨了 一怒

大家好,我是辣条。

 抓取目标:

url:http://webapi.cninfo.com.cn/#/marketDataDate
数据目标: 获取 证券代码 证券简称 交易日期 开盘价 最高价 最低价 收盘价 成交数量
难点: 请求头参数mcode 加密生成 

使用第三方库:

1. requests
2. execjs
3. js2py
4. math
5. time
6. pandas

工具:

1. 谷歌浏览器
2. pycharm
3. python3.7

 

页面分析:

进入页面,鼠标右击,选择检查 -> 弹出浏览器开发者工具 -> Netword -> 选择xhr -> 刷新页面

 找到接口,观察接口数据情况:

 

此接口为post请求,需要提交两个表单参数。

代码片段:

url = 'http://webapi.cninfo.com.cn/api/sysapi/p_sysapi1015'
data = {
   'tdate': datetime,
   'scode': '399001'
}
headers = {
   'mcode': 'MTYzNTEzOTkxMQ==',
   'Referer': 'http://webapi.cninfo.com.cn/',
   'Cookie': 'Hm_lvt_489bd07e99fbfc5f12cbb4145adb0a9b=1634795282; Hm_lpvt_489bd07e99fbfc5f12cbb4145adb0a9b=1634799860',
   'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36'
}
response = requests.post(url, headers=headers, data=data).json()

请求成功, 但是有时效性的问题,等过了几分钟后,就无权限访问了,仔细观察发现特殊参数mcode。

开始JS找加密参数生成位置: (注意需要重新刷新页面,不然会出现没有js情况)

 问题来了,好几个js文件,怎么确定那个是我们需要的?

使用第二种搜索方式,根据url的请求地址搜索:

 

打上断点后 直接刷新页面 开始调试

var indexcode={
getResCode:function(){
var time=Math.floor(new Date().getTime()/1000); return window.JSonToCSV.missjson(""+time);
}
}

继续调试,看看这个missjson是干啥的。

 下面把这些js扣下来执行

完整代码

import requests
import execjs
import js2py
import math
import time
import pandas as pd
​
​
code_list = []
​
​
def MCODE():
   jscode = '''
  function missjson(input) {  
      var keyStr = "ABCDEFGHIJKLMNOP" + "QRSTUVWXYZabcdef" + "ghijklmnopqrstuv"   + "wxyz0123456789+/" + "=";  
      var output = "";  
      var chr1, chr2, chr3 = "";  
      var enc1, enc2, enc3, enc4 = "";  
      var i = 0;  
      do {  
          chr1 = input.charCodeAt(i++);  
          chr2 = input.charCodeAt(i++);  
          chr3 = input.charCodeAt(i++);  
          enc1 = chr1 >> 2;  
          enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);  
          enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);  
          enc4 = chr3 & 63;  
          if (isNaN(chr2)) {  
              enc3 = enc4 = 64;  
          } else if (isNaN(chr3)) {  
              enc4 = 64;  
          }  
          output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2)  
                  + keyStr.charAt(enc3) + keyStr.charAt(enc4);  
          chr1 = chr2 = chr3 = "";  
          enc1 = enc2 = enc3 = enc4 = "";  
      } while (i < input.length);  
   
      return output;  
  }
   
  '''
   time1 = js2py.eval_js('Math.floor(new Date().getTime()/1000)')
   # py方式
   a = math.floor(time.time() / 1000)
   mcode = execjs.compile(jscode).call('missjson', '{a}'.format(a=time1))
   return mcode
​
​
def PageRquest(datetime, mcode):
   # 接口可以换
   url = 'http://webapi.cninfo.com.cn/api/sysapi/p_sysapi1015'
   data = {
       'tdate': datetime, # 获取数据时间
       'scode': '399001'  # 股票代码 以及交易所简称
  }
   headers = {
       'mcode': str(mcode),
       'Referer': 'http://webapi.cninfo.com.cn/',
       'Cookie': 'Hm_lvt_489bd07e99fbfc5f12cbb4145adb0a9b=1634795282; Hm_lpvt_489bd07e99fbfc5f12cbb4145adb0a9b=1634799860',
       'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36'
  }
   response = requests.post(url, headers=headers, data=data).json()
   code = response['records']
   for i in code:
       code_list.append(i)
​
​
def main(date):
   mcode = MCODE()
   PageRquest(date, mcode)
​
​
if __name__ == '__main__':
   # main()
   # 数据分析 pandas 自动化办公的
   datetime = pd.period_range('2021/5/1', '2021/10/20', freq='B')
   for date in datetime:
       main(date)
   df = pd.DataFrame(code_list)
   df.to_excel('code.xlsx')

  疑难解答、学习资料、路线导图可通过搜索下方 

版权声明
本文为[五包辣条!]所创,转载请带上原文链接,感谢
https://blog.csdn.net/AI19970205/article/details/120953778

  1. Python project management and construction, these four tools are enough!
  2. IDE的使用,pycharm引入Python库
  3. In the 120 series columns, you can learn the python beautiful oup4 module, 7000 word blog + climb the ninth workshop network
  4. Django运行xadmin 报错解析 ImportError: cannot import name 'DEFAULT_FORMATS' from 'import_export.admin'
  5. Python程序大学课程写程序
  6. Programme Python Programme d'études collégiales
  7. Python程序大學課程寫程序
  8. Django runxadmin Error resolution importerror: cannot Import name 'default Formats' from 'import _ Export.admin»
  9. Python 函数式编程,看这一篇足够了!
  10. 太棒了!11个好用到起飞的「Python字典」知识点!
  11. 一道Python题目,求解答!
  12. 一道Python題目,求解答!
  13. Un problème Python, s'il vous plaît!
  14. C'est génial! 11 points de connaissance du dictionnaire Python pour le décollage!
  15. Python Functional Programming, This is enough!
  16. 在python中beta分布的问题?
  17. 一个python习题,没有什么头绪,是关于进制的转换和绘制的,想了几天了,不仅仅是2,8,16这种常见的进制转换
  18. Un exercice Python, qui n'a pas beaucoup d'idées, est sur la conversion et le rendu décimaux et a pensé pendant quelques jours, pas seulement 2, 8, 16 cette conversion décimale commune
  19. Un problème avec la distribution bêta en python?
  20. python实现简单的读取excel 内容,报错
  21. L'implémentation Python lit simplement le contenu d'Excel et signale les erreurs
  22. 用Python定义一个函数,接收n个数字,求这些参数数字的和
  23. Définissez une fonction en python, recevez n nombres et additionnez ces nombres de paramètres
  24. 上电Python写文件后,再断电后导致文件内容丢失
  25. 上電Python寫文件後,再斷電後導致文件內容丟失
  26. Une fois que Python est allumé pour écrire des fichiers, le contenu des fichiers est perdu après une panne de courant
  27. python套接字编程报错:ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
  28. 【Python从入门到精通】(二)怎么运行Python呢?有哪些好的开发工具(PyCharm)
  29. 【Python从入门到精通】(二)怎么运行Python呢?有哪些好的开发工具(PyCharm)
  30. Python语法1
  31. 2018年度最受推荐的10本Python书籍(初学者必看)
  32. Les 10 livres Python les plus recommandés en 2018 (obligatoire pour les débutants)
  33. Syntaxe Python 1
  34. Python语法1
  35. 在python 运行celery时候 AttributeError: 'NoneType' object has no attribute 'Redis'错误
  36. Attributeerror: 'nonetype' Object has no attribute 'redis' Error when Celery is running in Python
  37. Syntaxe Python 1
  38. Python celery is a plug-in that focuses on distributed asynchronous task processing and task scheduling!
  39. Python celery is a plug-in that focuses on distributed asynchronous task processing and task scheduling!
  40. 在python,使用scrapy爬虫框架
  41. It's time for everyone to see your blog written in Django (including deployment tutorial video)
  42. Python扩展速记符 要求用for循环,if语句
  43. Python擴展速記符 要求用for循環,if語句
  44. Le sténographe d'extension Python nécessite une boucle pour, si instruction
  45. Python+人工智能就业班v5.0wumi
  46. python编程技术的题目,希望能得到解答
  47. Pandas determines the header row dynamically
  48. 关于#python#的问题:模拟登陆后能获取到cookie,就是cookie一天就过期
  49. pandas为dataframe添加新的数据行(rows)、在dataframe后面纵向添加一行数据(数据为列表list形式)、列有不匹配将会使用NA值进行填补
  50. pandas使用组合条件筛选、过滤数据行
  51. 热烈祝贺1024,求解Python3.10闪退问题
  52. Python基础题练习题库有没呢?
  53. python构建神经网络,正向和反向传播
  54. python爬虫输入数字翻页才成功,用变量代替不成功,为什么?
  55. 【Python 爬虫】 2、HTTP基本原理
  56. 【Python 爬虫】 1、爬虫基础概念
  57. Python中如何用find函数计数?
  58. 一文搞懂Python装饰器
  59. python数据结构之递归
  60. 关于#python#的问题:为什么这个open函数会报错