最近在更新Subtitls-view的过程中,涉及到字幕的搜索和下载,于是针对字幕库写了一个简单的爬虫Demo,姑且记点笔吧~

因为是通过网页抓取,查看网站搜索下载逻辑后可以简单的分为如下三个步骤。(demo依赖jsoup和hutool,请自行加入pom文件中)


1、获取影片列表

这一步模拟的是发起搜索,可以看到,关键字可能涉及多部影片,此步骤即可获得影片列表以及其对应页面。代码如下:

Document document = Jsoup.connect("http://www.zimuku.la/search?q="+ "西部世界").get();
        Elements elements = document.getElementsByClass("tt clearfix");
        elements.forEach(element -> {
            String href = "http://www.zimuku.la"+ element.getElementsByTag("a").attr("href");
            String name = element.getElementsByTag("b").text();
            log.info("片名:{}, 链接:{}", name, href);
        });

2、获取字幕列表

请求上一步影片地址,即可得到其字幕列表以及每一个字幕语言格式等详细信息,注意这里并没有分页,如果目标网站有分页需要处理一下。此步骤还可以截取到字幕id,拼接后即可获得下载页地址,而不需要继续进入详情页。代码如下:

Document subDetail = Jsoup.connect("http://www.zimuku.la/subs/52204.html").get();
        Elements tbody = subDetail.getElementsByTag("tbody").get(0).getElementsByTag("tr");
        for (Element element : tbody)  {
            Element first = element.getElementsByClass("first").first();
            Element tac_lang = element.getElementsByClass("tac lang").first();
            String href = "http://zmk.pw"+ StrUtil.replace(first.getElementsByTag("a").attr("href"), "detail", "dld");
            String title = first.getElementsByTag("a").attr("title");
            String type = first.getElementsByClass("label label-info").text();
            String lang = tac_lang.getElementsByTag("img").attr("alt");
            log.info("标题:{},类型:{}, 语言:{},链接:{}", title, type, lang, href);
        }

3、下载字幕文件

请求上一步得到的下载链接。由于网站还有一个下载页面,这里需要从下载页面中获取真实下载链接。多个下载地址依次请求,直到下载成功。需要注意的是,一般下载都是有重定向的,打开控制台即可看到下载请求还经过两次重定向,记得要配置一下重定向次数,否在得不到真实文件。代码如下:

Elements downs = Jsoup.connect("http://zmk.pw/dld/145539.html").get().getElementsByTag("li");
        for (Element d : downs) {
            try {
                String link = "http://zmk.pw" + d.getElementsByTag("a").attr("href");
                HttpResponse resp = HttpRequest
                        .get(link)
                        .header("Host", "zmk.pw")
                        .header("Referer", "http://zmk.pw/dld/145539.html")
                        .setMaxRedirectCount(3).timeout(8000).execute();
                String name = resp.header("Content-Disposition");
                if (StrUtil.isNotEmpty(name)){
                    name = ReUtil.get("\"(.*)\"", name, 1);
                    resp.writeBody(new File("C:\\Users\\admin\\Desktop\\666\\"+ name));
                    break;
                }
            }catch (Exception e){
                log.info("该通道下载失败" );
            }
        }
        log.info("done~");

到这里就结束了,下载到的文件是压缩包,解压操作就不列举了。demo虽然可以直接运行,但仅用作示例,不保证长久有效,也不建议频繁访问,会封ip的。酱~

标签: Demo

添加新评论