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

验证码坐标识别

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

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.mzph.cn/news/877355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多媒体技术:语音音频压缩

语音音频压缩 语音音频基础知识物理世界的声音——语音 语音音频编码方法波形编码波形编码原理常用波形编码技术脉冲编码调制PCM差分脉冲编码调制DPCM自适应差分脉冲编码调制ADPCM子带ADPCM 参数编码感知编码 语音音频编码框架语音编码框架音频编码框架混合编码框架 语音音频编…

JDK8的新特性

目录 接口的默认方法和静态方法 Lambda表达式1、匿名内部类2、函数式接口(FunctionalInterface)2.1 无参函数式接口匿名内部类方式-->Lambda表达式方式 2.2 有参函数式接口匿名内部类方式-->Lambda表达式方式 3、Lambda实战 3.1 循环遍历 3.2 集合排序 3.3 创建线程方…

黑马头条Day12-项目部署_持续集成

一、今日内容介绍 1. 什么是持续集成 持续集成&#xff08;Continuous integration&#xff0c;简称CI&#xff09;&#xff0c;指的是频繁地&#xff08;一天多次&#xff09;将代码集成到主干。 持续集成的组成要素&#xff1a; 一个自动构建过程&#xff0c;从检出代码、…

Golang处理Word文档模板实现标签填充|表格插入|图标绘制和插入

本教程主要实现【Golang处理Word文档模板实现标签填充|表格插入|图标绘制和插入】。 本文源码&#xff1a;https://gitee.com/songfayuan/go-zero-demo 教程源码分支&#xff1a;master 分支&#xff08;_examples/word-template/fill-word-template.go&#xff09; Golang处理…

Java-Swing开发-001组件

文章目录 Top-level containerJFrame容器对话框相关 JComponent组件面板相关文本相关菜单相关工具栏按钮下拉框进度条树形组件 Top-level container 1.JFrame 2.JDialog JFrame容器 //设置APP图标 this.setIconImage(new ImageIcon(getClass().getResource("/button/i…

论文解读(10)-图神经网络

加油&#xff0c;继续看论文。 这次学图神经网络&#xff0c;这个概念经常在其他论文里出现&#xff0c;所以我想先学习一下这方面的知识。 参考&#xff1a; 【图神经网络综述】一文道尽GNN原理、框架和应用-CSDN博客 【图神经网络】10分钟掌握图神经网络及其经典模型_图神经…

某“新一线城市“前端面试,纯纯被恶心到了

一.起因 在boss上刷到的一个小小厂&#xff0c;收大四全年实习生(web前端)&#xff0c;因为离家乡比较近&#xff0c;而且双非一本的学历以及入坑的时间没有太长(前端部分不到一年)&#xff0c;想去那里看看形势&#xff0c;要求是笔试面试&#xff0c;当场给是否录用结果&…

AgentBench: Evaluating LLMs As Agents

AgentBench: Evaluating LLMs As Agents Github&#xff1a; https://github.com/THUDM/AgentBench 榜单&#xff1a;https://llmbench.ai/agent/data demos&#xff1a;https://llmbench.ai/agent/demo 备注&#xff1a;该论文介绍为AgentBench v0.2版本 一、介绍 现如今&am…

三行代码高搞定nestjs静态图片映射方案

方案一 nestjs/serve-static 库映射 上代码 npm i nestjs/serve-staticimport { ServeStaticModule } from nestjs/serve-static; import { join } from path; const staticPath join(__dirname, .., /public/);Module({imports: [ServeStaticModule.forRoot({rootPath: sta…

用Python代码调用GPT-SoVITS

GPT-SoVITS 项目地址&#xff1a;https://github.com/RVC-Boss/GPT-SoVITS import os import requests from PySide6.QtCore import QThread from PySide6.QtWidgets import QWidget, QApplication from design import Ui_Form import subprocess import sounddevice as sd im…

JAVA基础 - 泛型

目录 一. 简介 二. 集合泛型 三. 自定义泛型 四. 自定义泛型类和普通类的区别 一. 简介 泛型是 Java 语言中一种强大的特性&#xff0c;它允许在定义类、接口和方法时使用类型参数&#xff0c;从而增加了代码的类型安全性和复用性。 类型安全性&#xff1a; 使用泛型可以…

day07 项目启动以及git

spring框架 spring 负责整合各种框架&#xff0c;把new对象的部分交给spring去做&#xff0c;对象new不出来&#xff0c;项目就启动不起来&#xff0c;这样可以有效保证所需要的对象都在容器中存在&#xff0c;后续的部分都可以顺利执行控制反转&#xff1a;业务对象创建依赖资…

“八股文”在实际工作中是助力、阻力还是空谈?

一&#xff1a;浅谈 关于“八股文”在程序员面试中的重要性和实际工作中的作用&#xff0c;确实是一个引发广泛讨论的话题。以下是我对这个问题的看法&#xff1a; 1. “八股文”的定义与特征 “八股文”通常指的是面试中常见的标准化问答或经典理论知识&#xff0c;例如…

Apollo:源码分析之cyber/mainboard启动入口介绍-my write, test ok

软件结构图 cyber入口 cyber的入口在"cyber/mainboard"目录中: ├── mainboard.cc // 主函数 ├── module_argument.cc // 模块输入参数 ├── module_argument.h ├── module_controller.cc // 模块加载,卸载 └── module_controller.…

关于Docker Engine AuthZ 插件授权绕过漏洞 (CVE-2024-41110)

一、漏洞概述 漏洞名称&#xff1a;Docker Engine AuthZ 插件授权绕过漏洞 &#xff08;CVE-2024-41110&#xff09; 漏洞等级&#xff1a;高危 漏洞描述&#xff1a;DockerEngine是Docker的核心组件&#xff0c;是一 个开源的容器引擎&#xff0c;负责构建、运行和管理容器…

【Vue】权限控制

权限管理 分类&#xff1a; 页面权限功能(按钮)权限接口权限 vue3-element-admin 的实现方案 一般我们在业务中将 路由可以分为两种&#xff0c;constantRoutes 和 asyncRoutes。 constantRoutes&#xff1a; 代表那些不需要动态判断权限的路由&#xff0c;如登录页、404(或…

【echarts】 柱状图,最后带“竖线”

具体&#xff1a; https://echarts.zhangmuchen.top/#/detail?cid28ea6-0601-e9f5-9cc29-c022b758 let data [{value: 0,name: 数据格式一},{value: 55,name: 数据格式二},{value: 66,name: 数据格式三},{value: 75,name: 数据格式四},{value: 20,name: 数据格式五}];getAr…

盘点.软件测试模型

软件开发模型   软件开发模型(Software Development Model)是指软件开发全部过程、活动和任务的结构框架。软件开发包括需求、设计、编码和测试等阶段&#xff0c;有时也包括维护阶段。 软件开发模型能清晰、直观地表达软件开发全过程&#xff0c;明确规定了要完成的主要活动…

C++类与对象-六大成员函数

默认成员函数就是用户没有显式实现&#xff0c;编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个空类编译器会默认⽣成8个默认成员函数。本文只介绍其中6个&#xff0c;C11增加两个函数见后续博客。 目录 一、构造函数 1.1 概念 1.2 特性 1.3 使用举例 1.4 初始化列表 1…

如何通过前端表格控件实现自动化报表?

背景 最近伙伴客户的项目经理遇见一个问题&#xff0c;他们在给甲方做自动化报表工具&#xff0c;项目已经基本做好了&#xff0c;但拿给最终甲方&#xff0c;业务人员不太买账&#xff0c;项目经理为此也是天天抓狂&#xff0c;没有想到合适的应对方案。 现阶段主要面临的问…