nodejs抓取数据二(列表解析)

这里做得比较暴力,没有分页取出数据解析,O(∩_∩)O哈哈~,居然没有被挂机.不过解析的坑特别多...不过大部分我想要的数据都拿到了.

//解析列表数据
var http = require("http"),
    cheerio = require("cheerio"),
    mongoose = require(‘mongoose‘),
    db = mongoose.createConnection(‘mongodb://127.0.0.1:27017/crawl58‘);

db.on(‘error‘, function (error) {
    console.log(‘mongodb连接错误: ‘ + error);
});

//列表页面数据
var mongooseSchema = new mongoose.Schema({
    url: {type: String},//抓取地址
    type: {type: String},//类型
    content: {type: String},//抓取地址
    updateTime: {type: Date, default: Date.now},//数据抓取时间
    flag: {type: String, default: 0} //用于判断是否抓取过 0表示详情没有抓取过.
});
// model
var mongooseModel = db.model(‘pageList‘, mongooseSchema);//代理记账

//存储数据
var parseListSchema = new mongoose.Schema({
    url: {type: String},//抓取地址
    detailUrl: {type: String},//详情地址
    type: {type: String},//类型
    title: {type: String},//标题
    company: {type: String},//公司名称
    contact: {type: String},//联系人
    score: {type: String},//评分
    phone: {type: String},//电话
    updateTime: {type: Date, default: Date.now},//数据解析时间
    flag: {type: String, default: 0} //用于判断是否抓取过 0表示详情没有抓取过.
});
// model
var parseListModel = db.model(‘parseList‘, parseListSchema);//代理记账

var pageNo = 0;
var data;//保存取出的数据
function queryList() {
    var condition = {
        url: ‘http://cd.58.com/yanzi/pn16/?PGTID=139112794188694845657499716&ClickID=1‘
    }
    mongooseModel.find(condition, function (error, result) {
        if (error) {
            console.log(error);
        } else {
            //解析数据
            data = result;
            console.log(‘开始解析...‘);
            parseList();
        }
    });//.skip(0).limit(100);//分页解析
};

//解析
function parseList() {
    //解析数据并存入数据库
    if (!data[pageNo]) {
        console.log(‘解析完成. 页码: ‘ + pageNo);
        //更新数据库,修改解析标志位  暂时不处理.

        return false;
    }
    var listItem = data[pageNo];
    var listContent = listItem.content;
    if (!listContent) {
        pageNo = pageNo + 1;
        parseList();
        return false;
    }
    var $ = cheerio.load(listContent);

    //解析页面
    var trElements = $(‘.small-tbimg>tr‘);
    var docArray = [];
    trElements.each(function (index, ele) {
        if ($(ele).find(‘td.dev‘).length > 0) {
            //已经没有这个类型的数据了.
            return false;
        }
        var contact = $(ele).find(‘div.tdiv .f14‘).first().text();
        if (contact) {
            contact = contact.replace(‘:‘, ‘‘);
        }

        var title = $(ele).find(‘div.tdiv>a‘).first().text();

        var company = $(ele).find(‘a.u‘).first().text();
        if (!company) {
            var companyBox = $(ele).find(‘div.tdiv‘);
            companyBox.find(‘b,a,span,i‘).remove();
            company = decodeUtf8(companyBox.html());
            if (company && company.indexOf(‘<br>‘) > 0) {
                company = company.replace(‘company‘, ‘‘).replace(‘%uA0‘, ‘‘);
                company = company.split(‘<br>‘)[2];
            }
        }

        var score = $(ele).find(‘.star00‘).first().attr(‘title‘);

        var detailUrl = $(ele).find(‘div.pjdiv a‘).first().attr(‘href‘);
        if (!detailUrl) {
            detailUrl = $(ele).find(‘div.tdiv a‘).first().attr(‘href‘);
            if (!detailUrl) {
                detailUrl = $(ele).find(‘a.t‘).first().attr(‘href‘);
            }
        } else {
            detailUrl = detailUrl.replace(‘showtype=yuyue&‘, ‘‘);
        }

        var phone = $(ele).find(‘.jumpDiv_tel‘).first().text();
        if (phone) {
            phone = getNumber(phone);
        }
        var item = {
            contact: contact,
            type: listItem.type,
            title: title,
            url: listItem.url,
            detailUrl: detailUrl,
            company: company,
            score: score,
            phone: phone
        };
        docArray.push(item);
    });

    //存入数据库
    parseListModel.create(docArray, function (error) {
        if (error) {
            console.log(error);
        } else {
            console.log(‘保存成功  页码: ‘ + pageNo + ‘  条数: ‘ + docArray.length);
            pageNo = pageNo + 1;
            parseList();
        }
    });
};

//解码utf-8
function decodeUtf8(str) {
    return unescape(str.replace(/&#x/g, ‘%u‘).replace(/;/g, ‘‘))
};

//提取电话号码
function getNumber(str) {
    var reg = /[0-9][0-9]*/g;
    return str.match(reg).join(‘-‘);//带区号的电话号码
};

//这里为整个解析的开始 -- 特么这么烂的代码自己都看不下去了,唯一看得过去的是,能用  .O(∩_∩)O.
//调用...1.取出数据;2 解析数据并存入数据库
queryList();
时间: 2024-11-05 16:07:15

nodejs抓取数据二(列表解析)的相关文章

nodejs抓取数据一(列表抓取)

纯属初学...有很多需要改进的地方,请多多指点... 目标是抓取58同城 这个大分类下的列表数据: http://cd.58.com/caishui/?PGTID=14397169455980.9244072034489363&ClickID=1 简单分析: 1. 按照以下二级分类来获取每个列表的数据, 2. 主要分页: 可以看出,其分页是pn5 这里设置的,那么这个5就是页码了. http://cd.58.com/dailijizh/pn5/?PGTID=1177429071887065549

我也来学着写写WINDOWS服务-解析xml抓取数据并插入数据库

项目告一段落,快到一年时间开发了两个系统,一个客户已经在试用,一个进入客户测试阶段,中间突然被项目经理(更喜欢叫他W工)分派一个每隔两小时用windows服务去抓取客户提供的外网xml,解析该xml,然后将截取的节点字段值插入到已经建好相应结构的表中.并记录日志. xml结构概要如下: <?xml version="1.0" encoding="UTF-8"?> <list> <info> <id>93ef7c7ccc

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

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

java抓取网页数据,登录之后抓取数据。

最近做了一个从网络上抓取数据的一个小程序.主要关于信贷方面,收集的一些黑名单网站,从该网站上抓取到自己系统中. 也找了一些资料,觉得没有一个很好的,全面的例子.因此在这里做个笔记提醒自己. 首先需要一个jsoup的jar包,我用的1.6.0..下载地址为:http://pan.baidu.com/s/1mgqOuHa 1,获取网页内容(核心代码,技术有限没封装). 2,登录之后抓取网页数据(如何在请求中携带cookie). 3,获取网站的ajax请求方法(返回json). 以上这三点我就用一个类

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

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

抓取数据,保存到表格

网上看房子,不过网速太慢,就做个demo来抓数据并存到表格里. 代码如下: using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using HtmlAgilityPack; using System.Data; using System.Reflec

nodejs--实现跨域抓取数据

最近公司安排给我一个任务,抓取页面数据:http://survey.finance.sina.com.cn/static/20205/20131120.html?pid=20205&dpc=1,身为一个前端,还没搞过后台的东西,硬着头皮接下之后,就到网上各种找方法了.最终找到一个nodejs的方法,经过实践之后,觉得非常好用,所以分享给大家.此教程从0开始 ,适用于从来还没接触过nodejs的童鞋!1.先下载 nodejs,这个不多说,然后双击安装文件安装.下载地址:http://www.nod

web scraper 抓取数据并做简单数据分析

其实 web scraper 说到底就是那点儿东西,所有的网站都是大同小异,但是都还不同.这也是好多同学总是遇到问题的原因.因为没有统一的模板可用,需要理解了 web scraper 的原理并且对目标网站加以分析才可以. 今天再介绍一篇关于 web scraper 抓取数据的文章,除了 web scraper 的使用方式外,还包括一些简单的数据处理和分析.都是基础的不能再基础了. 选择这个网站一来是因为作为一个开发者在上面买了不少课,还有个原因就是它的专栏也比较有特点,需要先滚动加载,然后再点击

使用Apache Flume抓取数据(1)

使用Apache Flume抓取数据,怎么来抓取呢?不过,在了解这个问题之前,我们必须明确ApacheFlume是什么? 一.什么是Apache Flume Apache Flume是用于数据采集的高性能系统 ,名字来源于原始的近乎实时的日志数据采集工具,现在广泛用于任何流事件数据的采集,支持从很多数据源聚合数据到HDFS. 最初由Cloudera开发 ,在2011年贡献给了Apache基金会 ,在2012年变成了Apache的顶级项目,Flume OG升级换代成了Flume NG. Flume