`
zhimaruanjian
  • 浏览: 32706 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

芝麻HTTP:Python爬虫进阶之爬虫框架概述

 
阅读更多

综述

爬虫入门之后,我们有两条路可以走。

一个是继续深入学习,以及关于设计模式的一些知识,强化Python相关知识,自己动手造轮子,继续为自己的爬虫增加分布式,多线程等功能扩展。另一条路便是学习一些优秀的框架,先把这些框架用熟,可以确保能够应付一些基本的爬虫任务,也就是所谓的解决温饱问题,然后再深入学习它的源码等知识,进一步强化。

就个人而言,前一种方法其实就是自己动手造轮子,前人其实已经有了一些比较好的框架,可以直接拿来用,但是为了自己能够研究得更加深入和对爬虫有更全面的了解,自己动手去多做。后一种方法就是直接拿来前人已经写好的比较优秀的框架,拿来用好,首先确保可以完成你想要完成的任务,然后自己再深入研究学习。第一种而言,自己探索的多,对爬虫的知识掌握会比较透彻。第二种,拿别人的来用,自己方便了,可是可能就会没有了深入研究框架的心情,还有可能思路被束缚。

不过个人而言,我自己偏向后者。造轮子是不错,但是就算你造轮子,你这不也是在基础类库上造轮子么?能拿来用的就拿来用,学了框架的作用是确保自己可以满足一些爬虫需求,这是最基本的温饱问题。倘若你一直在造轮子,到最后都没造出什么来,别人找你写个爬虫研究了这么长时间了都写不出来,岂不是有点得不偿失?所以,进阶爬虫我还是建议学习一下框架,作为自己的几把武器。至少,我们可以做到了,就像你拿了把枪上战场了,至少,你是可以打击敌人的,比你一直在磨刀好的多吧?

框架概述

博主接触了几个爬虫框架,其中比较好用的是 Scrapy 和PySpider。就个人而言,pyspider上手更简单,操作更加简便,因为它增加了 WEB 界面,写爬虫迅速,集成了phantomjs,可以用来抓取js渲染的页面。Scrapy自定义程度高,比 PySpider更底层一些,适合学习研究,需要学习的相关知识多,不过自己拿来研究分布式和多线程等等是非常合适的。

在这里博主会一一把自己的学习经验写出来与大家分享,希望大家可以喜欢,也希望可以给大家一些帮助。

PySpider

PySpiderbinux做的一个爬虫架构的开源化实现。主要的功能需求是:

  • 抓取、更新调度多站点的特定的页面
  • 需要对页面进行结构化信息提取
  • 灵活可扩展,稳定可监控

而这也是绝大多数python爬虫的需求 —— 定向抓取,结构化化解析。但是面对结构迥异的各种网站,单一的抓取模式并不一定能满足,灵活的抓取控制是必须的。为了达到这个目的,单纯的配置文件往往不够灵活,于是,通过脚本去控制抓取是最后的选择。
而去重调度,队列,抓取,异常处理,监控等功能作为框架,提供给抓取脚本,并保证灵活性。最后加上web的编辑调试环境,以及web任务监控,即成为了这套框架。

pyspider的设计基础是:以python脚本驱动的抓取环模型爬虫

  • 通过python脚本进行结构化信息的提取,follow链接调度抓取控制,实现最大的灵活性
  • 通过web化的脚本编写、调试环境。web展现调度状态
  • 抓取环模型成熟稳定,模块间相互独立,通过消息队列连接,从单进程到多机分布式灵活拓展

pyspider-arch

pyspider的架构主要分为 scheduler(调度器), fetcher(抓取器), processor(脚本执行):

  • 各个组件间使用消息队列连接,除了scheduler是单点的,fetcher 和 processor 都是可以多实例分布式部署的。 scheduler 负责整体的调度控制
  • 任务由 scheduler 发起调度,fetcher 抓取网页内容, processor 执行预先编写的python脚本,输出结果或产生新的提链任务(发往 scheduler),形成闭环。
  • 每个脚本可以灵活使用各种python库对页面进行解析,使用框架API控制下一步抓取动作,通过设置回调控制解析动作。

Scrapy

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试

Scrapy 使用了 Twisted 异步网络库来处理网络通讯。整体架构大致如下

Scrapy

Scrapy主要包括了以下组件:

  • 引擎(Scrapy): 用来处理整个系统的数据流处理, 触发事务(框架核心)
  • 调度器(Scheduler): 用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
  • 下载器(Downloader): 用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
  • 爬虫(Spiders): 爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
  • 项目管道(Pipeline): 负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
  • 下载器中间件(Downloader Middlewares): 位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
  • 爬虫中间件(Spider Middlewares): 介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
  • 调度中间件(Scheduler Middewares): 介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

Scrapy运行流程大概如下:

  • 首先,引擎从调度器中取出一个链接(URL)用于接下来的抓取
  • 引擎把URL封装成一个请求(Request)传给下载器,下载器把资源下载下来,并封装成应答包(Response)
  • 然后,爬虫解析Response
  • 若是解析出实体(Item),则交给实体管道进行进一步的处理。
  • 若是解析出的是链接(URL),则把URL交给Scheduler等待抓取

结语

 

对这两个框架进行基本的介绍之后,接下来我会介绍这两个框架的安装以及框架的使用方法,希望对大家有帮助。

分享到:
评论

相关推荐

    核心基础-模拟生成福彩双色球彩票号码-Python源码示例.zip

    这个程序展示了Python在自动化、数据分析、游戏开发以及网络爬虫等多个领域的应用潜力。下面将详细探讨相关知识点。 首先,我们要理解双色球彩票的基本规则。双色球彩票由6个红球(1-33中随机选择)和1个蓝球(1-16...

    网络爬虫-多进程爬取在线课程并存入MySQL数据库-Python源码示例.zip

    该压缩包文件“网络爬虫-多进程爬取在线课程并存入MySQL数据库-Python源码示例.zip”提供了一个Python实现的网络爬虫项目,旨在通过多进程技术抓取在线课程信息,并将数据存储到MySQL数据库中。这个项目涵盖了以下几...

    网络爬虫-如何通过selenium框架实现自动切换浏览器页面-Python实例源码.zip

    本主题聚焦于如何利用Python的Selenium框架来实现自动切换浏览器页面,这是一个非常实用的技术,尤其对于那些需要模拟用户交互或者处理动态加载内容的网站。 Selenium是一个强大的自动化测试工具,它允许开发者模拟...

    Python源码实例-画画.zip

    总的来说,这个压缩包提供了一个学习和实践Python图形处理和可视化的好机会,涵盖了从基础到进阶的多个层次。无论是自动化报告的图表生成,还是数据分析的可视化展示,甚至是游戏开发中的动态图形,都能从这些源码...

    网络爬虫-爬取在线课程并保存到Excel-Python源码示例.zip

    在本压缩包中,我们关注的是使用Python进行网络爬虫技术来抓取在线课程信息,并将其整理存储到Excel文件中的过程。这个实例涉及到的主要知识点包括网络爬虫的基础、Python编程、网页解析以及数据处理和存储。 1. **...

    网络爬虫-如何实现实时显示下载的进度(百分比形式)-Python实例源码.zip

    在Python编程中,网络爬虫是一项重要的技能,用于自动化地抓取互联网上的数据。本实例主要探讨如何在爬虫过程中实现实时显示下载进度,并以百分比的形式展示,这对于大型文件下载或者处理大量数据时非常有用,能帮助...

    Python源码实例-翻译软件.zip

    4. **网络爬虫**:为了获取网络上的多语言资源,软件可能使用了Python的Scrapy、BeautifulSoup等网络爬虫框架。这些工具可以抓取网页内容,提取需要翻译的文本,甚至从在线翻译服务中获取结果。 5. **游戏开发**:...

    芝麻Python

    "芝麻Python"是一个可能指的是入门或初级级别的Python学习资源,可能是某个课程、教程或学习项目的名称。这个资源可能旨在帮助初学者开启他们的Python编程之旅。Python是一种广泛使用的高级编程语言,以其简洁明了的...

    网络爬虫-如何获取网页中动态加载的验证码图片-Python实例源码.zip

    在进行网络爬虫时,有时候我们需要处理网页中的动态加载元素,比如验证码图片。验证码图片是网站为了防止自动化脚本或机器人滥用服务...在数据分析和自动化过程中,正确处理验证码也是确保爬虫正常运行的关键步骤之一。

    Python源码实例-画爱心.zip

    在Python编程语言中,"画爱心"是一种常见的图形绘制练习,它可以帮助初学者熟悉Python的图形输出和控制结构。这个压缩包"Python源码实例-画爱心.zip"包含了一个具体的Python代码示例,用于在终端或命令行界面绘制出...

    网络爬虫-如何去除文本信息中的干扰数据-Python实例源码.zip

    Python作为网络爬虫的常用语言,提供了丰富的库和方法来帮助我们完成这项任务。以下是一些关键知识点: 1. **BeautifulSoup库**:用于解析HTML和XML文档,可以方便地找到和提取网页中的特定元素。例如,我们可以...

    程序自动化-连接MySQL数据库时自动开启服务器-Python实例源码.zip

    在IT行业中,Python是一种广泛应用的编程语言,尤其在自动化、数据分析、游戏开发和网络爬虫等领域。本资源“程序自动化-连接MySQL数据库时自动开启服务器-Python实例源码.zip”提供了一个具体的Python代码实例,...

    文件图形多媒体-用Python实现文件对比分析并生成报告-Python源码示例.zip

    Python的requests库用于发送HTTP请求,BeautifulSoup解析HTML和XML文档,scrapy是一个强大的爬虫框架,可以构建复杂的爬虫项目。 7. **报告生成**:Python的reportlab库可以生成PDF报告,Jinja2模板引擎则用于...

    网络爬虫-如何实现定时爬取网页内容-Python实例源码.zip

    在Python中实现定时爬取网页内容是常见需求,它结合了网络爬虫技术与任务调度机制。本文将深入探讨如何利用Python进行网络爬虫的开发,并实现定时任务。 首先,我们需要了解Python中的网络爬虫基础。Python有许多...

    Python源码实例-贺卡.zip

    6. **网络爬虫**:虽然不常见,但如果你的贺卡实例需要从网上抓取特定图片或信息,Python的网络爬虫技术(如BeautifulSoup和Scrapy)就派上用场了。这可以实现自动收集网络上的贺卡素材。 7. **游戏开发**:虽然...

    [搜索链接]Java网络爬虫(蜘蛛)源码_zhizhu.zip

    - 探索分布式爬虫,如使用Apache Nutch或Scrapy(Python框架)。 总结,"Java网络爬虫(蜘蛛)源码_zhizhu.zip"是一个适合初学者实践和研究的项目,通过它,你可以深入理解网络爬虫的工作流程,学习Java JSP的实战...

    微信红包提醒-Python源码示例.zip

    在本压缩包“微信红包提醒-Python源码示例.zip”中,主要包含了一个使用Python编程语言实现的微信红包自动提醒的功能。这个功能对于经常参与微信红包活动的用户来说非常实用,可以避免错过任何红包机会。以下是这个...

    python实战项目源码-商城源码-含可执行文件.zip

    Python的Web框架提供了处理HTTP请求、路由、模型-视图-控制器(MVC)架构等功能。 3. **数据库**:可能使用MySQL、PostgreSQL或SQLite等关系型数据库存储商品信息、订单、用户数据等。 4. **支付接口**:商城系统...

    python实战项目源码-学生信息管理系统-含可执行文件.zip

    Python作为一种高级编程语言,因其简洁明了的语法和强大的功能,被广泛应用于各种领域,包括自动化、数据分析、网络爬虫和游戏开发等。本项目“Python实战项目源码-学生信息管理系统-含可执行文件”是一个典型的...

    Python源码实例-简易时钟.zip

    这个实例主要展示了Python在自动化、数据分析、网络爬虫以及游戏开发等多个领域的应用潜力。让我们深入探讨一下这个时钟程序背后的Python知识。 1. **Python基础**:Python是一种高级编程语言,以其简洁的语法和...

Global site tag (gtag.js) - Google Analytics