1363 字
7 分钟
scrapy入门指南
2025-12-25
无标签

Scrapy 框架概述#

Scrapy 是什么#

  • Scrapy 是一个快速、高效的 Web 爬虫框架,广泛应用于网页抓取、数据采集等领域。它的优势在于高效性、灵活性和可扩展性。
  • 采用事件驱动的异步机制,能够同时处理大量请求并高效地抓取数据。
  • 支持多种数据存储格式,如 JSON、CSV、XML、数据库等

Scrapy 的基本组件#

  1. Spider:爬虫的核心,负责请求网页并解析响应。
  2. Item:用于定义抓取的数据模型。
  3. Pipeline:用于处理抓取到的数据,例如清洗、存储等。
  4. Settings:爬虫的配置文件,管理抓取过程中的各类配置项。
  5. Middleware:中间件,负责处理请求和响应的各种操作。

Scrapy 与其他爬虫框架对比#

相比于 requests + BeautifulSoup 或 lxml 的组合,Scrapy 提供了更高效、自动化的抓取过程,并内置了异步机制,能够并行处理请求,适合大型项目和大规模数据抓取。

安装与配置 Scrapy#

Terminal window
pip install scrapy # 下载
scrapy version # 验证
scrapy startproject myproject # 创建

项目结构介绍:

创建项目后,Scrapy 会自动生成一些基本目录和文件:

  • myproject/ :项目根目录。
  • myproject/spiders/ :存放爬虫代码的目录。
  • myproject/items.py :定义抓取的数据模型。
  • myproject/settings.py :项目的配置文件。
  • myproject/pipelines.py :处理抓取数据的管道文件。
  • myproject/middlewares.py :处理中间件的文件。
Terminal window
myproject/
scrapy.cfg # Scrapy配置文件
myproject/ # 项目代码
__init__.py
items.py # 定义抓取的数据结构(Item)
middlewares.py # 定义中间件
pipelines.py # 数据处理管道
settings.py # 项目配置文件
spiders/ # 爬虫文件夹
__init__.py
example_spider.py # 示例爬虫

编写Scrapy 爬虫#

创建爬虫#

Terminal window
scrapy genspider quotes_spider quotes.toscrape.com
# 基于 Scrapy 的默认模板,快速生成一个名为 quotes_spider 的爬虫文件,且预设该爬虫只爬取 quotes.toscrape.com 这个域名下的内容

Spider#

Spider 是 Scrapy 的核心组件之一,负责定义如何抓取网站,如何从网页中提取数据。每个 Scrapy 项目可以有多个 Spider,每个 Spider 定义了爬虫要抓取的 URL 和数据提取规则。

Spider 示例

import scrapy
class QuotesSpider(scrapy.Spider):
name = 'quotes'. # 爬虫的名称,必须唯一
start_urls = ['http://quotes.toscrape.com/']. # 起始URL列表,Scrapy会从这些URL开始抓取。
def parse(self, response): # 处理响应内容的函数。它可以提取数据、查找其他页面链接并递归地抓取。
# 提取页面数据
for quote in response.css('div.quote'):
yield {
'text': quote.css('span.text::text').get(),
'author': quote.css('span small::text').get(),
'tags': quote.css('div.tags a.tag::text').getall(),
}
# 翻页处理
next_page = response.css('li.next a::attr(href)').get()
if next_page:
ield response.follow(next_page, self.parse)

items#

Item 是 Scrapy 中用来表示抓取到的数据结构。Item 类是一个简单的容器,用于存储从网页中提取的字段数据

import scrapy
# scrapy.Field() 用于定义 Item 的字段
class QuoteItem(scrapy.Item):
text = scrapy.Field() # 引用文本
author = scrapy.Field() # 作者
tags = scrapy.Field() # 标签

Pipeline#

Pipeline 用于处理抓取到的数据。通常用于数据清洗、存储等操作。Scrapy 允许开发者根据需求编写自定义的 Pipeline。

class MyPipeline:
def process_item(self, item, spider):
item['text'] = item['text'].strip() # 清洗数据
return item

settings.py 中启用管道

ITEM_PIPELINES = {
'myproject.pipelines.MyPipeline': 1, # 数字越小,管道处理优先级越高
}

Middleware#

Middleware 是 Scrapy 请求和响应的处理机制,可以通过它对请求和响应进行中介处理,例如修改请求头、设置代理等

# 例:设置请求头
class RandomUserAgentMiddleware:
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'

settings.py 中启用管道

DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.RandomUserAgentMiddleware': 400,
}

settings#

settings是Scrapy项目的全局配置文件,集中管理所有爬虫设置。同时提供了丰富的配置选项,允许开发者根据需求调整抓取性能。

Terminal window
# 并发请求
CONCURRENT_REQUESTS = 16 # 最大并发请求数
CONCURRENT_REQUESTS_PER_DOMAIN = 8 # 每个域名最大并发请求数
DOWNLOAD_DELAY = 0.5 # 每个请求之间的延迟,防止被封IP
# 设置代理和用户代理
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, # 关闭默认User-Agent中间件
'myproject.middlewares.RandomUserAgentMiddleware': 400,
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 1, # 启用代理中间件
}
HTTP_PROXY = 'http://proxy.example.com:1234'
# 设置错误重试与重定向
RETRY_TIMES = 5 # 重试次数
REDIRECT_ENABLED = False # 禁用重定向

Scrapy的数据存储与输出#

Scrapy 支持将抓取到的数据存储为多种格式,包括 JSON、CSV、XML 和数据库等.

  • 输出文件形式
# 运行爬虫时,可以通过命令行将抓取的数据导出为文件
scrapy crawl quotes -o quotes.json
scrapy crawl quotes -o quotes.csv
  • 存储到数据库

settings配置数据库信息和启动管道

import pymysql
# MySQL数据存储管道
class MySQLPipeline:
# 初始化:接收数据库配置参数
def __init__(self, host, database, user, password):
self.host = host
self.database = database
self.user = user
self.password = password
# 从settings.py读取MySQL配置
@classmethod
def from_crawler(cls, crawler):
return cls(
host=crawler.settings.get('MYSQL_HOST'),
database=crawler.settings.get('MYSQL_DATABASE'),
user=crawler.settings.get('MYSQL_USER'),
password=crawler.settings.get('MYSQL_PASSWORD')
)
# 爬虫启动时:连接数据库 + 创建表
def open_spider(self, spider):
# 连接MySQL
self.conn = pymysql.connect(
host=self.host, user=self.user, password=self.password, database=self.database, charset='utf8mb4'
)
self.cursor = self.conn.cursor()
# 自动建表
self.create_table()
# 创建数据表(不存在则创建)
def create_table(self):
sql = '''
CREATE TABLE IF NOT EXISTS books (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),author VARCHAR(100),publisher VARCHAR(100),
price DECIMAL(10,2),tags VARCHAR(255),url VARCHAR(255),
fav_count INT,commend_count INT,summary TEXT
)'''
self.cursor.execute(sql)
self.conn.commit()
# 核心:处理数据并插入MySQL
def process_item(self, item, spider):
sql = '''INSERT INTO books
(title,author,publisher,price,tags,url,fav_count,commend_count,summary)
VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)'''
# 执行插入
self.cursor.execute(sql, (
item['title'], item['author'], item['publisher'],
float(item['price']) if item['price'] != '未知' else 0.00,
item['tags'], item['url'],
int(item['fav_count']), int(item['commend_count']), item['summary']
))
self.conn.commit()
return item
# 爬虫结束:关闭连接
def close_spider(self, spider):
self.conn.close()

最后编辑于2026/04/06 10:20

scrapy入门指南
https://minthana.github.io/posts/scrapy/
作者
Mint
发布于
2025-12-25
许可协议
CC BY-NC-SA 4.0