可视化爬虫框架spiderflow入门及实战

03-18 5863阅读 0评论

官网: 点击直达官网

文档: 点击查看官网文档

说明: 目前官网和文档均无法正常访问,原因未知,参考本文即可。再有问题欢迎留言讨论。

以下内容部分来自官网或官网文档。文章比较长,请准备好瓜子和小板凳~~~

TIP:

  1. 文中用到的网站地址仅为了说明功能,如有侵犯,请告知,会及时删除或者修改
  2. 本文仅供学习参考,请勿用于非法用途

一、介绍

简介

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的单体项目,可以采用多种方式实现部署:

      1. Dockerfile

      2. docker-compose

      3. java -jar …

      也可以参考官网文档里面的安装部署模块进行部署。

      默认端口是8088, 部署完成后访问http://localhost:8088即可,页面如下图所示:

      可视化爬虫框架spiderflow入门及实战 第1张

      三、编辑器组件介绍及常用语法

      部署完成后打开页面会看到有4个内置的爬虫示例,随便点开一个我们看下编辑器布局和提供的组件。

      可视化爬虫框架spiderflow入门及实战 第2张

      组件介绍

      可视化爬虫框架spiderflow入门及实战 第3张

      爬取节点

      该节点用于请求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变量

                          字段名称字段类型字段描述用法示例
                          htmlString页面HTML${resp.html}
                          jsonJSONObject/JSONArray内容转json结果${resp.json}
                          bytesbyte[]二进制结果${resp.bytes}
                          cookiesMapcookies${resp.cookies}
                          headersMapheaders${resp.headers}
                          statusCodeintHTTP状态码${resp.statusCode}
                          urlString当前页面的URL${resp.url}
                          titleString当前页面的标题${resp.title}
                          streamInputStream二进制流(可用于下载)${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
                            参数名描述可否为空
                            htmlhtml内容如resp.html
                            csscss选择器
                            类型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
                              参数名描述可否为空
                              htmlhtml内容如resp.html
                              csscss选择器
                              类型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
                                参数名描述可否为空
                                htmlhtml内容如resp.html
                                xpathxpath表达式

                                TIP

                                返回值类型:String

                                采用xpath方法抽取一条数据

                                • 获取第一个a标签的html

                                  ${extract.xpath(resp.html,'//a')}
                                  
                                • 获取第一个a标签的href属性

                                  ${extract.xpath(resp.html,'//a/@href')}
                                  
                                  xpaths
                                  参数名描述可否为空
                                  htmlhtml内容如resp.html
                                  xpathxpath表达式

                                  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,'


免责声明
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明。
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所
提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何
损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在
转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并白负版权等法律责任。

手机扫描二维码访问

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,5863人围观)

还没有评论,来说两句吧...

目录[+]