1. Scrapy 基础


文档摘要

Scrapy 基础 Scrapy 基础详解:代码实践与原理分析 1. Scrapy 架构概览 Scrapy的架构设计使其具有高度的可扩展性和灵活性。理解其架构是掌握Scrapy的关键。 Spider: 定义如何抓取特定网站的类。它负责定义起始URL、如何跟踪链接以及如何解析页面内容。 Engine: 负责控制整个数据流的组件。它协调Spider、Scheduler、Downloader和Item Pipeline的工作。 Scheduler: 接收来自Engine的请求,并决定何时将它们发送给Downloader。 Downloader: 负责下载网页内容。 Item Pipeline: 处理从Spider提取的数据。它负责清洗、验证和存储数据。

1. Scrapy 基础

Scrapy 基础详解:代码实践与原理分析

1. Scrapy 架构概览

Scrapy的架构设计使其具有高度的可扩展性和灵活性。理解其架构是掌握Scrapy的关键。

  • Spider: 定义如何抓取特定网站的类。它负责定义起始URL、如何跟踪链接以及如何解析页面内容。

  • Engine: 负责控制整个数据流的组件。它协调Spider、Scheduler、Downloader和Item Pipeline的工作。

  • Scheduler: 接收来自Engine的请求,并决定何时将它们发送给Downloader。

  • Downloader: 负责下载网页内容。

  • Item Pipeline: 处理从Spider提取的数据。它负责清洗、验证和存储数据。

  • Middlewares: 位于Engine和各个组件之间的钩子,用于修改请求和响应。

2. Scrapy 项目创建与基本结构

首先,你需要安装Scrapy:

pip install scrapy

然后,创建一个新的Scrapy项目:

scrapy startproject myproject

这将创建一个名为myproject的目录,其中包含以下文件:

myproject/ scrapy.cfg # Scrapy 配置文件 myproject/ __init__.py items.py # 定义数据模型 middlewares.py # 定义中间件 pipelines.py # 定义数据管道 settings.py # 配置文件 spiders/ # 存放爬虫代码 __init__.py

3. 定义 Item

Item是用于存储抓取数据的容器。在items.py中定义你的数据模型:

# myproject/items.py import scrapy class MyprojectItem(scrapy.Item): title = scrapy.Field() link = scrapy.Field() description = scrapy.Field()

4. 创建 Spider

Spider是Scrapy的核心组件。它定义了如何抓取特定网站。在spiders目录下创建一个名为myspider.py的文件:

# myproject/spiders/myspider.py import scrapy class MySpider(scrapy.Spider): name = "myspider" allowed_domains = ["example.com"] # 允许爬取的域名 start_urls = ["http://www.example.com"] # 起始URL def parse(self, response): # 从响应中提取数据 titles = response.xpath('//h1/text()').getall() links = response.xpath('//a/@href').getall() descriptions = response.xpath('//p/text()').getall() for i in range(min(len(titles), len(links), len(descriptions))): item = MyprojectItem() item['title'] = titles[i] item['link'] = links[i] item['description'] = descriptions[i] yield item # 返回一个Item对象

代码详解:

  • name: Spider的名称,用于在Scrapy中标识它。

  • allowed_domains: 允许爬取的域名列表。

  • start_urls: Spider启动时要爬取的URL列表。

  • parse(self, response): 处理响应的回调函数。它接收一个response对象,其中包含下载的页面内容。 使用xpath提取页面中的标题,链接和描述,然后循环创建MyprojectItem对象,并使用yield返回。

5. 运行 Spider

使用以下命令运行Spider:

scrapy crawl myspider

Scrapy将启动Spider,下载start_urls中的网页,并调用parse方法处理响应。

6. Item Pipeline

Item Pipeline用于处理从Spider提取的数据。在pipelines.py中定义你的Pipeline:

# myproject/pipelines.py import json class MyprojectPipeline: def __init__(self): self.file = open("items.json", "w") def process_item(self, item, spider): line = json.dumps(dict(item)) + "\n" self.file.write(line) return item def close_spider(self, spider): self.file.close()

代码详解:

  • process_item(self, item, spider): 处理每个Item的方法。它接收一个item对象和一个spider对象。

  • open_spider(self, spider): Spider启动时调用的方法(可选)。

  • close_spider(self, spider): Spider关闭时调用的方法(可选)。

要启用Pipeline,需要在settings.py中进行配置:

# myproject/settings.py ITEM_PIPELINES = { 'myproject.pipelines.MyprojectPipeline': 300, }

7. Settings 配置

settings.py文件用于配置Scrapy的行为。一些常用的配置项包括:

  • BOT_NAME: 爬虫的名称。

  • ROBOTSTXT_OBEY: 是否遵守robots.txt协议。

  • DEFAULT_REQUEST_HEADERS: 默认的请求头。

  • DOWNLOAD_DELAY: 下载延迟,防止被网站封禁。

  • ITEM_PIPELINES: 启用的Item Pipeline。

8. Middlewares 的使用

Middlewares 允许你修改请求和响应。Scrapy 提供了 Downloader Middlewares 和 Spider Middlewares 两种。

  • Downloader Middlewares: 位于 Engine 和 Downloader 之间,可以修改请求 (Request) 在发送给 Downloader 之前,以及修改响应 (Response) 在发送给 Spider 之前。

  • Spider Middlewares: 位于 Engine 和 Spider 之间,可以修改 Spider 的输入 (Response) 和输出 (Item)。

一个简单的 Downloader Middleware 示例:

# myproject/middlewares.py class MyprojectDownloaderMiddleware: def process_request(self, request, spider): # 在请求发送之前修改请求头 request.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' return None def process_response(self, request, response, spider): # 在响应返回之前修改响应 return response def process_exception(self, request, exception, spider): # 处理下载过程中发生的异常 return None

settings.py中启用Middleware:

# myproject/settings.py DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.MyprojectDownloaderMiddleware': 543, }

9. 选择器 (Selectors)

Scrapy 使用 Selector 从 HTML 或 XML 文档中提取数据。Scrapy 支持两种选择器:

  • XPath: 一种用于在 XML 文档中定位节点的语言。

  • CSS: 一种用于选择 HTML 元素的语言。

XPath 示例:

title = response.xpath('//h1/text()').get() # 获取第一个 <h1> 标签的文本内容 titles = response.xpath('//h1/text()').getall() # 获取所有 <h1> 标签的文本内容

CSS 示例:

title = response.css('h1::text').get() # 获取第一个 <h1> 标签的文本内容 titles = response.css('h1::text').getall() # 获取所有 <h1> 标签的文本内容

10. Request 和 Response 对象

  • Request: 表示一个 HTTP 请求。 你可以使用 scrapy.Request 类创建请求,并指定回调函数。

  • Response: 表示一个 HTTP 响应。 Spider 的 parse 方法接收一个 Response 对象,其中包含响应的内容、状态码、头部信息等。

import scrapy class MySpider(scrapy.Spider): name = "myspider" allowed_domains = ["example.com"] start_urls = ["http://www.example.com"] def parse(self, response): # 创建一个新的请求 yield scrapy.Request("http://www.example.com/page2", callback=self.parse_page2) def parse_page2(self, response): # 处理第二个页面的响应 pass

11. 总结

本文详细介绍了Scrapy的基础概念和用法,包括项目创建、Item定义、Spider编写、Item Pipeline配置、Middlewares使用以及选择器和请求响应对象。掌握这些基础知识,你就可以开始构建自己的Scrapy爬虫,高效地抓取和处理数据。Scrapy 的强大之处在于它的灵活性和可扩展性,你可以根据自己的需求定制各种组件,以满足不同的爬虫需求。希望本文能够帮助你入门 Scrapy,并为你后续的学习和实践打下坚实的基础。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U