WebSplider在线爬虫

WebSplider

基于NodeJS的在线爬虫系统。支持提供数据接口API。

1、当你想在自己的网站添加一个小的新闻模块时,你可以利用WebSplider爬虫爬取指定网站的数据,然后在后端或者前端请求数据接口,再将获得的数据构造到你的网页上。

2、当你想知道自己追的剧,小说等更新没有,你可以抓取指定网站的数据(比如说视频级数),然后在后台请求数据接口,将数据保存到你的数据库中,设置一个定时器,定时请求数据接口,将获得的数据与数据库数据对比即可。然后弄个邮件发送,监控到数据变化时,给你发送邮件。

...

基于此,WebSplider诞生了。

特性

  • 简单、方便。只要掌握简单的网页知识,即可利用WebSplider在线爬虫系统,进行简单的配置之后,可进行数据抓取预览。
  • 功能强大。支持抓取预览,定制输出,生成API,API管理,查看分享,登录注册等功能。
  • 响应速度快。抓取结果保存在数据库中,每天定时更新数据,数据接口响应数据库内容。

本地测试

1、安装Nodejs,安装MongoDB数据库,搭建环境

2、运行代码

git clone https://github.com/LuckyHH/WebSplider.git
npm install
npm start

3,打开浏览器

http://localhost:3000

核心代码

const Koa = require("koa");
const superagent = require("superagent");
const cheerio = require("cheerio");
const app = new Koa();

app.get('/', function (req, res, next) {
    superagent.get('https://cnodejs.org/')
        .end(function (err, sres) {
            if (err) {
                return next(err);
            }
            var $ = cheerio.load(sres.text);

            $('.topic_title').each(function (idx, element) {
                var $element = $(element);
                items.push({
                    title: $element.attr('title'),
                    url : $element.attr('href')
                });
            })
           res.send(items);
        })
})

app.listen(3000);

使用

1.爬取深度

爬取深度指的是从初始网址经过几层到达数据所在网址。最大支持的爬取深度为3,推荐使用的最大爬取深度为2

2.网页编码

目标网页的编码格式,默认为UTF-8

3.抓取模式

普通模式与分页模式

4.页码范围

在分页模式下,抓取的起止页码

5.目标网址

目标网址即要爬取的目标网站的网址。

普通模式下只需填写要抓取的网址即可。

分页模式下:

网址填写时,将网址中的页码改为*即可

例如:

CNode的分页网址

https://cnodejs.org/?tab=good&page=10

改为

https://cnodejs.org/?tab=good&page=*

6.选择器

选择器用来筛选数据。填写需要用户具有基本的前端知识。

当抓取深度为1,则只需填写1级选择器,填写数据所在标签即可

当抓取深度为2,则一级选择器中填写到达第二层页面的a标签选择器,二级选择器填写数据所在标签即可。

当抓取深度为3,则一级选择器中填写到达第二层页面的a标签选择器,二级选择器中填写到达第三层页面的a标签选择器,三级选择器填写数据所在标签即可。

例如:

$(".topic_title a")

指的是目标页面中所有类名为topic_title的元素中的a元素

$(".topic_title").find('.content')

指的是目标页面中类名为topic_title的元素下的类名为content的子孙元素

更多选择器填写规则,参考cheerio

7.输出结果定制。

输出结果定制指的是输出哪些结果

这里需要写成JSON格式,参考写法如下:

{
    "name":"$element.find('.c-9 .ml-20 a').text()",
    "age":"$element.children('.c-9').next().text()"
}

其中,键为name的值,筛选出的元素下的类名为c-9的元素下的类名ml-20下的a元素中的文本

键为age的值,筛选出的元素下的类名为c-9的元素下一个元素的文本内容

键随意指定,值中写法需要参考cheerio的属性部分。$element代表的是选择器选择出的元素。

8.代理模式

即抓取数据是否需要使用HTTP代理。有3中模式,无代理,西刺代理与自定义代理模式。

无代理模式使用自己的IP向目标服务器发出请求。

西刺代理模式使用西刺代理可用的代理地址发出请求。HttpProxy提供API支持

自定义代理模式需要用户自己填写可用代理。 输入格式如下: ['http://111.111.111.111:1111','http://111.111.111.111:1111']

注:自定义代理地址填写有误的话,系统默认使用无代理模式

9.结果预览

返回结果中,time值为数据最后一次的更新时间。data值为抓取结果。

10.生成数据接口

数据接口只在用户登录情况下生成。

数据接口调用示例

1.后端调用示例:


Node.js后端
const express = require('express');
const axios = require("axios");
const router = express.Router();

router.get('/douban/movie', function(req, res, next) {
    axios.get("http://splider.docmobile.cn/interface?name=luckyhh&cid=1529046160624").then(ires => {
        res.render('douban', { title: 'douban', content: ires.data.data });
    }).catch(err => {
        console.log(err);
    });
});

ejs模板页面
<ul>
        <%
                for(let i = 0 ; i < content.length ; i++){
                    for(let j = 0 ; j < content[i].length ; j++){
        %>
            <li>
                <h3>
                    <%=content[i][j].name%>
                </h3>
                <img src="<%=content[i][j].image_src%>" alt="<%=content[i][j].name%>"><br>
                <span>导演:
                    <%=content[i][j].director%>
                </span>
                <br>
                <span>编剧:
                    <%=content[i][j].screenwriter%>
                </span>
                <br>
                <span>主演:
                    <%=content[i][j].starring%>
                </span>
                <br>
                <span>
                    得分:<%=content[i][j].score%>
                </span>
                <br>
                <p>简介:
                    <%=content[i][j].brief%>
                </p>
            </li>
        <%
                    }
                }
        %>
    </ul>

2.前端调用示例

JSONP的调用方式

<script>
    function callback(obj) {
        console.log(obj);
    }
</script>
<script src="http://localhost:3000/interface?name=luckyhh&cid=1531671500898&cb=callback"></script>

调用时,只需要在数据接口后添加 &cb = 函数名 即可。

接口调用DEMO

WebSplider DEMO

示例配置参考

更新日志

WebSplider更新日志

TODO

  • [x] 对GBK网页格式的抓取支持
  • [x] 支持模式选择,可抓取分页列表
  • [x] 定义请求头
  • [x] 添加HTTP代理
  • [x] JSONP调用支持
  • [ ] 优化管理界面
  • [ ] 添加更详细的使用说明

协议

MIT

转载于:https://my.oschina.net/u/3915793/blog/1860790

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值