node.js抓取数据(fake小爬虫)

  在node.js中,有了 cheerio 模块、request 模块,抓取特定URL页面的数据已经非常方便。

  一个简单的就如下

var request = require(‘request‘);
var cheerio = require(‘cheerio‘);

request(url,function(err,res){
    if(err) return console.log(err);
    var $ = cheerio.load(res.body.toString());

    //解析页面内容

});

  有了基本的流程,现在找个web地址(url)试试。就以博客园的搜索页为例。

   通过搜索关键词 node.js 

  

  得到如下的URL:

  http://zzk.cnblogs.com/s?t=b&w=node.js

  点击第二页,URL如下:

  http://zzk.cnblogs.com/s?t=b&w=node.js&p=2

  分析URL,发现w= ?为要搜索的关键词 p= ?为页码。 

  借助 request 模块请求URL 

var request = require(‘request‘);
var cheerio = require(‘cheerio‘);

var key = ‘node.js‘, page = 1;
var url = ‘http://zzk.cnblogs.com/s?t=b&w=‘+ key +‘&p=‘+ page;

request(url, function(err, res) {
    if (err) return console.log(err);
    var $ = cheerio.load(res.body.toString());
    var arr = [];
    //内容解析

});

  现在URL有了,分析下URL对应的页面内容。

  

  页面还是很有规律的。

  标题 摘要 作者  发布时间 推荐次数 评论条数 浏览次数 文章链接

  借助浏览器开发工具

  

  发现 <div class="searchItem">...</div> 对应的是每篇文章

  点开每一项,有如下内容

  

  class="searchItemTitle" 包含的是文章标题、也包含了文章URL地址

  class="searchItemInfo-userName" 包含的是作者

  class="searchItemInfo-publishDate" 包含的是发布时间

  class="searchItemInfo-views" 包含的是浏览次数

  借助 cheerio 模块解析文章,抓取具体的内容

var request = require(‘request‘);
var cheerio = require(‘cheerio‘);

var key = ‘node.js‘, page = 1;
var url = ‘http://zzk.cnblogs.com/s?t=b&w=‘+ key +‘&p=‘+ page;

request(url, function(err, res) {
    if (err) return console.log(err);
    var $ = cheerio.load(res.body.toString());
    var arr = [];
    //内容解析
    $(‘.searchItem‘).each(function() {
        var title = $(this).find(‘.searchItemTitle‘);
        var author = $(this).find(‘.searchItemInfo-userName a‘);
        var time = $(this).find(‘.searchItemInfo-publishDate‘);
        var view = $(this).find(‘.searchItemInfo-views‘);
        var info = {
            title: $(title).find(‘a‘).text(),
            href: $(title).find(‘a‘).attr(‘href‘),
            author: $(author).text(),
            time: $(time).text(),
            view: $(view).text().replace(/[^0-9]/ig, ‘‘)
        };
        arr.push(info);
        //打印
        console.log(‘============================= 输出开始 =============================‘);
        console.log(info);
        console.log(‘============================= 输出结束 =============================‘);
    });
});

  可以来运行下,看看是否正常抓取了数据。  

   

  现在有数据数据,可以保存到数据库。这里以mysql为例,其实用mongodb更方便。

   借助 mysql 模块保存数据(假设数据库名为test,表为blog)。

   

var request = require(‘request‘);
var cheerio = require(‘cheerio‘);

var mysql = require(‘mysql‘);
var db = mysql.createConnection({
    host:     ‘127.0.0.1‘,
    user:     ‘root‘,
    password: ‘123456‘,
    database: ‘test‘
});
db.connect();

var key = ‘node.js‘, page = 1;
var url = ‘http://zzk.cnblogs.com/s?t=b&w=‘+ key +‘&p=‘+ page;

request(url, function(err, res) {
    if (err) return console.log(err);
    var $ = cheerio.load(res.body.toString());
    var arr = [];
    //内容解析
    $(‘.searchItem‘).each(function() {
        var title = $(this).find(‘.searchItemTitle‘);
        var author = $(this).find(‘.searchItemInfo-userName a‘);
        var time = $(this).find(‘.searchItemInfo-publishDate‘);
        var view = $(this).find(‘.searchItemInfo-views‘);
        var info = {
            title: $(title).find(‘a‘).text(),
            href: $(title).find(‘a‘).attr(‘href‘),
            author: $(author).text(),
            time: $(time).text(),
            view: $(view).text().replace(/[^0-9]/ig, ‘‘)
        };
        arr.push(info);
        //打印
        console.log(‘============================= 输出开始 =============================‘);
        console.log(info);
        console.log(‘============================= 输出结束 =============================‘);
        //保存数据
        db.query(‘insert into blog set ?‘, info, function(err,result){
            if (err) throw err;
            if (!!result) {
                console.log(‘插入成功‘);
                console.log(result.insertId);
            } else {
                console.log(‘插入失败‘);
            }
        });
    });
});

  运行下,看看数据是否保存到数据库了。

  

    现在一个基本的抓取、保存都有了。但是呢 只抓取一次,而且只能抓取关键词为node.js 页码为1的URL页面。

    改关键词为javascript,页码为1,清空blog表,再从新运行一次,看看表里是不是能保存javascript相关的数据。

   

    现在去博客园搜索javascript,看看搜索到的结果和表里的内容能否对应。呵呵,不用看啦,肯定能对应啊~~

    只能抓取一个页面的内容,肯定不能满足的,能自动抓取其他页的内容就更好了。

    分析搜索页面,底部都有页码、下一页。

    

   借助浏览器开发工具查看

 

  我们发现最后一个a标签的内容有Next,表示下一页,看href有p=2,在第二分页p=3, ... 最后一页没有内容有Next的a标签了。

var nextA = $(‘.pager a‘).last(),
    nextUrl = ‘‘;
if ($(nextA).text().indexOf(‘Next‘) > -1) {
    nextUrl = nextA.attr(‘href‘);
    page = nextUrl.slice(nextUrl.indexOf(‘p=‘) + 2);

    //todo

} else {
    db.end();
    console.log(‘没有数据了...‘);
}

  这里把程序代码做一点修改,封装成一个函数,完整如下:

var request = require(‘request‘);
var cheerio = require(‘cheerio‘);

var mysql = require(‘mysql‘);
var db = mysql.createConnection({
    host:     ‘127.0.0.1‘,
    user:     ‘root‘,
    password: ‘123456‘,
    database: ‘test‘
});
db.connect();

function fetchData(key, page) {
    var url = ‘http://zzk.cnblogs.com/s?t=b&w=‘ + key + ‘&p=‘ + page;
    request(url, function(err, res) {
        if (err) return console.log(err);
        var $ = cheerio.load(res.body.toString());
        var arr = [];
        //内容解析
        $(‘.searchItem‘).each(function() {
            var title = $(this).find(‘.searchItemTitle‘);
            var author = $(this).find(‘.searchItemInfo-userName a‘);
            var time = $(this).find(‘.searchItemInfo-publishDate‘);
            var view = $(this).find(‘.searchItemInfo-views‘);
            var info = {
                title: $(title).find(‘a‘).text(),
                href: $(title).find(‘a‘).attr(‘href‘),
                author: $(author).text(),
                time: $(time).text(),
                view: $(view).text().replace(/[^0-9]/ig, ‘‘)
            };
            arr.push(info);
            //打印
            console.log(‘============================= 输出开始 =============================‘);
            console.log(info);
            console.log(‘============================= 输出结束 =============================‘);
            //保存数据
            db.query(‘insert into blog set ?‘, info, function(err, result) {
                if (err) throw err;
                if (!!result) {
                    console.log(‘插入成功‘);
                    console.log(result.insertId);
                } else {
                    console.log(‘插入失败‘);
                }
            });
        });

        //下一页
        var nextA = $(‘.pager a‘).last(),
            nextUrl = ‘‘;
        if ($(nextA).text().indexOf(‘Next‘) > -1) {
            nextUrl = nextA.attr(‘href‘);
            page = nextUrl.slice(nextUrl.indexOf(‘p=‘) + 2);
            setTimeout(function() {
                fetchData(key, page);
            }, 2000);
        } else {
            db.end();
            console.log(‘没有数据了...‘);
        }

    });
}
fetchData(‘node.js‘, 1);

  运行一下,开始抓数据了... 博客园搜索结果100个分页,每页20条数据,供2000条,程序间隔2秒抓取下一页,抓取一个搜索关键词2000条数据约3分20秒左右。

   到此程序实现了抓取、保存数据。

   如果是其他URL,需要重新解析页面内容,页面编码不是utf-8编码,需要转码,可以借助 iconv-lite 模块。 

   数据库有了数据,当然可以读取出来,比如按浏览次数多少排序输出来。

   按需求,抓取数据,显示数据,助技术进步。

    

时间: 2024-10-09 13:52:55

node.js抓取数据(fake小爬虫)的相关文章

node.js 抓取代理ip

node.js实现抓取代理ip 主要文件:index.js /* * 支持:node.js v7.9.0 */ const cheerio=require('cheerio'); const fetch =require('node-fetch'); const Promise=require('bluebird'); let mongoose=require('mongoose'); Promise.promisifyAll(mongoose); let Schema=mongoose.Sch

node.js 抓取

http://blog.csdn.net/youyudehexie/article/details/11910465 http://www.tuicool.com/articles/z2YbAr http://www.sufeinet.com/thread-8413-1-1.html https://github.com/cheeriojs/cheerio http://blog.fens.me/nodejs-crawler-douban/

Node.js抓取新浪新闻标题

"use strict"; let cheerio = require("cheerio"); let http = require("http"); let iconv = require("iconv-lite"); let mainUrl = "http://news.sina.com.cn/world/"; http.get(mainUrl, function(sres) { var chunks

分布式爬虫:使用Scrapy抓取数据

分布式爬虫:使用Scrapy抓取数据 Scrapy是Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. 官方主页: http://www.scrapy.org/ 中文文档:Scrapy 0.22 文档 GitHub项目主页:https://github.com/scrapy/scrapy Scrapy 使用了 Twisted 异步网络库来处理网络通讯.整体架构大致如下(注:图片来自

利用“爬虫”抓视频 法院审结全国首例计算机抓取数据案

近期,海淀法院审结了一起利用"爬虫"技术侵入计算机信息系统抓取数据的刑事案件.该案是全国首例利用"爬虫"技术非法入侵其他公司服务器抓取数据,进而实施复制被害单位视频资源的案件. 法院经审理查明,被告单位上海某网络科技有限公司,经营计算机网络科技领域内的技术开发.技术服务.电子商务.电子产品等业务.被告人张某是上海某网络科技有限公司法定代表人兼CEO,负责公司整体运行:被告人宋某于2016年8月至2017年2月任职上海某网络科技有限公司,担任联席CEO,是产品负责人:

[Python爬虫] 之三:Selenium 调用IEDriverServer 抓取数据

接着上一遍,在用Selenium+phantomjs 抓取数据过程中发现,有时候抓取不到,所以又测试了用Selenium+浏览器驱动的方式:具体代码如下: #coding=utf-8import osimport refrom selenium import webdriverfrom selenium.webdriver.common.keys import Keysimport timefrom selenium.webdriver.common.action_chains import A

python自然语言处理1——从网络抓取数据

python自然语言处理1--从网络抓取数据 写在前面 本节学习python2.7 BeautifulSoup库从网络抽取数据的技术,检验之简而言之就是爬虫技术.网络编程是一门复杂的技术,在需要基础的地方,文中给出的链接地址,都是很好的教程,可以参考,我在这里不在重复发明轮子.本节的主旨在于: 帮助快速掌握基本爬虫技术,形成一条主线,能为自己的实验构造基础数据.掌握爬虫技术后,可以从网络抓取符合特定需求的数据供分析,这里学习的爬虫技术适用于数据挖掘.自然语言处理等需要从外部挖掘数据的学科. 1.

python抓取数据,python使用socks代理抓取数据

在python中,正常的抓取数据直接使用urllib2 这个模块: import urllib2 url = 'http://fanyi.baidu.com/' stream = urllib2.urlopen(url) cont = stream.read() print cont 如果要走http代理的话,我们也可以使用urllib2,不需要引用别的模块: import urllib2 url = 'https://clients5.google.com/pagead/drt/dn/dn.j

测试开发Python培训:抓取新浪微博抓取数据-技术篇

测试开发Python培训:抓取新浪微博抓取数据-技术篇 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的selenium的课程中,我们在培训的课程里讲python的语言,也是通过项目实战的方式进行讲解,前期分享了个新浪微博的登陆功能,这次在通过抓取新浪微博数据进一步讲解脚本.(大家对课程感兴趣,请加qq:564202718) 微博有发布微博功能,微博发布后需要验证内容,那么如何验证微博发布数据的正确性,首先要