1.io操作
2.简单学习框架jsoup
3.多线程
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 href=jsoup.link(url);
List 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 link(String url) throws Exception{
//由于获取的连接只是一部分,所以要拼接
String link="http://www.bttiantangs.com";
List 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 get(List href) throws IOException {
List 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操作
电影图片:
数据库展示: