Python-Scrapy 库详解

一、Scrapy 库简介

Scrapy 是 Python 生态中 ​最强大的开源网络爬虫框架,专为高效抓取和提取结构化数据设计。其核心优势包括:

  1. 高性能异步架构:基于 Twisted 异步引擎,支持并发请求处理,单机可轻松实现每秒数百次请求。
  2. 全链路控制:覆盖请求调度、数据解析、存储、反爬处理等全流程,开发者仅需关注核心逻辑。
  3. 模块化扩展:通过中间件(Middleware)和管道(Pipeline)机制,可灵活定制请求处理、代理池、验证码破解等复杂功能。
  4. 企业级应用:被阿里巴巴、腾讯等大厂用于电商数据采集、舆情监控等场景。

 

二、Scrapy 核心架构

Scrapy 采用分层设计,各组件协同工作:

  1. 引擎(Engine)​:控制数据流,协调各模块交互(如调度器、下载器)。
  2. 调度器(Scheduler)​:管理请求队列,支持优先级和去重策略。
  3. 下载器(Downloader)​:处理 HTTP 请求,支持异步并发和代理/IP 轮换。
  4. 爬虫(Spider)​:定义抓取逻辑(如初始 URL、数据解析规则)。
  5. 管道(Item Pipeline)​:清洗、验证和存储数据(如存入数据库或导出 CSV)。
  6. 中间件(Middleware)​:拦截请求/响应,实现动态 User-Agent、Cookie 管理等高级功能。
三、安装与项目创建
  1. 安装命令

    bash

    pip install scrapy  
  2. 创建项目

    bash

    scrapy startproject my_project  # 生成标准项目结构[3,7](@ref)  
    项目目录包含:
    • spiders/:存放爬虫脚本
    • items.py:定义数据结构
    • pipelines.py:数据存储逻辑
    • settings.py:全局配置(如并发数、中间件)

 

 

四、常用函数与核心操作
1. 定义爬虫(Spider)​

python

import scrapy  

class DoubanSpider(scrapy.Spider):  
    name = "douban"  # 爬虫唯一标识  
    start_urls = ["https://movie.douban.com/top250"]  # 初始URL  

    def parse(self, response):  
        # 解析页面,提取数据  
        for movie in response.css("div.item"):  
            yield {  
                "title": movie.css("span.title::text").get(),  
                "rating": movie.css("span.rating_num::text").get()  
            }  
        # 翻页逻辑  
        next_page = response.css("span.next a::attr(href)").get()  
        if next_page:  
            yield response.follow(next_page, callback=self.parse)  

关键方法

  • parse():默认回调函数,处理响应并生成数据(yield 返回 Item 或 Request 对象)
  • start_requests():自定义初始请求(如带登录态)
2. 数据提取方法
  • CSS 选择器

    python

    response.css("div.quote span.text::text").get()  # 提取文本  
  • XPath

    python

    response.xpath("//h1[@class='title']/text()").extract_first()  
  • JSON 处理

    python

    data = response.json()  
    item["author"] = data.get("author")  
3. 项目管道(Item Pipeline)​

python

# pipelines.py  
import pymongo  

class MongoPipeline:  
    def __init__(self):  
        self.client = pymongo.MongoClient("mongodb://localhost:27017/")  
        self.db = self.client["scrapy_data"]  

    def process_item(self, item, spider):  
        self.db[spider.name].insert_one(dict(item))  
        return item  

配置启用

python

# settings.py  
ITEM_PIPELINES = {  
    "my_project.pipelines.MongoPipeline": 300,  # 数值越小优先级越高  
}  
4. 中间件(Middleware)​

示例:随机 User-Agent

python

# middlewares.py  
from fake_useragent import UserAgent  

class RandomUserAgentMiddleware:  
    def process_request(self, request, spider):  
        request.headers["User-Agent"] = UserAgent().random  

配置启用

python

# settings.py  
DOWNLOADER_MIDDLEWARES = {  
    "my_project.middlewares.RandomUserAgentMiddleware": 543,  
}  

五、常用命令
命令 功能描述 示例
scrapy startproject 创建新项目 scrapy startproject my_crawler
scrapy genspider 生成爬虫模板 scrapy genspider example example.com
scrapy crawl 运行爬虫 scrapy crawl douban -o data.csv
scrapy shell 交互式调试页面解析 scrapy shell "https://example.com"
scrapy check 检查爬虫语法 scrapy check douban

六、注意事项
  1. 反爬策略
    • 设置 DOWNLOAD_DELAY 控制请求频率
    • 使用代理池(如 scrapy-rotating-proxies
  2. 遵守协议
    • 在 settings.py 中设置 ROBOTSTXT_OBEY = True 以遵循 robots.txt
  3. 异常处理

    python

    try:  
        yield Request(url, callback=self.parse)  
    except scrapy.exceptions.IgnoreRequest:  
        self.logger.warning("请求被忽略")  

七、应用场景
  1. 电商价格监控:定时抓取商品价格,分析折扣趋势。
  2. 新闻聚合:采集多平台头条新闻,生成每日简报。
  3. 学术数据采集:抓取论文摘要和引用数据,构建知识图谱。
  4. 社交网络分析:提取用户评论和互动数据,进行情感分析。

你可能感兴趣的:(#,网络请求与爬虫,python,scrapy,开发语言)