一个mini爬虫的java实现,有码有真相

时间:2022-05-02 16:09:43
有一次上网看美女图片(好吧,BS我吧),网速慢的让我想砸电脑,突然脑袋灵光一闪,为什么不写个爬虫自动去网站上下载图片呢。经过几天的捣腾,于是就有了这个史上最mini爬虫。该爬虫采用java语言编写,使用了一个叫htmlparser的第三方开源库(可以到它的官网上下载jar)。由于纯属娱乐,所以它的功能比较简单,给它个网址,给一些限定的条件,它就会自动把网站中的图片下载到你的硬盘上,默认目录是C:\\日期_时间,如C:\\9_15_21_4_36。废话不多说,直接上代码:
(这篇文章对我帮助很大:http://developer.51cto.com/art/201103/248141.htm,感谢作者)

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayDeque;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Queue;
import java.util.Set;

import org.htmlparser.Node;
import org.htmlparser.Parser;
import org.htmlparser.tags.ImageTag;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeIterator;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

public class MiniCrawler {

private Set<String> alreadyCrawledSet;
private Queue<String> unCrawlQueue;
private static Set<String> picSrcSet;
private static final int MAX_COUNT = 10;
private String newFolder;


public MiniCrawler()
{
this.alreadyCrawledSet = new HashSet();
this.unCrawlQueue = new ArrayDeque();
this.picSrcSet = new HashSet<String>();

Calendar cal = Calendar.getInstance();
int month = cal.get(Calendar.MONTH)+1;
int day = cal.get(Calendar.DAY_OF_MONTH);
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);

    String folder = month+"_"+day+"_"+hour+"_"+minute+"_"+second;  
newFolder = "C:\\"+folder+"\\";
File dir = new File(newFolder);
if( null == dir || !dir.exists())
{
dir.mkdir();
}
}

public void crawl(String beginUrl)
{
Parser parser = null;
try {
parser = new Parser(beginUrl);
parser.setEncoding(parser.getEncoding());
NodeList nodeList = parser.parse(null);
parseNodeList(nodeList);
}
catch(ParserException e)
{
e.printStackTrace();
}
alreadyCrawledSet.add(beginUrl);
//已经爬完或者已经爬了最大网页数
while(!unCrawlQueue.isEmpty() && alreadyCrawledSet.size()< MAX_COUNT)
{
String newUrl = unCrawlQueue.remove();
try{
parser.setResource(newUrl);
parser.setEncoding(parser.getEncoding());
NodeList nl = parser.parse(null);
parseNodeList(nl);
} catch (ParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
alreadyCrawledSet.add(newUrl);
}
System.out.println("Crawl Finish!");

FileOutputStream fos = null;
PrintWriter pw = null;
//把得到的全部图片地址写到文件中
try {
String picFile = newFolder+"picAddrs.txt";
fos = new FileOutputStream(new File(picFile));
pw = new PrintWriter(fos);
Iterator<String> iter = picSrcSet.iterator();
while(iter.hasNext())
{
String str = iter.next().toString();
pw.write(str);
pw.flush();
}

} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally
{
if(null!=pw)
{
pw.close();
pw = null;
}
}
System.out.println("====== All the pic address have been writen to the file!");
}

public void parseNodeList(NodeList nodeList)
{
NodeIterator iter = nodeList.elements();
try {
while(iter.hasMoreNodes())
{
Node node = iter.nextNode();
if(node.getClass() == LinkTag.class)
{
LinkTag tag = (LinkTag)node;
String href = tag.getLink();
//System.out.println("===find a link: "+href);
if(null != href)
{
if(!alreadyCrawledSet.contains(href) && (href.indexOf("www.169pp.com")!=-1) && href.endsWith("htm"))
{
System.out.println("----find link: "+href);
unCrawlQueue.add(href);
}
}
}
else
{
NodeList childList = node.getChildren();
if( childList == null)
{
//说明是末尾节点,打印
//System.out.println("class: "+node.getClass()+",text: "+node.getText());
if(node instanceof ImageTag)
{
ImageTag tag = (ImageTag)node;
String picURL = tag.getImageURL();
if(picURL.endsWith(".jpg")||picURL.endsWith(".jpeg"))//||picURL.endsWith(".gif"))
{
picSrcSet.add(picURL);
}
}
}
else
{
parseNodeList(childList);
}

}

}
} catch (ParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void displayAlreadyCrawlUrl()
{
System.out.println("=================================");
Iterator<String> iter = alreadyCrawledSet.iterator();
while(iter.hasNext())
{
System.out.println(iter.next());
}

System.out.println("=================================");
Iterator<String> picIter = picSrcSet.iterator();
while(picIter.hasNext())
{
System.out.println(picIter.next());
}

}


public void download(Set<String> set,int flag)
{
if(null == set)
{
return;
}
System.out.println("They are total "+set.size()+" pics need to be download");
Iterator<String> iter = set.iterator();
int i = 0;
while(iter.hasNext())
{
String sourceFile = iter.next();
String newFileName = newFolder;
if(sourceFile.endsWith(".jpg"))
{
String s = i+".jpg";
newFileName += s;
}
else if(sourceFile.endsWith(".jpeg"))
{
String s = i+".jpeg";
newFileName += s;
}
i++;
URL url = null;
try {
url = new URL(sourceFile);
URLConnection conn = url.openConnection();
InputStream inputStream = conn.getInputStream();
FileOutputStream outputStream = new FileOutputStream(new File(newFileName));
byte[] bytes = new byte[1024];
int len = 0;
while((len = inputStream.read(bytes))!=-1)
{
outputStream.write(bytes,0,len);
}

outputStream.close();
inputStream.close();

System.out.println(i+" download finished");
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}

}

System.out.println("---------All Download Finished!");

}

public static void main(String[] args)
{
try{
String beginUrl = "http://www.169pp.com/";
MiniCrawler crawler = new MiniCrawler();
crawler.crawl(beginUrl);
//parser.displayAlreadyCrawlUrl();
crawler.download(picSrcSet,0);
}catch (Exception e)
{
e.printStackTrace();
}
}
}

30 个解决方案

#1


很好 学习了 谢谢分享哈

#2


盗爬下

#3


楼主是好人,一分钟下载71张风骚女PP

/*

Crawl Finish!
====== All the pic address have been writen to the file!
They are total 71 pics need to be download
1 download finished
2 download finished
3 download finished
4 download finished
5 download finished
6 download finished
7 download finished
8 download finished
9 download finished
10 download finished
11 download finished
12 download finished
13 download finished
14 download finished
15 download finished
16 download finished
17 download finished
18 download finished
19 download finished
20 download finished
21 download finished
22 download finished
23 download finished
24 download finished
25 download finished
26 download finished
27 download finished
28 download finished
29 download finished
30 download finished
31 download finished
32 download finished
33 download finished
34 download finished
35 download finished
36 download finished
37 download finished
38 download finished
39 download finished
40 download finished
41 download finished
42 download finished
43 download finished
44 download finished
45 download finished
46 download finished
47 download finished
48 download finished
49 download finished
50 download finished
51 download finished
52 download finished
53 download finished
54 download finished
55 download finished
56 download finished
57 download finished
58 download finished
59 download finished
60 download finished
61 download finished
62 download finished
63 download finished
64 download finished
65 download finished
66 download finished
67 download finished
68 download finished
69 download finished
70 download finished
71 download finished
---------All Download Finished!


*/


#4


能下视屏吗?
引用 3 楼 k3108001263 的回复:
楼主是好人,一分钟下载71张风骚女PP

Java code

/*

Crawl Finish!
====== All the pic address have been writen to the file!
They are total 71 pics need to be download
1 download finished
2 download finished
……

#5


好啊,顶一下

#6


都啥时代了,还htmlparser.jar 换jsoup.jar吧。

#7


lz很YD

#8


视频当然可以下了。把URL换成视频的就可以了。

#9


帮你顶!

#10


用的哪个htmlparser.jar版本啊,我下载了,可是对不上号,麻烦给个地址,让我去下载

#11


very good

#12


可以,把图片地址改成视频地址就行了,不过我还没下过
引用 4 楼 qqzy168 的回复:
能下视屏吗?引用 3 楼 k3108001263 的回复:
楼主是好人,一分钟下载71张风骚女PP

Java code

/*

Crawl Finish!
====== All the pic address have been writen to the file!
They are total 71 pics need to be download
1 downloa……

#13


这里:http://sourceforge.net/projects/htmlparser/files/
引用 10 楼 zhanghua_1199 的回复:
用的哪个htmlparser.jar版本啊,我下载了,可是对不上号,麻烦给个地址,让我去下载

#14


/71....

#15


我是个好淫,但是不荡。。。。
引用 7 楼 softroad 的回复:
lz很YD

#16


尼玛,我只路过~

#17


引用 13 楼 xxljayabc 的回复:
这里:http://sourceforge.net/projects/htmlparser/files/
引用 10 楼 zhanghua_1199 的回复:

用的哪个htmlparser.jar版本啊,我下载了,可是对不上号,麻烦给个地址,让我去下载



哥们,我打不开呀,不知道为什么,你就再帮帮忙吧,压缩一下发到我邮箱吧,,1215811695@qq.com

非常感谢,,
并且希望爱好编程的人加我为好友,,1215811695

#18



这种软件网上很多 templo** webzip

不过自己动手也是好的 

#19


不错,帮顶

#20


谢谢,顶顶更健康!!
引用 19 楼 zjp852218431 的回复:
不错,帮顶

#21


为什么我输入的网页里的图片都crawl不下来呢,你crawl什么样的网址

给一个让我试试,,,

程序能运行,就是crawl不下来

#22


可能crawl过,但是很多百度上的图片crawl不下来,,也有大型网址道页的图片crawl不下来

#23


我一直在顶这个贴子啊,,,
有没有httpparser帮助文档,,
官网又打不开。。。


lz帮帮忙了。。。

#24


zhanghua_1199,你要观察一下你要爬的网站的格式,然后稍稍修改一下代码,其实就是这里

 if(!alreadyCrawledSet.contains(href) && (href.indexOf("www.169pp.com")!=-1) && href.endsWith("htm"))
                        {
                            System.out.println("----find link: "+href);
                            unCrawlQueue.add(href);
                        }

看看你要爬的网站的地址样式
引用 21 楼 zhanghua_1199 的回复:
为什么我输入的网页里的图片都crawl不下来呢,你crawl什么样的网址

给一个让我试试,,,

程序能运行,就是crawl不下来

#25


你一直在顶我这个帖子,顶的我差点连菊花都感应到了,谢谢。有关httpparser的资料网上不用*的应该也有吧,多google,少baidu
引用 23 楼 zhanghua_1199 的回复:
我一直在顶这个贴子啊,,,
有没有httpparser帮助文档,,
官网又打不开。。。


lz帮帮忙了。。。

#26


强啊 悍啊!!!!!了不起啊

#27


楼主,你好!刚刚学爬虫,不是很懂,请问你回答二十四楼的观察网站格式并作修改是什么意思,谢谢!

#28


好东西!学习了

#29


呵呵,还不错。

#30


该回复于2012-09-03 11:27:02被版主删除

#1


很好 学习了 谢谢分享哈

#2


盗爬下

#3


楼主是好人,一分钟下载71张风骚女PP

/*

Crawl Finish!
====== All the pic address have been writen to the file!
They are total 71 pics need to be download
1 download finished
2 download finished
3 download finished
4 download finished
5 download finished
6 download finished
7 download finished
8 download finished
9 download finished
10 download finished
11 download finished
12 download finished
13 download finished
14 download finished
15 download finished
16 download finished
17 download finished
18 download finished
19 download finished
20 download finished
21 download finished
22 download finished
23 download finished
24 download finished
25 download finished
26 download finished
27 download finished
28 download finished
29 download finished
30 download finished
31 download finished
32 download finished
33 download finished
34 download finished
35 download finished
36 download finished
37 download finished
38 download finished
39 download finished
40 download finished
41 download finished
42 download finished
43 download finished
44 download finished
45 download finished
46 download finished
47 download finished
48 download finished
49 download finished
50 download finished
51 download finished
52 download finished
53 download finished
54 download finished
55 download finished
56 download finished
57 download finished
58 download finished
59 download finished
60 download finished
61 download finished
62 download finished
63 download finished
64 download finished
65 download finished
66 download finished
67 download finished
68 download finished
69 download finished
70 download finished
71 download finished
---------All Download Finished!


*/


#4


能下视屏吗?
引用 3 楼 k3108001263 的回复:
楼主是好人,一分钟下载71张风骚女PP

Java code

/*

Crawl Finish!
====== All the pic address have been writen to the file!
They are total 71 pics need to be download
1 download finished
2 download finished
……

#5


好啊,顶一下

#6


都啥时代了,还htmlparser.jar 换jsoup.jar吧。

#7


lz很YD

#8


视频当然可以下了。把URL换成视频的就可以了。

#9


帮你顶!

#10


用的哪个htmlparser.jar版本啊,我下载了,可是对不上号,麻烦给个地址,让我去下载

#11


very good

#12


可以,把图片地址改成视频地址就行了,不过我还没下过
引用 4 楼 qqzy168 的回复:
能下视屏吗?引用 3 楼 k3108001263 的回复:
楼主是好人,一分钟下载71张风骚女PP

Java code

/*

Crawl Finish!
====== All the pic address have been writen to the file!
They are total 71 pics need to be download
1 downloa……

#13


这里:http://sourceforge.net/projects/htmlparser/files/
引用 10 楼 zhanghua_1199 的回复:
用的哪个htmlparser.jar版本啊,我下载了,可是对不上号,麻烦给个地址,让我去下载

#14


/71....

#15


我是个好淫,但是不荡。。。。
引用 7 楼 softroad 的回复:
lz很YD

#16


尼玛,我只路过~

#17


引用 13 楼 xxljayabc 的回复:
这里:http://sourceforge.net/projects/htmlparser/files/
引用 10 楼 zhanghua_1199 的回复:

用的哪个htmlparser.jar版本啊,我下载了,可是对不上号,麻烦给个地址,让我去下载



哥们,我打不开呀,不知道为什么,你就再帮帮忙吧,压缩一下发到我邮箱吧,,1215811695@qq.com

非常感谢,,
并且希望爱好编程的人加我为好友,,1215811695

#18



这种软件网上很多 templo** webzip

不过自己动手也是好的 

#19


不错,帮顶

#20


谢谢,顶顶更健康!!
引用 19 楼 zjp852218431 的回复:
不错,帮顶

#21


为什么我输入的网页里的图片都crawl不下来呢,你crawl什么样的网址

给一个让我试试,,,

程序能运行,就是crawl不下来

#22


可能crawl过,但是很多百度上的图片crawl不下来,,也有大型网址道页的图片crawl不下来

#23


我一直在顶这个贴子啊,,,
有没有httpparser帮助文档,,
官网又打不开。。。


lz帮帮忙了。。。

#24


zhanghua_1199,你要观察一下你要爬的网站的格式,然后稍稍修改一下代码,其实就是这里

 if(!alreadyCrawledSet.contains(href) && (href.indexOf("www.169pp.com")!=-1) && href.endsWith("htm"))
                        {
                            System.out.println("----find link: "+href);
                            unCrawlQueue.add(href);
                        }

看看你要爬的网站的地址样式
引用 21 楼 zhanghua_1199 的回复:
为什么我输入的网页里的图片都crawl不下来呢,你crawl什么样的网址

给一个让我试试,,,

程序能运行,就是crawl不下来

#25


你一直在顶我这个帖子,顶的我差点连菊花都感应到了,谢谢。有关httpparser的资料网上不用*的应该也有吧,多google,少baidu
引用 23 楼 zhanghua_1199 的回复:
我一直在顶这个贴子啊,,,
有没有httpparser帮助文档,,
官网又打不开。。。


lz帮帮忙了。。。

#26


强啊 悍啊!!!!!了不起啊

#27


楼主,你好!刚刚学爬虫,不是很懂,请问你回答二十四楼的观察网站格式并作修改是什么意思,谢谢!

#28


好东西!学习了

#29


呵呵,还不错。

#30


该回复于2012-09-03 11:27:02被版主删除