如何在神箭手上快速开发爬虫——第一课 简单的文章爬虫【糗事百科】

注:
1、本课完整的爬虫代码可以在神箭手示例代码中查看:http://www.shenjianshou.cn/index.php?r=demo/docs
2、如何在神箭手上运行代码,请查看文档:http://docs.shenjianshou.cn/overview/guide/develop/crawler.html
3、更详细的爬虫开发教程,请查看文档:http://docs.shenjianshou.cn/develop/summary/summary.html


各位爬虫开发者,你们好。我是神箭手官方御用(听上去很高端的样子)爬虫开发导师游牧,我来跟大家讲讲如何在神箭手上快速开发爬虫。今天我们先从一个简单的例子开始!


大家都知道,现在爬虫工程师的工资都很高(不要问我怎么从拉勾上知道的( ̄▽ ̄)”),我想各位学开发的小伙伴已经都开始摩拳擦掌进入这个大坑了哇,特别是现在人工智能已经成为未来的发展方向,而爬虫爬取的大量数据为人工智能提供了最重要的数据来源,可谓是大数据和人工智能开发中的重中之重啊啊啊啊啊


好了,废话不多说,进入正题。


第一步:

我们先来看下今天要爬取的网站-糗事百科(https://www.qiushibaike.com/):


第二步:

看着页面结构很简单,我们首先来分析下爬虫的三大件

1、入口页,从哪个网页开始爬;

2、列表页,包含内容页链接的网页(文章类的一般表示文章列表页);

3、内容页,包含要爬取数据的网页;


OK,我们这次要爬取的是糗事百科里的这些段子,所以内容页很容易发现,就是这样的网页:https://www.qiushibaike.com/article/118902114

然后列表页,鼠标滑到下面,可以看到所有列表页的翻页:

鼠标点击这些分类按钮可以查看链接是类似这样的:https://www.qiushibaike.com/8hr/page/2/?s=4974991。这些页面中包含有内容页链接,所以就是我们需要的列表页。

入口页很简单 就是首页啦:https://www.qiushibaike.com/

在神箭手上开发爬虫使用的是上手最简单的脚本语言:javascript。这里我就不详细介绍它的基础语法了,会的人都知道用起来很简单方便,不会的可以自动百度最多半天就会啦~

好,发现了爬取糗事百科的三大件,我们需要在爬虫代码中注明这些页面的正则,方便爬虫根据正则自动匹配网页中的链接,然后分别处理和提取数据:
var configs = {
  domains: ["qiushibaike.com"],// 网站域名,设置域名后只处理这些域名下的网页
  scanUrls: ["https://www.qiushibaike.com/"],// 入口页链接,分别从这些链接开始爬取
  contentUrlRegexes: [/https?:\/\/www\.qiushibaike\.com\/article\/\d+/],// 内容页url的正则,符合这些正则的页面会被当作内容页处理
  helperUrlRegexes: [/https?:\/\/www\.qiushibaike\.com\/(8hr\/page\/\d+.*)?/],// 列表页url的正则,符合这些正则的页面会被当作列表页处理
  fields: [  // 从内容页中抽取需要的数据  
    {
        ******************
    }
  ]
};


第三步:

然后就是定义从内容页网页源码中抽取需要的数据了,最常用的抽取方式是XPath(不了解的可以自动百度)。当然神箭手还支持JSONPath和正则方式抽取数据(同样不了解的可以自动百度)。

我们此次用xpath来抽取这些数据:标题、内容、作者和发布时间。建议在开发的时候使用chrome的插件 xpath helper来验证xpath是否书写正确(插件下载地址:https://www.shenjianshou.cn/index.php?r=index/download

教大家一个简单的快速生成xpath的方法,用chrome浏览器,右键点击要抽取的数据,点击“检查”,在下方的开发者工具中,右键选择要抽取的页面元素,点击“copy”->“copy xpath”,粘贴出来就能看到快速生成的xpath了。

但是这样生成的xpath有的太过复杂或者兼容行不好,可以做下精简和优化~

好,拿到这四个抽取项的xpath后,我们将爬虫代码完善:

var configs = {
  domains: ["qiushibaike.com"],// 网站域名,设置域名后只处理这些域名下的网页
  scanUrls: ["https://www.qiushibaike.com/"],// 入口页链接,分别从这些链接开始爬取
  contentUrlRegexes: [/https?:\/\/www\.qiushibaike\.com\/article\/\d+/],// 内容页url的正则,符合这些正则的页面会被当作内容页处理
  helperUrlRegexes: [/https?:\/\/www\.qiushibaike\.com\/(8hr\/page\/\d+.*)?/],// 列表页url的正则,符合这些正则的页面会被当作列表页处理
  fields: [  // 从内容页中抽取需要的数据  
    {
        name: "article_title",
        alias: "文章标题",
        selector: "//*[@id='single-next-link']//div[contains(@class,'content')]/text()[1]",// 默认使用xpath抽取
        required: true // required为true表示该项数据不能为空
    },
    {
       name: "article_content",
       alias: "文章内容",
       selector: "//*[@id='single-next-link']",
       required: true
    },
    {
       name: "article_author",
       alias: "作者",
       selector: "//div[contains(@class,'author')]//h2"
    },
    {
       name: "article_publish_time",
       alias: "文章发布日期",
       selector: "//div[contains(@class,'author')]//h2"
    }
  ]
};

// 启动爬虫
var crawler = new Crawler(configs);
crawler.start();


第四步:

其实以上代码就可以正常运行了,并且很快就会出数据了(是不是很简单,我都说过了神箭手开发爬虫只需要5分钟!)。但是我们有时候需要对爬取的数据进行下处理,比如把时间转化成时间戳之类的,或者要做个小改动啥的(伪原创之类的你们都懂的)。

神箭手提供了很多丰富的回调函数,可以全方面360度随意修改爬取的数据(很爽吧)。

以上面的代码为例,因为糗事百科是没有标题的,但是如果我们要把数据发布到网站或者进行分析之类的是需要文章标题的,那就需要我们根据内容生成一个标题;同时也可以把抽取的时间转化成时间戳:

/*
  回调函数afterExtractField:对抽取出来的数据进行处理
*/
configs.afterExtractField = function(fieldName, data, page){
    if(fieldName=="article_title"){
      if(data.length>10){
        data=data.substring(0,10)+"..."; // 因为糗事百科的文章没有标题,所以取文章的前10个字作为标题
      }
    }else if(fieldName=="article_publish_time"){
      data = Date.parse(new Date())/1000+""; // 发布日期转换成时间戳
      // 使用神箭手进行数据发布时,默认处理的时间戳是10位。如非特殊,请转换成10位时间戳
    }
  return data;
};


好,到这里为止,糗事百科的这个爬虫就写好啦,完整的代码在这里:http://www.shenjianshou.cn/index.php?r=demo/docs

我们把代码拷贝到神箭手新建的爬虫应用中,点击“启动爬虫”,就可以看到数据源源不断的出现啦: