WebSpider在线爬虫

WebSpider是什么?

  • WebSpider在线爬虫是一个结合Web技术与爬虫技术的项目。
  • WebSpider支持Web页面进行爬虫配置,提交配置到服务器后,服务器端爬虫程序进行数据抓取,最后将结果返回给用户。
  • WebSpider支持多种代理模式,有效保证了IP不被ban掉
  • WebSpider支持生成数据接口API,方便用户调用爬虫爬到的数据
  • WebSpider基于Node.js,使用superagent与cheerio进行数据请求分析
  • 爬虫不能解决Ajax动态加载内容

 

WebSpider长得什么样?

WebSplider

 

 

WebSpider原理是什么?

      动态网站中相似网页的网页结构都是有规律的。以京东为例,京东网站每个产品详情页中,分析页面结构,可以看到产品名称的类名为sku-name。那么,如果想获得该产品的相关数据,用户只需给出目标网址,目标网页数据所在的标签,使用标签选择器与属性选择器就可以得到该类名标签中的数据。根据这个特点,可以设计让用户自行观察网页结构,提供标签选择器与属性选择器,指定目标网页URL即可让爬虫抓取数据。

     Web在线爬虫主要分为Web应用与爬虫程序两大模块。Web应用是用户与爬虫程序之间“联络人”,负责中转用户调用爬虫的请求与返回爬虫处理后的数据结果。

     爬虫基于Node.js平台,使用Superagent请求初始页面URL,获得整个网页,使用Cheerio根据用户配置中的标签选择器与属性选择器分析页面,得到目标数据。

     为了满足用户调用爬虫爬到的数据的需求Web在线爬虫支持生成数据接口,这是一个返回爬虫爬取数据的URLWeb应用负责与数据库交互,数据库保存用户的爬虫配置。生成数据接口时,将爬虫配置写入数据库,请求数据接口时,从数据库获得配置,将配置设置到爬虫中进行爬取数据。为了提高响应速度,可以将爬虫爬取结果保存到数据库中,设置定时任务,定时调用爬虫程序爬取数据,更新数据库。当用户请求数据接口,直接从数据库取出数据进行响应。

 

WebSpider技术细节

      WebSpider使用koa.js作为Web框架,使用superagent进行请求,Cheerio分析网页,mongodb存储数据。前端使用Vue.js

核心代码

WebSpider项目中使用koa.js,这里是express。东西差不多

var express = require('express');
var cheerio = require('cheerio');
var superagent = require('superagent');

var app = express();
var items = [];
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, function () {
  console.log('app is listening at port 3000');
});

 

爬取深度

首先看爬虫获得数据的过程。它是由用户给出的初始URL与a标签选择器来找到目标数据的。

原理

所以,在填写配置的页面,要指出初始页面到目标数据页的a标签选择器,在最后目标数据页,使用标签选择器与属性选择器就可以获得目标数据。

 

以澎湃新闻为例:

获取首页每个链接的文章详情。需要进入下一层链接才能获得文章数据。

所以“1级选择器”配置到下一层网页的a标签选择器。爬虫程序根据a标签选择器才能找到下一层链接。

“2级选择器”则配置数据所在的标签选择器。用于配合“输出结果定制”,获得数据。

配置

 

同样的道理,如果目标数据在下一层的下一层,则需要设置爬取深度为3.此时1级选择器与2级选择器都需要设置为a标签选择器。3级选择器是目标数据所在的标签选择器。 

 

HTTP代理

      对爬虫稍有研究的人会知道代理的重要性,它保证了我们的IP地址不被目标服务器ban掉。

      superagent使用代理发出HTTP请求其实很容易实现,但如何获得大量的代理地址呢?网上有很多代理网站提供免费代理服务。比如:西刺代理,IP海等。但是代理质量参差不齐,可用的代理少之又少。

      于是,我做了个小项目HttpProxy,用于检测代理是否可用。WebSplider爬虫爬取了西刺代理的大量代理地址,HttpProxy请求WebSplider提供的API获得这些地址数据,批量分析请求代理是否可用,分析之后,WebSplider请求HttpProxy提供的API,使用分析之后的代理地址进行请求代理。

      WebSplider支持选择代理模式。无代理,西刺代理与自定义代理

 

输出结果格式

      怎样让用户自定义自己想要的数据输出?我选择让用户自己根据标签选择器与属性选择器进行配置。

如下所示:

配置

2级选择器指出目标数据在类名为newscontent的元素中。

输出结果定制中则指出了输出那些数据结果。是标准的JSON格式。

这里根据键名称,可以直观的看到我要得到的数据是文章标题与内容。

{
"title":"$element.children('.news_title').text()",
"content":"$element.children('.news_txt').text()"
}

以这个为例说一下写法
 $element.children('.news_title').text() 
$element是指上面2级选择器选择出的标签。这句话是说要得到类名为newscontent的元素中子元素类名为news_title的文本值。

更多标签选择器与属性选择器写法,参考Cheerio

 

 

其他

实例地址:

https://webspiderr.herokuapp.com/

 

项目地址:

https://github.com/xdoer/WebSpider

 

配置参考:

https://hanblog.herokuapp.com/artical_detiail/luckyhh/1528369921460

 

posted @ 2018-07-14 01:07  xdoer  阅读(10035)  评论(0编辑  收藏  举报