为了方便用户简单高效的获取互联网数据,提出一种结合Web技术与爬虫技术的在线轻量级网络爬虫。该爬虫可在Web页面上进行配置,用户提交配置到远程服务器,服务器端爬虫程序进行数据抓取分析,最后由Web应用将结果返回到页面进行预览,同时支持生成数据结果接口URL,方便用户调用服务器上爬虫程序爬到的数据。
WebSpider是什么?
- WebSpider在线爬虫是一个结合Web技术与爬虫技术的项目。
- WebSpider支持Web页面进行爬虫配置,提交配置到服务器后,服务器端爬虫程序进行数据抓取,最后将结果返回给用户。
- WebSpider支持多种代理模式,有效保证了IP不被ban掉
- WebSpider支持生成数据接口API,方便用户调用爬虫爬到的数据
- WebSpider基于Node.js,使用superagent与cheerio进行数据请求分析
- 爬虫不能解决Ajax动态加载内容
WebSpider长得什么样?
WebSpider原理是什么?
以京东为例,京东网站的每个产品详情页中,分析页面结构,可以看到产品名称的类名为sku-name。那么,如果想获得该产品的相关数据,用户只需给出目标网址,目标网页中数据所在的标签,使用标签选择器与属性选择器就可以得到该类名标签中的数据。根据这个特点,可以设计让用户自行观察网页结构,提供标签选择器与属性选择器,指定目标网页URL即可让爬虫抓取数据。
在线爬虫主要分为Web应用与爬虫程序两大模块。Web应用是用户与爬虫程序之间“联络人”,负责中转用户调用爬虫的请求与返回爬虫处理后的数据结果。
爬虫基于Node.js平台,使用Superagent请求初始页面URL,获得整个网页,使用Cheerio根据用户配置中的标签选择器与属性选择器分析页面,得到目标数据。
用户调用爬虫爬到的数据的需求,Web在线爬虫支持生成数据接口,这是一个返回爬虫爬取数据的URL。Web应用负责与数据库交互,数据库保存用户的爬虫配置。生成数据接口时,将爬虫配置写入数据库,请求数据接口时,从数据库获得配置,将配置设置到爬虫中进行爬取数据。为了提高响应速度,可以将爬虫爬取结果保存到数据库中,设置定时任务,定时调用爬虫程序爬取数据,更新数据库。当用户请求数据接口,直接从数据库取出数据进行响应。
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