您的位置:首页 > Web前端 > Node.js

一次用爬虫扒取豆瓣电影条目信息的尝试

2017-05-10 18:11 453 查看
最近做个电影的东西,突发奇想把豆瓣的电影条目扒下来一点,看了下,现在大概有140个左右的条目,这些条目分得比较细,连某个人的电影都分了出来,所以重复的也比较多,当然这些我都还没细弄,只是大致扒了一点,而且因为扒得太快,导致暂时被封ip了。

昨天尝试了很久,本来不登录也能正常扒取电影信息,但是现在不行了,必须要登录。

豆瓣的反扒机制做得很简陋,以至于我成功时候以为就没有反扒机制。

刚开始是直接通过链接来扒取,豆瓣有的网页是返回json字符串,有的是返回整个网页,所以要区分开来。

整个扒取最关键的一点是初次登录时候response的headers里面set-cookie中的“dbcl2”一项,登录豆瓣时候的login返回的headers中set-cookie是有多项的,我没在npm库里面找到有什么好的解析方法,所以这个只能每次扒的时候手动添加,请求时候添加cookie用的是tough-cookie,这个库还是比较好用的,配合request-promise-native很简单,官方也有例子,大致看下就会了。

放一个获取单页20个条目的源代码,tough-cookie官方给的例子我觉得有的地方不太清晰,其实直接按照

let cookieJar = new request.jar()
cookieJar.setCookie('key=value', 'https://movie.douban.com')


这种格式设置就行了,多个就写多行。

代码

let getSinglePage = function (url) {
return new Promise((resolve, reject) => {
let getPage =  function () {
let cookieJar = new request.jar()
cookieJar.setCookie('dbcl2="你的dbcl2值"', 'https://movie.douban.com')
let options = {
uri: url,
jar: cookieJar,
transform: function(body) {
console.log('body', body)
return cheerio.load(body)
}
}
rp(options).then(($) => {
let movieInfos = []
console.log('$', $)
$('.nbg').each(function(index, el) {
let movieInfo = {}
movieInfo.title = $(this).attr('title')
movieInfo.url = $(this).attr('href')
movieInfo.poster = $(this).find('img').attr('src')
movieInfo.rating = $(this).parent().next().find('span[class=rating_nums]').text()
movieInfos.push(movieInfo)
});
resolve(movieInfos)
}).catch((err) => {
reject(err)
})

}
setTimeout(getPage(), 2000)
})
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息