1363 字
7 分钟
scrapy入门指南
Scrapy 框架概述
Scrapy 是什么
- Scrapy 是一个快速、高效的 Web 爬虫框架,广泛应用于网页抓取、数据采集等领域。它的优势在于高效性、灵活性和可扩展性。
- 采用事件驱动的异步机制,能够同时处理大量请求并高效地抓取数据。
- 支持多种数据存储格式,如 JSON、CSV、XML、数据库等
Scrapy 的基本组件
- Spider:爬虫的核心,负责请求网页并解析响应。
- Item:用于定义抓取的数据模型。
- Pipeline:用于处理抓取到的数据,例如清洗、存储等。
- Settings:爬虫的配置文件,管理抓取过程中的各类配置项。
- Middleware:中间件,负责处理请求和响应的各种操作。
Scrapy 与其他爬虫框架对比
相比于 requests + BeautifulSoup 或 lxml 的组合,Scrapy 提供了更高效、自动化的抓取过程,并内置了异步机制,能够并行处理请求,适合大型项目和大规模数据抓取。
安装与配置 Scrapy
pip install scrapy # 下载scrapy version # 验证scrapy startproject myproject # 创建项目结构介绍:
创建项目后,Scrapy 会自动生成一些基本目录和文件:
- myproject/ :项目根目录。
- myproject/spiders/ :存放爬虫代码的目录。
- myproject/items.py :定义抓取的数据模型。
- myproject/settings.py :项目的配置文件。
- myproject/pipelines.py :处理抓取数据的管道文件。
- myproject/middlewares.py :处理中间件的文件。
myproject/ scrapy.cfg # Scrapy配置文件 myproject/ # 项目代码 __init__.py items.py # 定义抓取的数据结构(Item) middlewares.py # 定义中间件 pipelines.py # 数据处理管道 settings.py # 项目配置文件 spiders/ # 爬虫文件夹 __init__.py example_spider.py # 示例爬虫编写Scrapy 爬虫
创建爬虫
scrapy genspider quotes_spider quotes.toscrape.com# 基于 Scrapy 的默认模板,快速生成一个名为 quotes_spider 的爬虫文件,且预设该爬虫只爬取 quotes.toscrape.com 这个域名下的内容Spider
Spider 是 Scrapy 的核心组件之一,负责定义如何抓取网站,如何从网页中提取数据。每个 Scrapy 项目可以有多个 Spider,每个 Spider 定义了爬虫要抓取的 URL 和数据提取规则。
Spider 示例
import scrapyclass 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项目的全局配置文件,集中管理所有爬虫设置。同时提供了丰富的配置选项,允许开发者根据需求调整抓取性能。
# 并发请求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.jsonscrapy 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