文集文档索引

Scrapy


  • 文集信息
  • 目录大纲
  • 最新文档
  • 知识宇宙

文集详情

文集导读

Scrapy Scrapy框架详解:实践与原理 Scrapy是一个强大的Python爬虫框架,用于快速、高效地抓取Web数据。它采用异步网络引擎Twisted,具有高度的可定制性和可扩展性,适用于各种规模的爬虫项目。 1. Scrapy架构概览 Scrapy框架的核心组件包括: Scrapy Engine: 引擎负责控制数据流在所有组件中的流动,并触发事件。 Scheduler: 调度器接收引擎发来的请求,并按照优先级进行排序,放入队列中。 Downloader: 下载器负责下载网页内容,并将响应返回给引擎。 Spiders: 蜘蛛是用户编写的核心组件,定义了如何抓取特定网站。 Item Pipeline: 项目管道负责处理蜘蛛提取出的数据,例如清洗、验证、存储等。 Downloader Middlewares: 下载器中间件位于引擎和下载器之间,可以修改请求和响应。 Spider Middlewares: 蜘蛛中间件位于引擎和蜘蛛之间,可以修改请求和提取结果。 2. 创建Scrapy项目 首先,安装Scrapy: 然后,创建一个新的Scrapy项目: 这会创建一个名为 的目录,包含以下文件: 3. 定义Item Item是Scrapy中用于存储抓取数据的容器。在 中定义Item的字段: 4. 编写Spider Spider是抓取数据的核心组件。

Scrapy

Scrapy框架详解:实践与原理

Scrapy是一个强大的Python爬虫框架,用于快速、高效地抓取Web数据。它采用异步网络引擎Twisted,具有高度的可定制性和可扩展性,适用于各种规模的爬虫项目。

1. Scrapy架构概览

Scrapy框架的核心组件包括:

  • Scrapy Engine: 引擎负责控制数据流在所有组件中的流动,并触发事件。

  • Scheduler: 调度器接收引擎发来的请求,并按照优先级进行排序,放入队列中。

  • Downloader: 下载器负责下载网页内容,并将响应返回给引擎。

  • Spiders: 蜘蛛是用户编写的核心组件,定义了如何抓取特定网站。

  • Item Pipeline: 项目管道负责处理蜘蛛提取出的数据,例如清洗、验证、存储等。

  • Downloader Middlewares: 下载器中间件位于引擎和下载器之间,可以修改请求和响应。

  • Spider Middlewares: 蜘蛛中间件位于引擎和蜘蛛之间,可以修改请求和提取结果。

2. 创建Scrapy项目

首先,安装Scrapy:

pip install scrapy

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

scrapy startproject myproject

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

myproject/ scrapy.cfg # 部署配置文件 myproject/ __init__.py items.py # 定义数据模型 middlewares.py # 定义中间件 pipelines.py # 定义项目管道 settings.py # 项目设置 spiders/ # 存放蜘蛛的目录 __init__.py

3. 定义Item

Item是Scrapy中用于存储抓取数据的容器。在items.py中定义Item的字段:

# myproject/items.py import scrapy class ProductItem(scrapy.Item): name = scrapy.Field() price = scrapy.Field() description = scrapy.Field() image_url = scrapy.Field() pass

4. 编写Spider

Spider是抓取数据的核心组件。在spiders目录下创建一个新的Spider文件,例如myspider.py

# myproject/spiders/myspider.py import scrapy from myproject.items import ProductItem class MySpider(scrapy.Spider): name = "myspider" allowed_domains = ["example.com"] # 允许爬取的域名 start_urls = ["http://www.example.com/products"] def parse(self, response): # 提取产品列表的链接 for product_link in response.css("div.product a::attr(href)").getall(): yield scrapy.Request(url=response.urljoin(product_link), callback=self.parse_product) def parse_product(self, response): # 提取产品信息 item = ProductItem() item['name'] = response.css("h1.product-name::text").get() item['price'] = response.css("span.product-price::text").get() item['description'] = response.css("div.product-description::text").get() item['image_url'] = response.css("img.product-image::attr(src)").get() yield item

代码详解:

  • name: Spider的名称,用于区分不同的Spider。

  • allowed_domains: 允许爬取的域名列表,防止爬虫爬到其他网站。

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

  • parse(self, response): 默认的回调函数,用于处理start_urls中的响应。

  • response.css(): 使用CSS选择器提取数据。

  • response.urljoin(): 将相对URL转换为绝对URL。

  • scrapy.Request(): 创建一个新的请求,并指定回调函数。

  • yield item: 将提取到的Item传递给Item Pipeline。

5. 配置Item Pipeline

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

# myproject/pipelines.py import json class JsonWriterPipeline: def __init__(self): self.file = open('products.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的主要方法。

  • open(): 打开一个文件,用于写入数据。

  • json.dumps(): 将Item转换为JSON字符串。

  • write(): 将JSON字符串写入文件。

  • close_spider(self, spider): 在爬虫关闭时执行的方法。

要在Scrapy中使用Pipeline,需要在settings.py中启用它:

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

数字300表示Pipeline的优先级,数字越小优先级越高。

6. 配置Settings

settings.py文件包含Scrapy项目的各种设置,例如:

  • BOT_NAME: 爬虫的名称。

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

  • DEFAULT_REQUEST_HEADERS: 默认的请求头。

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

  • USER_AGENT: 用户代理,模拟浏览器。

  • ITEM_PIPELINES: 启用的Item Pipeline。

7. 运行Spider

使用以下命令运行Spider:

scrapy crawl myspider

这会启动myspider,并将抓取到的数据存储到products.json文件中。

8. 使用Downloader Middlewares

Downloader Middlewares可以修改请求和响应。例如,可以使用Middlewares添加User-Agent,使用代理IP等。

# myproject/middlewares.py class RandomUserAgentMiddleware: def __init__(self): self.user_agents = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0' ] def process_request(self, request, spider): import random ua = random.choice(self.user_agents) request.headers['User-Agent'] = ua

要在Scrapy中使用Middlewares,需要在settings.py中启用它:

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

9. 使用Spider Middlewares

Spider Middlewares可以修改请求和提取结果。例如,可以用来过滤重复的请求。

# myproject/middlewares.py class DuplicatesFilterMiddleware: def __init__(self): self.seen = set() def process_spider_output(self, response, result, spider): for item in result: if item['name'] in self.seen: continue self.seen.add(item['name']) yield item

要在Scrapy中使用Middlewares,需要在settings.py中启用它:

# myproject/settings.py SPIDER_MIDDLEWARES = { 'myproject.middlewares.DuplicatesFilterMiddleware': 543, }

10. Scrapy数据流图

11. 总结

Scrapy是一个功能强大的爬虫框架,可以帮助你快速、高效地抓取Web数据。通过理解Scrapy的架构和核心组件,你可以构建各种复杂的爬虫项目。本文介绍了Scrapy的基本用法,包括创建项目、定义Item、编写Spider、配置Item Pipeline、使用Middlewares等。希望本文能够帮助你入门Scrapy,并为你的爬虫项目提供帮助。

额外提示:

  • 处理动态内容: 对于使用JavaScript动态加载内容的网站,可以使用Scrapy与Selenium或Splash集成。

  • 反爬机制: 了解常见的反爬机制,例如User-Agent检测、IP封禁、验证码等,并采取相应的措施。

  • 数据存储: 可以将抓取到的数据存储到各种数据库中,例如MySQL、MongoDB等。

  • 分布式爬虫: 使用Scrapy-Redis等工具可以构建分布式爬虫,提高抓取效率。

希望这篇文章能够帮助您更深入地理解Scrapy框架。

目录大纲

    最新文档

    知识宇宙

    正在加载知识图谱...


    转发