使用Python获取建筑网站数据,进行可视化分析,并实现网站JS解密

news2024/12/26 13:37:21

哈喽兄弟们,今天来实现一下建筑市场公共服务平台的数据采集,顺便实现一下网站的JS解密。

话不多说,我们直接开始今天的内容。

首先我们需要准备这些

环境使用

  • Python 3.8
  • Pycharm

模块使用

  • requests --> pip install requests
  • execjs --> pip install PyExecJS
  • json

爬虫基本流程思路

一. 数据来源分析

1. 明确需求: 明确采集的网站以及数据内容
    - 网址: https://****.gov.cn/data/company
    - 数据: 企业信息

初学者同学: 浏览器导航栏上面链接是什么, 请求什么链接

2. 抓包分析: 通过浏览器去分析, 我们需要数据具体在那个链接中
    - 静态网页: 刷新网页查看数据包内
    - 动态网页: 点击到下一页数据内容 / 下滑到下一页的数据内容
    * 打开开发者工具: F12
    * 点击第二页数据内容
    加密数据: https:/******.gov.cn/APi/webApi/dataservice/query/comp/list?pg=1&pgsz=15&total=450

二. 代码实现步骤

1. 发送请求 -> 模拟浏览器对于url地址发送请求
    url地址: 通过抓包分析找到链接地址
2. 获取数据 -> 获取服务器返回响应数据
    开发者工具: response 响应
3. 解析数据 -> 获取加密数据内容
4. 保存数据 -> 通过解密, 还原明文数据 保存表格文件中

爬虫部分代码

# 导入数据请求模块 
import requests
# 导入模块
import execjs
# 导入json模块
import json
# 导入csv模块
import csv

# 创建文件对象
csv_file = open('data.csv', mode='w', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(csv_file, fieldnames=[
    '企业名称',
    '统一社会信用代码',
    '法人',
    '注册属地省份',
    '注册属地城市',
])
csv_writer.writeheader()
# 模拟浏览器
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
}
for page in range(30):
    # 请求链接
    url = f'https://****网址都屏蔽了**不然你看不到这篇文章***.cn/APi/webApi/dataservice/query/comp/list?pg={page}&pgsz=15&total=450'
    # 发送请求 关键字传参, 指定参数传入到那个位置
    response = requests.get(url=url, headers=headers)
    # 2. 获取响应数据 --> 加密数据
    data = response.text
    # 3. 解密数据 -> 把密文转成明文 通过python代码调用JS代码
    f = open('建筑平台.js', mode='r', encoding='utf-8').read()
    # 编译js文件
    js_code = execjs.compile(f)
    # 调用js代码的函数 data->密文数据
    result = js_code.call('m', data)
    # 把json字符串数据, 转成json字典数据
    json_data = json.loads(result)
    # for 循环遍历
    for index in json_data['data']['list']:
        try:
            info = index['QY_REGION_NAME'].split('-')
            if len(info) == 2:
                area_1 = info[0]  # 省份
                area_2 = info[1]  # 城市
            else:
                area_1 = info[0]  # 省份
                area_2 = '未知'
            dit = {
                '企业名称': index['QY_NAME'],
                '统一社会信用代码': index['QY_ORG_CODE'],
                '法人': index['QY_FR_NAME'],
                '注册属地省份': area_1,
                '注册属地城市': area_2,
            }
            csv_writer.writerow(dit)
            print(dit)
        except:
            pass

可视化部分代码

import pandas as pd
from pyecharts import options as opts # 配置项
from pyecharts.charts import Pie # 导入饼图
# 读取文件
df = pd.read_csv('data.csv')
print(df.head())
info = df['注册属地省份'].value_counts().index.to_list() # 数据类目
num = df['注册属地省份'].value_counts().to_list() # 数据数量
print(info)
print(num)
c = (
    Pie()
    .add(
        "",
        [list(z) for z in zip(info,num,)],
        center=["40%", "50%"],
    )
    .set_global_opts(
        # 设置标题
        title_opts=opts.TitleOpts(title="注册省份占比分布"),
        legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
    )
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
    # 保存html文件
    .render("注册省份占比分布.html")
)

JS解密

const CryptoJS = require('crypto-js')
 
function b(t) {
    var e = CryptoJS.enc.Hex.parse(t)
        , n = CryptoJS.enc.Base64.stringify(e)
        , a = CryptoJS.AES.decrypt(n, f, {
        iv: m,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    })
        , r = a.toString(CryptoJS.enc.Utf8);
    return r.toString()
}
 
var f = CryptoJS.enc.Utf8.parse("jo8j9wGw%6HbxfFn")
var m = CryptoJS.enc.Utf8.parse("0123456789ABCDEF");
data = '95780ba0943730051dccb5fe3918f9fe9f9c759baf71007abbbc84deedcdd81cf58832bbc54e50a84c41faa2c40030710f9dcd7c6d7c8c59d5ec869f8d20495c96d9c5cefdb18e82f51bc97e693fe3f42cf0c5f2e7b9d630185fd13c4d3e8aa7c2fea290184736151f6b4ac09c903e2fb2ea29428c2daa2244f2770b59500b9959e9fa5ab0e0482499dc8cfb0b6b362a3b953b8f67e5e64f9fe3b9c4b7e2e43d139e74713e5d25d54286cff02b2d01cfd75abfd07161e55990343d47c42affd49c67db8e6d7b3281d8e0d4d7f7f665362b38b8e25002fea25a54db8ff11bbd365330b02e965314c0dd2f5f142849986dd383fd5707f1f3fe17898bab6f51cc3acaa08510ac99d9988d1114dc81e9849e2203490d0599a6a7557c65083ae61a59d6119cfde6b43c05cdb62c49ffbaf203cf1c91e31ea2a8d9f1390e134f84d236dc9bcaa5b538478e5bb9db45d5350578ec02f288dbac4fc86dbc8c6e8586ace2a8e05e0594e143a9218aead1815919c1fd8a9b7071aab85e09afb24f42199cd68b72cb5e6fe378afe274b5985c1e12e7cfcbf6d9ffcaed6edd0eca8cc1249a5407c50837ec5547bf81b45e8d096d19b5cc6d1321119b8836f5ee4b3df301d9c32a517a7968587d904e168702c16071c6ef9fd5981b432a5d82898caad049c603e718d2b23b01958444d941dae01e9328dbfeaee7adc6a4d1742002a3c553ef8e7cff9277befdd1e63ae5bbcebf9588f4bb4f686f5be5b1929ab388035d392eb1d0eef5cf1cb6a6cba6487d868dfb28acfaf945b1915a2482682e8d88840c9060b39b53fd90c969dd1e2ffa3535c750ce95265b2beb738ee1166c000754399cbe061db59078926f643936b2cdb2ef5bda6ed3354df7b56d1881edb6be9febb5a66a5352851c2156e7fe61b74fd0a0c6acffbc80513895f5bb0fd7eb68b7dab775c7385d6b216df90a8d1a09995716bd374796c2d94aec68d6c97d78540c3896affc2e567caf527553f6ca784117cbecac91293ca519d4c8342bb64046ab7bffb306a32d2cad525b844b43ecf10dcb6e60f2248de9f52b592d9d67d923a777e3a2a130b1a6bc435bb711d7bfcaf5f7f2b1a8228fdd02c0b7506b06fb5a3f7093a9398a2e8421ab22c466e2e473f400d3dc45dbd8215f37583e9537d89424feb5a0a09ad388a5cc1ae8a015a867c69c76158be6a31cd0743b86d8ea33473053057eb0299970972aec9a7803b7465d797da0bc8f9a08a247ba9cef19710cec257c4405b01d1da39bd1ce13d2bd8786483e1b'
console.log(b(data))

对此我录制了详细的视频讲解,跟源码一起打包好了,想详细学习的话,文末名片自取。

好了,今天的分享就到这结束了,咱们下次见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1147652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

scratch图书的ISBN码校验 2023年9月中国电子学会图形化编程 少儿编程 scratch编程等级考试三级真题和答案解析

目录 scratch图书的ISBN码校验 一、题目要求 1、准备工作 2、功能实现 二、案例分析

10 MIT线性代数-四个基本子空间 four fundamental subspaces

1. 四个子空间 Four subspaces (mxn) 列空间 Column space C(A) in 零空间Nullspace N(A) in 行空间Row space all combs of rows all combs of columns of AT C(AT) in 左零空间Left nullspace Nullspace of AT N(AT) left nullspace of A in 2. 基和维数 Basis&…

【Qt之QLocale】使用

描述 QLocale类可以在多种语言之间进行数字和字符串的转换。 QLocale类在构造函数中使用语言/国家对进行初始化,并提供类似于QString中的数字转字符串和字符串转数字的转换函数。 示例: QLocale egyptian(QLocale::Arabic, QLocale::Egypt);QString s1 …

分布式:一文吃透分布式事务和seata事务

目录 一、事务基础概念二、分布式事务概念什么是分布式事务分布式事务场景CAP定理CAP理论理解CAPCAP的应用 BASE定理强一致性和最终一致性BASE理论 分布式事务分类刚性事务柔性事务 三、分布式事务解决方案方案汇总XA规范方案1:2PC第一阶段:准备阶段第二…

ubuntu部署个人网盘nextCloud使用docker-compose方式

概述 当下各大网盘的容量都是有限制的,而且xx云不开会员网速就拉跨。 所以就想搭建一个自己的盘,并且可以控制用户的权限分组; nextCloud就很合适 我这边都是自己用偶尔给其他人使用下,所以直接docker部署了。 ubuntu版本&…

【面试经典150 | 栈】逆波兰表达式求值

文章目录 写在前面Tag题目来源题目解读解题思路方法一:栈方法二:使用数组模拟栈 知识点拨两个概念中缀表达式转后缀表达式后缀表达式计算四则运算表达式例题 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文…

时序预测 | Python实现ARIMA-LSTM差分自回归移动平均模型结合长短期记忆神经网络时间序列预测

时序预测 | Python实现ARIMA-LSTM差分自回归移动平均模型结合长短期记忆神经网络时间序列预测 目录 时序预测 | Python实现ARIMA-LSTM差分自回归移动平均模型结合长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Python实现ARIM…

闭包的理解?一般使用场景

是什么 一个函数和对其周围状态(词法环境)的引用捆绑在一起(函数被引用包围),这样的组合我们称之为闭包 也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域 🍖在 JavaScript中,每当创建一个函数,闭包…

Java SE 学习笔记(十七)—— 单元测试、反射

目录 1 单元测试1.1 单元测试概述1.2 单元测试快速入门1.3 JUnit 常用注解 2 反射2.1 反射概述2.2 获取类对象2.3 获取构造器对象2.4 获取成员变量对象2.5 获取常用方法对象2.6 反射的作用2.6.1 绕过编译阶段为集合添加数据2.6.2 通用框架的底层原理 1 单元测试 1.1 单元测试概…

Java字节码创建对象指令

接上节。 示例代码: package com.lkl.jvmDemo;public class HelloByteCode {public static void main(String[] args) {HelloByteCode obj new HelloByteCode();} }查看字节码清单javap -c -verbose HelloByteCode Classfile /XXX/com/lkl/jvmDemo/HelloByteCod…

【电路笔记】-交流电阻和阻抗

交流电阻和阻抗 文章目录 交流电阻和阻抗1、概述:电阻率2、交流状态与直流状态近似性3、交流状态与直流状态的差异性3.1 趋肤效应(The Skin Effect)3.2 靠近效应(The Proximity Effect) 4、总结 电阻是一种特性,用于表征当电压差施…

2023最流行的自动化测试工具有哪些?

一:前言 随着测试工程师技能和工资待遇的提升,甚至有一部分的开发人员开始转入测试岗位,跨入自动化领域的测试攻城狮越来越多。在自动化测试领域,自动化工具肯定占据了核心的位置。 本文总结了常用的测试自动化工具和框架&#x…

【机器学习可解释性】5.SHAP值的高级使用

机器学习可解释性 1.模型洞察的价值2.特征重要性排列3.部分依赖图4.SHAP 值5.SHAP值的高级使用 正文 汇总SHAP值以获得更详细的模型解释 总体回顾 我们从学习排列重要性和部分依赖图开始,以显示学习后的模型的内容。 然后我们学习了SHAP值来分解单个预测的组成部…

汇编语言-div指令溢出问题

汇编语言-div指令溢出问题 8086CPU中被除数保存在ax(16位)或ax和dx(32位)中,如果被除数为16位,进行除法运算时al保存商,ah保存余数。如果被除数为32位时,进行除法运算时,ax保存商,d…

从最简单基本开始 or 把问题复杂化还自诩为“设计了一个可扩展的系统”?

文章目录 Intro程序员“把问题复杂化”的职业病如何抉择 Intro 刚才看了一段关于在苹果系统中使用numbers表格软件制作记账本的视频教程:当 Excel 交给苹果来设计会变成…?#Numbers 新手教学,以下为最终界面效果: 有些触动&…

网络原理续

传输层的协议也并非就只有UDP和TCP 就拿王者荣耀这个游戏来说 是否需要可靠性是否需要高效率 那是使用TCP还是UDP呢? 当然是都不用, 除了这两个协议外, 有的传输层协议就是为游戏场景量身打造的. 比如说以KCP为代表的一系列协议. 网络层 地址管理路由选择 网络层的代表:…

【FreeRTOS】

FreeRTOS 一、FreeRTOS任务创建和删除1.1 动态方式1.2 静态方式 二、任务挂起和恢复三、中断管理四、临界区保护及调度器的挂起和恢复五、列表项的插入和删除六、时间片调度七、任务状态查询API函数介绍7.1 任务状态查询API7.2 任务运行时间统计API 八、时间管理九、队列十、信…

SpringBoot小项目——简单的小区物业后台管理系统 认证鉴权 用户-角色模型 AOP切面日志 全局异常【源码】

目录 引出一、应用到的技术栈Spring、Spring MVC、Spring Boot基础SpringBoot进阶、SpringMVC原理、AOP切面MyBatis 数据库相关JavaWeb基础:Session等前端Vue、JavaScript、Bootstrap 二、后台管理系统的功能登录功能1.用户名密码登录2.验证码的登录 报修业务的处理…

【多线程面试题十】、说一说notify()、notifyAll()的区别

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:说一说notify()、notify…

C++哈希表:一种快速查找和插入的方法

文章目录 1、前言2、unordered系列关联式容器2.1、 unordered_map2.1.1、unordered_map的文档介绍2.1.2、unordered_map的接口说明 2.2、 unordered_set 3. 底层结构3.1 哈希概念3.2 哈希冲突2.3 哈希函数2.4 哈希冲突解决2.4.1 闭散列2.4.2 开散列 4. 模拟实现4.1 哈希表的改造…