JAVA多线程网络爬虫(时光网为例)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MovieID = movieID; } }
MtimeThread 主方法
主方法里为了方便,我直接使用的是 Jsoup 去请求数据,建议大家还是使用 httpclient,因为 有时候 Jsoup 是失灵的。
package org.autodata.navi.main; /*
* author:合肥工业大学 管院学院 钱洋 *1563178220@qq.com */ import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.sql.DataSource; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.ResultSetHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.autodata.db.MyDataSource; import org.autodata.model.MtimeModel; import org.autodata.model.MtimeUrl; import org.autodata.parse.MtimeParse; import org.jsoup.Jsoup; import org.jsoup.nodes.Document;
* author:合肥工业大学 管院学院 钱洋 *1563178220@qq.com */ public class JsonModel {
private String VideoID; private String MovieID; private String ShortTitle; private String prmovieId; private String url; public String getVideoID() {
String Starturl = "";
String Id="";
//构造函数,初始化使用
public MtimeThread (String Starturl,String Id){
this.Starturl = Starturl;
this.Id = Id;
}
public void run(){
List<MtimeModel> moviedatas=new ArrayList<MtimeModel>();
//这里采用 jsoup 直接模拟访问网页
try {
Document doc = Jsoup.connect(Starturl).userAgent("bbb").timeout(120000).get();
this.movieId = movieId; } public String getTitle() {
return title; } public void setTitle(String title) {
this.title = title; }
}
Json 数据的解析 model
package org.autodata.model; /*
return prmovieId; } public void setPrmovieId(String prmovieId) {
this.prmovieId = prmovieId;
} public String getUrl() {
return url; } public void setUrl(String url) {
website='时光网' and is_crawler=0", h);
//创建固定大小的线程池
ExecutorService exec = Executors.newFixedThreadPool(5);
for (MtimeUrl Start:Stawww.shanxiwang.netrturls) {
this.id = id; } public String getUrl() {
return url; } public void setUrl(String url) {
this.url = url; } } 爬取的数据为:
package org.autodata.model; /*
* author:合肥工业大学 管院学院 钱洋 *1563178220@qq.com */ public class MtimeModel {
model model 里面主要写了三个,我们需要的,一个是 MtimeUrl 封装的是数据库 movie 这张表中 某些数据对应的信息。 MtimeModel 封装的是需要爬取数据的信息。 package org.autodata.model;
/* * author:合肥工业大学 管院学院 钱洋 *1563178220@qq.com
public class MtimeParse { public static List<MtimeModel> getData (Document doc) { List<MtimeModel> mtimeData=new ArrayList<MtimeModel>(); //获取待解析的 html 文件 String html=doc.html(); //fastJson 测试 //just contain the preview List<JsonModel> mtimeJsonData=new ArrayList<JsonModel>(); Pattern data1 = Pattern.compile("预告片\":(.*?)\\,(\"拍摄花絮|\"精彩片段)"); Matcher dataMatcher1 = data1.matcher(html); String da1=""; while (dataMatcher1.find()) { //待解析的 json 字符串 da1=dataMatcher1.group(1); } if (da1.length()!=0) { List<JsonModel> jsonmodel1 = JSON.parseArray(da1,JsonModel.class); for (JsonModel jso:jsonmodel1 ) { JsonModel mtimeModel=new JsonModel(); String VideoID="mtime"+jso.getVideoID(); String MovieID="mtime"+jso.getMovieID(); String ShortTitle=jso.getShortTitle(); String
//执行线程
exec.execute(new MtimeThread(Start.getUrl(),Start.getId()));
}
//线程关闭 exec.shutdown(); } }
MtimeParse 解析数据
package org.autodata.parse; /*
* author:合肥工业大学 管院学院 钱洋 *1563178220@qq.com */ import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.autodata.model.JsonModel; import org.autodata.model.MtimeModel; import org.jsoup.nodes.Document; import com.alibaba.fastjson.JSON;
下表是我所要爬的预告片相关的数据,包括预告片的 id(prmovieId),预告片的链接(url),预告 片对应的电影 id(movieId),预告片的标题(title)。后面会在 model 框架中,你会发现,我会把 这些待爬取的数据封装在 MtimeModel 中。
网络抓包 通过网络抓包的方式,查看数据的获取方式、方法。即真实请求的地址及返回数据的格式 (html or json). 爬虫框架 如果想了解,为什么这样写,请看我前面的介绍网络爬虫框架的文章。
moviedatas =MtimeParse.getData(doc);
} catch (IOException e) { e.printStackTrace();
} for (MtimeModel mt:moviedatas) {
System.out.println("prmovieId:"+mt.getPrmovieId()+" movieId:"+mt.getMovieId()+" Title:"+mt.getTitle()
this.url = url; } public void setVideoID(String videoID) {
VideoID = videoID; } public String getMovieID() {
return MovieID; } public void setMovieID(String movieID) {
public class MtimeThread extends Thread{
public
static
DataSource
ds
=
MyDataSource.getDataSource("jdbc:mysql://127.0.0.1:3306/moviedata");
public static QueryRunner qr = new QueryRunner(ds);
this.prmovieId = prmovieId; } public String getUrl() {
return url; } public void setUrl(String url) {
this.url = url;
} public String getMovieId() {
return movieIห้องสมุดไป่ตู้; } public void setMovieId(String movieId) {
ResultSetHandler<List<MtimeUrl>>
h
=
new
BeanListHandler<MtimeUrl>(MtimeUrl.class);
List<MtimeUrl> Starturls = qr.query("SELECT id,url FROM moviedata.movie WHERE
Java 多线程网络爬虫(时光网为例)
多线程简介 Java 多线程实现方式主要有三种:继承 Thread 类、实现 Runnable 接口、使用 ExecutorService、 Callable、Future 实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值, 只有最后一种是带返回值的。 本文所采用的方法是继承 Thread 类的方法,Thread 本质上也是实现了 Runnable 接口的一个 实例,它代表一个线程的实例。启动线程的唯一方法就是通过 Thread 类的 start()实例方法。 start()方法是一个 native 方法,它将启动一个新线程,并执行 run()方法。这种方式实现多线 程很简单,通过自己的类直接 extend Thread,并复写 run()方法,就可以启动新线程并执行 自己定义的 run()方法。 多线程网络爬虫 为了加快爬虫速度,可以采用多线程网络爬虫的方法。以下我以时光网为例,写一个简单的 网络爬虫。 分析要爬的数据 如下面数据,为我爬的一些电影预告片的初始信息,存在数据库 movie 的这张表中。
*/ public class MtimeUrl {
//待爬取电影的 id 和对应的连接 private String id; private String url; public String getId() {
return id; } public void setId(String id) {
return VideoID; } public String getShortTitle() {
return ShortTitle; } public void setShortTitle(String shortTitle) {
ShortTitle = shortTitle; } public String getPrmovieId() {
+" url:"+mt.getUrl()); } try {
MYSQLControl.executeUpdate(moviedatas,Id); } catch (SQLException e) {
e.printStackTrace(); } }
public static void main(String[] args) throws SQLException{
private String prmovieId; private String url; private String movieId; private String title; public String getPrmovieId() {
return prmovieId; } public void setPrmovieId(String prmovieId) {
MtimeThread 主方法
主方法里为了方便,我直接使用的是 Jsoup 去请求数据,建议大家还是使用 httpclient,因为 有时候 Jsoup 是失灵的。
package org.autodata.navi.main; /*
* author:合肥工业大学 管院学院 钱洋 *1563178220@qq.com */ import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.sql.DataSource; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.ResultSetHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.autodata.db.MyDataSource; import org.autodata.model.MtimeModel; import org.autodata.model.MtimeUrl; import org.autodata.parse.MtimeParse; import org.jsoup.Jsoup; import org.jsoup.nodes.Document;
* author:合肥工业大学 管院学院 钱洋 *1563178220@qq.com */ public class JsonModel {
private String VideoID; private String MovieID; private String ShortTitle; private String prmovieId; private String url; public String getVideoID() {
String Starturl = "";
String Id="";
//构造函数,初始化使用
public MtimeThread (String Starturl,String Id){
this.Starturl = Starturl;
this.Id = Id;
}
public void run(){
List<MtimeModel> moviedatas=new ArrayList<MtimeModel>();
//这里采用 jsoup 直接模拟访问网页
try {
Document doc = Jsoup.connect(Starturl).userAgent("bbb").timeout(120000).get();
this.movieId = movieId; } public String getTitle() {
return title; } public void setTitle(String title) {
this.title = title; }
}
Json 数据的解析 model
package org.autodata.model; /*
return prmovieId; } public void setPrmovieId(String prmovieId) {
this.prmovieId = prmovieId;
} public String getUrl() {
return url; } public void setUrl(String url) {
website='时光网' and is_crawler=0", h);
//创建固定大小的线程池
ExecutorService exec = Executors.newFixedThreadPool(5);
for (MtimeUrl Start:Stawww.shanxiwang.netrturls) {
this.id = id; } public String getUrl() {
return url; } public void setUrl(String url) {
this.url = url; } } 爬取的数据为:
package org.autodata.model; /*
* author:合肥工业大学 管院学院 钱洋 *1563178220@qq.com */ public class MtimeModel {
model model 里面主要写了三个,我们需要的,一个是 MtimeUrl 封装的是数据库 movie 这张表中 某些数据对应的信息。 MtimeModel 封装的是需要爬取数据的信息。 package org.autodata.model;
/* * author:合肥工业大学 管院学院 钱洋 *1563178220@qq.com
public class MtimeParse { public static List<MtimeModel> getData (Document doc) { List<MtimeModel> mtimeData=new ArrayList<MtimeModel>(); //获取待解析的 html 文件 String html=doc.html(); //fastJson 测试 //just contain the preview List<JsonModel> mtimeJsonData=new ArrayList<JsonModel>(); Pattern data1 = Pattern.compile("预告片\":(.*?)\\,(\"拍摄花絮|\"精彩片段)"); Matcher dataMatcher1 = data1.matcher(html); String da1=""; while (dataMatcher1.find()) { //待解析的 json 字符串 da1=dataMatcher1.group(1); } if (da1.length()!=0) { List<JsonModel> jsonmodel1 = JSON.parseArray(da1,JsonModel.class); for (JsonModel jso:jsonmodel1 ) { JsonModel mtimeModel=new JsonModel(); String VideoID="mtime"+jso.getVideoID(); String MovieID="mtime"+jso.getMovieID(); String ShortTitle=jso.getShortTitle(); String
//执行线程
exec.execute(new MtimeThread(Start.getUrl(),Start.getId()));
}
//线程关闭 exec.shutdown(); } }
MtimeParse 解析数据
package org.autodata.parse; /*
* author:合肥工业大学 管院学院 钱洋 *1563178220@qq.com */ import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.autodata.model.JsonModel; import org.autodata.model.MtimeModel; import org.jsoup.nodes.Document; import com.alibaba.fastjson.JSON;
下表是我所要爬的预告片相关的数据,包括预告片的 id(prmovieId),预告片的链接(url),预告 片对应的电影 id(movieId),预告片的标题(title)。后面会在 model 框架中,你会发现,我会把 这些待爬取的数据封装在 MtimeModel 中。
网络抓包 通过网络抓包的方式,查看数据的获取方式、方法。即真实请求的地址及返回数据的格式 (html or json). 爬虫框架 如果想了解,为什么这样写,请看我前面的介绍网络爬虫框架的文章。
moviedatas =MtimeParse.getData(doc);
} catch (IOException e) { e.printStackTrace();
} for (MtimeModel mt:moviedatas) {
System.out.println("prmovieId:"+mt.getPrmovieId()+" movieId:"+mt.getMovieId()+" Title:"+mt.getTitle()
this.url = url; } public void setVideoID(String videoID) {
VideoID = videoID; } public String getMovieID() {
return MovieID; } public void setMovieID(String movieID) {
public class MtimeThread extends Thread{
public
static
DataSource
ds
=
MyDataSource.getDataSource("jdbc:mysql://127.0.0.1:3306/moviedata");
public static QueryRunner qr = new QueryRunner(ds);
this.prmovieId = prmovieId; } public String getUrl() {
return url; } public void setUrl(String url) {
this.url = url;
} public String getMovieId() {
return movieIห้องสมุดไป่ตู้; } public void setMovieId(String movieId) {
ResultSetHandler<List<MtimeUrl>>
h
=
new
BeanListHandler<MtimeUrl>(MtimeUrl.class);
List<MtimeUrl> Starturls = qr.query("SELECT id,url FROM moviedata.movie WHERE
Java 多线程网络爬虫(时光网为例)
多线程简介 Java 多线程实现方式主要有三种:继承 Thread 类、实现 Runnable 接口、使用 ExecutorService、 Callable、Future 实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值, 只有最后一种是带返回值的。 本文所采用的方法是继承 Thread 类的方法,Thread 本质上也是实现了 Runnable 接口的一个 实例,它代表一个线程的实例。启动线程的唯一方法就是通过 Thread 类的 start()实例方法。 start()方法是一个 native 方法,它将启动一个新线程,并执行 run()方法。这种方式实现多线 程很简单,通过自己的类直接 extend Thread,并复写 run()方法,就可以启动新线程并执行 自己定义的 run()方法。 多线程网络爬虫 为了加快爬虫速度,可以采用多线程网络爬虫的方法。以下我以时光网为例,写一个简单的 网络爬虫。 分析要爬的数据 如下面数据,为我爬的一些电影预告片的初始信息,存在数据库 movie 的这张表中。
*/ public class MtimeUrl {
//待爬取电影的 id 和对应的连接 private String id; private String url; public String getId() {
return id; } public void setId(String id) {
return VideoID; } public String getShortTitle() {
return ShortTitle; } public void setShortTitle(String shortTitle) {
ShortTitle = shortTitle; } public String getPrmovieId() {
+" url:"+mt.getUrl()); } try {
MYSQLControl.executeUpdate(moviedatas,Id); } catch (SQLException e) {
e.printStackTrace(); } }
public static void main(String[] args) throws SQLException{
private String prmovieId; private String url; private String movieId; private String title; public String getPrmovieId() {
return prmovieId; } public void setPrmovieId(String prmovieId) {