人工智能现场

此刻之前 时间很慢


  • 首页

  • 归档

  • 标签

  • 分类

  • 关于

  • 公益404
人工智能现场

node.js写马蜂窝爬虫 有关ajax

发表于 2017-03-30 |

前言

之前写的爬虫都是直接获取网页内容,解析保存需求数据。然而我后来又遇到一些网页数据使用Ajax获取的,数据不存在于网页的源代码。(高手大神请无视我的见识浅薄) 后来经过学习,终于搞明白这类的网页怎么抓去信息。废话不多说,我们就以马蜂窝为例,做一个简单爬虫。

目标

马蜂窝爬取北京的热门景点。

具体流程

编写代码前,先来到这个网页 http://www.mafengwo.cn/jd/10065/gonglve.html 最下面北京全部景点模块。

打开chrome inspect under network 是这样的

看到这里就可以开始写代码了

核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
attractionsList = function(i,cityname){
superagent
.post('http://www.mafengwo.cn/ajax/router.php')
.type('form')
.send({
'sAct':'KMdd_StructWebAjax|GetPoisByTag',
'iMddid':10065,
'iTagId':0,
'iPage':i,
})
.set('User-Agent', 'Mozilla/5.0')
.end(function(err, res){
var jsonstring = JSON.parse(res.text);
var $ = cheerio.load(jsonstring.data.list)
$('li').each(function(){
var data = $(this);
var href = data.find('a').attr('href');
var title = data.find('a').attr('title');
superagent.get('http://www.mafengwo.cn'+href)
.end(function(err,docs){
if(!err){
var $ = cheerio.load(docs.text)
var summary = $('div.summary').text()
console.log(title);
console.log(summary);
}
})
})
var $$ = cheerio.load(jsonstring.data.page);
if ($$('a.pi.pg-next').length) {
getList(i+1,cityname)
};
});
}

这段代码是获取景点列表后,去景点的详细界面获取景点简介。需要注意的是,爬马蜂窝并发的线程不能太多,否则会被封ip,哈哈。

交友

对互联网技术 机器学习 电影 热门游戏 及其它感兴趣的小伙伴可以加我微信好友。大家一起进步,哈哈。

人工智能现场

node.js 使用superagent,cheerio与async写爬虫(二)

发表于 2017-02-02 |

前一章的已经可以爬到结果,可惜速度太慢了,2016年的妹子图网页大概600页,一页一页的爬完全部需要差不多15分钟。如果可以一次爬十页,就会快很多。用 async 这个库就可以实现。查看全部代码 github
在原来的代码基础上加上这一段。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var pages = [];
for(var i=2300;i>1000;i--){ //从2300页开始
pages.push(i);
}
async.mapLimit(pages, 20, //同时爬取20页
function (page, cb) {
getSeeds(page, cb);
},
function (err, results) {
setTimeout(function () { //等一会儿,其他的页面都callback
console.log(topten)
}, 3000);
}
);
//在getSeeds里面加上callback
if(year =='2015') //当图片的上传时间出现2015就停止
callback(true)
else
callback()

这样用新的代码不到两分钟就爬好了,只是有时会遇到error superagent: double callback bug,这个我还不明白怎么回事,如果你知道这是什么,留言告诉我吧。

人工智能现场

node.js 使用superagent与cheerio写爬虫,福利贴

发表于 2017-02-01 | 分类于 node.js |

前言

对于我这样普通程序员来说,想获取可观的免费数据,最直接的办法就是爬虫了。正好刚学node.js不久,写一个简单的爬虫练练手。废话不多说,直奔主题。

正文

目标

这次要爬的是煎蛋网,找出妹子图2016年度最受欢迎的(oo数量最多的)十张图片。

用到的模块

SuperAgent – 用此来获得网页信息
cheerio – nodejs版的JQuery

具体流程

编写代码前,先打开Chrome分析一下页面源代码 https://i.jandan.net/ooxx/

现在开始写我们的程序,创建一个文件夹,进去之后
npm init ,填上基本信息之后
npm install superagent cheerio --save
新建一个app.js,就可以编写我们的代码逻辑了。
查看全部代码 github

核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
var topten = [{ author : '', date : '',year:'', oo : 0, xx: 0 , url:''}]//需要获取的数据结构
var page = 2300 //从2300页开始爬
var bcontinue = true
getSeeds = function(url){
superagent.get('http://i.jandan.net/ooxx/page-'+url)
.end(function(err,docs){ //通过superagent获取网页数据
page--
if(!err){
console.log(page)
var $ = cheerio.load(docs.text) //使用cheerio解析数据
$('.commentlist li').each(function(){
var json = { author:'', year:'', date:'', oo:0, xx:0, url:''};
var data = $(this);
json.date = data.children().eq(1).text()
json.year = json.date.substring(2, 6)
if(json.year == '2016'){ //存储2016年的妹子图
json.oo = parseInt(data.find("*[id*='cos_support']").text())
json.author = data.children().first().text()
json.xx = parseInt(data.find("*[id*='cos_unsupport']").text())
json.url = data.find('.commenttext p img').attr('src')
var lastone = topten[topten.length-1] //只保存oo次数最多的十张图
if(lastone.oo < json.oo){
topten.push(json)
topten.sort(function(a, b) { return b.oo - a.oo });
if(topten.length>10){
topten.pop()
}
}
}
if(json.year == '2015'){
bcontinue = false
}
})
}
if (bcontinue){
getSeeds(page)
}else{
console.log(topten)
}
})
};

爬到的结果

1
2
3
4
5
6
7
8
9
10
11
12
[ { author: 'Kill',
year: '2016',
date: '@ 2016-09-20 17:47:07',
oo: 1949,
xx: 53,
url: '//ww3.sinaimg.cn/thumb180/0064r0Mujw1f1sb5tt0aug30b4068x6p.gif' },
{ author: 'wjking512',
year: '2016',
date: '@ 2016-12-27 02:59:24',
oo: 1815,
xx: 75,
url: '//ww1.sinaimg.cn/mw600/9b17754bjw1e534athnt4j20m80kgtd1.jpg' },...

说好的福利

前三名

人工智能现场

2017 Hello World

发表于 2017-01-24 | 分类于 闲谈 |

 2016年底的时候开始做一些网站相关的工作。大学毕业三年多了,一直在做移动端的app,此时接触js,有一种从孤岛回到大陆的感觉。也因此建立了这个博客。以后我会将平时的一些想法和工作纪录到这里。由于我天生三分钟热度的性格,可以预见此博客前景叵测。但希望总是美好的,希望能够尽我所能使得此博客能够持续的久一些。

 2016,上半年年读了几本书,看了一些电影,也时常做运动,下半年由于工作变忙,这些都暂停了。现在体重又回到了16年初的水平。读过的书可以记得主要内容的也依稀只剩下几本。电影也是这样。做app这么久了,也终于发布了属于自己的app,Badminton Clans,虽然现在还几乎没人用,也总算对自己有个交代。

 2017,看书看电影运动都要继续。从亚马逊上买了一本书机器学习,争取上半年读完。现在对于nodejs,爬虫,机器学习很感兴趣。会更多的关注这些方面的事情。

黄金时代 王小波

刚读完时,我是想写个书评来着。后来发现网上的关于此书评实在太多,无论写的多好多坏,差不多就是在中间。所以我就不写了。况且我和这本小说之间的伟大友谊并不是悬系在这可有可无的书评上面。我一字一句的读过,想过,这也足够了。就像若干年后王二和陈清扬还是可以相约在小旅馆。若干时间之后,我也可以再读一遍,如果到时内心的激动还是没有退却,我还可以读很多遍。

侠僧探案传奇

我一向是容易被虚假的事物所感动的,只要在电影院看的电影都觉得是好电影。但记性却不好,没过一会儿这种感动就忘了。2016在电影院里看的电影都是这样。在十月的时候,在网上偶然发现了这一系列电影,侠僧探案传奇。看过第一部觉得还不错,就接二连三的看完了其余的几部。电影本身给我的感觉就是真。真,是我在2016重新认识的一个字。一个事物分好坏,但随着时间环境的改变,好坏也很容易随之改变。我觉得真假是比好坏保质期长很多的形容词。我说这部电影真,包括演员,音乐,情节,包括大结局的彩蛋,我都认为很真诚。这让我想起小的时候从报纸上看节目预告,然后守在电视旁等待想看的电影的时候。那时候电影频道上播的电影没有小鲜肉,没有广告植入,很少卖弄情怀,都是演员没有明星,都很真。

Zhongkang

Zhongkang

4 日志
2 分类
1 标签
© 2017 Zhongkang
由 Hexo 强力驱动
主题 - NexT.Pisces
访问人数 访问总量