爬虫玩转Scrapy单机及分布式(一)

原创不易,请关注公众号:【爬虫与大模型开发】,大模型的应用开发之路,整理了大模型在现在的企业级应用的实操及大家需要注意的一些AI开发的知识点!持续输出爬虫与大模型的相关文章。

Scrapy概述

Scrapy 是一个用 Python 编写的开源爬虫框架,专为高效、灵活地抓取网页数据而设计。它广泛应用于数据爬取、网页解析和自动化测试等领域.

Scrapy框架的特性

  • 异步高效:基于 Twisted 异步框架,Scrapy 支持高并发爬取,适合大规模数据抓取。
  • 模块化设计:提供清晰的组件结构(如 Spider、Item、Pipeline 等),便于扩展和定制。
  • 内置功能强大:
    • 支持 CSS 选择器和 XPath 解析网页。
    • 提供请求调度、数据处理管道和中间件机制
    • 内置去重机制,避免重复爬取。
  • 可扩展性:支持自定义中间件、扩展和插件,适应复杂爬取需求。
  • 跨平台:可在 Windows、Linux、macOS 上运行。

Scrapy组件

Spider:定义爬取逻辑和解析规则的核心类,负责指定起始 URL、解析响应并提取数据。

Item:定义爬取数据的结构化容器,类似于 Python 字典。

Pipeline:处理爬取到的数据,如清洗、存储到数据库或文件。

Downloader Middleware:处理请求和响应,适合实现代理、用户代理切换等功能。

Spider Middleware:处理 Spider 的输入和输出,增强爬取逻辑。

Scheduler:管理请求队列,决定爬取顺序并去重。

框架运转流程

初始化:从 Spider 的起始 URL 开始,生成初始请求。

请求调度:Scheduler 管理请求队列,Downloader 通过中间件发送 HTTP 请求。

响应处理:Spider 解析响应,提取数据(生成 Item)或生成新请求。

数据处理:Item 传递到 Pipeline 进行处理(如存储到 MongoDB、MySQL 或 JSON 文件)。

循环:重复请求和解析,直到无新请求。

命令行工具

安装

pip install Scrapy

通常使用 scrapy 工具做的第一件事是创建您的 Scrapy 项目:

scrapy startproject quotes [project_dir]

接下来,进入新的项目目录:

cd project_dir

要创建一个新的爬虫:

scrapy genspider quote quotes.toscrape.com

查看scrapy的可用工具:

scrapy -h

案例分析

下面是这个爬虫器的代码,它可以从 http://quotes.toscrape.com 网站上抓取名人名言, 根据以下的页码:

import scrapy


class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    start_urls = [
        'http://quotes.toscrape.com/tag/humor/',
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').get(),
                'author': quote.xpath('span/small/text()').get(),
            }

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

把代码放到一个Python文件中,文件名如 quotes_spider.py 然后用 runspider 命令运行这个爬虫器:

scrapy runspider quotes_spider.py -o quotes.json
# 运行爬虫
scrapy crawl <spider>

当它执行完毕后,你会发现目录下多了一个名为 quotes.json 的文件,文件内容 是以JSON格式储存的,其中包含名言和作者,格式如下(为了美观进行了排版):

[{
    "author": "Jane Austen",
    "text": "\u201cThe person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.\u201d"
},
{
    "author": "Groucho Marx",
    "text": "\u201cOutside of a dog, a book is man's best friend. Inside of a dog it's too dark to read.\u201d"
},
{
    "author": "Steve Martin",
    "text": "\u201cA day without sunshine is like, you know, night.\u201d"
},
...]

当你运行 scrapy runspider quotes_spider.py 命令之后, Scrapy 会找到定义的爬虫器, 然后通过爬虫引擎运行它们。

爬虫是通过发送请求给 start_urls 属性中定义的 url(在本例中,就是 humor 分类下的 那些 url) 然后调用默认的回调函数 parse,并把响应的对象作为参数传给它。在 parse 回调函数中, 我们使用 CSS 选择器遍历quote元素,并把解析的引用名言和作者生成一个字典通过生成器返回, 寻找并请求下一个链接且继续使用 parse 方法作为回调函数。

这里你可以注意到Scrapy的一个主要的优势请求的调度是异步的。 这意味着Scrapy不需要等待一个请求被完成处理,它可以同时发送另一个请求或者做一些其他事情。 这也同样表明当一些请求失败或者处理发生错误时其他请求可以继续进行下去。

虽然这使得你可以非常快速地进行爬虫(同时可以并发多个请求,在可承载的压力下), 不过Scrapy同样提供了优雅的爬虫方法,简单地配置即可。 你也可以设置一些其他的参数,比如给下载器设置一个延迟,限制每个域名或者代理IP的并发量, 甚至可以让Scrapy自动根据请求的响应情况进行 限流

分布式爬虫

Scrapy-Redis 是一个基于 Redis 实现的 Scrapy 分布式爬虫组件。Scrapy 本身是一个强大的 Python爬虫框架,但它默认是单进程单线程的,在面对大规模数据抓取任务时效率不高。Scrapy-Redis 则解决了这一问题,它允许你将 Scrapy爬虫扩展到多个机器上运行,从而实现分布式爬虫的功能。

核心组件

调度器(Scheduler):Scrapy-Redis 提供了一个基于 Redis 的调度器,用于管理待爬取的请求队列。不同的爬虫实例可以从这个共享的队列中获取请求,避免了请求的重复抓取。

安装

pip install scrapy-redis

项目创建:

scrapy startproject myproject
cd myproject
scrapy genspider example example.com

分布式核心设置:

custom_settings = {
        # 自定义settings参数
        'SCHEDULER': "scrapy_redis.scheduler.Scheduler",  # 启用Redis调度存储请求队列
        'DUPEFILTER_CLASS': "scrapy_redis.dupefilter.RFPDupeFilter",  # 确保所有的爬虫通过Redis去重
        'SCHEDULER_PERSIST': True,  # 不清除Redis队列这样可以暂停/恢复 爬取
        'REDIS_START_URLS_AS_ZSET': True,  # 使用有序集合
        'REDIS_START_URLS_KEY': f'{name}s:start_urls',  # 优先级队列有序集合
        'STATS_CLASS': "scrapy_redis.stats.RedisStatsCollector",  # 将日志信息保存到redis
        'REDIS_HOST': "127.0.0.1",
        'REDIS_PORT': 6379,
        "REDIS_PARAMS": {'password': '123456', "db": 0},

    }

未完待续…

本月将会出一期约10篇的文章,详细介绍Scrapy框架的使用及源码分析! 喜欢博主,记得一键三联.

联系方式

加入星球:
原创不易,点个关注!
不会错过后面的优质文章!
觉着写的不错的可以帮忙点点赞
关注公众号:【爬虫与大模型开发】
需要以上源代码的下面关注并私信!

活跃在一线的Python工程师分享自己学习之路
我创建了【爬虫与大模型开发】的知识星球
适合爱好爬虫及从事爬虫的同学
需要代码提示词加我星球!

需要完整代码扫码星球自提!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

影雀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值