Scrapy入门指南

原文链接:scrapy入门指南-MintHana

Scrapy 框架概述

Scrapy 是什么

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

Scrapy 的基本组件

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

Scrapy 与其他爬虫框架对比

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

安装与配置 Scrapy

bash 复制代码
pip install scrapy  # 下载
scrapy version      # 验证
scrapy startproject myproject # 创建

项目结构介绍:

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

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

编写Scrapy 爬虫

创建爬虫

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

Spider

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

Spider 示例

python 复制代码
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 类是一个简单的容器,用于存储从网页中提取的字段数据

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

Pipeline

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

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

settings.py 中启用管道

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

Middleware

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

python 复制代码
# 例:设置请求头
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 中启用管道

python 复制代码
DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.RandomUserAgentMiddleware': 400, 
}

settings

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

bash 复制代码
# 并发请求
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 和数据库等.

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

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

python 复制代码
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()
相关推荐
ZC跨境爬虫4 小时前
Scrapy工作空间搭建与目录结构解析:从初始化到基础配置全流程
前端·爬虫·python·scrapy·自动化
小白学大数据5 小时前
Scrapy 分布式爬虫:大规模采集汽车之家电车评论
开发语言·分布式·爬虫·scrapy
源码之屋9 天前
计算机毕业设计:新能源汽车多维度数据分析系统 Django框架 Scrapy爬虫 可视化 数据分析 大数据 大模型 机器学习(建议收藏)✅
大数据·python·scrapy·django·汽车·课程设计·美食
IP老炮不瞎唠9 天前
Scrapy 高效采集:优化方案与指南
网络·爬虫·python·scrapy·安全
wxy_summer11 天前
scrcpy 的安装与使用
scrapy·app
小白学大数据14 天前
效率翻倍:Scrapy-Redis 分布式全站爬虫并发优化进阶
redis·分布式·爬虫·scrapy
博士僧小星16 天前
python3_scrapy_Requests类解析(请求与回应)
python·scrapy
q_354888515320 天前
计算机毕业设计源码:Python动漫智能推荐与可视化分析系统 Django框架 协同过滤推荐算法 可视化 数据分析 大数据 大模型(建议收藏)✅
python·scrapy·数据分析·django·课程设计·旅游·推荐算法
B站计算机毕业设计之家20 天前
Python 基于协同过滤的动漫推荐与数据分析平台 Django框架 协同过滤推荐算法 可视化 数据分析 大数据 大模型 计算机毕业设计(建议收藏)✅
大数据·python·scrapy·数据分析·django·课程设计·推荐算法