`
zhang_xzhi_xjtu
  • 浏览: 538386 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用豆瓣api查找本地电影评分来决定看什么电影

 
阅读更多
下载的电影过多,大把的时间花在到底要看什么电影上。
于是写了一个小程序,可以自动扫描电影在豆瓣的评分,并排序。

程序说明:
1 使用了反射和自定义classloader调用main方法,使得命令行不用指定jar包。
java  -cp .;allen_base-1.0.jar allen.program.Driver allen.douban.main.LocalFilmRating


        try {
            Class<?> type = myClassLoader.loadClass(mainClass);
            Method method = type.getMethod("main", String[].class);
            method.invoke(null, (Object) args0);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

2 使用了org.json包调用豆瓣API。
3 使用了多线程控制调用豆瓣API的频率。
    private static int           limitInMinutes = Config.LimitInMinutes;
    private static AtomicInteger invokeCounter  = new AtomicInteger(
                                                        limitInMinutes);
    private static Thread        monitorThread  = new Thread() {
                                                    @Override
                                                    public void run() {
                                                        while (true) {
                                                            try {
                                                                Thread.sleep(60000);
                                                            } catch (InterruptedException e) {
                                                                System.out
                                                                        .println(e);
                                                            }
                                                            invokeCounter
                                                                    .set(limitInMinutes);
                                                        }
                                                    }
                                                };

    private static void checkCounter() {
        int counter = invokeCounter.decrementAndGet();
        if (counter >= 0) {
            log.debug("pass counter = " + counter);
            return;
        } else {
            log.debug("deny counter = " + counter);
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            log.err(e);
        }

        checkCounter();
    }


4 使用了配置文件控制程序的运行。
#本地电影缓存目录。
MovieCacheDir=I:\douban_base\movie\

#本地个人缓存目录。
CelebrityCacheDir=I:\douban_base\celebrity\


#LocalFilmDirs=K:\todo,K:\allen_film
#本地电影目录。可以多个目录以逗号分隔。
LocalFilmDirs=K:\download


#豆瓣API的调用次数限制,每分钟。豆瓣API上面说不能超过40/min,实际上可以。
LimitInMinutes=40

#本地电影名称中需要过滤掉的字符串。
WordIgnoreInFilmTitle=BD,1280,高清,中字,CD,迅雷,下载,DVD,中英字幕,中英双字,720p

#可以处理的视频后缀名称。字母小写。
SuffixOfFiles=wmv,asf,asx,rm,rmvb,mpg,mpeg,mpe,dat,vob,dv,3gp,3g2,mov,avi,mkv,mp4,m4v,flv,xv

#不可以处理的文件后缀名称。字母小写。
IgnoreSuffixOfFiles=srt,torrent,idx,sub,rar,txt,jpg,zip,mp3


其中
WordIgnoreInFilmTitle配置了电影名称中被替换为空字符串的关键字。
SuffixOfFiles配置了可以处理的视频格式。
IgnoreSuffixOfFiles配置了不可以处理的文件格式。

5 为了减少对豆瓣API的调用次数,对于相似的电影名称进行了处理。
   /**
     * 处理相似的名字。2个名字有一个字符不同,其他相同,则认为2个名字相似。
     * */
    public static List<String> filterSimilarName(List<String> filmNames) {
        if (filmNames.size() <= 1) {
            return filmNames;
        }

        List<String> result = new ArrayList<String>();
        result.add(filmNames.get(0));

        //相同字符的index。
        int lastSimilarIndex = -1;

        for (int i = 1; i < filmNames.size(); i++) {
            String toHandleName = filmNames.get(i);
            String lastHandleName = result.get(result.size() - 1);
            int similarIndex = getSimilar(lastHandleName, toHandleName);

            if (similarIndex == -1) {
                if (lastSimilarIndex != -1) {
                    lastHandleName = lastHandleName.substring(0,
                            lastSimilarIndex)
                            + lastHandleName.substring(lastSimilarIndex + 1);
                    result.set(result.size() - 1, lastHandleName);
                }
                result.add(toHandleName);
                lastSimilarIndex = -1;
            } else {
                //不考虑连续相似的字符串,相似位置不同的情况。
                lastSimilarIndex = similarIndex;
            }
        }

        return result;
    }

    private static int getSimilar(String str1, String str2) {
        if (StringUtil.isEmptyString(str1) || StringUtil.isEmptyString(str2)) {
            return -1;
        }
        if (str1.length() != str2.length()) {
            return -1;
        }

        int similarIndex = -1;
        int differenceCount = 0;
        for (int i = 0; i < str1.length(); i++) {
            char c1 = str1.charAt(i);
            char c2 = str2.charAt(i);
            if (c1 != c2) {
                differenceCount++;
                similarIndex = i;
            }
        }
        if (differenceCount == 1) {
            return similarIndex;
        } else {
            return -1;
        }
    }


6 日志可以修改log4jconfig.xml控制。
7 结果可以在biz.log中查看。

本机跑结果如下:
INFO - 94    美丽人生
INFO - 93    阿甘正传
INFO - 91    天堂电影院
INFO - 91    鬼子来了
INFO - 91    搏击俱乐部
INFO - 91    海上钢琴师
INFO - 91    两杆大烟枪
INFO - 91    黄金三镖客
INFO - 91    三傻大闹宝莱坞
INFO - 90    指环王3:王者无敌
INFO - 90    美国往事
INFO - 90    教父2
INFO - 90    少年派的奇幻漂流
INFO - 89    楚门的世界
INFO - 89    上帝之城
INFO - 89    西游记大结局之仙履奇缘
INFO - 89    活着
INFO - 89    泰坦尼克号
INFO - 89    钢琴家
INFO - 88    指环王1:魔戒再现
INFO - 88    指环王2:双塔奇兵
INFO - 88    低俗小说
INFO - 88    天使爱美丽
INFO - 88    与狼共舞
INFO - 88    西游记第一百零一回之月光宝盒
INFO - 88    地球上的星星
INFO - 88    让子弹飞
INFO - 88    精英部队2:大敌当前
INFO - 87    大鱼
INFO - 87    黑客帝国
INFO - 87    剪刀手爱德华
INFO - 87    拯救大兵瑞恩
INFO - 87    芙蓉镇
INFO - 87    狮子王
INFO - 87    致命魔术
INFO - 86    猜火车
INFO - 86    纵横四海
INFO - 86    杀人回忆
INFO - 86    绿里奇迹
INFO - 86    西伯利亚的理发师
INFO - 86    喜宴
INFO - 86    V字仇杀队
INFO - 86    谍影重重3
INFO - 86    哈利·波特与死亡圣器(下)
INFO - 86    老爷车
INFO - 86    燃情岁月
INFO - 85    非常嫌疑犯
INFO - 85    洛城机密
INFO - 85    西西里的美丽传说
INFO - 85    费城故事
INFO - 85    末代皇帝
INFO - 85    美国X档案
INFO - 85    全金属外壳
INFO - 85    偷拐抢骗
INFO - 85    人工智能
INFO - 85    记忆碎片
INFO - 85    盲井
INFO - 85    赛德克·巴莱
INFO - 84    终结者2
INFO - 84    英国病人
INFO - 84    勇闯夺命岛
INFO - 84    加勒比海盗
INFO - 84    时时刻刻
INFO - 84    两小无猜
INFO - 84    黑天鹅
INFO - 84    朗读者
INFO - 84    这个男人来自地球
INFO - 84    蝙蝠侠:黑暗骑士崛起
INFO - 84    11度青春之《老男孩》
INFO - 83    歌剧魅影
INFO - 83    黑鹰坠落
INFO - 83    爱情是狗娘
INFO - 83    现代启示录
INFO - 83    不可饶恕
INFO - 83    荒岛余生
INFO - 83    谍影重重2
INFO - 83    了不起的狐狸爸爸
INFO - 83    凯尔经的秘密
INFO - 83    谜一样的双眼
INFO - 82    角斗士
INFO - 82    星球大战
INFO - 82    一级恐惧
INFO - 82    星球大战2:帝国反击战
INFO - 82    落水狗
INFO - 82    秋天的童话
INFO - 82    黑客帝国3:矩阵革命
INFO - 82    傲慢与偏见
INFO - 82    米尔克
INFO - 82    国王的演讲
INFO - 81    巴菲的奇妙命运
INFO - 81    夺宝奇兵3
INFO - 81    星球大战3:绝地归来
INFO - 81    罗塞塔
INFO - 81    喜剧之王
INFO - 81    黑客帝国2:重装上阵
INFO - 81    黑皮书
INFO - 81    霍比特人1:意外之旅
INFO - 81    碟中谍4
INFO - 81    社交网络
INFO - 81    黄海
INFO - 80    钢琴课
INFO - 80    英雄本色2
INFO - 80    小鬼当街
INFO - 80    卡特教练
INFO - 80    复仇者联盟
INFO - 80    葬礼上的死亡
INFO - 80    杀手没有假期
INFO - 80    X战警:第一战
INFO - 80    127小时
INFO - 79    苔丝
INFO - 79    大象
INFO - 79    精武英雄
INFO - 79    监狱风云
INFO - 79    星球大战前传1:幽灵的威胁
INFO - 79    九品芝麻官
INFO - 79    十二猴子
INFO - 79    鳗鱼
INFO - 79    你丫闭嘴!
INFO - 79    蝙蝠侠:侠影之谜
INFO - 79    星球大战前传3:西斯的复仇
INFO - 79    风吹麦浪
INFO - 79    四月三周两天
INFO - 79    白丝带
INFO - 79    猩球崛起
INFO - 79    大地惊雷
INFO - 79    单车少年
INFO - 78    迷失东京
INFO - 78    冰血暴
INFO - 78    樱桃的滋味
INFO - 78    夺宝奇兵
INFO - 78    国产凌凌漆
INFO - 78    华氏911
INFO - 78    加勒比海盗2:聚魂棺
INFO - 78    决战犹马镇
INFO - 78    老无所依
INFO - 78    立春
INFO - 78    人生不再重来
INFO - 77    云上的日子
INFO - 77    一条叫旺达的鱼
INFO - 77    碟中谍
INFO - 77    看得见风景的房间
INFO - 77    星球大战前传2:克隆人的进攻
INFO - 77    孔雀
INFO - 77    加勒比海盗3:世界的尽头
INFO - 77    卡波特
INFO - 77    美国黑帮
INFO - 77    潘神的迷宫
INFO - 77    孔雀王2 幻影城
INFO - 76    食神
INFO - 76    黄飞鸿之二:男儿当自强
INFO - 76    秋菊打官司
INFO - 76    毁灭之路
INFO - 76    黑社会
INFO - 76    功夫2
INFO - 76    理发师陶德
INFO - 76    看车人的七月
INFO - 76    预言者
INFO - 76    斗牛
INFO - 76    七个神经病
INFO - 75    性、谎言和录像带
INFO - 75    黄飞鸿之三:狮王争霸
INFO - 75    我的父亲母亲
INFO - 75    菊豆
INFO - 75    机械师
INFO - 75    虎胆龙威4
分享到:
评论
4 楼 a90120411 2014-01-28  
正在写一个Chrome的小插件。谢谢博主分享。
3 楼 zhang_xzhi_xjtu 2013-07-14  
我以前跑,也是经常被封ip的,你可以把每分钟抓取的次数限制调低一点。
JSONObject["subjects"]
这个是由于返回格式不符合导致的。
2 楼 mmxymm 2013-07-12  
另外一旦出现这个问题后,好像要过好久才能再次运行。我怀疑是豆瓣暂时屏蔽了IP访问吧。

能不能吧豆瓣的数据库抓下,然后在本地弄呢。。。瞎想中。
1 楼 mmxymm 2013-07-12  
你好,真的很好用哈。跟博主一样也是选电影花太久时间,真正看上的时候已经很晚了。

不过,我发现一旦目录里的文件过多(比如大于30个),我这里就会出现error,如下。不知博主有无时间能debug看看,呵呵。谢谢啦。


D:\pub_douban>java  -cp .;allen_base-1.0.jar allen.program.Driver allen.douban.m
ain.LocalFilmRating
Exception in thread "main" java.lang.RuntimeException: java.lang.reflect.Invocat
ionTargetException
        at allen.program.Driver.main(Driver.java:36)
Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at allen.program.Driver.main(Driver.java:34)
Caused by: org.json.JSONException: JSONObject["subjects"] not found.
        at org.json.JSONObject.get(JSONObject.java:472)
        at org.json.JSONObject.getJSONArray(JSONObject.java:553)
        at allen.douban.handler.OnlineDataSearcher.searchMovieList(OnlineDataSea
rcher.java:123)
        at allen.douban.handler.OnlineDataSearcher.searchMovie(OnlineDataSearche
r.java:138)
        at allen.douban.handler.OnlineDataSearcher.searchMovieWithoutSave(Online
DataSearcher.java:75)
        at allen.douban.main.LocalFilmRating.main(LocalFilmRating.java:30)
        ... 5 more

D:\pub_douban>pause
Press any key to continue . . .

相关推荐

    原生微信小程序源码 - -豆瓣电影

    8. **网络请求**:使用`wx.request`与豆瓣API交互,获取电影数据,如电影详情、评分、评论等。 9. **状态管理**:小程序的全局状态管理,可以使用微信小程序的Page对象或自定义的State管理库。 10. **生命周期方法**...

    一个简单的微信小程序豆瓣电影

    可以使用微信小程序的view、image、text等组件构建列表结构,同时结合网络请求获取豆瓣API提供的电影数据。 电影详情页面会展示更全面的电影信息,如剧情简介、演员表、导演信息、用户评论等。通过navigator组件,...

    Alfred2的豆瓣电影搜索插件.zip

    而豆瓣电影搜索插件则是对Alfred功能的扩展,它将豆瓣电影的强大数据库集成其中,使得用户无需打开浏览器或者专门的电影应用,即可完成对电影的查找、评分、评论等操作。 首先,让我们深入了解Alfred2的豆瓣电影...

    android 豆瓣apiV2解析json并ListView异步加载图片

    在Android开发中,豆瓣API V2是一个常用的接口,用于获取豆瓣平台上的各种数据,如书籍、电影、音乐等。这个接口返回的数据通常是以JSON(JavaScript Object Notation)格式,需要我们进行解析才能在应用程序中使用...

    豆瓣电影快应用doubanquickapp

    通过这个快应用,用户可以随时随地查找电影信息,查看评分、评论以及上映时间等。 【标签】:“JavaScript开发-混合移动开发”提示我们,该项目采用了JavaScript作为主要编程语言,同时利用了混合移动开发技术。...

    媒体服务-电影信息-移动应用-娱乐-豆瓣电影小程序.zip

    用户可以通过这个小程序轻松查找电影、了解电影详情、阅读评论和评分,甚至参与讨论和分享自己的电影体验。 主要特点: 丰富的电影数据库:接入豆瓣广泛的电影数据库,提供包括新片、经典影片以及各种类型电影的...

    豆瓣的相关资料

    9. **豆瓣API**:豆瓣提供了开放的API接口,允许开发者利用豆瓣的数据和服务开发第三方应用,推动了围绕豆瓣的创新生态。 10. **隐私与社区规则**:豆瓣重视用户的隐私保护,同时也有一套严格的社区规则,旨在维护...

    猎豹、搜狗Sougou 、 Chrome Extension: 豆瓣看电影

    豆瓣电影是中国知名的电影数据库和社区,用户可以查找电影评分、评论、上映日期等信息。通过这个扩展,用户无需离开浏览器就能直接查看这些信息,提高了观影决策的效率。 至于压缩包子文件的文件名称“DoubanMovie....

    豆瓣微信小程序

    2. 数据请求:使用Ajax或小程序内置的wx.request方法与服务器进行数据交换,获取豆瓣API的数据。 3. 响应式设计:适配不同屏幕尺寸的设备,保证界面在各种分辨率下都能良好显示。 4. 离线缓存:利用微信小程序的本地...

    一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息

    因此,我们需要利用浏览器的开发者工具(如Chrome的开发者工具)来查找获取电影信息的API。一旦找到API,我们可以分析其返回的数据格式,通常是JSON。 在Python环境中,我们将使用以下主要库来实现这个爬虫: 1. `...

    Python27 豆瓣影评抓取 源码 及插件下载

    7. **豆瓣API**:虽然直接抓取网页是一种方法,但豆瓣也提供了API接口,允许开发者以更结构化的方式获取数据。然而,需要注意的是,豆瓣API可能有限制,例如请求频率和返回数据的数量。 为了实现豆瓣影评抓取,你...

    doubanbook一个简单的豆瓣图书SDK

    首先,我们来了解一下什么是豆瓣API。豆瓣API是豆瓣网提供的开放接口,允许外部开发者通过HTTP协议请求获取豆瓣平台上的数据,如图书、电影、音乐等资源的相关信息。通过这个SDK,我们可以绕过复杂的API调用流程,...

    微信小程序电影列表

    在这个“微信小程序电影列表”项目中,开发者通过动态获取豆瓣电影API的数据,构建了一个展示电影列表的功能,同时结合了微信地图定位服务,为用户提供了查找附近电影院的便利。 首先,我们来详细了解微信小程序的...

    豆瓣Top250_爬取豆瓣Top250_

    核心知识点四:豆瓣API与反爬策略 豆瓣提供了一些官方API,但它们对于频繁的爬虫请求有限制。因此,大部分情况下,我们需要直接解析网页HTML。同时,要应对豆瓣的反爬策略,如验证码、IP限制等,可能需要用到随机...

    本项目爬取豆瓣Top250电影的几项基本信息,并利用flask框架在网页上将数据可视化.zip

    3. **豆瓣API**:虽然没有明确提及,但通常爬取豆瓣数据可能会涉及到其API。豆瓣提供API供开发者获取数据,但需要注册并获得API密钥。如果项目直接爬取网页而非使用API,可能需要处理反爬虫策略,如设置User-Agent,...

    大一 python 课程大作业,基于爬虫的豆瓣电影小工具.zip

    7. **豆瓣API(可选)**:虽然描述中提到的是基于爬虫,但也可以考虑使用豆瓣开放API,这可能涉及到OAuth认证和JSON数据处理。 8. **模块化编程**:为了提高代码的可读性和复用性,应将功能封装成独立的函数或类。...

    miniprogram-1.zip

    本文将深入探讨如何使用微信小程序平台,结合豆瓣API,开发一个包含“豆瓣电影推荐”、“豆瓣电影评分”以及“电影搜索”三大功能的应用。我们将围绕“miniprogram-1.zip”这个压缩包中的源码,详细解析其设计思路和...

    微信小程序demo:图书馆,豆瓣api,二维码扫描

    调用豆瓣API需要遵循其使用规则,通常需要申请API密钥,并在请求中携带以确保合法使用。 "二维码扫描"功能则让小程序具备了扫描二维码的能力。二维码在现代生活中广泛应用,包括图书条形码、链接分享、支付码等。在...

    豆瓣图书搜索阅读微信读书程序源码.zip

    豆瓣是一个包含电影、音乐、图书等多个领域的社区平台,其中豆瓣图书提供了丰富的图书信息,包括书名、作者、出版社、ISBN、评分、评论等。开发者通过豆瓣开放的API(Application Programming Interface)可以获取...

Global site tag (gtag.js) - Google Analytics