一、 序言
实现这个爬虫需要两个数据结构支持,unvisited队列(priorityqueue:可以适用pagerank等算法计算出url重要度)和visited表(hashset:可以快速查找url是否存在);队列用于实现宽度优先爬取,visited表用于记录爬取过的url,不再重复爬取,避免了环。java爬虫需要的工具包有httpclient和htmlparser1.5,可以在maven repo中查看具体版本的下载。
1、目标网站:新浪 http://www.sina.com.cn/ 2、结果截图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6k0mbeUt-1616421436057)(https://upload-images.jianshu.io/upload_images/25993207-ee1ac82f671f4a5f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
下面说说爬虫的实现,后期源码会上传到github中,需要的朋友可以留言:
**二、爬虫编程 **
1、创建种子页面的url
MyCrawler crawler = new MyCrawler();
crawler.crawling(new String[]{“http://www.sina.com.cn/”});
2、初始化unvisited表为上面的种子url
LinkQueue.addUnvisitedUrl(seeds[i]);
3、最主要的逻辑实现部分
在队列中取出没有visit过的url,进行下载,然后加入visited的表,并解析改url页面上的其它url,把未读取的加入到unvisited队列;迭代到队列为空停止,所以这个url网络还是很庞大的。注意,这里的页面下载和页面解析需要java的工具包实现,下面具体说明下工具包的使用。
while(!LinkQueue.unVisitedUrlsEmpty()&&LinkQueue.getVisitedUrlNum()<=1000)
{
//队头URL出队列
String visitUrl=(String)LinkQueue.unVisitedUrlDeQueue();
if(visitUrl==null)
continue;
DownLoadFile downLoader=new DownLoadFile();
//下载网页
downLoader.downloadFile(visitUrl);
//该 url 放入到已访问的 URL 中