Python爬虫实现建筑网站数据采集、JS解密、可视化分析
文章目录
前言
哈喽兄弟们,今天来实现一下建筑市场公共服务平台的数据采集,顺便实现一下网站的JS解密。
话不多说,我们直接开始今天的内容。
首先我们需要准备这些
环境使用
- Python 3.8
- Pycharm
模块使用
- requests --> pip install requests
- execjs --> pip install PyExecJS
- json
爬虫基本流程思路
一. 数据来源分析
1. 明确需求: 明确采集的网站以及数据内容
- 网址: https://jzsc.mohurd.gov.cn/data/company
- 数据: 企业信息
初学者同学: 浏览器导航栏上面链接是什么, 请求什么链接
2. 抓包分析: 通过浏览器去分析, 我们需要数据具体在那个链接中
- 静态网页: 刷新网页查看数据包内
- 动态网页: 点击到下一页数据内容 / 下滑到下一页的数据内容
* 打开开发者工具: F12
* 点击第二页数据内容
加密数据: https://jzsc.mohurd.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://jzsc.mohurd.gov.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")
)
# 对此我录制了详细的视频讲解,跟源码一起打包好了。
# 都放在这个抠裙了 872937351
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))
好了,今天的分享就到这结束了,咱们下次见!
关于Python技术储备
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,希望提供给想学习 Python 的小伙伴们一点帮助!
保存图片微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python基础学习视频
② 路线对应学习视频
还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~在这里插入图片描述
③练习题
每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
因篇幅有限,仅展示部分资料
三、精品Python学习书籍
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、Python工具包+项目源码合集
①Python工具包
学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
②Python实战案例
光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
③Python小游戏源码
如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
五、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
六、Python兼职渠道
而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以保存图片微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!