龙空技术网

我用了一个笨方法,成功绕过了某招标网的高反爬技术

毕小宝 1693

前言:

现时小伙伴们对“js 获取html”大致比较讲究,同学们都想要知道一些“js 获取html”的相关知识。那么小编也在网上汇集了一些对于“js 获取html””的相关文章,希望姐妹们能喜欢,你们快快来学习一下吧!

背景

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

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

自动化操作分析

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

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

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

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

切换为英文输入法,保证浏览器输入栏信息正确;打开 Chrome 浏览器;向浏览器地址栏输入目标 URL;按下 Enter 键,等待 2 秒保证页面数据加载完成;按下 Ctrl +S 键,并向存储路径发送存储文件名称,等待“保存”操作完成;按下 End 键盘,定位到页面底部;按下反向 Tab 键 15 次,定位到 “下页” 按钮;按下 Enter 键,请求下一页数据;循环 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 = ";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 操作文件才是最麻烦的哇!

标签: #js 获取html #cookies js #js 按钮用回车触发 #jswindows #m浏览器爬虫