java爬虫抓取动态网页( Java爬虫被屏蔽,不要慌,聊反爬虫策略和反反爬虫 )
优采云 发布时间: 2022-03-20 18:17java爬虫抓取动态网页(
Java爬虫被屏蔽,不要慌,聊反爬虫策略和反反爬虫
)
这是Java爬虫系列的第五篇。在上一篇文章中,Java爬虫服务器被阻塞了。不要惊慌。换个服务器吧。印章及其相应措施。之前的文章文章我们讲了爬虫的基础知识。在这篇文章中,我们来谈谈爬虫架构。
在前面的章节中,我们的爬虫程序都是单线程的。我们在调试爬虫程序的时候,单线程爬虫是没有问题的,但是当我们使用单线程爬虫程序去在线环境下的采集网页时,单线程的两个致命问题问题暴露:
线上的环境不能像我们本地的测试一样,不关心采集的效率,只要能正确提取结果即可。在这个时间就是金钱的时代,不可能给你时间慢慢来采集,所以单线程爬虫程序是行不通的,我们需要将单线程改为多线程模式来改进采集 效率和提高计算机利用率。
多线程爬虫的设计比单线程复杂很多,但不同于其他需要在高并发下保证数据安全的业务。被视为一个独立的实体。做多线程爬虫,必须做好两件事:第一点是维护统一的采集 URL,第二点是对URL进行去重。简单说一下这两点。
将 URL 维护为 采集
多线程爬虫不能像单线程一样,每个线程独立维护自己的采集 URL,如果是这样的话,那么每个线程的网页采集都是一样的,你会不是多线程采集,而是要多次采集 一个页面。为此,我们需要将 URL 统一维护为 采集。每个线程从统一的URL维护处接收到采集 URL,完成采集任务。如果在页面上找到新 URL 链接将添加到统一 URL 维护的容器中。这里有几个适合统一 URL 维护的容器:
URL重复数据删除
URL去重也是多线程采集中的一个关键步骤,因为如果我们不去重,那么我们会采集到大量重复的URL,这并不能改善我们的采集 效率,例如在一个分页的新闻列表中,我们可以在 采集 的第一页获取到 2、3、4、5 个页面的链接,并且在采集的第二个页面上,当得到1、3、4、5个页面链接时,URL队列中会有大量列表页面链接被采集,会重复采集甚至进入死循环,所以需要进行URL去重。有很多方法可以对 URL 进行重复数据删除。以下是几种常用的URL去重方法:
关于多线程爬虫的两个核心知识点大家都知道。下面我画一个简单的多线程爬虫架构图,如下图所示:
以上,我们主要了解了多线程爬虫的架构设计。接下来,我们不妨试试Java多线程爬虫。我们以采集虎扑新闻为例,实战Java多线程爬虫,在Java多线程爬虫中设计的URL为采集和URL为去重,由于这里只是演示,所以我们将使用JDK内置的容器来完成它。我们使用 LinkedBlockingQueue 作为 URL 维护容器为 采集,HashSet 作为 URL 到 Heavy 容器。以下是Java多线程爬虫的核心代码。详细代码可以上传到GitHub,地址在文末:
我们用5个线程去采集虎扑新闻列表页面看看效果?运行程序会产生以下结果:
从结果可以看出,我们启动了 5 个线程 采集 到 61 个页面,总共耗时 2 秒。可以说效果还是不错的。我们用单线程对比一下,看看差距有多大?我们将线程数设置为1,再次启动程序,得到如下结果:
可以看到,单线程采集Hupu 61消息耗时7秒,几乎是多线程的4倍。如果你仔细想想,这只有 61 页。如果有更多的页面,差距会增加。该值越大,多线程爬虫的效率越高。
分布式爬虫架构
分布式爬虫架构是只有大型采集程序才需要使用的架构。一般可以使用单机多线程来解决业务需求。反正我没有分布式爬虫项目的经验,所以和这个没什么关系。是的,但作为技术人员,我们需要保持技术的热度。虽然我们不需要它,但理解它是可以的。我查了很多资料,得出以下结论:
分布式爬虫架构在思路上和我们的多线程爬虫架构是一样的。我们只需要在多线程的基础上稍加改进,就可以成为一个简单的分布式爬虫架构。由于在分布式爬虫架构中爬虫程序部署在不同的机器上,我们等待的URL采集和已经是采集的URL不能存储在爬虫程序机器的内存中,我们需要存储在某台机器上统一维护,比如存储在Redis或者MongoDB中,每台机器都从这里获取采集链接,而不是从LinkedBlockingQueue等内存队列中获取链接,比如一个简单的分发爬虫架构出现了。当然会有很多细节,因为我没有分布式架构的经验,也谈不上。如果您有兴趣,欢迎交流。
源代码:
https://github.com/BinaryBall/java-base/blob/master/crawler/src/main/java/com/jamal/crawler/ThreadCrawler.java
文章希望大家多多指导,共同学习,共同进步。
作者:平头哥的技术博文
来源:掘金
商业用途请与原作者联系,本文只做展示分享,不妥侵删!