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 的原理并且对目标 ...
随机推荐
- POJ 2635 The Embarrassed Cryptographer(大数求余)
题意:给出一个大数,这个大数由两个素数相乘得到,让我们判断是否其中一个素数比L要小,如果两个都小,输出较小的那个. 分析:大数求余的方法:针对题目中的样例,143 11,我们可以这样算,1 % 11 ...
- 学习笔记——模板模式Template
模板模式,主要是利用多态来实现具体算法和父类逻辑的松耦合.父类中TemplateMethod内部定义了相应的算法操作顺序,子类负责实现相应的具体实现. 举例: 项目中曾遇到过一个需求,叫做高级价格体系 ...
- 查看UDP连接情况
运行界面,输入"CMD"命令; 在命令提示符界面中,输入"netstat -s -p udp"命令,按回车.即可显示本机所有UDP连接情况.
- PHPer转战Android的学习过程以及Android学习
原文作者: eoeadmin原文地址: http://my.eoe.cn/shuhai/archive/19684.html-------------------------------------- ...
- java项目开发第五天——奋力完成数据库
又一次成功地避开了UI界面,看来以后在这个部分得残了,无奈,心塞,不知为何.今天人品不好,大清早在群里签到居然和机器人聊起来了,顿时感觉智商被碾压,还下载了一个QQ空间背景复制器,看了看果真是实现了, ...
- haar_adaboost_cascade阅读资料
1,AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图 2,浅谈 Adaboost 算法 3,浅析人脸检测之Haar分类器方法 4,http://wenku.bai ...
- jsp如果超过字数就变成...
<script> var infoTitle = '<ww:property value="infoTitle"/>'; if(infoTitle.leng ...
- 需要注意的subList方法!和substring是不一样的!从源码解释他们的不同。
很多时候我们截取字符串用的是substring方法,很自然用着,但是对于列表的截取时很多时候就用得很少,但是其实他们是很不一样的,具体哪里不一样呢? package main; import java ...
- Left/Right/Inner Join用法和区别
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只 ...
- Android源码之Gallery专题研究(1)
前言 时光飞逝,从事Android系统开发已经两年了,总想写点什么来安慰自己.思考了很久总是无法下笔,觉得没什么好写的.现在终于决定写一些符合大多数人需求的东西,想必使用过Android手机的人们一定 ...