admin管理员组

文章数量:1558929

                                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/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/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";
		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/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/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操作

六:结果展示

电影图片:


数据库展示:


本文标签: 爬虫电影框架简单链接