- 浏览: 561792 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (478)
- lucene (45)
- oracle (19)
- nutch (2)
- blog (2)
- 垂直搜索 (19)
- java综合 (89)
- spring (15)
- Hibernate (9)
- Struts (9)
- Hadoop (16)
- Mysql (12)
- nosql (10)
- Linux (3)
- MyEclipse (4)
- Ant (1)
- 设计模式 (19)
- JBPM (1)
- JSP (1)
- HtmlParser (5)
- SVN (2)
- 插件 (2)
- 收藏 (7)
- Others (1)
- Heritrix (18)
- Solr (4)
- 主题爬虫 (31)
- 内存数据库 (24)
- 分布式与海量数据 (32)
- httpclient (14)
- Tomcat (1)
- 面试宝典 (6)
- Python (14)
- 数据挖掘 (1)
- 算法 (6)
- 其他 (4)
- JVM (12)
- Redis (18)
最新评论
-
hanjiyun:
本人水平还有待提高,进步空间很大,看这些文章给我有很大的指导作 ...
JVM的内存管理 Ⅲ -
liuxinglanyue:
四年后的自己:这种方法 不靠谱。 使用javaagent的方式 ...
计算Java对象占用内存空间的大小(对于32位虚拟机而言) -
jaysoncn:
附件在哪里啊test.NoCertificationHttps ...
使用HttpClient过程中常见的一些问题 -
231fuchenxi:
你好,有redis,memlink,mysql的测试代码吗?可 ...
MemLink 性能测试 -
guyue1015:
[color=orange][/color][size=lar ...
JAVA同步机制
来自:深沉的船
任务描述:
某图书网站按条件查询得出一页20条记录,每条记录有书目的简要信息和url链接到书的详细信息。
需要抓取网站图书的详细信息,保存到本地数据库中。
任务分析:
用httpclient模拟执行url将网站的信息取回,再用jericho包,分析页面元素,将需要的信息取出,保存到数据库中。
因为数据量比较大,还是采用多线程的方式来执行抓取详细页面,分析获得数据。
处理过程:
按条件查询到图书列表信息后,主线程不停的下翻页面,分析每本图书的详细url,将url保存到一个ArrayList中,启多个子线程分别去抓取详细页面的信息。然后利用jericho包分析页面数据并保存到数据库中。
代码实现截取如下:
......
public class BookCatcher { private static ArrayList threads= new ArrayList();//存储未处理URL public static boolean isFinished=false; public String getUrl() { try { synchronized (threads) { if (threads.size() > 0) { String tmp = String.valueOf(threads.get(0)); threads.remove(0); return tmp; } else return null; } } catch (Exception e) { return null; } } public void process(){ //处理预处理 //下面开10个线程等待处理 new Thread(new Processer(this)).start(); new Thread(new Processer(this)).start(); new Thread(new Processer(this)).start(); new Thread(new Processer(this)).start(); new Thread(new Processer(this)).start(); new Thread(new Processer(this)).start(); new Thread(new Processer(this)).start(); new Thread(new Processer(this)).start(); new Thread(new Processer(this)).start(); new Thread(new Processer(this)).start(); .... for(int j=0;j<pages;j++)//从第一页翻到最后一页 { ... source = CommonUtil.getSourceByUrl(url); List<Element> elements = source.getAllElementsByClass("ProductTitle"); for (Element element : elements){ String href = element.getContent().getFirstStartTag().getAttributeValue("href"); if (href!=null && !"".equals(href)){ synchronized (threads) { threads.add(bookurl);// 把URL存进去 } } } isFinished=true; //主线程处理完所有的url } class Processer implements Runnable { BookCatcher c; public Processer(BookCatcher c) { this.c = c; } public void run() { String bookUrl = null; while((bookUrl=c.getUrl())!=null || !BookCatcher.isFinished) //当还有记录时就处理 { if(bookUrl!=null) { //处理分析页面数据并将数据保存到数据库 Source source = CommonUtil.getSourceByUrl(bookUrl); String tmp = ""; BookBean bean = new BookBean(); bean.setStoreBookUrl(bookUrl); //书名 StartTag tag = source.getFirstStartTagByClass("BookTitle"); tmp = tag.getRenderer().toString(); bean.setName(tmp); //作者 tag = source.getFirstStartTagByClass("bookAuthor"); if (tag!=null){ List<StartTag> list = tag.getElement().getAllStartTags(HTMLElementName.A); if (list.size()>0) bean.setAuthor(list.get(0).getElement().getContent().toString()); } //书籍图片 tag = source.getFirstStartTag("id", "BookImage", false); if (tag!=null) bean.setPicUrl(tag.getAttributeValue("src").trim()); StartTag tagLeft = source.getFirstStartTagByClass("Left"); tmp=tagLeft.getRenderer().toString(); List<String> resList = new ArrayList<String>(); String[] leftArray = tmp.split("·"); for (String str:leftArray){ if ("".equals(str)) continue; resList.add(str); } StartTag tagRight = source.getFirstStartTagByClass("Right"); tmp = tagRight.getRenderer().toString(); String[] rightArray = tmp.split("·"); for (String str:rightArray){ if ("".equals(str)) continue; resList.add(str); } for (String str:resList){ try{ String name = CommonUtil.getString(str.split(":")[0]); String value = CommonUtil.getString(str.split(":")[1]); if ("ISBN".equals(name)) bean.setIsbn(value); if ("出版社".equals(name)) bean.setPublisherOrg(value); if ("页码".equals(name)) bean.setPageNum(value); if ("出版日期".equals(name)) bean.setPublishDate(value); if ("装帧".equals(name)) bean.setWrapType(value); if ("开本".equals(name)) bean.setFormat(value); }catch(ArrayIndexOutOfBoundsException ee){} } //定价 tag = source.getFirstStartTagByClass("BookPrice"); String price = tag.getElement().getAllStartTags(HTMLElementName.STRIKE).get(0).getRenderer().toString(); price = price.substring(1,price.length()); bean.setPrice(price); //零售价格 tag = source.getFirstStartTagByClass("DetailPrice"); if (tag!=null) bean.setStorePrice(tag.getElement().getAllStartTagsByClass("OurPrice").get(0).getRenderer().toString()); else bean.setStorePrice("0"); List<StartTag> tagList = source.getAllStartTagsByClass("ContentValue"); if(tagList!=null && tagList.size()>1){ // 内容简介 tag = tagList.get(0); tmp = tag.getRenderer().toString().trim(); if(tmp.length()>2000) tmp = tmp.substring(0, 1990)+"..."; bean.setContent(tmp); } new BookBO().saveBook(bean); }else//如果没标志处理则休眠一秒再重新开始处理 { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } } //CommonUtil中的方法,通过httpclient提交到url,返回的页面信息装入jericho的source public static Source getSourceByUrl(final String url) { Source source = null; HttpClient httpClient = new HttpClient(); GetMethod getMethod = new GetMethod(url); getMethod.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY); getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler()); try { int statusCode = httpClient.executeMethod(getMethod); if (statusCode != HttpStatus.SC_OK) { log.error("Method failed: " + getMethod.getStatusLine()); } source = new Source(getMethod.getResponseBodyAsStream()); } catch (HttpException e) { log.error("Please check your provided http address!"); e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { getMethod.releaseConnection(); } return source; }
发表评论
-
源码提供 —— 使用Apache Commons HttpClient灵活实现JAAS签权(转)
2010-12-12 10:52 1026JavaEE提供了JAAS安全机制,在架构一个web系统时,可 ... -
HttpClient的“Going to buffer response body of large or unknown size. Using getRes
2010-12-07 15:36 3206使用HttpClient,总是报出“Going to buff ... -
httpclient的并发连接问题
2010-12-07 15:33 1113转自:kafka0102 昨天的搜索系统又出状况了,几个 ... -
JAVA-用HttpClient来模拟浏览器GET,POST
2010-12-05 10:31 1251来自:深沉的船 一般 ... -
Java模拟HTTP的Get和Post请求
2010-12-05 10:30 1714来自:深沉的船 import java.io.Buff ... -
org.apache.commons.httpclient.HttpClient 基本功能
2010-12-05 10:27 4698来自:深沉的船 HttpClient 基本功能的使用GET ... -
使用HttpClient过程中常见的一些问题
2010-12-05 10:25 1413来自:深沉的船 下面介绍在使用HttpClient过 ... -
为 httpclient 设置代理, 设置http头
2010-12-05 10:23 2072来自:深沉的船 在学校园网,要代理才可上网。写程序获取网上资 ... -
浏览器与服务器交互原理以及用java模拟浏览器操作
2010-12-05 10:17 2141来自:深沉的船 * 1,在H ... -
HttpClient 学习整理
2010-12-05 10:12 811来自:深沉的船 HttpClient 是我最近想研究的东西, ... -
httpclient校内模拟登录CNKI
2010-12-04 20:45 11031. HttpClient httpClient=n ... -
抓取防爬虫的网站信息
2010-12-04 20:35 2137有的网站限制网络爬虫的抓取,例如javaeye。会出现错误提示 ... -
Apache Common HttpClient使用之七种武器(转)
2010-11-16 21:59 9821.拳头之Get/Post拳头是最基本的一重武器,也是最重要的 ...
相关推荐
基于SSM+maven+httpClient+jsoup实现小说网站项目 基于SSM+maven+httpClient+jsoup实现小说网站项目 基于SSM+maven+httpClient+jsoup实现小说网站项目 基于SSM+maven+httpClient+jsoup实现小说网站项目 基于SSM+...
基于SSM+maven+httpClient+jsoup实现小说网站项目源码.zip 基于SSM+maven+httpClient+jsoup实现小说网站项目源码.zip 基于SSM+maven+httpClient+jsoup实现小说网站项目源码.zip 基于SSM+maven+httpClient+jsoup实现...
标题 "HttpClient + Spring 实现多线程" 涉及到的是如何在Spring框架中使用Apache HttpClient库来创建一个支持多线程的HTTP客户端服务。Apache HttpClient是一个强大的HTTP客户端API,它提供了丰富的功能来处理HTTP...
在IT领域,网络数据抓取是一项重要的技能,它允许我们从网页中提取所需的信息,用于数据分析、内容聚合或自动化任务。HttpClient和Jsoup是两个Java库,分别专注于HTTP通信和HTML解析,它们常被组合使用来高效地抓取...
在"Httpclient+testng接口测试小例子"中,我们将使用以下步骤进行接口测试: 1. **环境准备**:首先,确保项目中已经添加了Apache HttpClient和TestNG的依赖。这些通常通过Maven或Gradle等构建工具进行管理,通过在...
在IT领域,网络爬虫是获取网页数据的重要手段,而HttpClient和Jsoup是两种常用的Java库,用于实现这一目的。HttpClient提供了低级别的HTTP通信能力,而Jsoup则是一个解析和操作HTML文档的强大工具。本教程将详细介绍...
在Android系统中,由于主线程不能执行耗时操作,否则会引发ANR(Application Not Responding)错误,因此利用HttpClient的多线程特性,可以将网络请求放到后台线程,保证UI的流畅性。 HttpClient的使用步骤通常包括...
Jsoup+httpclient模拟登陆和抓取页面.pdf
【标题】中的“基于SSM+maven+httpClient+jsoup实现的java爬虫项目”揭示了这个Java项目的核心技术和用途。下面将详细解释这些技术及其在项目中的作用: 1. **SSM框架**:SSM是Spring、SpringMVC和MyBatis的缩写,...
- 对于大型网站,可以考虑分布式爬虫设计,利用多台机器并行抓取。 总之,HttpClient和Jsoup是Java爬虫开发中的两个强大工具,它们结合使用能有效地抓取和解析网页信息。理解它们的工作原理和用法,对于构建高效的...
在本文中,我们将深入探讨HttpClient的基本用法,以及如何使用它来抓取网页内容。 首先,你需要在项目中引入HttpClient的依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml <groupId>org....
Jsoup+httpclient 模拟...通过上述知识点,可以了解到使用Jsoup和HttpClient进行网页登录和内容抓取的完整流程和关键技术点。在实际开发中,这些知识点可以帮助开发者高效地处理HTML页面数据,实现对网页的自动化操作。
开发者可能使用HTTPClient来模拟客户端,发送请求到一个基于servlet的服务器,而服务器则利用MQ来处理这些请求,实现服务间的通信和任务调度。 在实际开发中,这样的架构可以帮助我们构建出高性能、高可用的系统。...
HttpClient与JSoup结合使用,可以实现更高级的网页访问和数据获取。 **结合使用JSoup和HTTPClient** 将JSoup与HTTPClient结合,可以创建一个高效且灵活的网页爬虫。首先,HTTPClient负责发起HTTP请求,获取网页的...