php多线程抓取多个网页(2021-07-29介绍大家好!(上)(图))

优采云 发布时间: 2022-02-14 07:19

  php多线程抓取多个网页(2021-07-29介绍大家好!(上)(图))

  2021-07-29介绍

  大家好!回顾上一期,在介绍了爬虫的​​基本概念之后,我们用各种工具横冲直撞完成了一个小爬虫。目的是猛、粗、快,方便初学者上手,建立信心。有一定基础的读者请不要着急,未来我们会学习主流开源框架,打造强大专业的爬虫系统!但在此之前,我们必须继续打好基础。本期我们将首先介绍爬虫的类型,然后选择最典型的通用网络爬虫为其设计一个迷你框架。对框架有了自己的思考之后,在学习复杂的开源框架时,就会有一个线索。

  今天,我们将花更多时间思考,而不是编码。80%的时间思考,20%的时间打字,更有利于进步。

  

  语言环境

  语言:带上足够的*敏*感*词*,继续用Python开路!

  

  线程:线程库可以在单独的线程中执行 Python 中可调用的任何对象。Python 2.x 中的线程模块已被弃用,用户可以改用线程模块。在 Python 3 中不能再使用 thread 模块。为了兼容性,Python 3 将 thread 重命名为 _thread。

  队列:队列模块提供同步的、线程安全的队列类,包括FIFO(先进先出)队列Queue、LIFO(后进先出)队列LifoQueue和优先级队列PriorityQueue。这些队列都实现了锁定原语,可以直接在多个线程中使用。队列可用于实现线程之间的同步。

  re:Python 从 1.5 开始添加了 re 模块,它提供了 Perl 风格的正则表达式模式。re 模块为 Python 语言带来了完整的正则表达式功能。

  argparse:Python 用于解析命令行参数和选项的标准模块,替换了过时的 optparse 模块。argparse 模块的作用是解析命令行参数。

  configparser:读取配置文件的模块。

  爬行动物的种类

  

  网络爬虫根据系统结构和实现技术大致可以分为以下几种:通用网络爬虫、聚焦网络爬虫、增量网络爬虫、深度网络爬虫(Deep Web Crawler)。实际的网络爬虫系统通常是通过结合几种爬虫技术来实现的。

  通用网络爬虫

  通用网络爬虫,也称为Scalable Web Crawler,将爬取对象从一些*敏*感*词*URL扩展到整个Web。主要针对门户网站搜索引擎和大型网络服务商采集数据。

  一般网络爬虫的结构大致可以分为几个部分:页面爬取模块、页面分析模块、链接过滤模块、页面存储模块、URL队列、初始URL采集。为了提高工作效率,一般的网络爬虫都会采用一定的爬取策略。常用的爬取策略有:深度优先策略、广度优先策略。

  1) 深度优先策略(DFS):基本方法是按照深度从低到高的顺序访问下一级的网页链接,直到不能再深入为止。

  2) 广度优先策略(BFS):该策略根据网页内容目录层次的深度对页面进行爬取,较浅的目录层次的页面先爬取。当同一级别的页面被爬取时,爬虫深入到下一个级别继续爬取。

  聚焦网络爬虫

  Focused Crawler,也称为Topical Crawler,是指选择性爬取与预定义主题相关的页面的网络爬虫。与一般的网络爬虫相比,专注爬虫只需要抓取与主题相关的页面,大大节省了硬件和网络资源,而且由于页面数量少,保存的页面更新也很快。域信息需求。我们之前爬过的播放列表属于这一类。

  增量网络爬虫

  增量网络爬虫(Incremental Web Crawler)是指增量更新下载的网页,只爬取新生成或更改的网页的爬虫。可能是新页面。与周期性爬取和刷新页面的网络爬虫相比,增量爬虫只在需要的时候爬取新生成或更新的页面,不会重新下载没有变化的页面,可以有效减少数据下载量,对爬取的网页进行更新页,减少时间和空间消耗,但增加了爬取算法的复杂度和实现难度。现在流行的舆情爬虫一般都是增量网络爬虫。

  深度网络爬虫

  网页按存在方式可分为表层网页(Surface Web)和深层网页(Deep Web,又称隐形网页或隐藏网页)。表面网页是指可以被传统搜索引擎检索到的页面,以及主要由可以通过超链接到达的静态网页组成的网页。深网是那些通过静态链接大多不可用的网页,隐藏在搜索表单后面,只有提交一些 关键词 的用户才能访问。例如,那些内容只有在用户注册后才可见的网页属于深网。

  一个迷你框架

  下面以一个典型的通用爬虫为例,分析其工程要点,设计并实现一个mini框架。架构图如下:

  

  代码结构:

  

  config_load.py 配置文件加载

  crawl_thread.py 爬取线程

  mini_spider.py 主线程

  spider.conf 配置文件

  url_table.py url 队列,url 表

  urls.txt *敏*感*词* url 集合

  pages_parse.py 网页分析

  pages_save.py 网页保存

  查看配置文件中的内容:

  蜘蛛.conf

  

  步骤 1.BFS 还是 DFS?

  理论上,这两种算法都可以在大致相同的时间内爬取整个互联网。但显然每个网站最重要的页面应该是它的主页。在极端情况下,如果只能下载非常有限的页面,那么应该下载网站的所有主页。如果爬虫展开,应该爬到首页直接链接的页面,因为这些页面是网站设计者认为相当重要的网页。在这个前提下,显然 BFS 明显优于 DFS。事实上,在搜索引擎的爬虫中,主要使用的是BFS。我们的框架采用了这种策略。

  爬取深度可以通过配置文件中的max_depth来设置。只要未达到指定的深度,程序就会不断将解析后的 url 放入队列中:

  迷你蜘蛛.py

  

  步骤 2. 初始 URL 采集,URL 队列

  让我们看看通用爬虫如何下载整个互联网。假设从一个门户网站的首页开始,首先下载这个网页(depth=0),然后通过分析这个网页,可以找到页面中的所有超链接,也就是说你知道这个入口网站所有直接连接到首页的网页,如京东金融、京东白条、京东众筹等(深度=1)。接下来访问、下载和分析京东金融等网页,并且可以找到其他连接的页面网页(深度=2)。让电脑继续做,整个网站都可以下载了。

  在这个过程中,我们需要一个“初始 URL 集合”来保存门户的主页,以及一个“URL 队列”来保存通过分析网页获得的超链接。

  迷你蜘蛛.py

  

  url_table.py

  

  步骤3.在小本子——URL表中记录下载了哪些网页。

  在互联网上,一个网页可能被多个网页中的超链接指向。这样,在遍历互联网的这张图片时,这个网页可能会被访问​​很多次。为了防止一个网页被多次下载和解析,需要一个URL表来记录哪些网页被下载了。当我们再次遇到这个页面时,我们可以跳过它。

  crawl_thread.py

  

  步骤 4. 多个抓取线程

  为了提高爬虫的性能,需要多个爬取线程从URL队列中获取链接进行处理。多线程并没有错,但是Python的多线程可能会引起很多人的质疑,这源于Python设计的最初考虑:GIL。GIL的全称是Global Interpreter Lock(全局解释器锁)。如果一个线程要执行,首先要获得 GIL,而在一个 Python 进程中,只有一个 GIL。结果是Python中的一个进程每次只能执行一个线程,这就是Python的多线程效率在多核CPU上不高的原因。那么为什么我们仍然使用 Python 多线程呢?

  CPU密集型代码(各种循环处理、编*敏*感*词*等),在这种情况下,由于计算工作量很大,tick count很快就会达到阈值,然后触发GIL的释放和重新竞争(多个线程来回切换当然需要消耗资源),Python下的多线程对CPU密集型代码不友好。

  IO密集型代码(文件处理、网络爬虫等),多线程可以有效提高效率(单线程下的IO操作会进行IO等待,造成不必要的时间浪费,启用多线程可以自动等待线程A当线程A等待时,切换到线程B不会浪费CPU资源,从而提高程序执行效率)。Python的多线程对IO密集型代码更加友好。

  所以,对于IO密集型爬虫程序来说,使用Python多线程是没有问题的。

  crawl_thread.py

  

  步骤5.页面分析模块

  从网页解析 URL 或其他有用数据。这是上一期的重点,可以参考之前的代码。

  步骤6.页面存储模块

  保存页面的模块,目前将文件保存为文件,未来可以扩展成多种存储方式,如mysql、mongodb、hbase等。

  网页保存.py

  

  至此,整个框架已经清晰的呈现在大家面前。不要低估它。无论框架多么复杂,它都在这些基本元素上进行了扩展。

  下一步

  基础知识的学习暂时告一段落,希望能帮助大家打下一定的基础。下一期我会介绍强大成熟的爬虫框架Scrapy,它提供了很多强大的功能让爬取更简单、更高效、更精彩,敬请期待!

  最后觉得有帮助的朋友可以加入学习交流群

  沉迷Python,无法自拔:862672474

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线