当前位置:   article > 正文

Python爬虫进阶——Scrapy框架原理及分布式爬虫构建_scrapy 是如何实现爬取多个网页的数据的?如何理解分布式爬取过程?

scrapy 是如何实现爬取多个网页的数据的?如何理解分布式爬取过程?

1 Scrapy简介

1.1 概念

  1. Scrapy是由Python语言开发的一个快速、高层次的屏幕抓取和web信息抓取框架,用于抓取web站点并从页面中提取结构化的数据。

  2. Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试, Scrapy还使用了Twisted异步网络库来处理网络通讯。

  1. Scrapy最便捷的地方在于,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。

  2. 通过scrapy框架可以实现分布式爬取。

1.2 Scrapy的优点

  1. 提供了内置的HTTP缓存,以加速本地开发。

  2. 提供了自动节演调节机制,而且具有遵守robots.txt的设置的能力。

  3. 可以定义爬行深度的限制,以避免爬虫进入死循环链接。

  4. 会自动保留会话。

  5. 执行自动HTTP基本认证。不需要明确保存状态。

  6. 可以传递登录表单。

  7. Scrapy 有一个内置的中间件,可以自动设置请求中的引用(referrer)头。

  8. 支持通过3xx响应重定向,也可以通过HTML元刷新。

  9. 避免被网站使用的<noscript>meta重定向困住,以检测没有JS支持的页面。

  10. 默认使用CSS选择器或XPath编写解析器。

  11. 可以通过Splash或任何其他技术(如Selenium)呈现JavaScript页面。

  12. 拥有强大的社区支持和丰富的插件和扩展来扩展其功能。

  13. 提供了通用的蜘蛛来抓取常见的格式:站点地图、CSV和XML。

  14. 内置支持以多种格式(JSON、CSV、XML、JSON-lines)导出收集的数据并将其存在多个后端(FTP、S3、本地文件系统)中

1.3 主要组件

  • Scrapy Engine(引擎):
    负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。

  • Scheduler(调度器):
    它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。

  • Downloader(下载器):
    负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy
    Engine(引擎),由引擎交给Spider来处理,

  • Spider(爬虫):
    它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),

  • Pipeline(管道)**:
    它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.

  • Downloader Middlewares(下载中间件)**:
    你可以当作是一个可以自定义扩展下载功能的组件。

  • Spider Middlewares(Spider中间件)**:
    你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)

2 Scrapy数据流处理流程

  1. 引擎打开一个网站(open adomain),找到处理该网站的Spider并向该spider请求第一个要爬取的URL(s)。

  2. 引擎从Spider中获取到第一个要爬取的URL并在调度器(Scheduler)以Request调度。

  3. 引擎向调度器请求下一个要爬取的URL。

  4. 调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求(request)方向)转发给下载器(Downloader)。

  5. 一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(返回(response)方向)发送给引擎。

  6. 引擎从下载器中接收到Response并通过Spider中间件(输入方向)发送给Spider处理。

  7. Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。

  8. 引擎将(Spider返回的)爬取到的Item给Item Pipeline,将(Spider返回的)Request给调度器。

  9. (从第二步)重复直到调度器中没有更多地request,引擎关闭该网站

3 Scrapy安装与使用

3.1 安装

安装命令: pip3 install scrapy

如果安装失败按照下面的步骤进行安装:

  1. pip3 install wheel.

  2. pip3 install scrapy.

  3. 如果安装过程中提示缺失 twisted

  4. 下载并安装pywin32:https://sourceforge.net/projects/pywin32/files/

3.2 基本使用

3.2.1 新建工程

创建命令: scrapy startproject xxx #创建项目

执行这条命令将创建一个新目录:包括的文件如下:

  1. zhaobiaoscrapy.cfg:项目配置文件

  2. quotes/:项目python模块,代码将从这里导入

  3. quotes/items:项目items文件

  4. quotes/pipelines.py:项目管道文件

  5. quotes/settings.py:项目配置文件

  6. quotes/spiders:放置spider的目录

3.2.2 spider

import scrapy
from quotes.items  import  QuotesItemclass 
QuotespiderSpider(scrapy.Spider):
name = 'quotespider'  # 爬虫名称
allowed_domains = ['quotes.toscrape.com']  # 允许爬虫访问的域名,可以多个
start_urls = ['http://quotes.toscrape.com/'] # 爬虫开始的url地址

def  parse(self, response):  # 爬虫返回的数据解析函数
	quotes = response.css('.quote')  # 通过css选择器选择相应的内容
	for quote in quotes:
		item = QuotesItem()  # item做数据持久化的
		text = quote.css('.text::text').extract_first()  # ::text 表示输出文本内容
		author = quote.css('.author::text').extract_first()  # ::text 表示输出文本内容
		tags = quote.css('.tags .tag::text').extract()  # extract_first() 表示找第一个,extract()表示找到所有,并返回一个列表
		item['text'] = text  # 赋值  首先要在items类中创建
		item['tags'] = tags
		item['author'] = author
		yield item  # 生成item 做数据存储
	next = response.css('.pager .next a::attr(href)').extract_first()  # 得到相对的url
	url = response.urljoin(next)  # 获取一个绝对的url,获取下一页的url
	yield scrapy.Request(url=url, callback=self.parse)  # 处理链接,将返回的response交给callback的回调函数

# scrapy shell quotes.toscrape.com  # 进入命令行调试
# scrapy crawl quotes -o quotes.json(.csv  .xml)     # 数据保存,可以保存多个类型
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

3.2.3 items

  • Items是将要装载抓取的数据的容器,它工作方式像python里面的字典,但它提供更多的保护,比如对未定义的字段填充以防止拼写错误。

  • 它通过创建一个scrapy.item.Item类来声明,定义它的属性为scrpy.item.Field对象,就像是一个对象关系映射(ORM).

  • 我们通过将需要的item模型化,来控制获得的站点数据,比如我们要获得站点的名字,url和网站描述,我们定义这三种属性的域。要做到这点,我们编辑在quotes目录下的items.py文件,我们的Item类将会是这样

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/208653
推荐阅读
相关标签
  

闽ICP备14008679号