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();
nodejs抓取数据二(列表解析)的更多相关文章
- nodejs抓取数据一(列表抓取)
纯属初学...有很多需要改进的地方,请多多指点... 目标是抓取58同城 这个大分类下的列表数据: http://cd.58.com/caishui/?PGTID=14397169455980.924 ...
- PHP获取cookie、Token、模拟登录、抓取数据、解析生成json
本文介绍使用PHP获取cookie,获取Token.以及模拟登录.然后抓取数据.最后解析生成json的的过程. 0. 设置Cookie路径 set_time_limit(0); //使用的cookie ...
- C# 微信 生活助手 空气质量 天气预报等 效果展示 数据抓取 (二)
此文主要是 中国天气网和中国环境监测总站的数据抓取 打算开放全部数据抓取源代码 已在服务器上 稳定运行半个月 webapi http://api.xuzhiheng.cn/ 常量 /// <su ...
- NET 5 爬虫框架/抓取数据
爬虫大家或多或少的都应该接触过的,爬虫有风险,抓数需谨慎. 爬虫有的是抓请求,有的是抓网页再解析 本着研究学习的目的,记录一下在 .NET Core 下抓取数据的实际案例.爬虫代码一般具有时效性,当 ...
- nodejs--实现跨域抓取数据
最近公司安排给我一个任务,抓取页面数据:http://survey.finance.sina.com.cn/static/20205/20131120.html?pid=20205&dpc=1 ...
- java抓取网页数据,登录之后抓取数据。
最近做了一个从网络上抓取数据的一个小程序.主要关于信贷方面,收集的一些黑名单网站,从该网站上抓取到自己系统中. 也找了一些资料,觉得没有一个很好的,全面的例子.因此在这里做个笔记提醒自己. 首先需要一 ...
- 爬虫学习笔记(1)-- 利用Python从网页抓取数据
最近想从一个网站上下载资源,懒得一个个的点击下载了,想写一个爬虫把程序全部下载下来,在这里做一个简单的记录 Python的基础语法在这里就不多做叙述了,黑马程序员上有一个基础的视频教学,可以跟着学习一 ...
- 分布式爬虫:使用Scrapy抓取数据
分布式爬虫:使用Scrapy抓取数据 Scrapy是Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘. ...
- web scraper 抓取数据并做简单数据分析
其实 web scraper 说到底就是那点儿东西,所有的网站都是大同小异,但是都还不同.这也是好多同学总是遇到问题的原因.因为没有统一的模板可用,需要理解了 web scraper 的原理并且对目标 ...
随机推荐
- 如何删除tomcat下的一目
不知道我有没有把问题想简单了,是不是应该把webapps下对应的文件夹删了就可以了. work下面对应的也删掉 这个取决于你在tomcat下发布那个项目的方式. 首先是工程的根目录要删除,然后是工程相 ...
- Dev之ChartControl控件(二)— 绘制多重坐标图形
有时针对一个ChartControl控件可能要设置多个Y轴,进行显示: 以下举个例子:如在一个Chart中显示多个指标项如图: 首先,读取数据,并对左边的Y轴最大和最小值进行设定 IndexSerie ...
- 【使用Itext处理PDF文档(新建PDF文件、修改PDF文件、PDF中插入图片、将PDF文件转换为图片)】
iText简介 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文件转 ...
- Django: 之数据库导入、迁移和联用
Django 数据库导入 从网上下载的一些数据,excel表格,xml文件,txt文件等有时候我们想把它导入数据库,应该如何操作呢? 以下操作符合 Django版本为 1.6 ,兼顾 Django 1 ...
- POJ2096 概率dp 入门
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=118282#problem/B 挺好的一个题目: 不过刚开始嘛,看别人题解长知识.这个人写 ...
- 原创:LoadTest系列之Insert Condition
当脚本中的部分内容需要满足某些条件后才执行时,则可以使用Insert Condition,例如有如下操作: 操作1:登录 操作2:添加一条数据: 在这两个操作中,只有操作1成功后,操作2才有意义,这时 ...
- pscs6
http://wenku.baidu.com/link?url=cO03xdo_GQDdFdeYTDD36ZrjeHarUu4IN-fSEoFAnDXmd5W0yKvzkNWY_vOKKIaKbCdB ...
- Windows系统字体与文件对照表
源:Windows系统字体与文件对照表 宋体 (TrueType) = SIMSUN.TTF 黑体 (TrueType) = simhei.ttf 楷体_GB2312 (TrueType) = sim ...
- Delphi xe7并行编程快速入门(转)
源:http://blog.csdn.net/henreash/article/details/41315183 现在多数设备.计算机都有多个CPU单元,即使是手机也是多核的.但要在开发中使用多核的优 ...
- ural1470 UFOs
UFOs Time limit: 2.0 secondMemory limit: 64 MB Vasya is a ufologist and his duties include observing ...