java的一个爬虫
进行抓取页面,我看了一下人家的教程,一般要用到htmlparser用来解析html得到一个网页的相关链接,用httpclient抓取网页数据,
下面是一我写的spider类
package com.openzone.search.spider;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
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.lexer.Stream;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
public class Spider {
/**
* 使用种子初始化url队列
*/
String[] seeds;//种子地址,爬虫首先进入的网页
String line;//获取相关的链接,比如line="http://localhost",爬虫将只记录以此为开头的地址
String savepath;//存储网页的文件夹
String encoding;//爬虫的编码形式
public Spider(String[] seeds,String line,String savepath,String encoding){
this.seeds=seeds;
this.line=line;
this.savepath=savepath;
this.encoding=encoding;
}
public void init(){
Set<String> seedsSet=new HashSet<String>();
for(int i=0;i<seeds.length;i++){
seedsSet.add(seeds[i]);
}
UrlTables.addToUnvisitedUrlSet(seedsSet);
}
public void run() throws HttpException, IOException, ParserException{
init();
for(int i=0;i<20;i++){
if(UrlTables.getUnvisitedUrl().size()!=0){
String url=UrlTables.getFirstFromVisitedUrSet();
catchPages(url);
UrlTables.addToVisitedUrlSet(url);
UrlTables.addToUnvisitedUrlSet(getUrls(url));
}
}
}
public void catchPages(String url){
String filename=null;
HttpClient httpClient=new HttpClient();
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
GetMethod getMethod=new GetMethod(url);
//生成getmthod对象并设置参数
//设置get请求超时5s
getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000);
//设置请求重试处理
getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler());
//设置encoding 网页模板
getMethod.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,encoding);
getMethod.addRequestHeader("Content-Type", "text/html; charset=UTF-8");
//执行http get请求
int statusCode;
try {
statusCode = httpClient.executeMethod(getMethod);
System.out.print(statusCode);
if(statusCode==200){
InputStream responseBody=null;
responseBody=getMethod.getResponseBodyAsStream();
filename=getFileNameByUrl(url, getMethod.getResponseHeader("Content-Type").getValue());
if(responseBody!=null)
saveToLocal(responseBody,filename);
System.out.println("getsuccess");
String body="";
body=responseBody.toString();
System.out.println(body);
}else{
System.out.print("getfalse");
}
} catch (HttpException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 将catchPages得到的网页的比特流存到本地
*/
public void saveToLocal(InputStream responseBody,String filename) throws IOException{
BufferedReader reader = new BufferedReader(new InputStreamReader(responseBody,encoding));
File file=new File(savepath,filename);
FileOutputStream fileOutputStream=new FileOutputStream(file);
OutputStreamWriter writer=new OutputStreamWriter(fileOutputStream);
String line;
while((line=reader.readLine())!=null){
System.out.println(line);
writer.write(line);
}
writer.flush();
writer.close();
}
/*
* 解析页面的url
*/
public Set<String> getUrls(String url) throws ParserException{
Set<String> links=new HashSet<String>();
Parser parser=new Parser(url);
parser.setEncoding(encoding);
NodeFilter frameFilter=new NodeFilter() {
@Override
public boolean accept(Node node) {
// TODO Auto-generated method stub
if(node.getText().startsWith("frame src=")){
return true;
}else{
return false;
}
}
};
OrFilter linkFilter=new OrFilter(new NodeClassFilter(LinkTag.class),frameFilter);
NodeList list=parser.extractAllNodesThatMatch(linkFilter);
for(int i=0;i<list.size();i++){
Node tag=list.elementAt(i);
if(tag instanceof LinkTag){
LinkTag link=(LinkTag)tag;
String linkUrl=link.getLink();
if(frameFilter.accept(tag)){
//处理<frame>
String frameTxt=tag.getText();
int start=frameTxt.indexOf("src=");
frameTxt=frameTxt.substring(start);
int end=frameTxt.indexOf(" ");
if(end==-1){
end=frameTxt.indexOf(">");
} http://www.huiyi8.com/moban/
String frameUrl=frameTxt.substring(5,end-1);
if(LinkFilter(frameUrl))
links.add(frameUrl);
}else{
//处理<a>
if(LinkFilter(linkUrl)){
links.add(linkUrl);
}
}
}
}
return links;
}
//爬虫遵循的线索
public boolean LinkFilter(String url){
if(url.startsWith(line)){
return true;
}else{
return false;
}
}
//网页名filter,不然会出现存储错误
public String getFileNameByUrl(String url,String contentType){
//移除http;
url=url.substring(7);
//text/html类型
if(contentType.indexOf("html")!=-1){
url=url.replaceAll("[\\?/:*|<>\"]", "_")+".html";
return url;
}else{
return url.replaceAll("[\\?/:*|<>\"]","_")+"."+
contentType.substring(contentType.lastIndexOf("/")+1);
}
}
}
//下面是存储地址的类
package com.openzone.search.spider;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;
public class UrlTables {
private static Set<String> visitedUrlSet=new HashSet();
private static LinkedList unvisitedUrlSet=new LinkedList();
public static Set getVisitedUrl() {
return visitedUrlSet;
}
public static void setVisitedUrl(Set visitedUrl) {
UrlTables.visitedUrlSet = visitedUrl;
}
public static LinkedList getUnvisitedUrl() {
return unvisitedUrlSet;
}
public static void setUnvisitedUrl(LinkedList unvisitedUrl) {
UrlTables.unvisitedUrlSet = unvisitedUrl;
}
public static void addToVisitedUrlSet(String url){
visitedUrlSet.add(url);
}
public static boolean IsUnvisitedUrlSetEmpty(){
boolean isEmpty=false;
if(unvisitedUrlSet.isEmpty()){
isEmpty=true;
}
return isEmpty;
}
public static void addToUnvisitedUrlSet(Set<String> urls){
for (String url : urls) {
if(!isVisited(url)){
unvisitedUrlSet.add(url);
}
}
}
public static boolean isVisited(String url){
boolean isVisited=false;
for (String visitedUrl : visitedUrlSet) {
if(visitedUrl.equals(url)){
isVisited=true;
}
}
return isVisited;
}
public static String getFirstFromVisitedUrSet(){
String url=unvisitedUrlSet.getFirst().toString();
unvisitedUrlSet.removeFirst();
return url;
}
}
//下面实例化爬虫进行工作
package com.openzone.search.spider;
import java.io.IOException;
import org.apache.commons.httpclient.HttpException;
import org.htmlparser.util.ParserException;
public class SpiderRun {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] seeds={"http://localhost/openzone/"};
String line="http://localhost";
String savepath="D:\\javaworkspace\\openzone";
String encoding="utf-8";
Spider spider=new Spider(seeds, line, savepath, encoding);
try {
spider.run();
} catch (HttpException e) {
e.printStackTrace();
// TODO Auto-generated catch block
} catch (ParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
java的一个爬虫的更多相关文章
- Java实现一个简单的网络爬虫
Java实现一个简单的网络爬虫 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWri ...
- Java豆瓣电影爬虫——抓取电影详情和电影短评数据
一直想做个这样的爬虫:定制自己的种子,爬取想要的数据,做点力所能及的小分析.正好,这段时间宝宝出生,一边陪宝宝和宝妈,一边把自己做的这个豆瓣电影爬虫的数据采集部分跑起来.现在做一个概要的介绍和演示. ...
- Java开发搜索引擎爬虫
package com.peidon.html; import java.io.BufferedReader; import java.io.File; import java.io.FileOutp ...
- 【转】零基础写Java知乎爬虫之进阶篇
转自:脚本之家 说到爬虫,使用Java本身自带的URLConnection可以实现一些基本的抓取页面的功能,但是对于一些比较高级的功能,比如重定向的处理,HTML标记的去除,仅仅使用URLConnec ...
- Java之网络爬虫WebCollector2.1.2+selenium2.44+phantomjs2.1.1
Java之网络爬虫WebCollector2.1.2+selenium2.44+phantomjs2.1.1 一.简介 版本匹配: WebCollector2.12 + selenium2.44.0 ...
- java知乎爬虫
好久没写博客了,前阵子项目忙着上线,现在有点空闲,就把最近写的一个爬虫和大家分享下,统计结果放在了自己买的阿里云服务器上(点此查看效果),效果如下: 程序是在工作之余写的,用了java 的webmgi ...
- java简单web爬虫(网页图片)
java简单web爬虫(网页图片)效果,执行main()方法后图片就下载道C盘的res文件夹中.没有的话创建一个文件夹代码里的常量根据自己的需求修改,代码附到下面. package com.sinit ...
- 【网络爬虫】【java】微博爬虫(五):防止爬虫被墙的几个技巧(总结篇)
爬虫的目的就是大规模地.长时间地获取数据,跟我们正常浏览器获取数据相比,虽然机理相差不大,但总是一个IP去爬网站,大规模集中对服务器访问,时间一长就有可能被拒绝.关于爬虫长时间爬取数据,可能会要求验证 ...
- 【网络爬虫】【java】微博爬虫(一):小试牛刀——网易微博爬虫(自定义关键字爬取微博数据)(附软件源码)
一.写在前面 (本专栏分为"java版微博爬虫"和"python版网络爬虫"两个项目,系列里所有文章将基于这两个项目讲解,项目完整源码已经整理到我的Github ...
随机推荐
- K&R——第五章 指针与数组
#include <stdio.h> #define maxsize 5000 char buf[maxsize]; char *head = buf; char *new(int siz ...
- Elasticsearch分词导致的查找错误
这周在做视频搜索的过程中遇到一个问题,就是用下面的查询表达式去Elasticsearch检索,检索不到想要的结果.查询语句如下: 而查询的字段的值为: "mergeVideoName&quo ...
- Android 你应该注意的开发规范
本文由Blankj投稿. Blankjd的博客地址: http://www.jianshu.com/u/46702d5c6978 为了利于项目维护以及规范开发,促进成员之间Code Review的效率 ...
- 关于Label::createWithBMFont中资源文件使用的坑爹问题解决方式
1.问题 使用Label的createWithBMFont,结果.fnt的资源总是找不到或者获取数据失败.原来.fnt资源的使用须要配合该资源的.png共同 使用,如bitmapFontTest3.f ...
- 在jsp中拿到applicationContext
WebApplicationContext wac = (WebApplicationContext)config.getServletContext().getAttribute(WebApplic ...
- Unable to satisfy the following requirements解决方式
今天从git上面download我们项目,然后向往常一样安装Cocoapods.可是却突然发现报错了,尝试了几遍.发现一直报错. 然后我这才看了一下,安装Cocoapods的日志,发现抛出了一个报错. ...
- Go语言中的单引号、双引号、反引号
=Start= 搜索关键字: golang single quotes golang double quotes golang back quotes 参考结果: 结论写在最前:在Go语言中不倾向于使 ...
- python 大小写转换方法(全)
http://blog.csdn.net/liuxincumt/article/details/7945337 python大小写转换(全)
- Django-中介模型
有多对多字段的时候自己创建的第三章表就是中介模型 class Article(models.Model): ''' 文章表 ''' title = models.CharField(max_lengt ...
- Vue 资源
一. 资源教程 综合类 vuejs 英文资料 Vue中文资料总汇 Vue.js 的一些资源索引 vue资料 入门类 vue 快速入门 Vue.js 中文系列视频教程 on Laravist 英文教程 ...