百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Scrapy笔记(一)入门

zhezhongyun 2025-03-10 22:30 17 浏览

一、Scrapy简介

Scrapy是一个基于Python的开源网络爬虫框架,用于快速高效地抓取网页数据。它提供了完整的爬虫开发工具链,包含请求处理、数据解析、存储管道等功能。

二、核心概念解释

1. 主要组件

  • Engine:控制数据流的核心引擎,负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
  • Scheduler:管理请求的调度队列,它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
  • Downloader:处理HTTP请求并返回响应,负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理。
  • Spiders:用户编写的爬虫逻辑,它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)。
  • Item Pipeline:处理抓取的数据(清洗、存储等),它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。
  • Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。
  • Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)

2. 核心概念

  • Item:数据容器,定义抓取的数据结构
  • Selector:基于XPath/CSS选择器的数据提取工具
  • Request:封装HTTP请求对象
  • Response:封装HTTP响应对象
  • Feed exports:数据导出格式(JSON/CSV/XML等)

三、环境准备

1. 安装Scrapy

# python2
pip install scrapy
# python3
pip3 install scrapy

2. 验证安装

scrapy version
# 应该显示版本号(如:Scrapy 2.12.0)

四、创建第一个项目

1. 创建项目

scrapy startproject tutorial

项目结构说明

# 项目结构
tutorial/
    scrapy.cfg           # 部署配置文件
    tutorial/            # 项目模块
        __init__.py
        items.py         # 数据模型定义
        middlewares.py   # 中间件配置
        pipelines.py     # 数据处理管道
        settings.py      # 项目设置
        spiders/         # 爬虫目录
            __init__.py

2. 创建第一个Spider

在spiders目录下新建quotes_spider.py:

import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
        'http://quotes.toscrape.com/page/1/'
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').get(),
                'author': quote.css('small.author::text').get(),
                'tags': quote.css('div.tags a.tag::text').getall(),
            }

        next_page = response.css('li.next a::attr(href)').get()
        if next_page is not None:
            yield response.follow(next_page, callback=self.parse)

五、运行爬虫

scrapy crawl quotes -o quotes.json

结果将保存到quotes.json文件

六、完整示例演示

1. 定义Item(items.py)

import scrapy

class TutorialItem(scrapy.Item):
    text = scrapy.Field()
    author = scrapy.Field()
    tags = scrapy.Field()
    author_info = scrapy.Field()

2. 完善Spider

import scrapy
from tutorial.items import TutorialItem

class AuthorSpider(scrapy.Spider):
    name = 'author'
    start_urls = ['http://quotes.toscrape.com/']

    def parse(self, response):
        for quote in response.css('div.quote'):
            item = TutorialItem()
            item['text'] = quote.css('span.text::text').get()
            item['author'] = quote.css('small.author::text').get()
            item['tags'] = quote.css('div.tags a.tag::text').getall()
            
            author_page = quote.css('small.author + a::attr(href)').get()
            yield response.follow(
                author_page, 
                callback=self.parse_author,
                meta={'item': item}
            )

        next_page = response.css('li.next a::attr(href)').get()
        if next_page is not None:
            yield response.follow(next_page, callback=self.parse)

    def parse_author(self, response):
        item = response.meta['item']
        item['author_info'] = {
            'birth_date': response.css('.author-born-date::text').get(),
            'birth_place': response.css('.author-born-location::text').get(),
            'description': response.css('.author-description::text').get().strip()
        }
        yield item

3. 配置Pipeline(pipelines.py)

import json

class JsonWriterPipeline:
    def open_spider(self, spider):
        self.file = open('authors.jl', 'w', encoding='utf-8')

    def close_spider(self, spider):
        self.file.close()

    def process_item(self, item, spider):
        line = json.dumps(dict(item), ensure_ascii=False) + "\n"
        self.file.write(line)
        return item

4. 启用Pipeline(settings.py)

ITEM_PIPELINES = {
    'tutorial.pipelines.JsonWriterPipeline': 300,
}

七、常用命令

  1. 创建爬虫:
scrapy genspider myspider example.com
  1. 运行爬虫:
scrapy crawl 
  1. 交互式调试:
scrapy shell "http://quotes.toscrape.com"
  1. 导出不同格式:
scrapy crawl quotes -o quotes.csv
scrapy crawl quotes -o quotes.xml

八、进阶功能 (后续陆续更新)

  1. CrawlSpider使用(
  2. 使用 CrawlerProcess 编程式运行爬虫
  3. 分布式爬虫
  4. 处理动态内容
  5. 数据处理与存储优化

九、注意事项

  1. 遵守网站的robots.txt协议
  2. 设置合理的下载延迟(DOWNLOAD_DELAY)
  3. 使用User-Agent轮换
  4. 处理反爬机制(验证码、IP封禁等)
  5. 注意数据存储格式和编码问题

十、调试技巧

  1. 使用scrapy shell进行快速测试
  2. 查看日志:
# settings.py
LOG_LEVEL = 'DEBUG'
LOG_FILE = 'scrapy.log'
  1. 使用中间件捕获异常
  2. 通过response.status检查HTTP状态码

这个教程涵盖了Scrapy的主要功能和典型使用场景。建议通过实际项目练习来加深理解,可以从简单的静态网站开始,逐步挑战更复杂的动态网站和数据抓取需求。

学习资料

Scrapy 2.12 文档 — Scrapy 2.12.0 文档 - Scrapy 框架

源代码合集

  • 汽车之家车型数据抓取解析 (后续更新)

相关推荐

「layui」表单验证:验证注册

注册界面手动验证获取短信验证码代码原文<!DOCTYPEhtml><htmllang="zh"><head>&...

Full text: Joint statement between China and Kenya on creating an inspiring example in the all-weather China-Africa community with a shared future for the new era

JointStatementBetweenthePeople'sRepublicofChinaandtheRepublicofKenyaonCreatinganInspi...

国际组织最新岗位信息送给你

国际刑警组织PostingTitleITLogisticsManagerGrade5DutyStationAbidjan,IvoryCoastDeadlineforApplicatio...

【新功能】Spire.PDF 8.12.5 支持设置表单域的可见与隐藏属性

Spire.PDF8.12.5已发布。该版本新增支持设置表单域的可见与隐藏属性、添加自定义的元数据以及给PDF文档的元数据添加新的命名空间。本次更新还增强了PDF到DOCX和图片的转换...

AI curbs show Biden&#39;s rejection of cooperation

AIcurbsshowBiden'srejectionofcooperation:ChinaDailyeditorial-Opinion-Chinadaily.com.cnT...

“煤气灯效应”上热搜,这几种有毒的“情感关系”也要注意了……

近日,“煤气灯效应”(theGaslightEffect)再次进入公众视野并登上热搜,引发网友广泛关注。那么,什么是“煤气灯效应”?以“爱”之名进行情绪控制在心理学中,通过“扭曲受害者眼中的真实”...

Qt编写推流程序/支持webrtc265/从此不用再转码/打开新世界的大门

一、前言在推流领域,尤其是监控行业,现在主流设备基本上都是265格式的视频流,想要在网页上直接显示监控流,之前的方案是,要么转成hls,要么魔改支持265格式的flv,要么265转成264,如果要追求...

写给运维的Nginx秘籍

要说Web服务器、代理服务器和调度服务器层面,目前使用最大的要数Nginx。对于一个运维工程师日常不可避免要和Nginx打交道。为了更好地使用和管理Nginx,本文就给大家介绍几个虫虫日常常用的秘籍。...

突破亚马逊壁垒,Web Unlocker API 助您轻松获取数据

在数据驱动决策的时代,电商平台的海量数据是十足金贵的。然而,像亚马逊这样的巨头为保护自身数据资产,构建了近乎完美的反爬虫防线,比如IP封锁、CAPTCHA验证、浏览器指纹识别,常规爬虫工具在这些防线面...

每日一库之 logrus 日志使用教程

golang日志库golang标准库的日志框架非常简单,仅仅提供了print,panic和fatal三个函数对于更精细的日志级别、日志文件分割以及日志分发等方面并没有提供支持.所以催生了很多第三方...

对比测评:为什么AI编程工具需要 Rules 能力?

通义灵码ProjectRules在开始体验通义灵码ProjectRules之前,我们先来简单了解一下什么是通义灵码ProjectRules?大家都知道,在使用AI代码助手的时候,有时...

python 面向对象编程

Python的面向对象编程(OOP)将数据和操作封装在对象中,以下是深度解析和现代最佳实践:一、核心概念重构1.类与实例的底层机制classRobot:__slots__=['...

Windows系统下常用的Dos命令介绍(一)

DOS是英文DiskOperatingSystem的缩写,意思是“磁盘操作系统”。DOS主要是一种面向磁盘的系统软件,说得简单些,DOS就是人给机器下达命令的集合,是存储在操作系统中的命令集。主要...

使用 Flask-Admin 快速开发博客后台管理系统:关键要点解析

一、为什么选择Flask-Admin?Flask-Admin是Flask生态中高效的后台管理框架,核心优势在于:-零代码生成CRUD界面:基于数据库模型自动生成增删改查功能-高度可定制...

Redis淘汰策略导致数据丢失?

想象一下,你的Redis服务器是一个合租宿舍,内存就是床位。当新数据(新室友)要住进来,但床位已满时,你作为宿管(淘汰策略)必须决定:让谁卷铺盖走人?Redis提供了8种"劝退"方案,...