Python爬虫框架之Scrapy
Scrapy是一个用Python编写的强大的网络爬虫框架,用于高效地从网页中提取所需的数据。
一、安装Scrapy
- 确保已经安装了Python(建议使用Python 3.x)。可以通过以下命令来安装Scrapy:
- 在命令行中使用
pip install scrapy
(如果使用的是Anaconda环境,可以使用conda install -c conda -forge scrapy
)。
- 在命令行中使用
二、Scrapy的基本架构
- Spider(爬虫)
- 这是Scrapy的核心组件,用于定义如何爬取网站。例如,你可以定义一个简单的Spider来爬取一个书籍网站的书名和作者信息。
- 代码示例:
import scrapy
class BookSpider(scrapy.Spider):
name = "book_spider"
start_urls = ["https://example.com/books"]
def parse(self, response):
for book in response.css('div.book'):
yield {
'title': book.css('h2::text').get(),
'author': book.css('p.author::text').get()
}
- 在这个示例中,
name
属性定义了Spider的名称,start_urls
是开始爬取的URL列表。parse
方法是处理响应(从网站获取的HTML内容)的回调函数,它使用CSS选择器来提取数据。
- Item(数据项)
- 用于存储爬取到的数据。可以把它看作是一个Python字典,但具有更好的结构和可维护性。
- 例如:
import scrapy
class BookItem(scrapy.Item):
title = scrapy.Field()
author = scrapy.Field()
- 可以在Spider中使用
yield
关键字返回Item
对象,然后通过管道(Pipeline)进行进一步处理。
- Pipeline(管道)
- 主要用于处理Spider提取的数据,比如数据清洗、存储等操作。
- 例如,将爬取到的书籍信息存储到数据库中:
class BookPipeline:
def open_spider(self, spider):
# 连接数据库等初始化操作
self.connection = sqlite3.connect('books.db')
self.cursor = self.connection.cursor()
self.cursor.execute('CREATE TABLE IF NOT EXISTS books (title TEXT, author TEXT)')
def process_item(self, item, spider):
self.cursor.execute("INSERT INTO books VALUES (?,?)", (item['title'], item['author']))
self.connection.commit()
return item
def close_spider(self, spider):
# 关闭数据库连接等清理操作
self.connection.close()
- 要启用这个管道,需要在
settings.py
文件中配置ITEM_PIPELINES
选项。
- Downloader Middleware(下载中间件)和Spider Middleware(爬虫中间件)
- Downloader Middleware用于处理请求和响应,比如设置请求头、代理等。例如,设置随机的用户代理来避免反爬虫:
class RandomUserAgentMiddleware:
def process_request(self, request, spider):
user_agents = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/88.0.1']
request.headers['User - Agent'] = random.choice(user_agents)
- Spider Middleware主要用于处理Spider的输入和输出,比如对Spider产生的请求和解析后的数据进行处理。
三、Scrapy的工作流程
- 首先,引擎(Engine)从Spider获取初始请求(
start_urls
中的请求),并将请求发送到调度器(Scheduler)。 - 调度器对请求进行排队,然后将请求发送到下载器(Downloader)。
- 下载器根据请求下载网页内容,并将响应返回给引擎。
- 引擎将响应发送给Spider进行处理,Spider通过
parse
等回调函数提取数据,并可以产生新的请求。 - 提取到的数据被发送到管道进行处理,新产生的请求会再次进入调度器排队,如此循环,直到没有新的请求。
四、Scrapy的优点
- 高效性
- 采用异步I/O和多线程技术,能够快速地并发处理多个请求,大大提高了爬取速度。
- 灵活性
- 可以方便地定制Spider来适应不同的网站结构,通过选择器(CSS选择器或XPath)精确地提取数据。
- 可扩展性
- 中间件和管道机制使得可以很容易地扩展功能,如添加反爬虫策略、数据存储方式等。
五、Scrapy的应用场景
- 数据采集
- 可以用于采集电商网站的商品信息(价格、评论等)、新闻网站的新闻内容、社交媒体的数据等。
- 搜索引擎索引构建
- 帮助搜索引擎构建索引,通过爬取网页内容,提取关键词等信息,为搜索引擎提供数据。