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

简介: 朋友股票亏惨了,我一怒用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')

目录
相关文章
|
1月前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
123 10
|
3月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
使用Python实现深度学习模型:智能数据隐私保护
使用Python实现深度学习模型:智能数据隐私保护 【10月更文挑战第3天】
221 0
|
14天前
|
数据采集 Web App开发 监控
Python爬虫:爱奇艺榜单数据的实时监控
Python爬虫:爱奇艺榜单数据的实时监控
|
1月前
|
数据采集 分布式计算 大数据
构建高效的数据管道:使用Python进行ETL任务
在数据驱动的世界中,高效地处理和移动数据是至关重要的。本文将引导你通过一个实际的Python ETL(提取、转换、加载)项目,从概念到实现。我们将探索如何设计一个灵活且可扩展的数据管道,确保数据的准确性和完整性。无论你是数据工程师、分析师还是任何对数据处理感兴趣的人,这篇文章都将成为你工具箱中的宝贵资源。
|
2月前
|
传感器 物联网 开发者
使用Python读取串行设备的温度数据
本文介绍了如何使用Python通过串行接口(如UART、RS-232或RS-485)读取温度传感器的数据。详细步骤包括硬件连接、安装`pyserial`库、配置串行端口、发送请求及解析响应等。适合嵌入式系统和物联网应用开发者参考。
64 3
|
3月前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
2月前
|
图形学 Python
SciPy 空间数据2
凸包(Convex Hull)是计算几何中的概念,指包含给定点集的所有凸集的交集。可以通过 `ConvexHull()` 方法创建凸包。示例代码展示了如何使用 `scipy` 库和 `matplotlib` 绘制给定点集的凸包。
38 1
|
3月前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
186 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
3月前
|
计算机视觉 Python
Python实用记录(九):将不同的图绘制在一起、将不同txt文档中的数据绘制多条折线图
这篇文章介绍了如何使用Python的OpenCV库将多张图片合并为一张图片显示,以及如何使用matplotlib库从不同txt文档中读取数据并绘制多条折线图。
57 3
Python实用记录(九):将不同的图绘制在一起、将不同txt文档中的数据绘制多条折线图
|
2月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
下一篇
开通oss服务