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

来源:互联网 发布:sai在mac虚拟机没压感 编辑:程序博客网 时间:2024/05/17 03:01

最近做个电影的东西,突发奇想把豆瓣的电影条目扒下来一点,看了下,现在大概有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)    })}
0 0