python爬虫之js逆向(一)

JS逆向破解反爬虫
本文介绍了一种使用Python模拟JS代码以绕过网站反爬虫机制的方法。通过分析目标网站的JS代码,提取关键变量并用Python的execjs库执行,成功获取到所需的Cookies和重定向URL,从而实现了对特定网站的爬取。

python爬虫之js逆向(一)

写在前面

现在各种反爬手段很多,虽然我在工作的时候并没有遇到过(我的工作就是爬虫,但是基本上都是爬外网,google,都是企业级爬虫,很少像这样写垂直爬虫)。在平时的技术交流群中经常看到大神们说一些我没遇到过的的反爬手段,为了能够插上话题,为了升职加薪,今天终于下定决心开始学习各种反爬,并在此记录分享心得。本人刚刚上班没几个月,小白一个,有不对的地方希望大神能够指教。

网站分析

目标网站:http://www.300600900.cn/

首先当然是抓包分析返回的数据
或者直接将链接放到代码里面,将响应内容打印出来。
如果一样的话说明直接就能获取到,否则的话可能就是对网页进行了处理

在这里插入图片描述上面是用代码请求返回的响应,并没有返回你想要的数据。
那么问题来了,请随我接着往下看

解析

道高一尺,魔高一丈。打开浏览器f12.我们进行抓包分析,既然返回的是js,那么我们就从js下手。
因为返回的js里面有location 的变量,说明进行了跳转,其中重定向的链接是在第一次请求返回的响应里,用 JS 生成的,我们把响应下来的js扣下来,然后用python进行模拟js。
好了现在已经将js代码完全抠下来了,创建js文件,放入和脚本同样的目录等待导入。
现在我们开始进行js加载,其中有些用不到的参数,直接删掉
比如参数 curlocation 是当前页面的 href,没有用到,反而会给我们调试增加阻碍
因为我们没有 window 这个对象。接下来代码实现:

import requests
import execjs
node = execjs.get() #通过python代码去执行JavaScript代码的库
file = 'baikewangjia.js'
ctx = node.compile(open(file).read())
data = ctx.eval("data") #去执行js里面的函数变量
verify_data = ctx.eval("verify")
print(data, verify_data)

headers = {
    'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
    }
url = "http://www.300600900.cn/"
session = requests.session()
session.get(url, headers=headers) #获取session
cookies = data.split('=')
session.cookies.set(cookies[0], cookies[1]) #设置cookies
next_url = url + '?security_verify_data=' + verify_data
session.get(next_url, headers=headers)
print(session.cookies)
cookies = requests.utils.dict_from_cookiejar(session.cookies)
res = session.get(url, headers=headers, cookies=cookies)
res.encoding = res.apparent_encoding
print(res.text)

### Python 爬虫 JS 逆向工程实际案例 #### 微信公众平台 JavaScript 逆向改写实例 在微信公众平台上,许多接口返回的数据经过了复杂的加密处理。为了能够获取这些数据,在个具体的案例中,进行了微信公众平台的 JavaScript 逆向改写工作[^2]。 ```python import requests from Crypto.Cipher import AES import base64 import json def decrypt_data(encrypted_data, key): """解密微信公众号平台返回的加密数据""" cipher = AES.new(key.encode('utf8'), AES.MODE_CBC, iv='0102030405060708'.encode()) decrypted_data = unpad(cipher.decrypt(base64.b64decode(encrypted_data))) return json.loads(decrypted_data) def pad(s): """填充字符串至AES块大小""" bs = AES.block_size padding = (bs - len(s) % bs) * chr(bs - len(s) % bs) return s + padding def unpad(s): """移除填充字符""" return s[:-ord(s[-1:])] # 示例:模拟登录并抓取特定文章列表 login_url = 'https://api.weixin.qq.com/sns/oauth2/access_token' params = { 'appid': '<your_appid>', 'secret': '<your_secret>', 'code': '<authorization_code>' } response = requests.get(login_url, params=params).json() access_token = response['access_token'] openid = response['openid'] article_list_api = f'https://api.someendpoint/getArticles?token={access_token}&openId={openid}' headers = {'User-Agent': 'Mozilla/5.0'} r = requests.post(article_list_api, headers=headers) if r.status_code == 200: encrypted_articles = r.json()['data']['articles'] articles = decrypt_data(encrypted_articles, '<aes_key>') print(json.dumps(articles)) else: raise Exception(f'Failed to fetch article list with status code {r.status_code}') ``` 这段代码展示了如何利用 `requests` 和 PyCryptodome 库来完成对微信公众平台 API 的调用以及对接收到的加密内容进行解码的过程。需要注意的是,这里的 `<your_appid>`, `<your_secret>` 及其他敏感信息应当替换为真实的值,并妥善保管以保障安全性。 #### MD5 加密与源代码改写的实践方法 另个常见的应用场景是在某些情况下服务器端会对客户端发送过来的信息做简单的哈希校验(比如使用 MD5)。此时可以考虑直接提取原始 JavaScript 文件中的相关部分来进行本地化改造[^3]: ```javascript // 原始 js 中的部分 md5 计算逻辑 function calcMd5(str){ var hash = crypto.createHash('md5').update(str); return hash.digest("hex"); } ``` 将其转换成 Python 版本如下所示: ```python import hashlib def calculate_md5(string_to_hash): """计算给定字符串的MD5摘要""" m = hashlib.md5() m.update(string_to_hash.encode('utf-8')) return m.hexdigest() test_string = "example string" print(f"The MD5 of '{test_string}' is: {calculate_md5(test_string)}") ``` 此段脚本实现了相同的功能—即接收输入字符串并输出其对应的 MD5 散列值。这种方法适用于当无法绕过前端验证而必须模仿原生行为的情形下。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的黑蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值