当前位置: 首页 > news >正文

寒假学习笔记2.13

一、学习目标
理解分布式爬虫的原理与优势

掌握Scrapy‑Redis实现分布式爬虫的方法

学习数据存储方案:MySQL与MongoDB

掌握增量爬取与去重策略

能够将Scrapy爬虫集成到其他Python程序中(CrawlerRunner)

完成一个分布式爬虫项目,并将数据存入数据库

二、学习内容

  1. 分布式爬虫概述
    为什么需要分布式:单机爬虫受限于带宽、CPU、内存,无法满足大规模数据采集需求;分布式可以将任务分发到多台机器,提高抓取速度。

核心问题:

任务队列:需要一个中央调度器管理URL。

去重:多台机器同时抓取,必须共享去重集合。

数据汇总:抓取结果需要集中存储。

Scrapy‑Redis:Scrapy的扩展组件,利用Redis作为任务队列和去重容器,实现分布式。

  1. Scrapy‑Redis 基础
    2.1 安装与配置
    bash
    pip install scrapy-redis
    2.2 修改Scrapy项目为分布式
    settings.py 中添加:

python

使用Redis调度器

SCHEDULER = "scrapy_redis.scheduler.Scheduler"

使用Redis去重

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

启用Redis任务队列(可选)

SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderQueue'

Redis连接配置

REDIS_HOST = 'localhost' # Redis服务器地址
REDIS_PORT = 6379
REDIS_PARAMS = {
'password': 'yourpassword' # 如果有密码
}

持久化爬取状态(可选)

SCHEDULER_PERSIST = True

抓取结束后不清除Redis队列,方便后续增量

2.3 编写分布式爬虫
继承自 RedisSpider 而非 scrapy.Spider:

python
from scrapy_redis.spiders import RedisSpider

class MyDistributedSpider(RedisSpider):
name = 'dist_spider'
# 不再使用 start_urls,而是从Redis读取起始URL
redis_key = 'myspider:start_urls'

def parse(self, response):# 解析逻辑pass

向Redis中推送起始URL:

python
import redis
r = redis.Redis(host='localhost', port=6379)
r.lpush('myspider:start_urls', 'http://example.com/page1')
r.lpush('myspider:start_urls', 'http://example.com/page2')
启动多个爬虫实例,它们会从Redis中消费URL。

2.4 分布式去重与队列
去重使用Redis的set,指纹存储在spider:dupefilter键中。

请求队列可以使用Redis的list或优先级队列。

  1. 数据存储方案
    3.1 MySQL 存储
    安装MySQL驱动:pip install pymysql

在Pipeline中写入MySQL:

python
import pymysql

class MySQLPipeline:
def open_spider(self, spider):
self.conn = pymysql.connect(
host='localhost',
user='root',
password='123456',
database='spider_data',
charset='utf8mb4'
)
self.cursor = self.conn.cursor()

def close_spider(self, spider):self.conn.commit()self.cursor.close()self.conn.close()def process_item(self, item, spider):sql = "INSERT INTO products (title, price, url) VALUES (%s, %s, %s)"self.cursor.execute(sql, (item['title'], item['price'], item['url']))self.conn.commit()return item

3.2 MongoDB 存储
安装MongoDB驱动:pip install pymongo

Pipeline示例:

python
import pymongo

class MongoPipeline:
def open_spider(self, spider):
self.client = pymongo.MongoClient('localhost', 27017)
self.db = self.client['spider_db']
self.collection = self.db['products']

def close_spider(self, spider):self.client.close()def process_item(self, item, spider):self.collection.insert_one(dict(item))return item

3.3 选择合适的存储
MySQL:适合结构化数据,需要复杂查询和事务的场景。

MongoDB:适合非结构化或半结构化数据,扩展性好,无需预定义模式。

  1. 增量爬取与去重策略
    增量爬取:只抓取新增或更新的内容,避免重复抓取。

实现方式:

使用Redis存储已抓取的URL指纹(Scrapy‑Redis自带)。

设置SCHEDULER_PERSIST = True,爬虫停止后不清除指纹,下次启动继续。

定期清除过期的指纹(如通过Redis的过期时间)。

自定义去重:可以重写RFPDupeFilter,加入自己的指纹生成逻辑。

  1. 集成Scrapy到现有程序(CrawlerRunner)
    有时需要在非命令行环境下运行爬虫(如Web应用后台)。

使用CrawlerRunner或CrawlerProcess:

python
from scrapy.crawler import CrawlerRunner
from scrapy.utils.project import get_project_settings
from twisted.internet import reactor, defer

def run_spider():
settings = get_project_settings()
runner = CrawlerRunner(settings)
d = runner.crawl('my_spider')
d.addBoth(lambda _: reactor.stop())
reactor.run()

if name == 'main':
run_spider()
注意Twisted的reactor只能启动一次,适合长期运行的程序。

http://www.jsqmd.com/news/399373/

相关文章:

  • 基于java+Vue的养老院服务预订管理系统的设计与实现
  • 光子晶体仿真在COMSOL里总能把人折腾得又爱又恨。今天聊聊几个实战中容易卡壳的点:拓扑荷对偏振态的操控、三维能带与Q因子计算,顺带提一嘴远场偏振的骚操作
  • java电影评论情感分析系统78j90381
  • java第二课堂教学管理系统 j6l4ub2t
  • java基于数据可视化的大学生创新能力培养平台
  • java校园二手交易平台
  • 股市赚钱学概论:赚钱理之其他
  • SVPWM+死区补偿(基于电流极性)+高频注入法辨识PMSM的dq轴电感(离线辨识) 1.模型...
  • 47款U盘
  • JAVA面试题速记-第1期-java基础
  • 屏幕注释工具DrawPen
  • NanaZip
  • 题解:AcWing 854 Floyd求最短路
  • TVP-FAVAR模型解读
  • 机器学习入门:用 Python 实现简单分类模型完整流程
  • AI元人文:在技术加速时代守护意义生态
  • 【Kafka基础篇】面试高频题:Rebalance触发条件、执行阶段,一篇讲透不踩坑
  • 题解:AcWing 859 Kruskal算法求最小生成树
  • 2026.2.21:微调vgg16模型训练CIFAR-10,准确率达0.9034
  • 【Kafka基础篇】Kafka高可用核心:ISR机制与ACK策略详解,吃透可靠性与吞吐量权衡
  • 0221 重听收藏的歌
  • 搭建环境的流程——以多有米为例
  • 题解:AcWing 858 Prim算法求最小生成树
  • 题解:AcWing 852 spfa判断负环
  • 题解:AcWing 851 spfa求最短路
  • 智能指针(三):实现篇 —— shared_ptr 的内部设计与引用计数机制
  • 智能指针(二):机制篇 —— 移动语义与所有权转移
  • 【单片机】vscode环境配置
  • 智能指针(四):体系篇 —— 现代 C++ 内存管理全景图
  • 桌面整理 Desk Tidy