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

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

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);// ul
            if(element!=null){
            //System.out.println(element);
            for(Element e:element.children()){// 依次循环每个元素,也就是一个li
                if(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包

仅供学习与交流

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您想了解关于Java版Web搜索爬虫系统和Java开源爬虫框架WebCollector的教程,主要是如何爬取搜索引擎的内容,对吗?那我来给您介绍一下。 WebCollector是一款Java开源爬虫框架,它基于Jsoup解析库,提供了一系列简单易用的API,可以帮助用户快速开发爬虫程序。WebCollector可以用于爬取各种类型的网站,包括搜索引擎。 下面是一个简单的WebCollector爬虫程序示例,可以用来爬取百度搜索结果页面的内容: ```java import cn.edu.hfut.dmic.webcollector.model.Page; import cn.edu.hfut.dmic.webcollector.net.HttpRequest; import cn.edu.hfut.dmic.webcollector.net.HttpResponse; import cn.edu.hfut.dmic.webcollector.net.Requester; import cn.edu.hfut.dmic.webcollector.plugin.berkeley.BreadthCrawler; public class BaiduSearchCrawler extends BreadthCrawler { public BaiduSearchCrawler(String crawlPath, boolean autoParse) { super(crawlPath, autoParse); this.addSeed("https://www.baidu.com/s?wd=webcollector"); } public void visit(Page page, HttpRequest httpRequest, HttpResponse httpResponse) { System.out.println(page.getHtml()); } public static void main(String[] args) throws Exception { BaiduSearchCrawler crawler = new BaiduSearchCrawler("crawl", true); crawler.setThreads(10); crawler.start(2); } } ``` 在这个示例中,我们定义了一个名为BaiduSearchCrawler的类,它继承自BreadthCrawler类。在BaiduSearchCrawler的构造函数中,我们指定了爬虫程序的爬取路径和是否自动解析网页内容。然后,我们使用addSeed()方法添加了一个种子URL,这个URL是百度搜索webcollector的结果页面。 在visit()方法中,我们定义了爬取页面时的处理逻辑,这里我们只是简单地将页面内容打印出来。在main()方法中,我们创建了一个BaiduSearchCrawler对象,设置了线程数为10,并启动了爬虫程序。 当您运行这个程序时,它将会爬取百度搜索webcollector的结果页面,并将页面内容打印出来。 当然,实际的爬虫程序往往比这个示例要复杂得多,需要考虑到各种情况和异常处理。但是,WebCollector的API非常简单易用,您可以根据自己的需求快速开发出符合要求的爬虫程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值