这里做得比较暴力,没有分页取出数据解析,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();

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

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

    纯属初学...有很多需要改进的地方,请多多指点... 目标是抓取58同城 这个大分类下的列表数据: http://cd.58.com/caishui/?PGTID=14397169455980.924 ...

  2. PHP获取cookie、Token、模拟登录、抓取数据、解析生成json

    本文介绍使用PHP获取cookie,获取Token.以及模拟登录.然后抓取数据.最后解析生成json的的过程. 0. 设置Cookie路径 set_time_limit(0); //使用的cookie ...

  3. C# 微信 生活助手 空气质量 天气预报等 效果展示 数据抓取 (二)

    此文主要是 中国天气网和中国环境监测总站的数据抓取 打算开放全部数据抓取源代码 已在服务器上 稳定运行半个月 webapi http://api.xuzhiheng.cn/ 常量 /// <su ...

  4. NET 5 爬虫框架/抓取数据

    爬虫大家或多或少的都应该接触过的,爬虫有风险,抓数需谨慎.  爬虫有的是抓请求,有的是抓网页再解析 本着研究学习的目的,记录一下在 .NET Core 下抓取数据的实际案例.爬虫代码一般具有时效性,当 ...

  5. nodejs--实现跨域抓取数据

    最近公司安排给我一个任务,抓取页面数据:http://survey.finance.sina.com.cn/static/20205/20131120.html?pid=20205&dpc=1 ...

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

    最近做了一个从网络上抓取数据的一个小程序.主要关于信贷方面,收集的一些黑名单网站,从该网站上抓取到自己系统中. 也找了一些资料,觉得没有一个很好的,全面的例子.因此在这里做个笔记提醒自己. 首先需要一 ...

  7. 爬虫学习笔记(1)-- 利用Python从网页抓取数据

    最近想从一个网站上下载资源,懒得一个个的点击下载了,想写一个爬虫把程序全部下载下来,在这里做一个简单的记录 Python的基础语法在这里就不多做叙述了,黑马程序员上有一个基础的视频教学,可以跟着学习一 ...

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

    分布式爬虫:使用Scrapy抓取数据 Scrapy是Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘. ...

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

    其实 web scraper 说到底就是那点儿东西,所有的网站都是大同小异,但是都还不同.这也是好多同学总是遇到问题的原因.因为没有统一的模板可用,需要理解了 web scraper 的原理并且对目标 ...

随机推荐

  1. acm课程练习2--1013(同1014)

    题目描述 There is a strange lift.The lift can stop can at every floor as you want, and there is a number ...

  2. Python 安装matplotlib,six,dateutil,pyparsing 完整过程

    [摘要:正在做词频剖析的时间,须要用matlotlib 做图表,柱状图啥的,因而便最先了一个又一个的装置库的进程 由于matplotlib 须要依附很多其他科教盘算的第三圆库,须要一个一个的装置了.. ...

  3. CodeForces 678B The Same Calendar

    暴力.一年一年判断过去.如果某一年与输入的年份闰年性质相同,并且1月1日是星期几相同,那么输出. #include<cstdio> #include<cstring> #inc ...

  4. 阅读 LdrInitializeThunk

    参考: http://blog.csdn.net/hw_henry2008/article/details/6568255 Windows 的 DLL 装入(除 ntdll.dll 外)和连接是通过 ...

  5. Itext简绍及操作PDF文件

    iText简介 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文件转 ...

  6. storm第一篇--概念,例子,参数优化

    1 概念 目前最新的0.8.0版本里面 worker -> 进程.一个worker只能执行同一个spout/bolt的task,一个worker里面可以有多个executor. executor ...

  7. HBase集群安装

    1.HBase的机群搭建过程(在原来的hadoop0上的HBase伪分布基础上进行搭建)1.1 集群结构,主节点(hmaster)是hadoop0,从节点(region server)是hadoop1 ...

  8. HTTP状态码 - HTTP Status Code

    HTTP Status Code 常见的状态码: HTTP: Status 200 – 服务器成功返回网页HTTP: Status 404 – 请求的网页不存在HTTP: Status 503 – 服 ...

  9. Linux查看文件最后几行的命令,日志的福音啊

    tail -n 20 filename说明:显示filename最后20行

  10. 关于Stringbulider类

    在使用String类构造一个字符串时,要给它分配足够的内存来保存字符串,但StringBuilder通常分配的内存会比需要的更多.开发人员可以选择显式指定StringBuilder要分配多少内存,但如 ...