31

node爬虫实践总结

 4 years ago
source link: https://www.tuicool.com/articles/73M7V3j
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

网络爬虫 (又被称为网页蜘蛛,网络机器人,在 FOAF 社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。

随着web2.0时代的到来,数据的价值愈发体现出来。无论是在目前火热的人工智能方向,还是在产品侧的用户需求分析,都需要获取到大量的数据,而网络爬虫作为一种技术手段,在不违反主体网站基本要求的情况下是获取数据成本最低的手段。与此同时,爬虫技术也飞速发展。

了解爬虫,首先要了解一个君子协议。

robot.txt协议

该协议是搜索引擎从业者和网站站长通过邮件讨论定下的,有几个重要的特点:

  • robot.txt协议是蜘蛛访问网站的开关,决定蜘蛛可以抓取哪些内容,不可以抓取哪些内容。
  • robot.txt是指网站与搜索引擎之间的协议
  • 存放在网站根目录网站服务器的根目录下

nodejs爬虫

一提到爬虫,我们可能很容易联想到python,python由于其语法容易上手,操作数据简洁方便成为爬虫界的龙头,scrapy框架更是只用简单配置,按照其语法规范就能够轻松获取到网站内容。但是作为前端开发,获取数据就不可能了吗?当然不是,随着nodejs的出现,npm社区的火热,nodejs所提供的功能日渐强大,由于nodejs单线程支持高并发的特性,我们不必要将注意力过多放在线程之间的同步与通信,在加上JavaScript本身与html之间的紧密联系,使用nodejs进行网络爬虫也是很好的实践。

node爬虫工具

俗话说工欲善其事必先利其器,爬虫从根上说就是四个模块,网页下载器、网页解析器、URL调度器、内容输出器。

npm社区中为我们提供了很多有用的模块,接下来分别介绍下网络请求模块、解析模块以及流程处理模块。

网络请求模块

  1. SuperAgent

SuperAgent 是一个轻量级、灵活的、易读的、低学习曲线的客户端请求代理模块,其使用极其简单,支持链式调用,可以很容易就封装成Promise或者async函数。

async function getOuterUrls(url) {
    return new Promise((resolve, reject) => {
        superagent.get(url)
        .end((err, docs) => {
            if(err) {
                return reject(err);
            }
            // 成功解析
            resolve(items);
        })
    })
}
  1. request

request的使用也非常简单,request的设计是让http请求变得容易。

const request = require('request');
request('您的请求url', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body) // 请求成功的处理逻辑
  }
});

那么两者有什么区别呢,从npm社区中的统计量可以看出,request的周下载量有千万级,而superagent也有百万。superagent特别适合刚学爬虫的新手操作,请求中需要发送的参数以及请求头通过set直接设置。作者认为Request最强大的功能在于其CookieJar的功能,它能够保存每一次请求的cookie,让我们的请求和在浏览器中点击一样,我们甚至不用去设置每一次的cookie,他会根据请求的主机域从jar中自动匹配与实时更新。

const cookieColl = Request.jar();
const request = Request.defaults({jar: cookieColl});

资源解析模块

  • cheerio

我们都知道大名鼎鼎的jQuery,它提供了便捷轻量的dom操作语法。而cheerio是nodejs中的jQuery,上手方便,相比于xml解析的xpath简直好用一万倍。如果你熟悉jQuery,那么cheerio就能很容易玩转。

let $ = cheerio.load(docs.text);
   let items = [];
   $('#topic_list .topic_title').each((index, ele) => {
       let element = $(ele);
       items.push(Url.resolve(baseUrl, element.attr('href')))
   })
  • jsdom

JSDOM的目标是提供与浏览器一样的DOM环境

const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
console.log(dom.window.document.querySelector("p").textContent); // "Hello world"

bqumIvj.png!web

jsdom相比于cheerio解析速度会稍慢,但是从npm社区的下载量来说,jsdom是cheerio的两倍,jsdom提供了其他丰富的功能,后续有待继续挖掘。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK