最近和朋友们一起看悬疑电影,会百度了解信息并把想看的电影写在记事本中,突然萌生了一个想法,能不能写一个简单的程序每次自动下载记事本中想看的电影。因此用了一个下午和一个晚上的时间学习和编写了一个简单的Java爬虫程序。

Jsoup爬取电影数据并筛选下载

  • 1、目标网站分析
  • 2、编写jsoup爬虫代码
  • 3、从远程数据库中获取数据并筛选下载电影
  • 4、总结

1、目标网站分析

首先对于要爬取的网站进行分析,经尝试发现,网站中大概有不到59000个电影,每个电影对应的网页是相应编号.html,我猜测这是这个电影对应的数据库id,部分编号页面无法打开,可能是因为政策或者一些限制下架,每个页面中对应的类名相同,因此循环59000次对对应页面的电影信息进行爬取。

个人喜欢看清晰度比较高的电影,所以只抓取大小为GB级的电影。

写好后在服务器上运行代码爬取到服务器的数据库中,同时服务器mysql开启远程数据库,方便后面筛选代码的进行(由于没有多线程爬取,可能运行会很慢,我运行了大概两天)

2、编写jsoup爬虫代码

具体参考这篇文章:
https://www.cnblogs.com/youqc/p/10251485.html

package downloadmovie;import java.io.IOException;
import java.util.ArrayList;
import java.util.regex.Pattern;import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class getJson {//根据url获取数据public Document getHtmlTextByUrl(String url){Document document=null;try{int i=(int)(Math.random()*1000);做一个随机延时,防止网站屏蔽while (i!=0) {i--;}document=Jsoup.connect(url).data("query","Java").userAgent("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36").cookie("auth", "token").timeout(300000).post();}catch(Exception e){e.printStackTrace();try{document=Jsoup.connect(url).timeout(5000000).get();}catch(Exception e1){e1.printStackTrace();}}return document;}//根据元素属性获取某个元素内的elements列表public Element getElementByClass(Document document,String className){Element element=null;//System.out.println(document.select(className));Elements es2 = document.select(className);if(es2.size()>0&&es2!=null){element=es2.get(0);}return element;}public ArrayList<String []> getMovies(String url,String type){ArrayList<String[]> result=new ArrayList<String[]>();String classtype="."+type;//从网络上获取网页Document document=getHtmlTextByUrl(url);if (document!=null) {Element element=getElementByClass(document,classtype);// ulif(element!=null){//System.out.println(element);for(Element e:element.children()){// 依次循环每个元素,也就是一个liif(e!=null&&e.children().size()>=2){// 一个li包含两个a标签//System.out.println("first");//System.out.println(e.children().get(1));//取第二个a标签String magnet = e.children().get(1).select("a").attr("href");String temp= e.children().get(1).select("a").text();//System.out.println(temp);String[] message=temp.split(" ");String fullname=message[0];if(fullname.contains(".")){String Chinesename=fullname.substring(0, fullname.indexOf(".",fullname.indexOf(".")));//System.out.println(Chinesename);if(message.length>=2){String size=message[1];if(message.length>=3){String danwei=message[2];//System.out.println(fullname+"///"+size+"///"+danwei);       //if(danwei.equals("GB"))System.out.println("yes");if(isNumber(size) && danwei.equals("GB")){String []movies = new String[4];movies[0]=Chinesename;movies[1]=fullname;movies[2]=size;movies[3]=magnet;/*for(int i=0;i<movies.length;i++){System.out.println(movies[i]);}*/result.add(movies);}          }}}}}}}return result;}public static void main(String[] args) {DBManager.createtable();int pages;for(pages=1;pages<59000;pages++){String url="https://www.bttiantangok.com/movie/"+pages+".html";String type="dlist";ArrayList<String []> movies = new ArrayList<String []>();movies = new getJson().getMovies(url, type);//System.out.println(new getJson().getMovies(url, type).isEmpty());if(movies!=null&movies.size()>0){for(String []movie : movies){//System.out.println(moviemessage(movie));Movie m = new Movie(1, movie[0], movie[1], String.valueOf(pages), movie[2], movie[3]);DBManager.insert(m);}System.out.println("已经爬取了第"+pages+"个电影!");}//System.out.println(new getJson().getMovies(url, type));/*DBManager.createtable();Movie movie= new Movie(3,"chineseName", "fullName", "number", "size", "magnet");DBManager.insert(movie);*/}}public static boolean isNumber(String str){if (null == str || "".equals(str)) {return false;}Pattern pattern = Pattern.compile("^[-\\+]?[.\\d]*$");return pattern.matcher(str).matches();}public static String moviemessage(String []movie){String result="";for(int i=0; i<movie.length;i++){result+=movie[i];result+=" ";}return result;}}    

总体思想就是在chrome浏览器中f12键查看标签信息,逐步获取子项的信息,进行相应的处理后存入数据库中。

对于本次实战来说就是获取dlist类下每个li的第二个a标签

效果图如下:

3、从远程数据库中获取数据并筛选下载电影

这部分比较简单,首先读取txt文件中的电影内容,检测移动硬盘电影目录中如果没有该文件夹就自动创建,循环对每个电影从数据库中进行选取(由于只有10万级的数据,所以Select也比较快),然后将电影分为两个List并排序,如果有12G以下的电影就下载最大的那个,否则就下载12G以上电影中最小的那个。将每个电影的magnet拼接,并复制到剪贴板中。

一开始想直接调用接口使电影下载到对应的目录中,但目前只发现打开迅雷的cmd命令,但没找到参数设置的格式。(参考了几篇python爬虫的文章,里面也讲到下载文件夹这一参数并无作用)见:

https://blog.csdn.net/qq_38188725/article/details/83713689

因此只能每次打开迅雷,迅雷会自动感应磁链,然后手工按顺序下载到对应文件夹中。。。


如果有朋友知道迅雷的命令行参数,恳请留言告知

4、总结

总体而言这一问题实现起来比较简单,也没有使用maven,mybatis等,直接引入jar包,工程及jar包在:

工程及jar包

仅供学习与交流

Java爬虫初学——爬取BT电影天堂电影的磁力链接并筛选下载相关推荐

  1. java爬虫京东商品,Java爬虫实现爬取京东上的手机搜索页面 HttpCliient+Jsoup

    1.需求及配置 需求:爬取京东手机搜索页面的信息,记录各手机的名称,价格,评论数等,形成一个可用于实际分析的数据表格. 使用maven项目,log4j记录日志,日志仅导出到控制台. maven依赖如下 ...

  2. 爬虫初学——爬取京东商品的评论(一)

    最近,初学了一些爬虫的知识,然后刚好被老师要求去爬取一些评论数据(淘宝.京东等),来进行深度学习识别虚假评论.然后咋办咧,东搜搜西搜搜,看有没有什么好的办法.毕竟之前可是被反爬机制很强的网站弄得毫无头 ...

  3. 第一次写爬虫程序爬取豆瓣5W条电影数据

    第一次写爬虫程序爬取豆瓣5W条电影数据 最近工作比较不是很忙,想到之前使用httpclient和jsoup爬取过一次豆瓣电影TOP250,但总觉得数据量太小,不过瘾.于是趁着最近不是很忙的机会,重新写 ...

  4. 【JAVA爬虫】爬取猫眼电影TOP100并将数据存入数据库

    前几天的简单写了个利用JSOUP进行JAVA爬虫,里面有谈到后续版本会更新数据库操作,所以这次来更新了. 版本更新 此次的版本里数据爬取部分新增了[电影主演-star]和[电影评分-score]部分, ...

  5. Python3简单爬虫:爬取猫眼评分top100电影

    Python3:用xpath库爬取猫眼评分top100电影 在看<Python3 网络爬虫开发实战中>一书学习时,书中第三章例子用re正则匹配来爬取电影的所需数据,虽然爬取速度快,效率好, ...

  6. Java爬虫-WebMagic爬取博客图片(好色龍的網路觀察日誌)

    WebMagic爬取博客图片 最近在学习java爬虫,接触到WebMagic框架,正好拿我喜爱的博客来练习,希望龙哥(博主)不要责备我~~ 博客链接: 好色龍的網路觀察日誌 ,超级有趣的翻译漫画,持续 ...

  7. Java爬虫学习--爬取漫画

    我看大部分的爬虫入门教学都是爬取图片的,但是我测试了一下,那个网站现在加了一些反爬措施(如协议头部的 referer),并且很容易就会遇到429(太多请求)这个问题.可能是多线程速度太快,这也说明了控 ...

  8. java爬虫-简单爬取网页图片

    刚刚接触到"爬虫"这个词的时候是在大一,那时候什么都不明白,但知道了百度.谷歌他们的搜索引擎就是个爬虫. 现在大二.再次燃起对爬虫的热爱,查阅资料,知道常用java.python语 ...

  9. java爬虫之爬取博客园推荐文章列表

    这几天学习了一下Java爬虫的知识,分享并记录一下: 写一个可以爬取博客园十天推荐排行的文章列表 通过浏览器查看下一页点击请求,可以发现 在点击下一页的时候是执行的 post请求,请求地址为 http ...

最新文章

  1. Chromium之各国语言切换
  2. mysql多实例(多个配置文件方式)
  3. servlet config 初始化参数
  4. android 英文帮助文档地址,使用android SDk帮助文档(英文) 下载中文SDK帮助文档(中文)...
  5. linux卸载vs codeblocks,哪个适合linux? GNU make vs cmake vs codeblocks vs qmake
  6. python maketrans_Python maketrans()方法 - Python 教程 - 自强学堂
  7. centos7 firewall防火墙实现映射其他机器的端口
  8. 系统架构师学习笔记-多媒体基础知识
  9. pycharm通过pytest运行报错:No test were found 解决
  10. \pset 、\x命令
  11. Android Learning:数据存储方案归纳与总结
  12. python包里面的dll是什么_使用R的程序包提示我们无法使用怎么回事?因为计算机丢失jvm.dll...
  13. SPOJ LCMSUM - LCM Sum
  14. Android 开机logo支持的格式
  15. C语言---------俄罗斯方块(源代码)
  16. 宝塔/Linux下自动更新maccms到github原版的最新版
  17. 梅特勒托利多xk3124电子秤说明书_梅特勒电子秤校准(标定)步骤
  18. w ndows7旗舰版镜像下载,win7旗舰版32位原版iso
  19. 利用高频信号改变钢丝磁性来实现大量存储信息的钢丝录音机
  20. Star CCM+如何修改默认单位

热门文章

  1. Tech Talk 活动回顾|基于 Amazon KVS 打造智能视觉产品
  2. JavaScript选项卡/页签/Tab的实现
  3. 软件测试BUG(缺陷)等级分类
  4. 一九产业AI速写:工业篇
  5. Mathematica保姆级教程
  6. 我的世界java怎么变速_我的世界变速齿轮是什么怎么用
  7. 你还在为无法完美卸载SQL Server 2008 R2而烦恼吗?
  8. 关于知识付费项目的五大总结
  9. txt文件转csv文件乱码问题
  10. 【创作赢红包】如何提高写作水平?让写作成为你的强项。