java爬虫框架——jsoup的简单使用(爬取电影天堂的所有电影的信息,包括下载的链接)

                                java爬虫——jsoup

一:所需知识

1.io操作

2.简单学习框架jsoup

3.多线程

二:java文件介绍

1.Main.java --------------------程序入口

2.JsoupDemo.java-------------------爬虫的逻辑部分

3.Movies.java--------------------javaBean类

4.MoviesDao.java----------------有关数据库的操作

5.Bt_picture.java------------------电影图片下载到本机


三:程序流程

1.通过链接分析,发现http://www.bttiantangs.com/list/dianying/index_2.html中的2代表页码,该首页一共有500页

2.每当爬取一页时,从电影标题中获取下一页的链接


3.解析电影详情页中你所需要的信息。

四:程序代码

Main.java:

import java.util.List;

public class Main {

	public static void main(String [] args) throws Exception{
		int k=0;                     //用来计数
		MoviesDao md=new MoviesDao();//用来对获取到的数据插入数据库
		Bt_picture p=new Bt_picture();//用来下载图片
		for(int i=2;i<50;i++){        //爬取地址的总数
			String url="http://www.bttiantangs.com/list/dianying/index_"+i+".html";//爬取的地址
			JsoupDemo jsoup=new JsoupDemo();
			//获取某一页的所有电影详情页下的连接
			List<String> href=jsoup.link(url);
			List <Movies> m=jsoup.get(href);
			for(Movies e:m){
				k++;
				//插入数据库
				p.download(e);
				md.insert(e.getTitle(), e.getYear(), e.getContry(), e.getLan(), e.getDouban_link(), e.getIntroduce(), e.getMain_actor(), e.getDownload_url(), e.getImg_url());
				System.out.println(k);
			}
			
		}
		
	}
}

JsoupDemo.java

jsoup的使用都在这

package jsoup;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

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 JsoupDemo {

	//获取第二级页面的所有链接地址并返回
	public List<String> link(String url) throws Exception{
		//由于获取的连接只是一部分,所以要拼接
		String link="http://www.bttiantangs.com";
		List <String > href=new ArrayList<>();
		Connection conn=Jsoup.connect(url).timeout(30000);
		Document doc=conn.get();
		//System.out.println(doc.html());
		Elements ele=doc.select(".article >h2>a");
		for(Element element:ele){
			String a=element.attr("href");
			//拼接完整的连接
			String full=link+a;
			href.add(full);
		}
		return href;
	}
	
	
	//根据第二级页面的链接,将爬取到的电影集合返回
	
	public List<Movies> get(List<String> href) throws IOException {
		List<Movies> ls=new ArrayList<>();
		for(String h:href){
			Movies m=new Movies();
			Connection conn=Jsoup.connect(h).timeout(30000);
			Document doc;
			try {
				doc = conn.get();
			} catch (IOException e) {
			    conn=Jsoup.connect("http://www.bttiantangs.com/movie/50680.html").timeout(30000);
			    doc = conn.get();
				e.printStackTrace();
			}
			Elements ele_title=doc.select(".article_container >h1");//电影标题
			m.setTitle(ele_title.get(0).text());
			Elements ele_p=doc.select("#post_content :nth-child(2)");//电影其他信息
			String p=ele_p.text();
			String sum[]=p.split("◎");
			for(String s:sum){
				//年代截取
				if(s.contains("年  代")){
					m.setYear(s.substring(5, s.length()));
				}
				//国家截取
				if(s.contains("国  家")){
					m.setContry(s.substring(5, s.length()));
				}
				//语言截取
				if(s.contains("语  言")){
					m.setLan(s.substring(5, s.length()));
				}
				//豆瓣链接
				if(s.contains("豆瓣链接")){
					m.setDouban_link(s.substring(5, s.length()));
				}
				//主演
				if(s.contains("主  演")){
					m.setMain_actor(s.substring(5, s.length()));
				}
				
				
			}
			
			//电影图片
			Elements ele_img=doc.select(".tpic-cont-s >img:nth-child(1)");
			//有的不存在电影图片
			if(!ele_img.isEmpty()){
				m.setImg_url(ele_img.attr("src"));
			}
			
			//电影简介
			Elements ele_introduce =doc.select(".minfos");
			//有的不存在电影简介
			if(!ele_introduce.isEmpty()){
				m.setIntroduce(ele_introduce.text());
			}
			//电影下载地址
			Elements ele_download=doc.select(".dlist >li >a:nth-child(2)");
			if(!ele_download.isEmpty()){
				m.setDownload_url(ele_download.get(0).attr("href"));
			}
			
			ls.add(m);
		}
		return ls;
	}
}

Movies.java

package jsoup;

public class Movies {

	private String title;//电影标题
	private String year;//电影年份
	private String country;//国家
	private String lan;//语言
	private String douban_link;//豆瓣连接
	private String introduce;//简介
	private String main_actor;//主演
	private String download_url;//下载地址
	private String img_url;//图片下载地址
	public Movies(){
		title="null";
		year="null";
		country="null";
		lan="null";
		douban_link="null";
		introduce="null";
		main_actor="null";
		download_url="null";
		img_url="null";
		
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getYear() {
		return year;
	}
	public void setYear(String year) {
		this.year = year;
	}
	public String getContry() {
		return country;
	}
	public void setContry(String contry) {
		this.country = contry;
	}
	public String getLan() {
		return lan;
	}
	public void setLan(String lan) {
		this.lan = lan;
	}
	public String getDouban_link() {
		return douban_link;
	}
	public void setDouban_link(String douban_link) {
		this.douban_link = douban_link;
	}
	public String getIntroduce() {
		return introduce;
	}
	public void setIntroduce(String introduce) {
		this.introduce = introduce;
	}
	public String getMain_actor() {
		return main_actor;
	}
	public void setMain_actor(String main_actor) {
		this.main_actor = main_actor;
	}
	public String getDownload_url() {
		return download_url;
	}
	public void setDownload_url(String download_url) {
		this.download_url = download_url;
	}
	public String getImg_url() {
		return img_url;
	}
	public void setImg_url(String img_url) {
		this.img_url = img_url;
	}
	
}

MoviesDao.java

package jsoup;

import java.sql.Connection;
import java.sql.Statement;

public class MoviesDao {

	private Util util;
	private Connection conn;
	private Statement st;
	public MoviesDao() throws Exception{
		util=new Util();
		conn=util.conn();
		st=conn.createStatement();
	}
	//将电影信息存入数据库
	public void insert(String title,String year,String country,String lan,String douban_link,String introduce,String main_actor,String download_url,String img_url ) throws Exception{
		String sql="INSERT INTO movies VALUES('"+title.replace("'", "")+"','"+year.replace("'", "")+"','"+country.replace("'", "")+"','"+lan.replace("'", "")+"','"+douban_link.replace("'", "")+"','"+introduce.replace("'", "")+"','"+main_actor.replace("'", "").replaceAll("     ", "")+"','"+download_url.replace("'", "")+"','"+img_url.replace("'", "")+"');";
		System.out.println(sql);
		st.executeUpdate(sql);
	}
}

Bt_picture.java

图片下载

package jsoup;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

import org.jsoup.Connection;
import org.jsoup.Connection.Response;
import org.jsoup.Jsoup;

public class Bt_picture {

	/**
	 * 
	 * @param ls 传递多来的有关电影的信息,包括所需要的图片地址,和电影名称
	 * @throws IOException 
	 */
	public void download(Movies e) throws IOException  {
		String url=e.getImg_url();
		//图片链接有的没
			if(url=="null"){
				url="https://ws2.sinaimg.cn/large/6c7edb3fly1fguvf22hznj215o0k67h5.jpg";
			}
			Connection conn=Jsoup.connect(url);
			Response rs=conn.ignoreContentType(true).timeout(3000).ignoreHttpErrors(true).execute();
			//存放图片的数组
			byte b[]=rs.bodyAsBytes();
			File file = new File("E:/BT_Movies_Picture",e.getTitle().replace(":", "")+".jpg");
	        if (!file.exists()) {
	            FileOutputStream raf = new FileOutputStream(file);
	            raf.write(b);
	            raf.close();
	        }
	}
}

Util.java

数据库的连接

package jsoup;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;

public class Util {


	//数据库连接
	public Connection conn() throws Exception{
		
//		//创建Properties对象,用于加载配置信息
//		Properties prop=new Properties();
//		//将文件加载到字节输入流中
//		InputStream in=MoviesDao.class.getClassLoader().getResourceAsStream("db_properties.properties");
//		//把流对象的数据放到prop对象中
//		prop.load(in);
//		String username=prop.getProperty("username");
//		String password=prop.getProperty("password");
//		String url=prop.getProperty("url");
//		String driver=prop.getProperty("driver");
		
		String username="root";
		String password="zp1759999";
		String url="jdbc:mysql://localhost:3306/bt_movies";
		String driver="com.mysql.jdbc.Driver";
		System.out.println(username);
		//数据库连接
		//第一步:加载驱动
		Class.forName(driver);
		//第二步:建立数据库连接
		Connection conn=DriverManager.getConnection(url,username,password);
		return conn;
	}
	
}

五:总结

学习到的:

1.学会简单的Jsoup 爬虫

2.学会用jsoup下载网络上的图片等文件

3.熟练jdbc

4.熟练io操作

六:结果展示

电影图片:


数据库展示:


  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,您想了解关于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非常简单易用,您可以根据自己的需求快速开发出符合要求的爬虫程序。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值