本文章只是记录自己的技术实践思路,绝无破坏网站运行的想法,如若被他人用于商业用途,与本人无关。
瑞数的反爬做的很好,值得我们不断学习。这里这个破解思路说白了就是记录一次偷懒的过程,毕竟js逆向是个体力活,调试得花不少时间,调试的主要目的也是为了请求头里的若干请求参数,我就想到不如设个拦截器直接拦截后存入数据库方便调用,趁着过年前比较空,记录一下过程(同时祝大家新年快乐)。(当然这个思路不只适用于瑞数)
以下是需要准备的依赖(安装过程厚颜就放上几个链接):
linux 安裝mitmproxy: https://blog.csdn.net/zaishijizhidian/article/details/81778685
Ubuntu安装Mysql: https://www.cnblogs.com/magicking/p/9750513.html
Ubuntu安装Chrome浏览器:https://www.cnblogs.com/x54256/p/8403864.html
下载对应ChromeDriver:http://chromedriver.storage.googleapis.com/index.html
本人使用的是Ubuntu18,至于为何使用ununtu而不是centos,原因是centos上安装mitmproxy过程中找不到CA 证书。。也有可能是我自己没有尝试太多版本的原因;其次为什么使用Ubuntu18,因为这个版本集成了python3,不用再费时费力去安装python3,自己安装还容易出错。
测试网站为食品药品监督管理局(调试遇到debugger就把js下到本地替换一下debugger参数再使用fiddler或charles重新映射一下)
以下是过程:
1.先安装ChromeDriver并能运行
提醒小白同学,Chrome浏览器版本必须和ChromeDriver相对应,不然启动时会报错。
2.创建拦截脚本,使用 “mitmdump -s 拦截脚本 -p 端口” 运行脚本
(这个拦截脚本,我起初的方向是通过拦截器注入某些js代码达到屏蔽网站对ChromeDriver检测的效果,后来发现这个真的是随缘的,有些网站根本用不了)这里就是一个简单的拦截js的cookie值脚本,顺带检测cookie长度,过滤一下无用的cookie。
import re
from mitmproxy import ctx
import time
#
def request(flow):
if '.js' in flow.request.url:
cook = re.findall("Cookie.*?b'(.*?)'\)",str(flow.request.headers),re.S)[0]
if len(cook) >= 200:
print('当前截取cookie为: '+cook)
f = "cook.txt"
with open(f, "w") as file:
file.write(cook)
3.设置chromdriver启动参数,突破网站对chromdriver的识别
这里是耳熟能详的selenium环节,理论上只要windows上chrom开启实验性功能参数后使用无头模式能访问的页面都可以照搬到linux,下面贴上我的启动参数:
chrome_options.add_argument('--proxy-server=http://127.0.0.1:8001')
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
chrome_options.add_argument('--no-sandbox') # 解决DevToolsActivePort文件不存在报错问题
chrome_options.add_argument("--disable-gpu") # 禁用GPU硬件加速。如果软件渲染器没有就位,则GPU进程将不会启动。
# chrome_options.add_argument('--disable-infobars') # 禁用浏览器正在被自动化程序控制的提示
# chrome_options.add_argument('--window-size=1920,1080') # 设置当前窗口的宽度和高度
# chrome_options.add_argument('--start-maximized') # 界面最大化
# chrome_options.add_argument('--incognito') # 无痕模式
chrome_options.add_argument('--headless') # 无界面
chrome_options.add_argument('--disable-javascript') # 禁用javascript
chrome_options.add_argument('blink-settings=imagesEnabled=false') # 禁用加载图片
为了方便调用浏览器,我设置了个swagger接口,同时代码布置在云上,调用起来比较方便。直接连接云上的数据库获取cookie,失败了后重新调用浏览器脚本,获取新cookie。
有些网站selenuim还是过不去的,这里使用pyppeteer,同时这个pyppeteer还不能使用无头模式,不然也会被识别。这里pyppeteer还需要先去找到源代码中的 launcher.py文件,将“ --enable-automation”这一行注释掉,可以使window.nagivator.webdriver的值为undefined。
因为我linux是使用腾讯云的服务器,只支持无头运行浏览器,故这个pyppeteer只在mac环境下测试了一遍。
测试网站为网上房地产
过程类似于linux,这里就不贴了。