分享一个可以绕过 JS 高反爬的简单工具: autoit3

背景

前一阵儿被某网站的 JS 反爬流程难住了,至今也没明白它的反扒原理和攻破方法。最终找到了一个自动化脚本工具 autoit 3,用一个笨方法将人手动点击浏览器的动作脚本化,达到网页数据获取目的,拿到网页文件后,再用代码解析,曲线完成任务。

本文将介绍这个自动化的过程,现场编写一个完整的 autoit 3 爬虫脚本,希望对各位读者朋友有所启发。

自动化操作分析

国家信息安全漏洞共享平台为例,它在返回数据前发起了两次 512 响应,第三次浏览器带着动态生成的 Cookie 信息才能得到数据。
在这里插入图片描述

这次咱们直接从网页入手,操作键盘找到“下一页” 按钮,按下 Enter 键完全请求。通过键盘定位到 “下页” 按钮的过程为:

  1. 第一步,按下 “End” 键,到达网页底部;
  2. 第二步,反向 “Tab” 键,按 15 次就可定位到 “下页” 按钮。

接着就可以编写自动化脚本了,把刚刚的手动操作翻译成脚本命令:

  1. 切换为英文输入法,保证浏览器输入栏信息正确;
  2. 打开 Chrome 浏览器;
  3. 向浏览器地址栏输入目标 URL;
  4. 按下 Enter 键,等待 2 秒保证页面数据加载完成;
  5. 按下 Ctrl +S 键,并向存储路径发送存储文件名称,等待“保存”操作完成;
  6. 按下 End 键盘,定位到页面底部;
  7. 按下反向 Tab 键 15 次,定位到 “下页” 按钮;
  8. 按下 Enter 键,请求下一页数据;
  9. 循环 5-8 这个过程 N 次,N=需要爬的页数。

这个流程,对其他高反扒的信息发布网站,也是适用的。

编写自动化脚本

按照上面的流程,编写 autoit 自动化脚本,创建一个 myspider.au3 文件:

#include <AutoItConstants.au3>

;;切换为英文输入法,保证浏览器输入正常
$hWnd = WinGetHandle("[ACTIVE]");$hWnd 为目标窗口句柄,这里设置的是当前活动窗口
$ret = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", "08040804", "int", 1 + 0)
DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, "int", 0x50, "int", 1, "int", $ret[0])

$url = "https://www.cnvd.org.cn/flaw/list.htm"
spiderData($url)

Func spiderData($url)
	;;打开 Chrome 浏览器窗口
	$chromePath = "C:\Users\admin\AppData\Local\Google\Chrome\Application\chrome.exe"
	Run($chromePath)

	;;登录窗口显示
	WinWaitActive("[CLASS:Chrome_WidgetWin_1]")
	;; 休息2000毫秒
	Sleep(2000)
	;; 移动窗口
	WinMove("[CLASS:Chrome_WidgetWin_1]", "打开新的标签页 - Google Chrome", 0, 0,1200,740,2)

	;; 休息500毫秒
	Sleep(500)

	;;地址栏输入URL 并按下 Enter 键
	Send($url)
	Sleep(500)
	Send("{enter}")
	Sleep(3000)

	;; 循环爬取需要的页数,测试只爬3页
	For $i = 1 To 3 Step 1
		;;打开右键另存为按钮: Ctrl+S
		send("^s")
		Sleep(2000)
		WinWait("[CLASS:#32770]","",10)

		;;将存储路径设置到另存为组件输入框 Edit1 里
		$timeNow = @YEAR & "" & @MON & "" & @MDAY & "" & @HOUR & "" & @MIN
		$savePath = "F:\A2021Study\ListData\" &$timeNow &  "_page" & $i & ".html"
		ControlSetText("另存为","", "Edit1", $savePath)

		;;点击确定
		ControlClick("另存为","","Button2")

		;;再次确定
		WinWait("[CLASS:#32770]","",10)
		ControlClick("确认另存为","","Button1")

		;; 等待保存操作完成
		Sleep(3000)

		;; 定位到下一页按钮,并触发点击下一页
		send("{END}")
		Send("+{TAB 15}")
		Send("{enter}")

		;;点击确定后,等待网页加载完成
		Sleep(3000)
	Next

	;; 整个操作完成,则关闭浏览器
	Send("^w")
EndFunc

脚本编写过程中,有几点需要注意:

  • 第一,输入法切换很重要,否则 URL 地址栏的值很容易乱;
  • 第二, windows 的文件路径是反斜杠 \ ,否则会导致另存为的路径无法识别;
  • 第三,帮助文档里面提供的关闭方法是 WinClose ,但是反复测试,确定这个方法不靠谱,要么会引起浏览器异常关闭导致下次打开会恢复上次的网址;要么完全不生效。迂回的解决办法是用关闭按键 Ctrl+W ,完成了正常关闭的目的。

因为爬虫要作为定时任务运行的,为避免打开太多浏览器窗口,因此需要在脚本结束时关闭浏览器。

运行效果参考这个视频:

启示录

数据爬取一般分为列表页和详情页,定位点击每一条详情的过程比较麻烦,所以爬取详情页面的和列表分开,用 Java 代码解析所有详情 URL 后,再由另一个 autoit 脚本去获取详情页面,这个流程大家可以自己写一下,这里就不详细介绍了。

最后再汇总下整个爬取的流程:

第一步,执行爬取列表的 autoit 脚本,得到列表页面 html;
第二步,解析列表页 html ,得到所有详情页面的 URL ,写入到文件中;
第三步,执行爬取详情页面的 autoit 脚本,它遍历第二步的目标 URL ,得到详情页 html ;
第四步,解析详情页 html 文件,得到详情数据。

总控流程、第二步和第四步的解析都用 Java 代码完成,用 Runtime.getRuntime().exec("cmd /c E:\A2021Study\Autoit3\myspider.au3") 调用脚本,文件路径是反斜杠。

这个方法虽然有点笨,但完全是人工操作浏览器,能够对抗反爬虫策略,感兴趣的朋友可以执行下本文的脚本试试。

autoit 还是蛮有意思的,语法也很简单,DirCreate 创建文件,iniread 读取配置项,一行代码顶 Java 几十行,不得不承认 Java 操作文件才是最麻烦的哇!

已标记关键词 清除标记
相关推荐
AuAceBox 是 Skyfore 开发的一款 Au3 辅助工具:该工具涵盖了大多 数 Au3 编程常用操作,可完美替代官方的 AccAu3Box. 开发语言:AU3、C++、等等,所以文件偏大! 版本特点: 1.酷炫 UI,扁平化窗口设计 2.常用操作一键集成,绝对给力; 3.支持用户自定义工具,方便功能扩展,支持展开环境变量 使用帮助: 1.程序中大部分都有气泡提示,根据气泡提示操作即可。 2.配置 AuMFCompiler 1.程序默认不自带 AuMFCompiler,如果您需要使用,请根据以下步骤配置: 2.到 Au3.Cc -> AuMFC专区 花200A币下载 AuMFC 3.打开主程序 AuAceBox.exe 打开 主菜单 -> 扩展功能 -> 配置 AuMFC 编译器 4.根据提示操作,完成后您就可以直接在主界面调用 AuMFC 编译器了! 3.创建桌面方式 1.如果您觉得本工具好用的话,可以按以下步骤直接创建快捷方式: 2.打开主程序 AuAceBox.exe 打开 主菜单 -> 扩展功能 -> 程序设置 -> 选中 为 AuAceBox 创建桌面快捷方式 即可! 3.然后桌面上就会跳出快捷方式 "AuAceBox 专业版",OK,以后您就可以直接通过快捷方式运行本工具了 4.用户自定义工具 1.AuAceBox v2.1+ 版本提供用户自定义工具功能 2.点击 首页大图标 -> 实用工具汇总 -> 用户工具 -> 配置用户工具箱 即可配置工具3.工具格式:每行一个工具,格式如: 工具名=路径(或URL) 4.自定义工具支持如下环境变量: %APPDIR%:AuAceBox.exe 所在目录 %AU3DIR%:AutoIt3.exe 所在目录 %ScriptFile%:载入 Au3 脚本路径 5.检查更新窗口弹出为何有延时 1.更新先获取网络版本号,更新日志,更新地址 2.再显示更新窗口,所以会有些延迟,具体时间与网络环境有关 6.本程序是否开源 1.对不起,本程序为闭源程序,未来也不打算开源 2.要问原因?1.这个程序本来就没什么开源价值 2.伸手党泛滥... AutoIt v3 编程交流学习网 - Au3.Cc 版本更新日志: [2015/3/7 2.1.2.6] 1.修正 取消所有窗口半透明 2.修正 更新窗口若无可用更新自适应为 初始化程序 3.新增 原生支持托盘功能,适应不同用户需求 4.新增 托盘双击显示、隐藏主窗口 5.新增 托盘显示 内置/用户 工具 6.修正 关于对话框标题栏显示程序版本号 7.新增 Ctrl+F12 显示隐藏主界面 8.修正 AuAceBox 更新逻辑 9.新增 AuAceBox 设置中心 AuAceManager 10.新增 支持手动限制自动吸附 11.优化 AuAceBox 吸附效率/未知吸附情况 12.修正 新功能增加后对应控件/托盘说明 [2015/3/5 2.1.2.4] 1.新增 检查更新功能 2.新增 AuAceBox 专属浏览器 3.新增 修正 N 多窗口主题 4.新增 无人值守自动更新 功能 5.新增 Au3.Cc 链接支持两种打开方式 6.修正 菜单文字以及描述 7.修正 访问网站链接指向 AuAceBox 专属浏览器. 8.修复 2.1 版本中的某些 BUG. 9.修正 关于页文字说明来自 ReadMe.Txt (如果存在) 10.优化 保证效率下减小附加组件内存及CPU占用率 [2015/3/2 2.1.0.34] 1.删除 Au3 脚本录制工具链接 2.新增 内置实用工具 ,用于放置 AU3 辅助工具,从此本人写的所有 AU3 辅助工具就都会直接嵌入至 AuAceBox ! 3.新增 GUID 生成器; 4.新增 RegExTester 内嵌插件,绝对给力! [2015/3/2 2.1.0.9] 1.调整 根据用户馈,调整编译栏背景色 2.修正 部分文字描述 [2015/3/1 2.1.0.6] 1.调整 调整UI,使其看起来更和谐; 2.修正 AuAceBox.Tool 增加部分工具; [2015/3/1 2.1.0.5] 1.修正 修复1.0版本的 N 多 BUG; 2.修正 完全重写代码,加快程序运行速度 3.新增 用户自定义工具功能 4.修正 窗口乱跑的问题 5.去除 托盘,用户定义工具集成于图标菜单 6.新增 支持程序环境变量(支持系统原有的如%WINDIR%) %AU3DIR% %APPDIR% %ScriptFile%
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值