本文为原创博客,仅供技术学习使用。未经允许,禁止将其复制下来上传到百度文库等平台。如有转载请注明本文博客的地址(链接)
源码获取请联系:1563178220@qq.com
简介
互联网有海量的新闻,如何基于关键字检索相关新闻,并将新闻内容存储到数据库呢,以新浪新闻为例,如下图所示,输入关键字爬取历史新闻,可以看到历史新闻的数量有很多,因此采用单线程的方式,无法满足需求,可采用多线程的方式采集数据。
程序框架
主程序
package main;
/**
* @author:合肥工业大学 管理学院 钱洋
* @email:1563178220@qq.com
* @
*/
/*
* 多线层爬取新闻id,标题,url
*
*/
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 org.apache.http.ParseException;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import db.MYSQLControl;
import model.NewInfo;
import utils.URLFecter;
import utils.Utils;
public class FirstNewsThread extends Thread{
String Starturl = "";
//构造函数,初始化使用
public FirstNewsThread (String Starturl){
this.Starturl = Starturl;
}
public void run(){
//针对每个url开始爬取
HttpClient client = new DefaultHttpClient();
System.out.println(Starturl);
List<NewInfo> newinfo=new ArrayList<NewInfo>();
try {
newinfo=URLFecter.htmlFirstGet(client, Starturl);
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
for (NewInfo info:newinfo) {
System.out.println(info.getNewsurl()+"\t"+info.getNewsid()+"\t"+info.getNewstitle());
}
MYSQLControl.insertnewsurl_info(newinfo);
}
public static void main(String[] args) throws SQLException{
//提供你的关键字
String keyword="金融";
//转化成网页字符
String keywordtransform=Utils.toUrlString(keyword,"gbk");
//创建固定大小的线程池
ExecutorService exec = Executors.newFixedThreadPool(5);
for (int i = 1; i < 1000; i++) {
String starturl="http://search.sina.com.cn/?q="+keywordtransform+"&range=all&c=news&sort=time&col=&source=&from=&country=&size=&time=&a=&"
+ "page="+i+"&pf=2131425467&ps=2134309112&dpc=1";
//执行线程
exec.execute(new FirstNewsThread(starturl));
}
//线程关闭
exec.shutdown();
}
}
程序运行结果
数据库结果展示: