`
zhang_xzhi_xjtu
  • 浏览: 543053 次
  • 性别: 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 . . .

相关推荐

    智慧园区3D可视化解决方案PPT(24页).pptx

    在智慧园区建设的浪潮中,一个集高效、安全、便捷于一体的综合解决方案正逐步成为现代园区管理的标配。这一方案旨在解决传统园区面临的智能化水平低、信息孤岛、管理手段落后等痛点,通过信息化平台与智能硬件的深度融合,为园区带来前所未有的变革。 首先,智慧园区综合解决方案以提升园区整体智能化水平为核心,打破了信息孤岛现象。通过构建统一的智能运营中心(IOC),采用1+N模式,即一个智能运营中心集成多个应用系统,实现了园区内各系统的互联互通与数据共享。IOC运营中心如同园区的“智慧大脑”,利用大数据可视化技术,将园区安防、机电设备运行、车辆通行、人员流动、能源能耗等关键信息实时呈现在拼接巨屏上,管理者可直观掌握园区运行状态,实现科学决策。这种“万物互联”的能力不仅消除了系统间的壁垒,还大幅提升了管理效率,让园区管理更加精细化、智能化。 更令人兴奋的是,该方案融入了诸多前沿科技,让智慧园区充满了未来感。例如,利用AI视频分析技术,智慧园区实现了对人脸、车辆、行为的智能识别与追踪,不仅极大提升了安防水平,还能为园区提供精准的人流分析、车辆管理等增值服务。同时,无人机巡查、巡逻机器人等智能设备的加入,让园区安全无死角,管理更轻松。特别是巡逻机器人,不仅能进行360度地面全天候巡检,还能自主绕障、充电,甚至具备火灾预警、空气质量检测等环境感知能力,成为了园区管理的得力助手。此外,通过构建高精度数字孪生系统,将园区现实场景与数字世界完美融合,管理者可借助VR/AR技术进行远程巡检、设备维护等操作,仿佛置身于一个虚拟与现实交织的智慧世界。 最值得关注的是,智慧园区综合解决方案还带来了显著的经济与社会效益。通过优化园区管理流程,实现降本增效。例如,智能库存管理、及时响应采购需求等举措,大幅减少了库存积压与浪费;而设备自动化与远程监控则降低了维修与人力成本。同时,借助大数据分析技术,园区可精准把握产业趋势,优化招商策略,提高入驻企业满意度与营收水平。此外,智慧园区的低碳节能设计,通过能源分析与精细化管理,实现了能耗的显著降低,为园区可持续发展奠定了坚实基础。总之,这一综合解决方案不仅让园区管理变得更加智慧、高效,更为入驻企业与员工带来了更加舒适、便捷的工作与生活环境,是未来园区建设的必然趋势。

    labelme标注的json转mask掩码图,用于分割数据集 批量转化,生成cityscapes格式的数据集

    labelme标注的json转mask掩码图,用于分割数据集 批量转化,生成cityscapes格式的数据集

    (参考GUI)MATLAB GUI漂浮物垃圾分类检测.zip

    (参考GUI)MATLAB GUI漂浮物垃圾分类检测.zip

    人脸识别_OpenCV_活体检测_证件照拍照_Demo_1741778955.zip

    人脸识别项目源码实战

    人脸识别_科大讯飞_Face_签到系统_Swface_1741770704.zip

    人脸识别项目实战

    跟网型逆变器小干扰稳定性分析与控制策略优化simulink仿真模型和代码.zip

    本仿真模型基于MATLAB/Simulink(版本MATLAB 2016Rb)软件。建议采用matlab2016 Rb及以上版本打开。(若需要其他版本可联系代为转换) CSDN详情地址:https://blog.csdn.net/qq_50594161/article/details/146242453sharetype=blogdetail&sharerId=146242453&sharerefer=PC&sharesource=qq_50594161&spm=1011.2480.3001.8118

    16-1文本表示&词嵌入.ipynb

    实战练习分词、创建词表、文本处理

    45页-零碳智慧园区标准解决方案:模块化、可扩展且可复制的解决方案.pdf

    在智慧园区建设的浪潮中,一个集高效、安全、便捷于一体的综合解决方案正逐步成为现代园区管理的标配。这一方案旨在解决传统园区面临的智能化水平低、信息孤岛、管理手段落后等痛点,通过信息化平台与智能硬件的深度融合,为园区带来前所未有的变革。 首先,智慧园区综合解决方案以提升园区整体智能化水平为核心,打破了信息孤岛现象。通过构建统一的智能运营中心(IOC),采用1+N模式,即一个智能运营中心集成多个应用系统,实现了园区内各系统的互联互通与数据共享。IOC运营中心如同园区的“智慧大脑”,利用大数据可视化技术,将园区安防、机电设备运行、车辆通行、人员流动、能源能耗等关键信息实时呈现在拼接巨屏上,管理者可直观掌握园区运行状态,实现科学决策。这种“万物互联”的能力不仅消除了系统间的壁垒,还大幅提升了管理效率,让园区管理更加精细化、智能化。 更令人兴奋的是,该方案融入了诸多前沿科技,让智慧园区充满了未来感。例如,利用AI视频分析技术,智慧园区实现了对人脸、车辆、行为的智能识别与追踪,不仅极大提升了安防水平,还能为园区提供精准的人流分析、车辆管理等增值服务。同时,无人机巡查、巡逻机器人等智能设备的加入,让园区安全无死角,管理更轻松。特别是巡逻机器人,不仅能进行360度地面全天候巡检,还能自主绕障、充电,甚至具备火灾预警、空气质量检测等环境感知能力,成为了园区管理的得力助手。此外,通过构建高精度数字孪生系统,将园区现实场景与数字世界完美融合,管理者可借助VR/AR技术进行远程巡检、设备维护等操作,仿佛置身于一个虚拟与现实交织的智慧世界。 最值得关注的是,智慧园区综合解决方案还带来了显著的经济与社会效益。通过优化园区管理流程,实现降本增效。例如,智能库存管理、及时响应采购需求等举措,大幅减少了库存积压与浪费;而设备自动化与远程监控则降低了维修与人力成本。同时,借助大数据分析技术,园区可精准把握产业趋势,优化招商策略,提高入驻企业满意度与营收水平。此外,智慧园区的低碳节能设计,通过能源分析与精细化管理,实现了能耗的显著降低,为园区可持续发展奠定了坚实基础。总之,这一综合解决方案不仅让园区管理变得更加智慧、高效,更为入驻企业与员工带来了更加舒适、便捷的工作与生活环境,是未来园区建设的必然趋势。

    人脸识别_活体检测_数据录入_登录系统Face_Login_1741778308.zip

    人脸识别项目源码实战

    学生信息管理平台是一个基于Java Web技术的综合性管理平台

    学生信息管理系统是一个基于Java Web技术的综合性管理平台。通过此系统,可以实现对学生、教师、选课信息等的动态管理, 提升学校管理效率。系统采用分层架构设计,前端使用HTML、CSS,JavaScript和jQuery,后端基于Servlet,JSP和Spring框架,数据库采用MySQL。主要有四个大功能,学生管理( 增加学生信息、删除学生信息、修改学生信息、查询学生信息)、教师管理(增加教师信息、删除教师信息、修改教师信息、查询教师信息)、选课信息管理(添加选课、查询选课情况、删除选课记录)、系统管理( 登录与注册功能、 用户角色管理(老师,学生,管理员)、系统日志查看)。 技术架构 1.前端技术 HTML,CSS:静态页面布局与样式 JavaScript,jQuery:动态交互、DOM操作和AJAX请求 2.后端技术 Servlet:控制层,处理用户请求 JSP:页面动态生成 Spring:依赖注入,业务逻辑分离 3.数据库 MySQL:存储学生、教师,课程等数据 JDBC:数据库连接与操作

    PHP进阶系列之Swoole入门精讲(课程视频)

    本课程是 PHP 进阶系列之 Swoole 入门精讲,系统讲解 Swoole 在 PHP 高性能开发中的应用,涵盖 协程、异步编程、WebSocket、TCP/UDP 通信、任务投递、定时器等核心功能。通过理论解析和实战案例相结合,帮助开发者掌握 Swoole 的基本使用方法及其在高并发场景下的应用。 适用人群: 适合 有一定 PHP 基础的开发者、希望提升后端性能优化能力的工程师,以及 对高并发、异步编程感兴趣的学习者。 能学到什么: 掌握 Swoole 基础——理解 Swoole 的核心概念,如协程、异步编程、事件驱动等。 高并发处理——学习如何使用 Swoole 构建高并发的 Web 服务器、TCP/UDP 服务器。 实战项目经验——通过案例实践,掌握 Swoole 在 WebSocket、消息队列、微服务等场景的应用。 阅读建议: 建议先掌握 PHP 基础,了解 HTTP 服务器和并发处理相关概念。学习过程中,结合 官方文档和实际项目 进行实践,加深理解,逐步提升 Swoole 开发能力。

    人脸识别_表情分析_spider运行_数据采集用途_1741771318.zip

    人脸识别项目实战

    美颜_GPUimage_人脸识别_动态贴纸_Demo_1741771705.zip

    人脸识别项目实战

    人脸照片文件批量分辨率裁剪工具

    功能简介:本工具可实现批量对照片文件的人脸识别,并按指定分辨率进行转换保存。 可为人脸识别采集系统提供很好的辅助工具。 软件基本于OPENVC开发,识别精确,转换高效。 人脸识别工具 +人脸采集处理

    基于强化学习与肌肉长度反馈控制的高效无意识姿态稳定算法研究(可复现,有问题请联系博主)

    内容概要:本文探讨了利用肌长变化反馈控制(FCM-ML)和演员-评论家强化学习(ACRL-NGN)来有效实现人体上肢和下肢无意识姿态稳定的算法方法。通过构建一个包含949条肌肉和22个关节的全身计算模型,在不同初始姿势的情况下进行模拟试验,验证了这些方法的有效性和鲁棒性,结果显示FCM-ML方法比其他传统方法更适用于此类任务。研究指出人类及其他脊椎动物在无意识状态下,通过抗拮抗性的肌肉长度变化反馈机制来维持舒适状态下的自然身体姿势(NBP)。此外,研究还表明这种控制策略有助于机器人设计、运动员训练以及康复患者的治疗。 适用人群:生物力学、机器人学以及神经科学领域的研究人员、工程师,以及关注人体姿态控制及其应用的学者和技术人员。 使用场景及目标:①解释人和非人的脊椎动物如何在无意识情况下维持最佳姿势,特别是处于重力环境中的自然身体姿势(NBP)。②为机器人肌肉控制提供理论支持和发展方向,特别是在模拟多肌肉协调控制方面。③指导运动训练及病患恢复计划的设计与优化。 其他说明:研究发现ACRL-NGN结合FCM-ML不仅能够迅速有效地实现期望的姿态稳定性,而且不需要对肌肉分类,这使其在复

    反编译apk重要的工具之一

    反编译apk重要的工具之一

    `计算机视觉_Python_PyQt5_Opencv_综合图像处理与识别跟踪系统`.zip

    人脸识别项目实战

    FDTD复现圆偏振超透镜 ,FDTD; 复现; 圆偏振; 超透镜;,FDTD技术在超透镜复现圆偏振的实践

    FDTD复现圆偏振超透镜 ,FDTD; 复现; 圆偏振; 超透镜;,FDTD技术在超透镜复现圆偏振的实践

    计算机视觉_手势识别_Matlab_交互用途_1741857188.zip

    手势识别项目实战

Global site tag (gtag.js) - Google Analytics