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

纯属初学...有很多需要改进的地方,请多多指点...

目标是抓取58同城 这个大分类下的列表数据: http://cd.58.com/caishui/?PGTID=14397169455980.9244072034489363&ClickID=1

简单分析:

1. 按照以下二级分类来获取每个列表的数据,

2. 主要分页: 可以看出,其分页是pn5 这里设置的,那么这个5就是页码了.

http://cd.58.com/dailijizh/pn5/?PGTID=117742907188706554997826849&ClickID=1

3. 电话号码: 实在隐藏的div里面,点击 联系商家即可看到.但是对于程序来说.只可以直接取得的.

代码如下:

//抓取58数据
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 proxy = [ //代理
    {ip: ‘120.203.159.14‘, port: ‘8118‘},
    {ip: ‘111.161.246.233‘, port: ‘8118‘},
    {ip: ‘58.30.233.196‘, port: ‘8118‘},
    {ip: ‘113.215.0.130‘, port: ‘80‘},
    {ip: ‘183.218.63.179‘, port: ‘8181‘},
    {ip: ‘120.198.245.36‘, port: ‘8080‘},
    {ip: ‘120.203.158.149‘, port: ‘8118‘},
    {ip: ‘124.240.187.89‘, port: ‘80‘},
    {ip: ‘218.204.140.105‘, port: ‘8118‘},
    {ip: ‘175.1.79.63‘, port: ‘80‘}
];
var proxyIndex = 5;

var flag = false;//判断是否为最后一页
var pageNo = 1;
function crawl() {
    console.log(‘正在抓取 页码: ‘ + pageNo);
    //url需要手动设置一下,每个分类抓完毕后,切换到下一个分类
    //var url = ‘http://cd.58.com/dailijizh/pn‘ + pageNo + ‘/?PGTID=1007041601886955933022299‘ + pageNo + ‘&ClickID=1‘;
    var url = ‘http://cd.58.com/nashuishenbao/pn‘ + pageNo + ‘/?PGTID=1007041601886955933022299‘ + pageNo + ‘&ClickID=1‘;
    var type=‘纳税申报‘;//这里需要手动设置一下分类,对应url分类

    if (flag) {
        console.log(‘抓取完毕.总页数为:‘ + pageNo);
        return false;
    }
    var option = {
        host: proxy[proxyIndex].ip,
        port: proxy[proxyIndex].port,
        method: ‘GET‘,//这里是发送的方法
        path: url,
        header: {
            ‘Host‘: ‘cd.58.com‘,
            ‘Connection‘: ‘keep-alive‘,
            ‘Cache-Control‘: ‘max-age=0‘,
            ‘Accept‘: ‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8‘,
            ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36‘,
            ‘Referer‘: url,
            ‘Accept-Encoding‘: ‘gzip, deflate, sdch‘,
            ‘Accept-Language‘: ‘zh-CN,zh;q=0.8‘,
            ‘Cookie‘: ‘userid360_xml=6B337B22E8098342C5F725D4F58495C6; time_create=1442050990222; id58=05dzXVSaeAcJgzn9Crp9Ag==; bdshare_firstime=1419409592050; bangbangguoqi=true; ppqp=1; tj_ershoubiz=true; tj_ershounobiz=true; CNZZDATA30017898=cnzz_eid%3D443859762-1419406677-%26ntime%3D1431055823; ag_fid=WeYSRnDPQwUjsUJF; myfeet_tooltip=end; quanmyy=forfirst; __ag_cm_=1439442804516; bangbigtip2=1; nearby=NOTSHOW; ipcity=cd%7C%u6210%u90FD; sessionid=4019a46c-3b78-45f9-8af1-d5d576171b60; 58home=cd; bangbangid=1080863912864997567; cookieuid1=05dvUVXOs3ZTEwlzHrnMAg==; __autma=253535702.1952421463.1439442813.1439598477.1439610035.5; __autmc=253535702; __autmz=253535702.1439610035.5.2.autmcsr=cd.58.com|autmccn=(referral)|autmcmd=referral|autmcct=/caishui/; final_history=19947936375429%2C20303113064713%2C16884696076038%2C18742095746434%2C22669284355361; ag_fid=WeYSRnDPQwUjsUJF; __utmt_pageTracker=1; city=cd; Hm_lvt_3bb04d7a4ca3846dcc66a99c3e861511=1439452109,1439458833,1439516942,1439598477; Hm_lpvt_3bb04d7a4ca3846dcc66a99c3e861511=1439627751; __utma=253535702.1249887847.1419409519.1439618478.1439625451.38; __utmb=253535702.20.10.1439625451; __utmc=253535702; __utmz=253535702.1439625451.38.15.utmcsr=cd.58.com|utmccn=(referral)|utmcmd=referral|utmcct=/dailijizh/pn2/; new_session=0; init_refer=http%253A%252F%252Fcd.58.com%252Fdailijizh%252Fpn2%252F%253FPGTID%253D198304873188692623092226919; new_uv=41‘
        }
    };
    //http.request(option, function (res) {//这里为使用代理IP,还有bug,暂时没有解决掉.
    http.get(url, function (res) {
        var data = "";
        res.on(‘data‘, function (chunk) {
            data += chunk;
        });
        res.on("end", function () {
            //解析数据并存入数据库
            var $ = cheerio.load(data);
            if ($(‘a.next‘, ‘div.pager‘).length < 1) {
                flag = true;//设置 抓取完毕的标志
            }
            var item = {
                url: url,
                type: type,
                content: data
            }
            //保存列表数据
            mongooseModel.create(item, function (error) {
                if (error) {
                    console.log(error);
                } else {
                    console.log(‘保存成功  页码: ‘ + pageNo + ‘   ‘ + url);

                    if (proxyIndex = 10) {
                        proxyIndex = 0;
                    } else {
                        proxyIndex = proxyIndex + 1;
                    }
                    pageNo = pageNo + 1;
                    setTimeout(crawl, 5020);//设置为5秒以上,就不会被跳转验证页面,  O(∩_∩)O哈哈~被我发现了. 其实最好是使用代理.
                }
            });
        });
    }).on("error", function (error) {
        console.log(‘抓取错误: ‘ + error.message);
    });
};

//开始抓取数据
crawl();
时间: 2024-10-10 17:02:06

nodejs抓取数据一(列表抓取)的相关文章

Python 字符串——巧取值和列表——巧取值 对比

Python 字符串——巧取值和列表——巧取值 对比 1.字符串取值实例: samp_string = "Whatever you are, be a good one." for i in samp_string: print(i) for i in range(0,len(samp_string)-2,2): print(samp_string[i]+samp_string[i+1]) print('A=',ord("A")) print('65=',chr(6

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

这里做得比较暴力,没有分页取出数据解析,O(∩_∩)O哈哈~,居然没有被挂机.不过解析的坑特别多...不过大部分我想要的数据都拿到了. //解析列表数据 var http = require("http"), cheerio = require("cheerio"), mongoose = require('mongoose'), db = mongoose.createConnection('mongodb://127.0.0.1:27017/crawl58');

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

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

爬虫scrapy抓取w3school课程列表

首先还是先创建scrapy项目,当然这都是在你安装scrapy之后啊,这个scrapy还是在linux系统下最省事,一行指令瞬间安装,这酸爽..... 言归正传啊,创建scrapy文件. <span style="font-size:14px;">scrapy startproject w3school</span> 之后可以查看一下,这个文件的结构,上一次抓取天气的时候还记得吗,我们采用的是tree命令. <span style="font-s

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

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

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

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

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

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

nodejs--实现跨域抓取数据

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

利用“爬虫”抓视频 法院审结全国首例计算机抓取数据案

近期,海淀法院审结了一起利用"爬虫"技术侵入计算机信息系统抓取数据的刑事案件.该案是全国首例利用"爬虫"技术非法入侵其他公司服务器抓取数据,进而实施复制被害单位视频资源的案件. 法院经审理查明,被告单位上海某网络科技有限公司,经营计算机网络科技领域内的技术开发.技术服务.电子商务.电子产品等业务.被告人张某是上海某网络科技有限公司法定代表人兼CEO,负责公司整体运行:被告人宋某于2016年8月至2017年2月任职上海某网络科技有限公司,担任联席CEO,是产品负责人: