如何在神箭手上快速开发爬虫——第六课 如何爬取分类数据【春雨医生

2017-12-14  本文已影响65人  98405539a93c

1、本课完整的爬虫代码可以在神箭手示例代码中查看

2、如何在神箭手上运行代码,请查看文档

3、更详细的爬虫开发教程,请查看文档


大家好,我是神箭手的游牧老师~

今天继续给大家带来 如何在神箭手上快速开发爬虫 系列教程的第六课:如何爬取分类数据。

对于基础知识还不熟悉的童鞋,请先从第一课开始学起啊:第一课点这里

神箭手为了简化爬虫代码,默认是全站爬虫,会自动从入口页链接中自动发现新的链接,全站爬取。但是在爬取文章或者商品数据的时候,我们可能需要精准采集,比如只爬取某些分类的文章或者某个店铺某个关键字的商品。对于这种情况,有两种处理办法:

1、优化列表页和内容页url正则表达式,使其只匹配需要的url;

2、关闭自动链接发现,手动添加需要的url到待爬队列中。

第一种办法没什么好说的,大家多熟悉熟悉正则表达式即可。本文主要讲解第二种办法。关闭自动链接发现和手动添加新的链接,都是在网页下载完成后的回调函数中处理的。

举个例子,按分类爬取春雨医生的健康资讯文章:

我们首先通过自定义输入(在本系列上一篇文章有具体讲解如何使用自定义输入),传入要爬取的分类的首页url,比如:https://www.chunyuyisheng.com/pc/health_news/?channel_id=21

// 输入要爬取的分类url,可以输入多个

var channelUrls = ["https://www.chunyuyisheng.com/pc/health_news/?channel_id=21", "https://www.chunyuyisheng.com/pc/health_news/?channel_id=35"];//@input(channelUrls, 要爬取的资讯分类首页url)

然后在爬取前,将这些首页url添加到入口页url列表中:

configs.initCrawl = function (site) {

// 分别判断输入的资讯分类首页链接是否正确,正确的话添加到入口页url列表中

for(var i in channelUrls){

if(!/https:\/\/www\.chunyuyisheng\.com\/pc\/health_news/.exec(channelUrls[i])){

console.log("输入的资讯分类首页url:"+channelUrls[i]+"错误!");

}else{

site.addScanUrl(channelUrls[i]);

}

}

};

在入口页、列表页和内容页下载完成后的回调函数中,返回值改为false表示关闭自动发现新链接,防止处理到其他分类的链接

// 下载完入口页内容的回调

configs.onProcessScanPage = function (page, content, site) {

// 返回false表示不自动从入口页中发现新链接。因为本代码中入口页也属于列表页,所以在列表页回调中统一处理

return false;

};

// 下载完内容页内容的回调

configs.onProcessContentPage = function (page, content, site) {

// 返回false表示不自动从内容页中发现新链接

return false;

};

同时在列表页的回调函数中,手动添加该页的内容页url和下一页列表页url到待爬队列中

// 下载完列表页内容的回调

configs.onProcessHelperPage = function (page, content, site) {

// 从列表页中抽取内容页url,添加到待爬url队列中

var contentUrls = extractList(content, "//ul[contains(@class,'health-news-list')]//a[contains(@class,'title')]/@href");

for(var i in contentUrls){

site.addUrl(contentUrls[i]);

}

// 从列表页中抽取下一页列表页url,添加到待爬url队列中

var nextPageUrl = extract(content, "//a[contains(text()[1],'下一页') and not(contains(@class,'disabled'))]/@href");console.log(nextPageUrl);

if(nextPageUrl){

site.addUrl(nextPageUrl);

}

// 返回false表示不自动从列表页中发现新链接

return false;

};

列表页是类似这样的url:https://www.chunyuyisheng.com/pc/health_news/?channel_id=21&page=2;内容页是类似这样的url:https://www.chunyuyisheng.com/pc/article/115739/。最后我们在configs里设置好域名、内容页和列表页url正则、从内容页抽取数据的xpath等:

// 定义抽取数据的规则 和 列表页、内容页url正则

var configs = {

domains: ["chunyuyisheng.com"],

scanUrls: [],

contentUrlRegexes: [/https:\/\/www\.chunyuyisheng\.com\/pc\/article\/\d+.*/],

helperUrlRegexes: [/https:\/\/www\.chunyuyisheng\.com\/pc\/health_news\/\?channel_id=\d+.*/, /https:\/\/www\.chunyuyisheng\.com\/pc\/health_news\/\#channel/],

fields: [

{

name: "article_title",

alias: "文章标题",

selector : "//h1[contains(@class,'news-detail-title')]",

required: true

},

{

name: "article_abstract",

alias: "文章摘要",

selector: "//p[contains(@class,'desc')]"

},

{

name: "article_content",

alias: "文章内容",

selector: "//div[contains(@class,'news-content')]"

},

{

name: "article_publish_time",

alias: "发布时间",

selector: "//p[contains(@class,'time')]"

},

{

name: "article_category",

alias: "文章分类",

selector: "//ul[contains(@class,'bread-crumb')]//li[position()>1 and contains(@class,'item')]/a"

}

]

};

这个按分类爬取文章的爬虫就写好了,是不是真的五分钟搞定!!完整的代码点这里:http://www.shenjian.io/index.php?r=demo/docs&demo_id=500015

把代码拷贝到神箭手上,启动爬虫,爬取结果里就源源不断的出现按分类爬的文章了:

上一篇下一篇

猜你喜欢

热点阅读