JAVA爬虫创建第一个互联网爬虫程序
上一章介绍了XPATH的基础语法。 本章用手编写第一个爬行器程序。 另外,希望通过这个爬虫程序,熟悉上一章学到的XPATH的基础语法,可以在实战中运用。
目标通过Java程序收集URL地址,获取地址中的标题、发布时间和正文内容,并将收集到的内容保存在本地文件中。
准备工作1.jdk1.6以上
2.eclipse
3.URL地址:3358 blog.csdn.net/gong bing 798930123/article/details/7895597
4.htmlcleaner.jar
HtmlCleaner包概述HtmlCleaner是开源Java语言的Html文档效应器。 HtmlCleaner会刷新HTML文档中的每个元素,以生成结构良好的“欢迎”HTML文档。
默认情况下,它类似于大多数web浏览器用于文档对象创建模型的规则。 但是,用户可以提供自定义tag和规则集进行过滤和匹配。 它被设计成小、快、灵活、独立。 对于命令行工具和Ant任务,HtmlCleaner还可以在Java代码中使用。 分析后对轻量级文档对象进行编程可以方便地转换为DOM或JDom标准文档,也可以通过多种方式(压缩、打印)连续输出XML。
简单来说,HtmlCleaner可以将我们下载的Html内容转换为DOM对象。 此Jar包还提供了XPATH分析的API,有助于在XPATH上分析收集的web内容。
代码示例:
DataBean.java :包含标题、正文和发行时间的实体类
package com.demo;
//*
*
* @author binggong
@制作时间2018年1月4日下午10:18:26
* @微信公众号:DT数据技术博文
* @tag:包含标题、正文和发布时间的实体类
*/
公共类数据数据库{
//*
*标题
*/
私有字符串标题;
//*
*发布时间
*/
私密字符串pubtime;
//*
*正文内容
*/
私有字符串上下文;
公共数据库
super (;
}
公共数据库(字符串title,字符串pubtime,字符串上下文) {
super (;
this.title=title;
this.pubtime=pubtime;
this.context=context;
}
公共字符串获取
返回标题;
}
publicvoidsettitle (字符串标题) {
this.title=title;
}
公共字符串get pubtime
返回行程;
}
publicvoidsetpubtime (字符串pubtime ) {
this.pubtime=pubtime;
}
公共字符串获取上下文(
返回上下文;
}
publicvoidsetcontext (字符串上下文) {
this.context=context;
}
}
download html.Java :下载web内容
package com.demo;
import java.io.BufferedReader;
import java.io.InputStream;
import Java.io.input streamreader;
import Java.net.malformedurlexception;
import java.net.URL;
import java.net.URLConnection;
//*
*
* @author binggong
* @创建时间2018年1月5日下午9:25:31
* @微信公众号:DT数据技术博文
* @ tag :网络内容下载
*/
公共的
class DownloadHtml {/**
* 下载指定URL的Html内容
* @param url url连接
* @return 返回html页面内容
* @throws Exception
*/
public String getHtml(String url) throws Exception{
URL u = new URL(url);
URLConnection conn =u.openConnection();
InputStream in = conn.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line = null;
StringBuffer html = new StringBuffer();
while((line=br.readLine())!=null){
html.append(line);
}
in.close();
br.close();
return html.toString();
}
}
SpiderMain.java:爬虫解析存储类
package com.demo;
import java.io.PrintWriter;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;
/**
*
* @author binggong
* @创建时间 2018年1月4日 下午10:24:01
* @微信公众号:DT数据技术博文
* @tag: 爬虫解析
*/
public class SpiderMain {
/**
* 爬虫解析方法
* @param url 待采集的URL
* @return 返回解析的内容
* @throws Exception
*/
public DataBean getSpiderData(String url) throws Exception{
//1.下载html
String html = new DownloadHtml().getHtml("http://blog.csdn.net/gongbing798930123/article/details/78955597");
HtmlCleaner hc = new HtmlCleaner();
//2.把html转换成dom对象
TagNode tn = hc.clean(html);
//3.通过xpath解析dom对象
String title = tn.evaluateXPath("//h1[@class='csdn_top']/text()")[0].toString();
String context = tn.evaluateXPath("//div[@id='article_content']/text()")[0].toString();
String pubictime = tn.evaluateXPath("//span[@class='time']/text()")[0].toString();
//4.把结果放入到实体类中
DataBean result = new DataBean();
result.setTitle(title);
result.setPubtime(pubictime);
result.setContext(context);
return result;
}
/**
* 保存采集到的内容
* @param url 待采集的网页
* @param outpath 存储的路径
* @throws Exception
*/
public void saveSpiderData(String url,String outpath) throws Exception{
DataBean data = getSpiderData(url);
PrintWriter pw = new PrintWriter(outpath);
pw.println("标题:"+data.getTitle());
pw.println("发布时间:"+data.getPubtime());
pw.println("正文:"+data.getContext());
pw.flush();
pw.close();
}
public static void main(String[] args) {
try {
new SpiderMain().saveSpiderData("http://blog.csdn.net/gongbing798930123/article/details/78955597","c:\spider_result.txt");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
总结从代码示例可以看出,完成一个爬虫程序还是比较简单的,相信对于有学习过Java基础的你上手起来很容易。
同时从代码示例可以看出,爬虫的基本流程为:
请求URL--->下载HTML内容--->解析内容--->保存结果
对于生产级的爬虫项目来说需要处理的问题远不止这些,比如在项目中会遇到反爬虫、性能、登录、加密、异步请求问题、请求失败、代码健壮等这些问题都需要解决。
万变不离其宗,不管生产级的爬虫项目遇到多少难题,爬虫的基础流程是不会变的,
同时后面我会把我在爬虫中所踩的坑都会记录下来,希望能对读者在爬虫道路上少走弯路。
备注:大家记得关注微信公众号:DT数据技术博文,回复:001,下载项目jar包和源码哟!![这里写图片描述](https://img-blog.csdn.net/20180106161404304?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ29uZ2Jpbmc3OTg5MzAxMjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)