爬虫“拥抱大模型”,有没有搞头?

news/2024/9/20 1:24:10/ 标签: 语言模型, 人工智能, llm, ai
aidu_pl">

验证码坐标识别

数据采集过程中,可能会碰到各种风控策略。其中,验证码人机验证是较为常见的,点选类验证码需要识别出相应的坐标,碰到这种情况,一般要么自己训练模型,要么对接打码平台。现在也可以将识别工作交给大模型,我们来看看,相同的问法,各家大模型,在识别验证码坐标上的表现。

GPT-4o

问题,选出相似的,并给出坐标:

问题,找出鸟的位置:

在这里插入图片描述

通义千问

问题,选出相似的,并给出坐标:

问题,找出鸟的位置:

Kimi

Kimi 暂时还不能分析图片文件:

文心一言

问题,选出相似的,并给出坐标(说了一堆,不知道在说什么):

问题,找出鸟的位置:

腾讯元宝

问题,选出相似的,并给出坐标:

问题,找出鸟的位置:

综上所述,在图片识别方面,GPT 还是有着明显的优势,测试结果:GPT-4o > 腾讯元宝 > 通义千问 = 文心一言 > Kimi。

代码解混淆

今时不同往日,现在扣算法就会发现,很多网站的关键代码都经过了混淆处理,掩盖了真实的算法逻辑,增大了逆向的难度。常规的处理方法,要么硬跟,要么使用 AST 技术解混淆。

能解混淆自然是最好的,整体逻辑会清晰很多。接下来,我们用一段简单的经过 OB 混淆了的代码,交给各大模型,看看他们的处理能力如何。

原代码:

function hi() {     console.log("Hello World!");   }   hi();   

OB 混淆后:

OB 混淆测试网站:https://www.obfuscator.io

(function (_0x3e0fd2, _0x4d9507) {       var _0x35a832 = _0x49f9, _0x24b53a = _0x3e0fd2();       while (!![]) {           try {               var _0x384e17 = parseInt(_0x35a832(0x70)) / 0x1 + parseInt(_0x35a832(0x74)) / 0x2 * (parseInt(_0x35a832(0x71)) / 0x3) + parseInt(_0x35a832(0x77)) / 0x4 + -parseInt(_0x35a832(0x7b)) / 0x5 * (-parseInt(_0x35a832(0x78)) / 0x6) + parseInt(_0x35a832(0x6f)) / 0x7 * (-parseInt(_0x35a832(0x72)) / 0x8) + -parseInt(_0x35a832(0x79)) / 0x9 * (parseInt(_0x35a832(0x76)) / 0xa) + -parseInt(_0x35a832(0x75)) / 0xb * (parseInt(_0x35a832(0x7a)) / 0xc);               if (_0x384e17 === _0x4d9507) break; else _0x24b53a['push'](_0x24b53a['shift']());           } catch (_0x2befb5) {               _0x24b53a['push'](_0x24b53a['shift']());           }       }   }(_0x396e, 0xad666));      function hi() {       var _0x20619c = _0x49f9;       console[_0x20619c(0x73)]('Hello\x20World!');   }      function _0x49f9(_0x30b03a, _0x5089e4) {       var _0x396e7c = _0x396e();       return _0x49f9 = function (_0x49f929, _0x5aa706) {           _0x49f929 = _0x49f929 - 0x6f;           var _0x1df762 = _0x396e7c[_0x49f929];           return _0x1df762;       }, _0x49f9(_0x30b03a, _0x5089e4);   }      hi();      function _0x396e() {       var _0x20721f = ['26vRQjos', '352XPZRnp', '198430jvTVQT', '5553740GCzFmR', '6723558KGzclN', '9lDhkVw', '858180FVJhEP', '5eMHKUA', '5257oBQoZa', '397536fXbNYr', '145083vijLVr', '5504RSNMkb', 'log'];       _0x396e = function () {           return _0x20721f;       };       return _0x396e();   }   

腾讯元宝

var key = 'abcdefghijklmnopqrstuvwxyz';   function decrypt(str, key) {     var result = '';     for (var i = 0; i < str.length; i++) {       var index = key.indexOf(str[i]);       result += String.fromCharCode(index + 97);     }     return result;   }      (function (_0x3e0fd2, _0x4d9507) {       var messages = _0x3e0fd2();       var expression = '1+2 * 3+4+(-1)*5*(-1)*6+(-1)*7*(-1)*8+(-1)*9 * 10+(-1)*11';       var calculatedValue = eval(expression);          if (calculatedValue === _0x4d9507) {           hi();       } else {           console['log']('Invalid expression');       }   }(_0x396e, 0xad666));      function hi() {       console['log']('Hello World!');   }      function _0x49f9(_0x30b03a, _0x5089e4) {       var messages = _0x396e();       return decrypt(_0x30b03a, key);   }      function _0x396e() {       var encryptedMessages = [         'afZ_rFsbwj',         '352XPZRnp',         '198430jvTVQT',         '5553740GCzFmR',         '6723558KGzclN',         '9lDhkVw',         '858180FVJhEP',         '5eMHKUA',         '5257oBQoZa',         '397536fXbNYr',         '145083vijLVr',         '5504RSNMkb',         'log'       ];       return encryptedMessages;   }   

混淆解的较为清晰,但是 expression 有误,输出了 Invalid expression

文心一言

// 定义一个简单的数组来存储字符串     var strings = ['26vRQjos', '352XPZRnp', '198430jvTVQT', '5553740GCzFmR', '6723558KGzclN', '9lDhkVw', '858180FVJhEP', '5eMHKUA', '5257oBQoZa', '397536fXbNYr', '145083vijLVr', '5504RSNMkb', 'log'];      // 创建一个辅助函数来从数组中检索字符串     function getString(index) {       return strings[index - 0x6f]; // 减去偏移量0x6f     }      // 定义hi函数,使用辅助函数来输出Hello World     function hi() {       console[getString(0x73)]('Hello World!'); // getString(0x73) 相当于 getString(115),返回 'log'   }      // 调用hi函数     hi();   

解混淆后的代码较为简洁,但是偏移量不对,运行会报错:TypeError: console[getString(...)] is not a function

通义千问

// 创建一个数组,其中最后一个元素是 "log"   const array = [       '26vRQjos', '352XPZRnp', '198430jvTVQT', '5553740GCzFmR',       '6723558KGzclN', '9lDhkVw', '858180FVJhEP', '5eMHKUA',       '5257oBQoZa', '397536fXbNYr', '145083vijLVr', '5504RSNMkb', 'log'   ];      // 创建一个函数,它可以从数组中获取 "log" 并打印 "Hello World!"   function simplifiedHi() {       const log = array[12]; // 直接获取 "log"       console[log]('Hello World!');   }      // 调用简化后的 hi 函数   simplifiedHi();   

可以正常输出 Hello World!,且解混淆后的代码较为简洁。

Kimi

(function (dictionary, expectedValue) {       var decode = decodeFunction, array = dictionary();       while (true) {           try {               var result = parseInt(decode(0x70)) / 1 + parseInt(decode(0x74)) / 2 * (parseInt(decode(0x71)) / 3) + parseInt(decode(0x77)) / 4 + -parseInt(decode(0x7b)) / 5 * (-parseInt(decode(0x78)) / 6) + parseInt(decode(0x6f)) / 7 * (-parseInt(decode(0x72)) / 8) + -parseInt(decode(0x79)) / 9 * (parseInt(decode(0x76)) / 10) + -parseInt(decode(0x75)) / 11 * (parseInt(decode(0x7a)) / 12);               if (result === expectedValue) break;               else array.push(array.shift());           } catch (e) {               array.push(array.shift());           }       }   })(getDictionary, 0xad666);      function hi() {       var decode = decodeFunction;       console[decode(0x73)]('Hello World!');   }      function decodeFunction(index, offset) {       var dictionary = getDictionary();       return decodeFunction = function (index, offset) {           index = index - 0x6f;           var value = dictionary[index];           return value;       }, decodeFunction(index, offset);   }      hi();      function getDictionary() {       var dictionary = ['26vRQjos', '352XPZRnp', '198430jvTVQT', '5553740GCzFmR', '6723558KGzclN', '9lDhkVw', '858180FVJhEP', '5eMHKUA', '5257oBQoZa', '397536fXbNYr', '145083vijLVr', '5504RSNMkb', 'log'];       getDictionary = function () {           return dictionary;       };       return getDictionary();   }   

可以正常输出 Hello World!,解混淆后的代码很清晰。

GPT-4o

(function (_0x3e0fd2, _0x4d9507) {       var _0x35a832 = _0x49f9, _0x24b53a = _0x3e0fd2();       while (!![]) {           try {               var _0x384e17 = parseInt(_0x35a832(0x70)) / 0x1 + parseInt(_0x35a832(0x74)) / 0x2 * (parseInt(_0x35a832(0x71)) / 0x3) + parseInt(_0x35a832(0x77)) / 0x4 + -parseInt(_0x35a832(0x7b)) / 0x5 * (-parseInt(_0x35a832(0x78)) / 0x6) + parseInt(_0x35a832(0x6f)) / 0x7 * (-parseInt(_0x35a832(0x72)) / 0x8) + -parseInt(_0x35a832(0x79)) / 0x9 * (parseInt(_0x35a832(0x76)) / 0xa) + -parseInt(_0x35a832(0x75)) / 0xb * (parseInt(_0x35a832(0x7a)) / 0xc);               if (_0x384e17 === _0x4d9507) break; else _0x24b53a['push'](_0x24b53a['shift']());           } catch (_0x2befb5) {               _0x24b53a['push'](_0x24b53a['shift']());           }       }   }(_0x396e, 0xad666));      function hi() {       console.log('Hello World!');   }      function _0x49f9(_0x30b03a, _0x5089e4) {       var _0x396e7c = _0x396e();       return _0x49f9 = function (_0x49f929, _0x5aa706) {           _0x49f929 = _0x49f929 - 0x6f;           var _0x1df762 = _0x396e7c[_0x49f929];           return _0x1df762;       }, _0x49f9(_0x30b03a, _0x5089e4);   }      hi();      function _0x396e() {       var _0x20721f = ['26vRQjos', '352XPZRnp', '198430jvTVQT', '5553740GCzFmR', '6723558KGzclN', '9lDhkVw', '858180FVJhEP', '5eMHKUA', '5257oBQoZa', '397536fXbNYr', '145083vijLVr', '5504RSNMkb', 'log'];       _0x396e = function () {           return _0x20721f;       };       return _0x396e();   }   

甚至直接给出了原始代码:

可以看到,几家大模型都能判断出代码目的是 console.log("Hello World!");,不过在代码可用性、解混淆能力上,还是有差异的。个人觉得,GPT 的逻辑分析能力更强,通义千问、Kimi 解混淆的可读性更好。测试结果:GPT-4o = 通义千问 = Kimi > 腾讯元宝 = 文心一言。

文心一言的解答速度,明显慢于其他几家。

大模型最多只能解一些简单的混淆,想要处理复杂的混淆代码,还是需要自己学习 AST 相关技术。

数据清洗

数据采集过程中,会碰到很多数据存在于 HTML 源码当中,一般需要通过 XPath、正则表达式等,将所需的数据提取出来,有些处理起来会相对痛苦,那么现在,我们能否将这部分工作交给 AI 来清洗呢?接下来测试一下,各大模型能否将以下代码中的 价格 提取出来:

<div className="l">       <div className="lv" onMouseOver="this.className='lv lv1';" onMouseOut="this.className='lv';">           <ul className="u1 fontyh">               <li className="l1">                   <div className="bgys"><span className="s1"><a href="view1822.html" target="_blank">查看详情</a></span>无演示</span>                   </div>               <li className="l2">¥<strong>55.00</strong></li>               <li className="l3"><a href="view1822.html" title="xxx" target="_blank">xxx</a></li>               <li className="l4"><a href="../shop/view23.html" target="_blank" class="hui">xxx工作室</a><span><img src="../img/auto.gif"/></span></li>               <li className="l5">销量<span className="red">230</span>笔</li>   

腾讯元宝

文心一言

通义千问

Kimi

GPT-4o

可以看到,对于简单 HTML 源码的数据清洗,几家大模型都可以准确提取出目标内容,不过文心一言给出的代码又会报错 =.=。

Kimi 回答问题有时候需要等待:

在这里插入图片描述

当然,没什么是打钱解决不了的问题:

AI 爬虫框架

  • https://github.com/coder-hxl/x-crawl(Node.js)

    https://github.com/ScrapeGraphAI/Scrapegraph-ai(Python)

    https://github.com/unclecode/crawl4ai(Python)


http://www.ppmy.cn/news/1504441.html

相关文章

用60行python代码制作一个扫雷

扫雷游戏&#xff08;Minesweeper&#xff09;是一个经典的逻辑游戏&#xff0c;玩家需要在一个包含隐藏地雷的网格中标记出所有地雷的位置&#xff0c;同时避免触发它们。下面&#xff0c;我将提供一个简单的Python扫雷游戏实现&#xff0c;并附带详细的教程。 第一步&#x…

行为型设计模式1:状态/策略/命令

行为型设计模式&#xff1a;状态/策略/命令 (qq.com)

CC++:贪吃蛇小游戏教程

❀创作不易&#xff0c;关注作者不迷路❀&#x1f600;&#x1f600; 目录 &#x1f600;贪吃蛇简介 &#x1f603;贪吃蛇的实现 &#x1f40d;生成地图 &#x1f40d;生成蛇模块 ❀定义蛇的结构体 ❀初始化蛇的相关信息 ❀初始化食物的相关信息 &#x1f40d;光标定位和…

无人值守大数据平台(CDH6.3.2+Flink+海豚调度器)如何实现大数据平台稳定及顺利跑出离线报表和实时报表(持续更新方案)

目录 背景 一、影响因素 (一)硬件方面 服务器硬件故障 资源不足 (二)软件方面 大数据组件故障 源数据问题 二、解决方案 (一)硬件冗余与监控 硬件冗余 (二)软件容错 1.配置高可用和分布式 HDFS (Hadoop Distributed File System) 高可用性 2. YARN (Yet …

湖仓一体架构解析:数仓架构选择(第48天)

系列文章目录 1、Lambda 架构 2、Kappa 架构 3、混合架构 4、架构选择 5、实时数仓现状 6、湖仓一体架构 7、流批一体架构 文章目录 系列文章目录前言1、Lambda 架构2、Kappa 架构3、混合架构4、架构选择5、实时数仓现状6、湖仓一体架构7、流批一体架构 前言 本文解析了Lambd…

JAVA游戏源码:泡泡堂|大学生练手项目

学习java朋友们&#xff0c;福利来了&#xff0c;今天小编给大家带来了一款泡泡堂源码。此源码仅供学习使用!! 视频演示 源码搭建和讲解 代码简介 包名称类描述com.whh.frameMyJFrame.java显示窗体、绑定监听、启动线程com.whh.frameMyJPanel.java不断读取人物信息com.whh.m…

PCB设计经验——布线原则

1.连线精简——避免直角布线 导线也应看作一种元器件&#xff0c;有自己的电阻&#xff0c;电感&#xff0c;电容 PCB走线在直角转弯的地方&#xff0c;信号前后部分相互影响&#xff0c;导致分布电容增加&#xff0c;对信号上升沿和下降沿有延缓影响。从阻抗的角度来说&#…

Java 并发编程:Java 线程池的介绍与使用

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 024 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

前端自定义组件+自建npm缓存服务器

自建 npm 缓存服务 安装 verdaccio npm install -global verdaccio启动 verdaccio verdaccio默认情况下&#xff0c;会在本地启动一个服务 http://localhost:4873/ 开发公共组件 在你的工程目录下执行 npm init -y &#xff0c;相关配置自己定义index.ts 中开发组件逻辑 …

【WPF开发】如何将工程打包成单独的EXE安装包

一、安装NSIS与HM NIS Edit 1、下载和安装NSIS NSIS官网 2、下载和安装HM NIS Edit HM NIS Edit官网 点击下载后等待几秒&#xff0c;就会弹出下载提示 双击下载的安装包&#xff0c;点击“OK” 点击“下一步” 点击“我接受” 更改路径后&#xff0c;点击安装即可 二、打包软…

82.WEB渗透测试-信息收集-框架组件识别利用(6)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;81.WEB渗透测试-信息收集-框架组件识别利用&#xff08;5&#xff09; log4j/log4j2&…

测试人生 | 招聘严峻期从面试无力感,到一天2个offer的一些经验分享(内附美团、字节、快手等面试题)

本人是霍格沃兹北京测试开发学社线下3期学员&#xff0c;拥有3年测试工作经验&#xff0c;之前一直在某大厂外包做软件测试&#xff0c;期间主要是以功能测试为主。 经过一个月的高强度找工作奋战&#xff0c;最终拿下了3家公司offer&#xff0c;选择了一家自己很满意的公司。…

③分析胃癌组蛋白脱乙酰酶HDS模型-SeuratHDS细胞比例

目录 文献Seurat处理步骤 ①HDS分析步骤 ②原文献数据处理 加载单细胞Seurat 换算每个样本每种细胞比例 比较两个分组比例 ①比例计算 ②绘图 单种细胞比例亚组间差异 ①添加分组信息 ②循环作图 文献Seurat处理步骤 组蛋白脱乙酰酶介导的胃癌肿瘤微环境特征及协同…

机器学习笔记 - python学习记录三 Python中的矢量化

当我们必须处理大量数据集时,计算上非最优的函数可能会成为算法的巨大瓶颈,最终导致模型运行时间过长。为了确保代码计算效率高,我们将使用矢量化。任何算法执行的时间复杂度都非常重要,决定了应用程序是否可靠。在实时输出应用方面,尽可能在最佳时间内运行大型算法非常重…

【从相邻元素对还原数组】python刷题记录

R3-图篇 饭前一道题 思路&#xff1a; 单向构造 class Solution:def restoreArray(self, adjacentPairs: List[List[int]]) -> List[int]:mnlen(adjacentPairs)#n表示数组元素总数n1#统计dictdefaultdict(int)#存储关系哈希表hashmapdefaultdict(list)for a,b in adjacent…

E25.【C语言】练习:修改二进制序列的指定位

十进制13-->二进制01101 现要求二进制序列的第5位修改为1&#xff0c;再改成0 复习&#xff1a;逻辑运算 非&#xff08;NOT&#xff09;&#xff08;C语言&#xff1a;~&#xff09; x0&#xff0c;NOT x-->1&#xff1b;x1&#xff0c;NOT x-->0 与&#xff08;…

day12 多线程

目录 1.概念相关 1.1什么是线程 1.2什么是多线程 2.创建线程 2.1方式一&#xff1a;继承Thread类 2.1.1实现步骤 2.1.2优缺点 2.1.3注意事项 2.2方式二&#xff1a;实现Runnable接口 2.2.1实现步骤 2.2.2优缺点 2.2.3匿名内部类写法 2.3方式三&#xff1a;实现cal…

JAVA游戏源码:仙剑|大学生练手项目

学习java朋友们&#xff0c;福利来了&#xff0c;今天小编给大家带来了一款仙剑源码。注意&#xff1a;此源码仅供学习使用!! 源码搭建和讲解 启动main入口&#xff1a; //************************************************************************ // ************完整源码…

一步步搭建Web自动化测试框架

测试框架的设计有两种思路&#xff0c;一种是自底向上&#xff0c;从脚本逐步演变完善成框架&#xff0c;这种适合新手了解框架的演变过程。另一种则是自顶向下&#xff0c;直接设计框架结构和选取各种问题的解决方案&#xff0c;这种适合有较多框架事件经验的人。本章和下一张…

jenkins集成jmeter

jenkins 安装插件HTML Publisher startup trigger Groovy 脚本介绍 cd /app/jmeter rm -rf result.jtl jmeter.log report mkdir -p report sh /app/jmeter/apache-jmeter-5.6.3/bin/jmeter.sh -n -t test.jmx -l result.jtl -e -o ./report-n: 表示以非 GUI 模式运行 JMete…