• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
五包辣条!
帮助1

大家好,我是辣条。

学新通

 抓取目标:

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请求,需要提交两个表单参数。

代码片段:

  1.  
    url = 'http://webapi.cninfo.com.cn/api/sysapi/p_sysapi1015'
  2.  
    data = {
  3.  
       'tdate': datetime,
  4.  
       'scode': '399001'
  5.  
    }
  6.  
    headers = {
  7.  
       'mcode': 'MTYzNTEzOTkxMQ==',
  8.  
       'Referer': 'http://webapi.cninfo.com.cn/',
  9.  
       'Cookie': 'Hm_lvt_489bd07e99fbfc5f12cbb4145adb0a9b=1634795282; Hm_lpvt_489bd07e99fbfc5f12cbb4145adb0a9b=1634799860',
  10.  
       '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'
  11.  
    }
  12.  
    response = requests.post(url, headers=headers, data=data).json()

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

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

学新通

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

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

学新通

 学新通学新通学新通

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

学新通学新通

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

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

学新通

 下面把这些js扣下来执行

完整代码

  1.  
    import requests
  2.  
    import execjs
  3.  
    import js2py
  4.  
    import math
  5.  
    import time
  6.  
    import pandas as pd
  7.  
  8.  
  9.  
    code_list = []
  10.  
  11.  
  12.  
    def MCODE():
  13.  
       jscode = '''
  14.  
      function missjson(input) {  
  15.  
          var keyStr = "ABCDEFGHIJKLMNOP" "QRSTUVWXYZabcdef" "ghijklmnopqrstuv"   "wxyz0123456789 /" "=";  
  16.  
          var output = "";  
  17.  
          var chr1, chr2, chr3 = "";  
  18.  
          var enc1, enc2, enc3, enc4 = "";  
  19.  
          var i = 0;  
  20.  
          do {  
  21.  
              chr1 = input.charCodeAt(i );  
  22.  
              chr2 = input.charCodeAt(i );  
  23.  
              chr3 = input.charCodeAt(i );  
  24.  
              enc1 = chr1 >> 2;  
  25.  
              enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);  
  26.  
              enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);  
  27.  
              enc4 = chr3 & 63;  
  28.  
              if (isNaN(chr2)) {  
  29.  
                  enc3 = enc4 = 64;  
  30.  
              } else if (isNaN(chr3)) {  
  31.  
                  enc4 = 64;  
  32.  
              }  
  33.  
              output = output keyStr.charAt(enc1) keyStr.charAt(enc2)  
  34.  
                      keyStr.charAt(enc3) keyStr.charAt(enc4);  
  35.  
              chr1 = chr2 = chr3 = "";  
  36.  
              enc1 = enc2 = enc3 = enc4 = "";  
  37.  
          } while (i < input.length);  
  38.  
       
  39.  
          return output;  
  40.  
      }
  41.  
       
  42.  
      '''
  43.  
       time1 = js2py.eval_js('Math.floor(new Date().getTime()/1000)')
  44.  
       # py方式
  45.  
       a = math.floor(time.time() / 1000)
  46.  
       mcode = execjs.compile(jscode).call('missjson', '{a}'.format(a=time1))
  47.  
       return mcode
  48.  
  49.  
  50.  
    def PageRquest(datetime, mcode):
  51.  
       # 接口可以换
  52.  
       url = 'http://webapi.cninfo.com.cn/api/sysapi/p_sysapi1015'
  53.  
       data = {
  54.  
           'tdate': datetime, # 获取数据时间
  55.  
           'scode': '399001'  # 股票代码 以及交易所简称
  56.  
      }
  57.  
       headers = {
  58.  
           'mcode': str(mcode),
  59.  
           'Referer': 'http://webapi.cninfo.com.cn/',
  60.  
           'Cookie': 'Hm_lvt_489bd07e99fbfc5f12cbb4145adb0a9b=1634795282; Hm_lpvt_489bd07e99fbfc5f12cbb4145adb0a9b=1634799860',
  61.  
           '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'
  62.  
      }
  63.  
       response = requests.post(url, headers=headers, data=data).json()
  64.  
       code = response['records']
  65.  
       for i in code:
  66.  
           code_list.append(i)
  67.  
  68.  
  69.  
    def main(date):
  70.  
       mcode = MCODE()
  71.  
       PageRquest(date, mcode)
  72.  
  73.  
  74.  
    if __name__ == '__main__':
  75.  
       # main()
  76.  
       # 数据分析 pandas 自动化办公的
  77.  
       datetime = pd.period_range('2021/5/1', '2021/10/20', freq='B')
  78.  
       for date in datetime:
  79.  
           main(date)
  80.  
       df = pd.DataFrame(code_list)
  81.  
       df.to_excel('code.xlsx')
学新通

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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhhacbcg
系列文章
更多 icon
同类精品
更多 icon
继续加载