JAVA爬取虎嗅网截图_httpclient3+jsoup多线程抓取虎嗅网全部文章
周六无事生非,一直觉得虎嗅网的文章质量很高,早上醒来突然有个念头想把它的文章都搞下来;花了半个钟头,写了个小程序,jdk6下采用httpclient3.1、线程池ThreadPoolExecutor、jsoup1.7.1,commons.io
* 等工具多线程抓取虎嗅网全部文章,并以文本文件形式持久化入磁盘,速度还是可以的半个小时把全站所有文章搞定
1.[代码][Java]代码
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.apache.commons.io.FileUtils;
/**
* @ClassName: CrawlHuxiu
* @Description: jdk6下采用httpclient3.1、线程池ThreadPoolExecutor、jsoup1.7.1和commons.io
* 等工具包多线程抓取虎嗅网全部文章,并以文本文件形式持久化入磁盘
* @author Leon温陵
* @version V1.0
*/
public class CrawlHuxiu {
/**
* @Title: main
* @Description: 采用多线程抓取虎嗅网全文
* @param args
* @author
* @throws IOException
* @date 2012-12-15
*/
public static void main(String[] args) throws IOException, InterruptedException
{
CrawlHuxiu crawlHuxiu= new CrawlHuxiu();
// 创建 HttpClient 的多线程实例
MultiThreadedHttpConnectionManager connectionManager =
new MultiThreadedHttpConnectionManager();
HttpClient httpClient = new HttpClient(connectionManager);
crawlHuxiu.getHuxiu(httpClient, "http://www.huxiu.com/article/8000/1.html");
}
/**根据jsoup解析出爬取回来的虎嗅网文章内容,利用common.io包放入磁盘
* @param doc
* @param i
* @throws IOException
*/
static void crawlHuxiu(Document doc, int i) throws IOException
{
List yuliao= new ArrayList();
Elements title= doc.select("title");//主题
String str = title.first().text().replace("-看点-@虎嗅网", "").
replace("-观点-@虎嗅网", "").replace("-读点-@虎嗅网", "");
System.out.println("title: "+str);
Elements userAndTime = doc.select(".author-name"); // 发帖时间
Elements content= doc.select("#article_content");//内容
if(str.contains("提示信息 - 虎嗅网"))
{
System.out.println("文章被删除");
return;
}
String baseUrl = "http://www.huxiu.com/article/";
yuliao.add(str);
yuliao.add(baseUrl + i + "/1.html");
yuliao.add(userAndTime.get(0).select(".fc1").text());
yuliao.add(userAndTime.get(1).text());
yuliao.add(content.get(0).text());
File file = new File("c:\\huxiu\\"+str+".txt");
FileUtils.writeLines(file, yuliao);
yuliao.clear();
return;
}
/**
* 线程池执行的任务,抓取网页
*/
static class ThreadPoolTask implements Runnable
{
private static final long serialVersionUID = 0;
HttpClient httpClient =null;
HttpMethod getMethod = null;
int i = 0;
// 保存任务所需要的数据
private Object threadPoolTaskData;
ThreadPoolTask(Object tasks)
{
this.threadPoolTaskData = tasks;
}
public ThreadPoolTask(HttpMethod getMethod, int i) {
// TODO Auto-generated constructor stub
}
public ThreadPoolTask(HttpClient httpClient, HttpMethod getMethod, int i) {
// TODO Auto-generated constructor stub
this.httpClient = httpClient;
this.getMethod = getMethod;
this.i = i;
}
public void run()
{
// 处理一个任务,这里的处理方式太简单了,仅仅是一个打印语句
try {
System.out.println("executing request " + getMethod.getURI());
// 执行getMethod
int status = httpClient.executeMethod(getMethod);
System.out.println("status:" + status);
// 连接返回的状态码
if (HttpStatus.SC_OK == status)
{
// 获取到的内容
Document doc = null;
try
{
doc = Jsoup.parse(getMethod.getResponseBodyAsStream(),
"utf-8", "");
}
catch (HttpException e)
{
e.printStackTrace();
}
if (getMethod.getURI().getURI().startsWith(
"http://www.huxiu.com/article/"))
{
crawlHuxiu(doc, i);
}
}
}
catch (URIException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
} catch (Exception e)
{
e.printStackTrace();
} finally {
// 释放连接
getMethod.releaseConnection();
}
}
}
/**
* 获取虎嗅网的全体文章
*
* @param httpClient
* @param startUrl
* @throws InterruptedException
*/
public void getHuxiu(HttpClient httpClient, String startUrl) throws InterruptedException
{
// 构造一个线程池
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(100, 500, 3, TimeUnit.SECONDS,
new ArrayBlockingQueue(10000), new ThreadPoolExecutor.DiscardOldestPolicy());
String baseUrl = "http://www.huxiu.com/article/";
// 请求URI
HttpMethod getMethod = null;
String id = startUrl.split("/")[4];
Integer count = Integer.valueOf(id);
for (int i = count; i > 100; i--)
{
// 根据虎嗅网文章url的特点,构造请求URI,用具有100个活动线程的线程池进行加载
getMethod = new GetMethod(baseUrl + i + "/1.html");
threadPool.execute(new ThreadPoolTask(httpClient, getMethod, i));
Thread.sleep(10);
}
while(true)
{
Thread.sleep(10);
if(threadPool.getActiveCount()==0)
{
threadPool.shutdown();
break;
}
}
}
}
JAVA爬取虎嗅网截图_httpclient3+jsoup多线程抓取虎嗅网全部文章相关推荐
- java jsoup爬动态网页_使用Jsoup+HtmlUnit抓取动态网页数据
最后更新日期为2018.1.3 只为自己留个记录 待添加功能: 1.获取历史全部消息 2.爬取大于10条数据 3.自定义抓取公众号信息 package cc.buckler.test; import ...
- python多线程爬虫 爬取多个网页_Python 多线程抓取网页
最近,一直在做网络爬虫相关的东西. 看了一下开源C++写的larbin爬虫,仔细阅读了里面的设计思想和一些关键技术的实现. 1.larbin的URL去重用的很高效的bloom filter算法: 2. ...
- java铃声类_java多线程抓取铃声多多官网的铃声数据
一直想练习下java多线程抓取数据. 有天被我发现,铃声多多的官网(http://www.shoujiduoduo.com/main/)有大量的数据. 通过观察他们前端获取铃声数据的ajax http ...
- java 爬取百度云盘,百度网盘资源抓取 爬虫
[实例简介] 简要实现了百度网盘资源的抓取,以及定时抓取,百度分享用户的抓取以及资源抓取,booststrap 页面 [实例截图] [核心代码] da0a5e77-e599-4f8f-829f-edb ...
- 学校铃声Java_java_java多线程抓取铃声多多官网的铃声数据,一直想练习下java多线程抓取数 - phpStudy...
java多线程抓取铃声多多官网的铃声数据 一直想练习下java多线程抓取数据. 有天被我发现,铃声多多的官网(http://www.shoujiduoduo.com/main/)有大量的数据. 通过观 ...
- java铃声_java多线程抓取铃声多多官网的铃声数据
一直想练习下java多线程抓取数据. 有天被我发现,铃声多多的官网(http://www.shoujiduoduo.com/main/)有大量的数据. 通过观察他们前端获取铃声数据的ajax http ...
- Python 多线程抓取网页 牛人 use raw socket implement http request great
Python 多线程抓取网页 - 糖拌咸鱼 - 博客园 Python 多线程抓取网页 最近,一直在做网络爬虫相关的东西. 看了一下开源C++写的larbin爬虫,仔细阅读了里面的设计思想和一些关键技术 ...
- Python 多线程抓取网页
Python 多线程抓取网页 - 糖拌咸鱼 - 博客园 Python 多线程抓取网页 最近,一直在做网络爬虫相关的东西. 看了一下开源C++写的larbin爬虫,仔细阅读了里面的设计思想和一些关键技术 ...
- 十七、爬虫实战,多线程抓取大搜网新车的数据
上次爬取毛豆新车的数据 十六.爬虫实战,多线程抓取毛豆新车的数据 这次爬取大搜车卖车 爬虫实战 对于之前学的知识,作一个整合,爬取大搜车卖车信息 目标:爬取大搜车卖车信息,并写入mongodb数据库 ...
最新文章
- python中列表和集合_15个例子掌握Python列表,集合和元组
- 服务容错、限流、资源隔离、熔断、监控…3天,撸完了!
- OpenCV实现简单人脸检测
- CCPC-Wannafly Winter Camp Day8 (Div2, onsite) A 题 Aqours (精巧的树形DP)
- 什么是高并发,如何避免高并发
- 边缘计算比云计算强在哪里?终于有人讲明白了
- UmiJS 是一个 react 开发框架
- 大数据学习入门难,给初学者支招
- 关于Pearson相关性系数、Cosine相似度、欧式距离
- 水星无线路由启动dhcp服务器,水星无线路由器wds设置教程
- JAVA基础——循环结构(while)
- 【爬虫BUG】‘list‘ object has no attribute ‘text‘
- Android中MVP框架理解
- Jenkins镜像加速(清华大学镜像)
- oracle数据库直方图,[转] oracle统计信息(statistics)和直方图(histogram)
- 《管理的常识》读书笔记
- Charmer--viv
- Android - 双向绑定
- 分享如何有效的提升网站PV值
- 0124:镂空三角形(C++)
热门文章
- 《Android 3D游戏开发技术宝典——OpenGL ES 2.0》.(吴亚峰).[PDF]ckook
- docker 安装elasticsearch 和 kibana elasticsearch-head插件 完整版
- NM储存卡数据丢失怎么办?四招数据恢复宝典
- 武田天津工厂扩建项目竣工;益方生物完成10亿人民币D轮融资 | 美通企业日报...
- magic--创建魔方矩阵
- 海外移动APP开发常用的三方平台
- 腾讯课堂Python课程哪家强?
- Windows批处理 - 用笔记本开WiFi
- 推动全球发展倡议,与世界共享发展机遇
- Hadoop下载安装(ubantu20.04)