周六无事生非,一直觉得虎嗅网的文章质量很高,早上醒来突然有个念头想把它的文章都搞下来;花了半个钟头,写了个小程序,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多线程抓取虎嗅网全部文章相关推荐

  1. java jsoup爬动态网页_使用Jsoup+HtmlUnit抓取动态网页数据

    最后更新日期为2018.1.3 只为自己留个记录 待添加功能: 1.获取历史全部消息 2.爬取大于10条数据 3.自定义抓取公众号信息 package cc.buckler.test; import ...

  2. python多线程爬虫 爬取多个网页_Python 多线程抓取网页

    最近,一直在做网络爬虫相关的东西. 看了一下开源C++写的larbin爬虫,仔细阅读了里面的设计思想和一些关键技术的实现. 1.larbin的URL去重用的很高效的bloom filter算法: 2. ...

  3. java铃声类_java多线程抓取铃声多多官网的铃声数据

    一直想练习下java多线程抓取数据. 有天被我发现,铃声多多的官网(http://www.shoujiduoduo.com/main/)有大量的数据. 通过观察他们前端获取铃声数据的ajax http ...

  4. java 爬取百度云盘,百度网盘资源抓取 爬虫

    [实例简介] 简要实现了百度网盘资源的抓取,以及定时抓取,百度分享用户的抓取以及资源抓取,booststrap 页面 [实例截图] [核心代码] da0a5e77-e599-4f8f-829f-edb ...

  5. 学校铃声Java_java_java多线程抓取铃声多多官网的铃声数据,一直想练习下java多线程抓取数 - phpStudy...

    java多线程抓取铃声多多官网的铃声数据 一直想练习下java多线程抓取数据. 有天被我发现,铃声多多的官网(http://www.shoujiduoduo.com/main/)有大量的数据. 通过观 ...

  6. java铃声_java多线程抓取铃声多多官网的铃声数据

    一直想练习下java多线程抓取数据. 有天被我发现,铃声多多的官网(http://www.shoujiduoduo.com/main/)有大量的数据. 通过观察他们前端获取铃声数据的ajax http ...

  7. Python 多线程抓取网页 牛人 use raw socket implement http request great

    Python 多线程抓取网页 - 糖拌咸鱼 - 博客园 Python 多线程抓取网页 最近,一直在做网络爬虫相关的东西. 看了一下开源C++写的larbin爬虫,仔细阅读了里面的设计思想和一些关键技术 ...

  8. Python 多线程抓取网页

    Python 多线程抓取网页 - 糖拌咸鱼 - 博客园 Python 多线程抓取网页 最近,一直在做网络爬虫相关的东西. 看了一下开源C++写的larbin爬虫,仔细阅读了里面的设计思想和一些关键技术 ...

  9. 十七、爬虫实战,多线程抓取大搜网新车的数据

    上次爬取毛豆新车的数据 十六.爬虫实战,多线程抓取毛豆新车的数据 这次爬取大搜车卖车 爬虫实战 对于之前学的知识,作一个整合,爬取大搜车卖车信息 目标:爬取大搜车卖车信息,并写入mongodb数据库 ...

最新文章

  1. python中列表和集合_15个例子掌握Python列表,集合和元组
  2. 服务容错、限流、资源隔离、熔断、监控…3天,撸完了!
  3. OpenCV实现简单人脸检测
  4. CCPC-Wannafly Winter Camp Day8 (Div2, onsite) A 题 Aqours (精巧的树形DP)
  5. 什么是高并发,如何避免高并发
  6. 边缘计算比云计算强在哪里?终于有人讲明白了
  7. UmiJS 是一个 react 开发框架
  8. 大数据学习入门难,给初学者支招
  9. 关于Pearson相关性系数、Cosine相似度、欧式距离
  10. 水星无线路由启动dhcp服务器,水星无线路由器wds设置教程
  11. JAVA基础——循环结构(while)
  12. 【爬虫BUG】‘list‘ object has no attribute ‘text‘
  13. Android中MVP框架理解
  14. Jenkins镜像加速(清华大学镜像)
  15. oracle数据库直方图,[转] oracle统计信息(statistics)和直方图(histogram)
  16. 《管理的常识》读书笔记
  17. Charmer--viv
  18. Android - 双向绑定
  19. 分享如何有效的提升网站PV值
  20. 0124:镂空三角形(C++)

热门文章

  1. 《Android 3D游戏开发技术宝典——OpenGL ES 2.0》.(吴亚峰).[PDF]ckook
  2. docker 安装elasticsearch 和 kibana elasticsearch-head插件 完整版
  3. NM储存卡数据丢失怎么办?四招数据恢复宝典
  4. 武田天津工厂扩建项目竣工;益方生物完成10亿人民币D轮融资 | 美通企业日报...
  5. magic--创建魔方矩阵
  6. 海外移动APP开发常用的三方平台
  7. 腾讯课堂Python课程哪家强?
  8. Windows批处理 - 用笔记本开WiFi
  9. 推动全球发展倡议,与世界共享发展机遇
  10. Hadoop下载安装(ubantu20.04)