爬虫_06_余票检测&js解加密

06_余票检测&js解加密&12306模拟登录

余票检测1️⃣

JS解密+混淆破解

  • 博客地址:https://www.cnblogs.com/bobo-zhang/p/11243138.html
  • 爬取的网站:https://www.aqistudy.cn/html/city_detail.html

分析

  1. 修改查询条件(城市的名称+时间范围),点击查询按钮,捕获点击按钮后发起请求对应的数据包。点击查询按钮后,发起的是ajax请求。该请求就会指定查询条件对应的数据加载到当前页面中。(我们要爬取的数据就是该ajax请求请求到的数据)

  2. 分析捕获到的数据包

    • 提取出请求的url:https://www.aqistudy.cn/apinew/aqistudyapi.php

    • 请求方式:post

    • 请求参数:d:动态变化的一组数据(且加密)

    • 响应数据:是加密的密文数据

      • 问题:该数据包请求到的是密文数据,为何在前台页面显示的却是原文数据?
      • 原因:请求请求到密文数据后,前台接收到密文数据后使用指定的解密操作(js函数)对密文数据进行了解密,然后将原文数据显示在了前台页面。
    • 下一步工作的步骤:

      • 首先先处理动态变化的请求参数,动态获取该参数的话,就可以携带该参数进行请求参数,将请求到的密文数据捕获到。
      • 将捕获到的密文数据找到对应的解密函数对其进行解密即可。
      • 【重点】需要找到点击查询按钮后对应的ajax请求代码,从这组代码中就可以破解动态变化的请求参数和加密的响应数据对应的相关操作
  3. 找ajax请求对应的代码,分析代码获取参数d的生成,和加密的响应数据的解密操作

3.1 处理动态变化的请求参数

  • 基于火狐浏览器定位查询按钮绑定的点击事件。

    在这里插入图片描述

  • 从getData函数实现中找寻ajax请求对应的代码

    • 从getData函数的实现中没有找到ajax代码,但是发现了另外两个函数的调用
      • getAQIData(); getWeatherData(); ajax代码一定是存在于这两个函数实现内部
      • type == HOUR:查询时间是以小时为单位
  • 分析getAQIData(); getWeatherData():找到ajax代码

    • 没有找到ajax请求代码
    • 发现了另一个函数调用:getServerData(method,param,func,0.5)
      • method = ‘GETCITYWEATHER’ or ‘GETDETAIL’
      • params = {city,type,startTime,endTime}:查询条件
  • 分析getServerData,找寻ajax代码

    • 基于抓包工具做全局搜索

      在这里插入图片描述

    • 找到的函数实现被加密

    • 对getServerData加密的实现进行解密

      • js混淆:对核心的js代码进行加密
      • js反混淆:对js加密代码进行解密
        • 暴力破解:https://www.sojson.com/jscodeconfusion.html
        • 终于看到了ajax实现的代码
        • 分析结论:
          • data:加密的响应数据
            • decodeData(data)将加密的响应数据进行解密
              • 参数data:加密的响应数据
          • param:动态变化且加密的请求参数
            • getParam(method,object)返回动态变化的请求参数
              • 参数method:method = ‘GETCITYWEATHER’ or ‘GETDETAIL’
              • 参数object:{city,type,startTime,endTime}:查询条件

js逆向

  • 现在只需要调用两个js函数(decodeData,getParam)返回结果即可。在python程序中如何调用js函数。
  • js逆向:在python中调用js函数
    1. 方式1:手动的将js函数改写成为python函数
    2. 方式2:
      • 使用固定模块实现自动逆向(推荐)
      • 利用PyExecJS库来实现模拟JavaScript代码执行获取动态加密的请求参数,然后再将加密的响应数据代入decodeData进行解密即可!
      • 在本机安装好nodejs的环境

PyExecJS的使用2️⃣

#模拟执行decodeData的js函数对加密的响应数据进行解密
import execjs
import requests

node = execjs.get()

#Params
method = "GETCITYWEATHER"
city = '北京'
type = 'HOUR'
start_time = '2018-01-25 00:00:00'
end_time = '2018-01-25 23:00:00'

#Compile javascript
file = 'jsCode.js'
ctx = node.compile(open(file.,encoding='utf-8').read())

#Get params
js = 'getPostParamCode("{0}","{1}","{2}","{3}","{4}")'.format(method,city,type,start_time,end_time)
#请求参数d
params = ctx.eval(js) #eval执行指定的js函数

#发起post请求
url = 'https://www.aqistudy.cn/apinew/aqistudyapi.php'
data = {
    'd':params
}
response_text = requests.post(url=url,data=data).text #加密的响应数据

#对加密的响应数据进行解密
js = 'decodeData("{0}")'.format(response_text)
decrypted = ctx.eval(js) #返回的是解密后的原文数据
print(decrypted_data)
#执行会报错:目前页面中没有数据。解密函数只是针对页面中原始的数据进行解密。
(response_text)
decrypted = ctx.eval(js) #返回的是解密后的原文数据
print(decrypted_data)
#执行会报错:目前页面中没有数据。解密函数只是针对页面中原始的数据进行解密。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你决这个问题。你可以使用 Python 的第三方库 `requests` 和 `beautifulsoup4` 来爬取微博某个话题的内容数据。 首先,你需要了微博的 URL 格式。以微博话题“Python爬虫”为例,其 URL 为:https://s.weibo.com/weibo?q=%23Python%E7%88%AC%E8%99%AB%23&Refer=top。其中,“%23”是“#”的 URL 编码,“q=”后面跟的是话题的关键词。 接下来,你可以使用 `requests` 库向该 URL 发送 GET 请求,并将响应结果的 HTML 代码析为 `beautifulsoup4` 对象。例如: ```python import requests from bs4 import BeautifulSoup url = 'https://s.weibo.com/weibo?q=%23Python%E7%88%AC%E8%99%AB%23&Refer=top' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') ``` 然后,你可以使用 `beautifulsoup4` 的查找方法来提取微博内容数据。例如,你可以使用 `find_all` 方法找到所有的微博 div 元素,再从中提取微博的文本内容和发布时间。具体代码如下: ```python weibo_list = soup.find_all('div', class_='content') # 找到所有微博 div 元素 for weibo in weibo_list: text = weibo.find('p', class_='txt').get_text() # 提取微博文本内容 time = weibo.find('p', class_='from').find('a').get_text() # 提取微博发布时间 print(text, time) ``` 以上就是爬取微博话题“Python爬虫”内容数据的基本步骤。当然,实际应用中还需要注意反爬虫策略、数据清洗和存储等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值