Java爬虫搜索原理实现

简介:

permike 原文 Java爬虫搜索原理实现

没事做,又研究了一下爬虫搜索,两三天时间总算是把原理闹的差不多了,基本实现了爬虫搜索的原理,本次实现还是俩程序,分别是按广度优先和深度优先完成的,广度优先没啥问题,深度优先请慎用,有极大的概率会造成死循环情况,下面深度优先的测试网站就造成了死循环。。。。好吧,我承认是我人品不太好。。。下面有请代码君出场~~~~~~~~~~~~~~~

1.广度优先

 

[java]  view plain copy
 
  1. /** 
  2.  * 完成广度优先搜索 
  3.  */ package import import import import import import import import import importimport /** 
  4.  * @author 魏诗尧 
  5.  * @version 1.8 
  6.  * @emali inwsy@hotmail.com 
  7.  */ publicclass   
  8. privatevoid   
  9. null   
  10. null   
  11. null try   
  12. new   
  13.   
  14.   
  15. new bytenewbyte1024 int;  
  16.   
  17. while)) != -) {  
  18. , len);  
  19.   
  20. new);  
  21. catch );  
  22. finally try   
  23. ifnull ifnull catch   
  24. privatevoid   
  25. null null null try   
  26. newtrue new);  
  27. newnew   
  28. whilenull   
  29.   
  30.   
  31. while );  
  32.   
  33. if) {  
  34. continue if) == ) {  
  35. continue if)) {  
  36. continue if) != -) {  
  37. continue if) != -) {  
  38. continue if)) {  
  39. continue   
  40.   
  41. );  
  42. catch );  
  43. finally   
  44. try ifnull ifnull ifnull catch   
  45. privatevoid   
  46. null null try   
  47. new);  
  48. newnew   
  49. new   
  50. whilenull   
  51. );  
  52. catch finally try   
  53. ifnull ifnull catch publicstaticvoidthrows   
  54. new);  
  55.   
  56. new }  

上面广度优先没啥问题,本人昨天凌晨3点多做的测试,15分钟左右的时间,这只小爬虫爬到了30W+的链接,能力还是蛮强大的么,顺便提一下,白天测试的时候会非常非常的慢,推荐各位测试君在晚上12点以后做测试。。。。。虽然不太人道。。。

 

下面是深度优先的代码,测试的时候每次都能造成死循环。。。好吧,我承认我没有人品。。。其实基本方法和广度优先没啥区别,我每个页面爬出来的链接只拿第一个去爬下一个页面,总共爬多少层我懒的木有定义,就是想看看最多能爬到哪。。。然后每次都能悲剧的死循环了。。。我明明也设置了跳出的方法了啊,我有判断有效链接的方式,但是我的判断并不完善么,跳出方法我写到了catch中,只要有一个无效链接,就可以跳出来了么。。。今天凌晨全都是死循环。。。。无奈了。。。。下面请代码君上场~~~~~~~~~~


 

[java]  view plain copy
 
  1. /** 
  2.  * 完成深度优先搜索 
  3.  * 爬虫进行深度优先很有可能会出现死循环的情况 
  4.  */ package import import import import import import import import import importimport import import /** 
  5.  * @author 魏诗尧 
  6.  * @version 1.8 
  7.  * @emali inwsy@hotmail.com 
  8.  */ publicclass   
  9. privatestaticnew   
  10. privatevoid   
  11. null   
  12. null   
  13. null try   
  14. new   
  15.   
  16.   
  17. new bytenewbyte1024 int;  
  18.   
  19. while)) != -) {  
  20. , len);  
  21. new);  
  22. catch );  
  23. finally try   
  24. ifnull ifnull catch   
  25. privatevoid   
  26. null null try   
  27. new);  
  28. newnew   
  29. whilenull   
  30.   
  31.   
  32. while );  
  33.   
  34. if) {  
  35. continue if) == ) {  
  36. continue if)) {  
  37. continue if) != -) {  
  38. continue if) != -) {  
  39. continue if)) {  
  40. continue   
  41.   
  42. whilenull new);  
  43. break catch );  
  44. new finally   
  45. try ifnull ifnull catch publicvoid null try   
  46. newtrue   
  47. while );  
  48. catch );  
  49. finally try ifnull catch publicstaticvoid new);  
  50. new }  

上面这两篇代码本身是十分不完善的,时间原因,我基本只实现了最基本的原理,能改动增加的地方还有很多,主要是增加,很多地方都可增加代码来增强程序的健壮性。。。比如有效链接判断的地方,我们从href标签中取出来的内容除了我写的几条判断意外还有好多东西都没有处理掉,这个地方还是能增加很多东西的。。。

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。






   本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/6194372.html ,如需转载请自行联系原作者
相关文章
|
2月前
|
数据采集 监控 数据库
爬虫技术详解:从原理到实践
本文详细介绍了爬虫技术,从基本概念到实际操作,涵盖爬虫定义、工作流程及Python实现方法。通过使用`requests`和`BeautifulSoup`库,演示了如何发送请求、解析响应、提取和保存数据,适合初学者学习。强调了遵守法律法规的重要性。
442 4
|
2月前
|
存储 Java 关系型数据库
高效连接之道:Java连接池原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。频繁创建和关闭连接会消耗大量资源,导致性能瓶颈。为此,Java连接池技术通过复用连接,实现高效、稳定的数据库连接管理。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接池的基本操作、配置和使用方法,以及在电商应用中的具体应用示例。
96 5
|
3月前
|
数据采集 缓存 Java
Python vs Java:爬虫任务中的效率比较
Python vs Java:爬虫任务中的效率比较
|
3月前
|
存储 算法 Java
Java HashSet:底层工作原理与实现机制
本文介绍了Java中HashSet的工作原理,包括其基于HashMap实现的底层机制。通过示例代码展示了HashSet如何添加元素,并解析了add方法的具体过程,包括计算hash值、处理碰撞及扩容机制。
|
1月前
|
监控 Java API
探索Java NIO:究竟在哪些领域能大显身手?揭秘原理、应用场景与官方示例代码
Java NIO(New IO)自Java SE 1.4引入,提供比传统IO更高效、灵活的操作,支持非阻塞IO和选择器特性,适用于高并发、高吞吐量场景。NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector),能实现多路复用和异步操作。其应用场景涵盖网络通信、文件操作、进程间通信及数据库操作等。NIO的优势在于提高并发性和性能,简化编程;但学习成本较高,且与传统IO存在不兼容性。尽管如此,NIO在构建高性能框架如Netty、Mina和Jetty中仍广泛应用。
49 3
|
1月前
|
安全 算法 Java
Java CAS原理和应用场景大揭秘:你掌握了吗?
CAS(Compare and Swap)是一种乐观锁机制,通过硬件指令实现原子操作,确保多线程环境下对共享变量的安全访问。它避免了传统互斥锁的性能开销和线程阻塞问题。CAS操作包含三个步骤:获取期望值、比较当前值与期望值是否相等、若相等则更新为新值。CAS广泛应用于高并发场景,如数据库事务、分布式锁、无锁数据结构等,但需注意ABA问题。Java中常用`java.util.concurrent.atomic`包下的类支持CAS操作。
70 2
|
2月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
2月前
|
Java
Java之CountDownLatch原理浅析
本文介绍了Java并发工具类`CountDownLatch`的使用方法、原理及其与`Thread.join()`的区别。`CountDownLatch`通过构造函数接收一个整数参数作为计数器,调用`countDown`方法减少计数,`await`方法会阻塞当前线程,直到计数为零。文章还详细解析了其内部机制,包括初始化、`countDown`和`await`方法的工作原理,并给出了一个游戏加载场景的示例代码。
Java之CountDownLatch原理浅析
|
2月前
|
Java 索引 容器
Java ArrayList扩容的原理
Java 的 `ArrayList` 是基于数组实现的动态集合。初始时,`ArrayList` 底层创建一个空数组 `elementData`,并设置 `size` 为 0。当首次添加元素时,会调用 `grow` 方法将数组扩容至默认容量 10。之后每次添加元素时,如果当前数组已满,则会再次调用 `grow` 方法进行扩容。扩容规则为:首次扩容至 10,后续扩容至原数组长度的 1.5 倍或根据实际需求扩容。例如,当需要一次性添加 100 个元素时,会直接扩容至 110 而不是 15。
Java ArrayList扩容的原理
|
2月前
|
数据采集 存储 Web App开发
Java爬虫:深入解析商品详情的利器
在数字化时代,信息处理能力成为企业竞争的关键。本文探讨如何利用Java编写高效、准确的商品详情爬虫,涵盖爬虫技术概述、Java爬虫优势、开发步骤、法律法规遵守及数据处理分析等内容,助力电商领域市场趋势把握与决策支持。