博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nodejs抓取数据二(列表解析)
阅读量:6800 次
发布时间:2019-06-26

本文共 4322 字,大约阅读时间需要 14 分钟。

这里做得比较暴力,没有分页取出数据解析,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表示详情没有抓取过.});// modelvar 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表示详情没有抓取过.});// modelvar 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('
') > 0) { company = company.replace('company', '').replace('%uA0', ''); company = company.split('
')[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-8function 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();

 

转载于:https://www.cnblogs.com/ry123/p/4734672.html

你可能感兴趣的文章
SSL协议握手过程
查看>>
博客阅读和思考
查看>>
学习笔记之PostgreSQL / pgAdmin / Psycopg / PostGIS
查看>>
Linux Timer定时器【转】
查看>>
java设计模式-工厂方法模式
查看>>
SAP RFC通信模式
查看>>
基于jQuery+JSON的省市联动效果
查看>>
jquery实现点击显示,再一次点击隐藏
查看>>
NABCD构建APP
查看>>
React 获取 url 参数 —— this.props.match
查看>>
乙佳荣第二次作业
查看>>
request请求的常用属性
查看>>
13-JS中的面向对象
查看>>
[转载]LeetCode: Gray Code
查看>>
Ubuntu 16.04 安装摄像头驱动usb_cam
查看>>
11.23
查看>>
优达学城数据分析师纳米学位——知识点总结2
查看>>
GitHub使用
查看>>
9.react 从入门到放弃
查看>>
(五)UML之协作图
查看>>