php 抓取网页生成图片( 2017年09月19日小编觉得挺不错的更新时间介绍)

优采云 发布时间: 2021-11-13 14:23

  php 抓取网页生成图片(

2017年09月19日小编觉得挺不错的更新时间介绍)

  Node.js+jade 抓取所有文章博客生成静态html文件的例子

  更新时间:2017年9月19日07:59:35 作者:ghostwu

  下面的编辑器给大家带来一个Node.js+jade从博客中抓取所有文章静态html文件的例子。我觉得还不错,现在分享给大家,给大家参考。跟着小编一起来看看

  在这个文章中,我们将上面采集中文章列表中的所有信息进行整理,启动采集文章,生成静态html文件来看看我的采集的效果。我的博客目前有77个文章,所有采集都在不到1分钟的时间内生成。这里我剪了一些图片。文件名生成的id为文章,生成的文章,我写了一个简单的静态模板,所有文章都是基于这个模板生成的。

  项目结构:

  

  

  

  好的,接下来我们来解释一下这个文章的主要功能:

  1、抓取文章,主要抓取文章

  的标题、内容、超链接、文章id(用于生成静态html文件)

  2、基于jade模板生成html文件

  一、如何捕获文章?

  很简单,类似于上面爬取文章列表的实现

  function crawlerArc( url ){

var html = '';

var str = '';

var arcDetail = {};

http.get(url, function (res) {

res.on('data', function (chunk) {

html += chunk;

});

res.on('end', function () {

arcDetail = filterArticle( html );

str = jade.renderFile('./views/layout.jade', arcDetail );

fs.writeFile( './html/' + arcDetail['id'] + '.html', str, function( err ){

if( err ) {

console.log( err );

}

console.log( 'success:' + url );

if ( aUrl.length ) crawlerArc( aUrl.shift() );

} );

});

});

}

  参数url为文章的地址。捕获文章的内容后,调用filterArticle(html)过滤掉需要的文章信息(id、title、超链接、Content),然后使用jade的renderFile api替换模板内容,

  模板内容替换后,肯定需要生成html文件,所以使用writeFile来写文件。写入文件时,使用id作为html文件名。这是生成静态html文件的实现,

  下一步就是循环生成静态html文件,就是下面这行:

  if(aUrl.length) crawlerArc(aUrl.shift());

  aUrl保存了我博客文章的所有url,每次采集写完一篇文章文章,删除当前文章的url让我下载一个url 文章出来了,继续采集

  完整的实现代码server.js:

  var fs = require( 'fs' );

var http = require( 'http' );

var cheerio = require( 'cheerio' );

var jade = require( 'jade' );

var aList = [];

var aUrl = [];

function filterArticle(html) {

var $ = cheerio.load( html );

var arcDetail = {};

var title = $( "#cb_post_title_url" ).text();

var href = $( "#cb_post_title_url" ).attr( "href" );

var re = /\/(\d+)\.html/;

var id = href.match( re )[1];

var body = $( "#cnblogs_post_body" ).html();

return {

id : id,

title : title,

href : href,

body : body

};

}

function crawlerArc( url ){

var html = '';

var str = '';

var arcDetail = {};

http.get(url, function (res) {

res.on('data', function (chunk) {

html += chunk;

});

res.on('end', function () {

arcDetail = filterArticle( html );

str = jade.renderFile('./views/layout.jade', arcDetail );

fs.writeFile( './html/' + arcDetail['id'] + '.html', str, function( err ){

if( err ) {

console.log( err );

}

console.log( 'success:' + url );

if ( aUrl.length ) crawlerArc( aUrl.shift() );

} );

});

});

}

function filterHtml(html) {

var $ = cheerio.load(html);

var arcList = [];

var aPost = $("#content").find(".post-list-item");

aPost.each(function () {

var ele = $(this);

var title = ele.find("h2 a").text();

var url = ele.find("h2 a").attr("href");

ele.find(".c_b_p_desc a").remove();

var entry = ele.find(".c_b_p_desc").text();

ele.find("small a").remove();

var listTime = ele.find("small").text();

var re = /\d{4}-\d{2}-\d{2}\s*\d{2}[:]\d{2}/;

listTime = listTime.match(re)[0];

arcList.push({

title: title,

url: url,

entry: entry,

listTime: listTime

});

});

return arcList;

}

function nextPage( html ){

var $ = cheerio.load(html);

var nextUrl = $("#pager a:last-child").attr('href');

if ( !nextUrl ) return getArcUrl( aList );

var curPage = $("#pager .current").text();

if( !curPage ) curPage = 1;

var nextPage = nextUrl.substring( nextUrl.indexOf( '=' ) + 1 );

if ( curPage < nextPage ) crawler( nextUrl );

}

function crawler(url) {

http.get(url, function (res) {

var html = '';

res.on('data', function (chunk) {

html += chunk;

});

res.on('end', function () {

aList.push( filterHtml(html) );

nextPage( html );

});

});

}

function getArcUrl( arcList ){

for( var key in arcList ){

for( var k in arcList[key] ){

aUrl.push( arcList[key][k]['url'] );

}

}

crawlerArc( aUrl.shift() );

}

var url = 'http://www.cnblogs.com/ghostwu/';

crawler( url );

  layout.jade 文件:

  doctype html

html

head

meta(charset='utf-8')

title jade+node.js express

link(rel="stylesheet", href='./css/bower_components/bootstrap/dist/css/bootstrap.min.css')

body

block header

div.container

div.well.well-lg

h3 ghostwu的博客

p js高手之路

block container

div.container

h3

a(href="#{href}" rel="external nofollow" ) !{title}

p !{body}

block footer

div.container

footer 版权所有 - by ghostwu

  后续计划:

  1、使用mongodb进行存储

  2、支持断点采集

  3、采集图片

  4、采集小说

  等等...

  上面Node.js+jade抓取所有博客文章生成静态html文件的例子就是编辑器分享的全部内容。希望能给大家参考,也希望大家多多支持。乐官。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线