`

[java]使用htmlparser获取豆瓣日记

 
阅读更多

内容很简单就是使用htmlparser这个工具库来进行一些html的简单解析

 

测试页面:http://www.douban.com/people/maybedekky/notes

 

拦截的规则也是很简单的 

  • 豆瓣每页的url形式是http://www.douban.com/people/maybedekky/notes?start= 每页10页的话 第一页就是=0 第二页=10 以此类推
  • 文章页面的url是http://www.douban.com/note/数字/ 的形式也很好获取到
  • 然后就是文章内容 标题直接获取<title></title>就可以了 而内容则是被div class="note" id="link-report“包裹的 

按照以上规则匹配就可以了

代码如下:

package org.cc.douban;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
/**
 * 
 * @author fair_jm
 * http://fair-jm.iteye.com/
 *
 */
public class MayBeTest {

	public static final int PAGE_SIZE = 10;

	/**
	 * 如果输出的标题和内容是乱序的很正常 因为用了多线程在输出的时候也没加锁 
	 * 可以放到数据库 或者生成文本 方法中并没有共享变量所以不会产生太大的问题
	 * @param args
	 * @throws InterruptedException
	 */
	public static void main(String[] args) throws InterruptedException {
		List<String> articel_urls = getUrl(
				"http://www.douban.com/people/maybedekky/notes", 11);
		Executor exec = Executors.newCachedThreadPool();
		final CountDownLatch cdl = new CountDownLatch(articel_urls.size());
		for (String url : articel_urls) {
			final String u = url;
			exec.execute(new Runnable() {

				@Override
				public void run() {
					getArticle(u);
					cdl.countDown();
				}
			});
		}

		cdl.await();

		System.out.println("任务完成");
	}

	/**
	 * 得到文字(这里直接输出)
	 * @param url 文章的url
	 */
	public static void getArticle(String url) {
		try {
			Parser parser = new Parser(url);
			parser.setEncoding("UTF-8");
			NodeFilter articleFilter = new NodeFilter() {
				public boolean accept(Node node) {
					if (node.getText().startsWith(
							"div class=\"note\" id=\"link-report\"")) {
						return true;
					} else {
						return false;
					}
				}
			};

			NodeFilter titleFilter = new NodeFilter() {
				public boolean accept(Node node) {
					if (node.getText().startsWith("title")) {
						return true;
					} else {
						return false;
					}
				}
			};

			OrFilter or1 = new OrFilter(new NodeFilter[] { articleFilter,
					titleFilter });
			NodeList list = parser.extractAllNodesThatMatch(or1);
			for (int i = 0; i < list.size(); i++) {
				Node tag = list.elementAt(i);
				System.out.println(tag.getText() + "\n"
						+ tag.getChildren().asString().trim() + "\n");

			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

    /**
     * 
     * @param url 要获取日志的地址
     * @param pageCount 多少页
     * @return 返回对应的url列表
     */
	public static List<String> getUrl(String url, int pageCount) {
		List<String> urls = new ArrayList<String>();
		try {
			for (int page = 0; page < pageCount; page++) {
				Parser parser = new Parser(
						url+"?start="
								+ page * pageCount);
				parser.setEncoding("gbk");
				NodeList list = parser
						.extractAllNodesThatMatch(new NodeClassFilter(
								LinkTag.class));
				for (int i = 0; i < list.size(); i++) {
					Node tag = list.elementAt(i);
					if (tag instanceof LinkTag)// <a> 标签
					{
						LinkTag link = (LinkTag) tag;
						String linkUrl = link.getLink();// url
						String text = link.getLinkText();// 链接文字
						if (linkUrl.contains("http://www.douban.com/note")
								&& linkUrl.endsWith("/")) {
							if (!urls.contains(linkUrl)) {
								urls.add(linkUrl);
							}
						}
					}
				}
			}
		} catch (ParserException e) {
			e.printStackTrace();
		}
		for (String s : urls) {
			System.out.println(s);
		}
		return urls;
	}
}

 输出就不写了 因为输出是乱序的(标题和内容我是分开打印的) 这个是没什么关系的 可以用写文件或者存入数据库的形式完成操作.

 

 

0
0
分享到:
评论
2 楼 fair_jm 2013-07-01  
struts2coding 写道
建议用jsoup抓取网页,主要有jquery那样的css选择器语法,很方便

嗯 感谢回复 htmlparser更新也很慢 ^_^。(但我不会JQuery 额..%>_<% 选择器当然也就不会用了哈....(以后再学....)
1 楼 struts2coding 2013-06-30  
建议用jsoup抓取网页,主要有jquery那样的css选择器语法,很方便

相关推荐

    Java使用HtmlParser实现简单的网络爬虫

    这里我们使用了HtmlParser库,它是一个开源的Java库,专门用于解析HTML文档,提取和处理网页上的信息。以下是如何使用HtmlParser实现网络爬虫的关键知识点: 1. **HtmlParser库**:HtmlParser是一个强大的HTML解析...

    Java使用HtmlParser实现简单的网络爬虫.zip

    Java使用HtmlParser实现简单的网络爬虫是一种常见的技术实践,它涉及到网络编程、HTML解析和数据提取等核心概念。本文将详细讲解如何运用Java语言结合HtmlParser库来构建一个基础的网络爬虫,以便从网页中获取所需...

    java利用htmlparser抓取网页数据

    通过使用HTMLParser,开发者可以方便地遍历HTML元素,获取所需信息。 首先,我们需要引入HTMLParser库到项目中。这通常可以通过Maven或Gradle依赖管理工具来完成。例如,在Maven的pom.xml文件中添加以下依赖: ```...

    JAVA htmlparser 使用实例

    ### JAVA HtmlParser 使用实例详解 在Java开发过程中,解析HTML文档是一项常见的需求,尤其是在处理Web爬虫、数据抓取等应用场景时。`HtmlParser`库为开发者提供了一种简便的方式来解析HTML文档,并从中提取所需的...

    java解析html工具htmlparser的jar包及api文档

    API文档是使用HTMLParser的关键,它详尽地解释了库中每个类、方法和接口的用途。通过API文档,开发者可以了解如何初始化解析器,如何遍历HTML元素,以及如何处理各种HTML标签。例如,HTMLParser库可能会提供如`...

    java使用htmlparser提取网页纯文本例子

    【Java使用HTMLParser提取网页纯文本】\n\n在Java编程中,提取网页纯文本是一项常见的任务,尤其在数据抓取、信息分析等领域。HTMLParser是一个强大的Java库,专门用于解析HTML文档,提取其中的文本内容。下面我们将...

    Java正则表达式入门 + HTMLParser使用详解

    自从Java 1.4引入`java.util.regex`包以来,Java程序员就可以方便地使用正则表达式来处理字符串操作。下面将详细介绍Java正则表达式的常用语法和特性。 1. **转义字符**: - `\a`: 响铃符 (ASCII 07) - `\f`: ...

    javajsp中使用HTMLParser

    2. **DOM树构建**:HTMLParser能够构建一个基于DOM(Document Object Model)的树形结构,使开发者可以像操作XML一样操作HTML文档,通过节点遍历和查询来获取所需信息。 3. **错误处理**:HTMLParser具备容错能力,...

    java htmlparser

    根据给定文件的信息,本文将围绕“Java HTMLParser解析网页源码”的主题展开,深入探讨其功能、工作原理以及在不同场景下的应用方法。 ### Java HTMLParser简介 HTMLParser是用Java编写的开源HTML解析器,它能帮助...

    htmlparser_Java网页解析器

    在Java项目中,可以使用Maven或Gradle添加HTMLParser依赖。对于Maven,可以在pom.xml文件中添加如下依赖: ```xml &lt;groupId&gt;org.htmlparser &lt;artifactId&gt;htmlparser &lt;version&gt;2.3 ``` 对于Gradle,则在build....

    HTMLParser 使用举例

    HTMLParser 使用举例 HTMLParser 是一个开源的类库,用于解析 Web 页面。它有两种主要使用方式:extraction 和 transformation。前者用于从网页中萃取出需要的内容,后者用于把 Web 页面中的内容转换为需要的格式。...

    HtmlParser 实现简易爬虫

    通过使用HTMLParser,我们可以解析HTML文档,找到特定的标签、类名或者ID,进而获取所需的数据。 要开始构建爬虫,首先需要在项目中引入HTMLParser的jar包。在提供的压缩包中,"lib"目录下的jar文件就是HTMLParser...

    htmlparser(c#,java)

    本文将深入探讨HTMLParser的核心功能、使用场景、以及如何在C#和Java中集成和使用。 1. HTMLParser的核心功能: HTMLParser的主要目标是解析不规则的HTML代码,它能够识别并提取出标签、属性、文本内容等关键元素...

    java利用htmlparser获取html中想要的代码具体实现

    总结来说,使用Java和HTMLParser库,我们可以有效地解析HTML文档,并通过过滤器和正则表达式来提取需要的信息。这个过程包括了创建解析器、设置编码、定义过滤器、获取节点列表、遍历子节点以及解析和提取目标数据。...

    htmlparser

    META-INF/maven/org.htmlparser/htmlparser/pom.properties META-INF/maven/org.htmlparser/htmlparser/pom.xml org.htmlparser.Parser.class org.htmlparser.PrototypicalNodeFactory.class org.htmlparser.beans....

    java htmlparser 类JAR包下载

    使用HTMLParser类库的步骤大致如下: 1. 引入依赖:将HTMLParser的JAR包添加到项目的类路径中,或者在Maven或Gradle项目中配置相应的依赖。 2. 创建解析器:实例化HTMLParser对象,可以设置不同的解析策略,如严格...

    HTMLParser使用文档和jar包

    本篇将详细阐述HTMLParser的使用方法、功能以及提供的相关资源。 首先,`HTMLParser-2.0-SNAPSHOT-doc.zip`包含了HTMLParser的使用文档。这份文档通常包含API参考、教程、示例代码和用户指南,是学习和理解...

    HTMLParser.net源代码HTMLParser.net使用demo

    本项目名为"HTMLParser.net源代码HTMLParser.net使用demo",显然是一个包含示例代码的压缩包,用于展示如何在实际应用中使用HTMLParser.net。 HTMLParser.net的核心功能包括: 1. **HTML解析**:它能够将HTML字符...

    使用htmlparser制作的网页爬虫例题

    使用htmlparser制作的网页爬虫例题

Global site tag (gtag.js) - Google Analytics