文档章节

一段基于Jsoup和Dom4j的海报爬取小程序

xyxo
 xyxo
发布于 2012/09/08 10:45
字数 358
阅读 535
收藏 1
/**
 * 
 */
package com.pan.tools;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.ResourceBundle;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.jsoup.Jsoup;
import org.jsoup.select.Elements;

/**
 * @author Javay
 * 
 * 2012-9-7下午3:13:10
 * 
 */
public class MovieRssCNGenerator {

	private ResourceBundle bundle = ResourceBundle.getBundle("xmlCN");
	private final static int RETRY_TIME = 3;
	
	public static String getDateTime() {		
		return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
	}
	
	/**
	 * 解析获取豆瓣电影宣传海报信息
	 * 
	 * @return */
	public Elements getDoubanMovieSlidePic() {
		
		int time = 0;
		
		do{
			try {
				
				org.jsoup.nodes.Document doc = Jsoup
						.connect(bundle.getString("douban")).data("query", "Java")
						.userAgent("Mozilla").cookie("auth", "token")
						.timeout(20000).post();
				org.jsoup.nodes.Element screeningbd = doc
						.select("div.screening-bd").first();
				Elements slideItems = screeningbd.select("li.poster");
				return slideItems;
				
			} catch (IOException e) {			
				time++;
				if(time < RETRY_TIME){
					System.out.println("请求超时,进行第"+time+"次重连。");
					try {
						Thread.sleep(3000);
					} catch (InterruptedException e1) {
						continue;
					}
				}
								
			}
		}while(time < RETRY_TIME);
		
		return null;

	}
	/**
	 * 生成XML文件
	 * 
	 * @param items
	 */
	public void createXMLDoc(Elements items) {
		Document doc = DocumentHelper.createDocument();
		doc.addComment("panmay.com"+this.getDateTime());
		Element root = doc.addElement("movies");
		if (items != null) {
			for (org.jsoup.nodes.Element item : items) {
				Element movie = root.addElement("movie");
				Element title = movie.addElement("title");
				title.setText(item.select("img").attr("alt").trim());
				Element link = movie.addElement("link");
				link.setText(item.select("a").attr("href"));

				String img = item.select("img").attr("data-original");
				Element pic = movie.addElement("pic");
				if ("".equals(img)) {
					pic.setText(item.select("img").attr("src").trim());
				} else {
					pic.setText(img.trim());
				}

			}

			String directory = bundle.getString("xmlPath");
			String fileName = bundle.getString("fileName");
			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setEncoding("UTF-8");

			File file = new File(directory);
			if (!file.exists()) {
				System.out.println("目录不存在,创建一个新的文件输出路径: " + file);
				file.mkdirs();
			}
			try {
				FileOutputStream fos = new FileOutputStream(directory
						+ fileName + ".xml");
				try {
					XMLWriter writer = new XMLWriter(fos, format);
					try {
						writer.write(doc);
					} catch (IOException e) {
						e.printStackTrace();
					} finally {
						if (writer != null) {
							try {
								writer.close();
								System.out.println(fileName + "文件输出完毕!");
							} catch (IOException e) {
								e.printStackTrace();
							}
						}
					}
				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
				}
			} catch (FileNotFoundException e1) {
				e1.printStackTrace();
			}
		} else {
			System.out.println("数据读取失败!程序终止!");
		}

	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		MovieRssCNGenerator robot = new MovieRssCNGenerator();
		robot.createXMLDoc(robot.getDoubanMovieSlidePic());
	}

}

© 著作权归作者所有

xyxo

xyxo

粉丝 8
博文 19
码字总数 5259
作品 0
深圳
程序员
私信 提问
Java 多线程爬虫框架 - AiPa

一款小巧、灵活的Java多线程爬虫框架(AiPa) 1.框架简介 AiPa 是一款小巧,灵活,扩展性高的多线程爬虫框架。 AiPa 依赖当下最简单的HTML解析器Jsoup。 AiPa 只需要使用者提供网址集合,即可...

像风一样i
2018/09/29
4.4K
6
jsoup可以访问js运行之后的html页面吗?

jsoup可以访问js运行之后的html页面吗?比如有些数据是调用js从后台取得,我现在要得到这些数据,就要爬取js运行之后的页面,可是以我现在对jsoup的研究深度,发现jsoup没有这样的功能,请问...

菠萝啊哈哈
2012/02/15
7K
10
Jsoup获取全国地区数据属性值(省市县镇村)

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。 最近手头在做一些东西,需...

JAVA_NINA
2016/06/07
162
0
怎样用爬取网页中的pdf的内容

诸位大神,求指点。。。。 在爬取网页数据的时候,发现里面有学正文内容是在pdf中的,请问大神们怎样爬取下来这些内容啊,我的程序用的是jsoup。。。谢谢

struts_hibernate_spr
2014/01/13
2.8K
4
由Java爬虫所想到的

爬虫,听起来似乎很高端,然而也就那么回事,有很多爬虫框架,Java实现的有crawler4j,WebCollector,webMagic,Python实现的最著名的应该是Scrapy,工作中用到,但是没用什么爬虫框架,整个...

开源中国刘德华
2016/06/02
160
0

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
43分钟前
7
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部