- 文集信息
- 目录大纲
- 最新文档
- 知识宇宙
文集详情
文集导读
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框架。
目录大纲
最新文档
知识宇宙
正在加载知识图谱...