可视化爬虫框架spiderflow入门及实战
官网: 点击直达官网
文档: 点击查看官网文档
说明: 目前官网和文档均无法正常访问,原因未知,参考本文即可。再有问题欢迎留言讨论。
以下内容部分来自官网或官网文档。文章比较长,请准备好瓜子和小板凳~~~
TIP:
- 文中用到的网站地址仅为了说明功能,如有侵犯,请告知,会及时删除或者修改
- 本文仅供学习参考,请勿用于非法用途
一、介绍
简介
spider-flow 是一个基于springboot+layui开发的前后端不分离的爬虫平台,以图形化方式定义爬虫流程,无需代码即可实现一个爬虫。
特性
- 支持css选择器、正则提取
- 支持JSON/XML格式
- 支持Xpath/JsonPath提取
- 支持多数据源、SQL select/insert/update/delete
- 支持爬取JS动态渲染的页面
- 支持代理
- 支持二进制格式
- 支持保存/读取文件(csv、xls、jpg等)
- 常用字符串、日期、文件、加解密、随机等函数
- 支持流程嵌套
- 支持插件扩展(自定义执行器,自定义函数、自定义Controller、类型扩展等)
- 支持HTTP接口
- 支持数据源配置
- 支持任务的定时执行
插件
- redis插件
- mongodb插件
- IP代理池插件
- OSS插件
- OCR插件
- Selenium插件
二、部署
代码仓库地址: https://gitee.com/ssssssss-team/spider-flow
部署及验证
spiderflow是基于springboot的单体项目,可以采用多种方式实现部署:
-
Dockerfile
-
docker-compose
-
java -jar …
也可以参考官网文档里面的安装部署模块进行部署。
默认端口是8088, 部署完成后访问http://localhost:8088即可,页面如下图所示:
三、编辑器组件介绍及常用语法
部署完成后打开页面会看到有4个内置的爬虫示例,随便点开一个我们看下编辑器布局和提供的组件。
组件介绍
爬取节点
该节点用于请求HTTP/HTTPS页面或接口
- 请求方法:GET、POST、PUT、DELETE等方法
- URL: 请求地址
- 延迟时间:单位是毫秒,意思是爬取之前延迟一段时间在执行抓取
- 超时时间:网络请求的超时时间,单位也是毫秒
- 代理:请求时设置的代理,格式为host:port 如 192.168.1.26:8888
- 编码格式:用来设置页面的编码格式默认为UTF-8,当解析出现乱码时,可以修改此值
- 跟随重定向:默认是跟随30x重定向,当不需要此功能时,可以取消勾选
- TLS证书验证:此项默认是勾选的,当出现证书一类的异常可以取消勾选此项尝试
- 自动管理Cookie:请求时自动设置Cookie(自己手动设置的与之前请求的Cookie都会设置进去)
- 自动去重:勾选时会对url进行去重处理,如果重复则跳过。
- 重试次数:当请求发生异常或状态码不为200时会进行重试
- 重试间隔:重试期间的间隔时间(单位为毫秒)
- 参数:用来设置GET、POST等方法的参数设置
- 参数名:参数key值
- 参数值:参数value值
- 参数描述:仅仅用来描述该项参数(相当于备注/注释)无实际意义
- Cookie:用来设置请求Cookie
- Cookie名:Cookie key值
- Cookie值:Cookie value值
- 描述:仅仅用来描述该项Cookie(相当于备注/注释)无实际意义
- Header:用来设置请求头
- Header名:Header key值
- Header值:Header value值
- 描述:仅仅用来描述该项Header(相当于备注/注释)无实际意义
- Body:请求类型(默认是none)
- form-data(Body项设置为form-data)
- 参数名:请求参数名
- 参数值:请求参数值
- 参数类型:text/file
- 文件名:上传二进制数据时需要填的文件名
- raw(Body项设置为raw)
- Content-Type:text/plain,application/json
- 内容:请求体内容(String类型)
TIP
此图形会返回一个HttpResponse对象,以resp存入变量中
定义变量
该节点用于定义变量之后,可以与表达式配套使用,实现动态设置各项参数(如动态请求分页地址)
- 变量名:变量的名字,当变量名重复时,会覆盖前一个变量
- 变量值:变量的值,可以是常量,可以是表达式
输出节点
该节点主要用于调试,测试时会把输出打印到页面中,另外也可以用来自动保存到数据库或文件
- 输出到数据库:勾选时需要填写数据源、表名称,且输出项要与列名对应
- 输出到CSV文件:勾选时需要填写CSV文件路径,输出项会作为表头
- 输出全部参数:一般用来调试,可以输出所有变量到界面上
- 输出项:输出项的名字
- 输出值:输出的值,可以是常量,可以是表达式
循环节点
- 次数或集合:当此项有值(值为集合或数字)时,后续节点(包括本节点)会循环执行
- 循环变量:默认为item,与for(Object item : collections) 中的item意义相同
- 循环下标:当循环时,会产生下标(从0开始)以该值存入变量中,与for(int i =0; i
- 开始位置:从该位置开始循环(从0开始)
- 结束位置:到该位置结束(-1为最后一项,-2为倒数第二项,以此类推)
TIP
使用循环时需注意当有多个循环时会形成嵌套循环,必要时应与等待结束节点配套使用
执行SQL
主要用于与数据库交互(查询/修改/插入/删除等等)
- 数据源:需要选择配置好的数据源
- 语句类型:select/selectInt/selectOne/insert/insertofPk/update/delete
- SQL: 要执行SQL语句,需要动态注入的参数用##包裹起来如:#${item[index].id}#
TIP
该节点执行完毕时会产生rs变量,selectInt/insert/update/delete会返回int类型,select会返回List,selectOne返回Map,insertofPk返回主键值
内置变量
爬取结果
当爬取节点执行后产生类型为HttpResponse的resp变量
字段名称 字段类型 字段描述 用法示例 html String 页面HTML ${resp.html} json JSONObject/JSONArray 内容转json结果 ${resp.json} bytes byte[] 二进制结果 ${resp.bytes} cookies Map cookies ${resp.cookies} headers Map headers ${resp.headers} statusCode int HTTP状态码 ${resp.statusCode} url String 当前页面的URL ${resp.url} title String 当前页面的标题 ${resp.title} stream InputStream 二进制流(可用于下载) ${resp.stream} 异常信息
当节点发生异常时,会产生ex变量,需要注意的是,ex变量不会向下传递
sql执行结果
执行sql后产生变量rs
- 当是select语句时,类型为List
- 当是selectInt语句时,变量类型为int
- 当是selectOne语句时,变量类型为Map
- 当是insert/update/delete语句时,变量类型为int
- 当是insertofpk语句时,返回的是主键,变量类型为int
表达式语法
基本用法
本项目中表达式引擎也支持模板的方式,例如动态拼接url
https://www.xxx.com/${path}/q?=keyword=${keyword}
运算符
模板语言支持大多数Java运算符。这些运算符的优先级也与Java中的相同。
类型
byte ${123b} short ${123s} int ${123} long ${123l} float ${123f} double ${123d} string ${'hello'} string ${"hello"}
同时也支持定义Map和List
${{key : "value"}} ${[1,2,3,4,5]} ${{$key : "value"}}//$key表示动态从变量中获取key值
一元运算符
您可以通过一元运算-符将数字取反,例如${-234}。要取反布尔表达式,可以使用!运算符,例如${!true}。
算术运算符
支持常见的算术运算符,例如${1 + 2 * 3 / 4 % 2}
比较运算符
${23 = 34}`,`${ true != false }`,`${23 == 34}
比较运算符结果为boolean类型
逻辑运算符
除了一元运算!符,您还可以使用&&和||。就像Java中一样,运算符也是一种短路运算符。如果&&左边计算为false,则不会计算右边。如果||左侧为true,则不会计算右边
三元运算符
三元运算符是if语句的简写形式,其工作方式类似于Java中,例如${true ? "yes" : "no"}
变量
${var}
通过${变量名}调用
调用方法
${extract.xpath(resp.html,'//div[@id=abc]').regx('/\d/').toInt()}
通过${变量.方法名(参数1,参数2,....)}进行调用
数组和Map
${myArray[2]} ${myArray[indexVar]} ${myMap.get("key")} ${myMap["key"]} ${myMap.get(keyVar)} ${myMap[keyVar]}
链式调用
与Java中一样,您可以无限嵌套成员,数组元素和映射访问
${myObject.aField[12]["key"].someMethod(1, 2).anotherMethod()} ${extract.xpath(resp.html,'//div[@id=abc]').regx('/\d/').toInt()}
抽取函数
selector
参数名 描述 可否为空 html html内容如resp.html 否 css css选择器 否 类型 text/attr/outerhtml 是 属性名 当类型为attr时,填写此项 是 TIP
返回值类型:String
采用css选择器方法抽取一条数据
-
获取第一个a标签的html
${extract.selector(resp.html,'a')}
-
获取第一个a标签的text(文本)
${extract.selector(resp.html,'a','text')}
-
获取第一个a标签的outerhtml
${extract.selector(resp.html,'a','outerhtml')}
-
获取第一个a标签的href属性
${extract.selector(resp.html,'a','attr','href')}
selectors
参数名 描述 可否为空 html html内容如resp.html 否 css css选择器 否 类型 text/attr/outerhtml 是 属性名 当类型为attr时,填写此项 是 TIP
返回值类型:List
采用css选择器方法抽取一组数据
-
获取所有a标签的html
${extract.selectors(resp.html,'a')}
-
获取所有a标签的text(文本)
${extract.selectors(resp.html,'a','text')}
-
获取所有a标签的outerhtml
${extract.selectors(resp.html,'a','outerhtml')}
-
获取所有a标签的href属性
${extract.selectors(resp.html,'a','attr','href')}
xpath
参数名 描述 可否为空 html html内容如resp.html 否 xpath xpath表达式 否 TIP
返回值类型:String
采用xpath方法抽取一条数据
-
获取第一个a标签的html
${extract.xpath(resp.html,'//a')}
-
获取第一个a标签的href属性
${extract.xpath(resp.html,'//a/@href')}
xpaths
参数名 描述 可否为空 html html内容如resp.html 否 xpath xpath表达式 否 TIP
返回值类型:List
采用xpath方法抽取一组数据
-
获取所有a标签
${extract.xpaths(resp.html,'//a')}
-
获取所有a标签的href属性
${extract.xpaths(resp.html,'//a/@href')}
regx
参数名 描述 可否为空 string 字符串,如resp.html 否 regx 正则表达式 否 groups 捕获组序号int或List(多个) 是 TIP
返回值类型:String/List
采用正则方法抽取一条数据
-
获取网页title
${extract.regx(resp.html,'(.*?)')}
regxs
参数名 描述 可否为空 string 字符串,如resp.html 否 regx 正则表达式 否 groups 捕获组序号int或List(多个) 是 TIP
返回值类型:List/Listextract.regxs(resp.html,'
-
-
-
-
-
-
还没有评论,来说两句吧...