前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python 分布式爬虫

python 分布式爬虫

作者头像
友儿
发布2022-10-05 18:35:10
3380
发布2022-10-05 18:35:10
举报
文章被收录于专栏:友儿

分布式爬虫

  • 什么分布式 分布式就是把一个系统拆分成若干个子系统, 每个子系统独立运行, 然后通过某种方式进行交互.
  • 什么是分布式爬虫 狭义地讲, 需要将爬虫的多个组件拆分成子系统. 但是现在主流是只拆分出任务生产者, 建立一个生产消费者模型.由多台机器上的爬虫实例作为消费者去完成爬虫任务.

scrapy的痛点

  • 爬虫实例中断后重启后, 内存保存的消息队列将会丢失, 实现爬虫重启功能比较复杂;
  • 去重中间件无法持久化, 中断后无法正常过滤;
  • 消息队列放在了内置类型QUEUE中, 无法简单地从外部查看;
  • 不共享消息队列, 可扩展性差;

scrapy-redis

代码语言:javascript
复制
https://github.com/rmax/scrapy-redis

安装

代码语言:javascript
复制
pip install scrapy-redis

SETTINGS设置

SCHEDULER

更换调度器

代码语言:javascript
复制
SCHEDULER = 'scrapy_redis.scheduler.Scheduler'

SCHEDULER_QUEUE_CLASS

更换消息队列

代码语言:javascript
复制
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'

DUPEFILTER_CLASS

更换过滤器, 将请求指纹保存在redis当中

代码语言:javascript
复制
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

SCHEDULER_PERSIST

消息队列持久化, 不会清空redis中的消息队列

代码语言:javascript
复制
SCHEDULER_PERSIST = True

REDIS配置

代码语言:javascript
复制
# Redis settings
REDIS_HOST = 'localhost'
REDIS_PORT = 6379
# Redis 参数配置
REDIS_PARAMS = {"db": 5}

SPIDER设置

修改继承的父类为scrapy_redis.spiders.RedisSpider

代码语言:javascript
复制
from scrapy_redis.spiders import RedisSpider

class JdSearch(RedisSpider):

添加redis_key配置

代码语言:javascript
复制
redis_key = f"{name}:start_urls"

将生产者从scrapy项目中拆分出去

代码语言:javascript
复制
import redis
import time
import json

redis_con = redis.Redis(host='localhost', port=6379, db=5)


def search_producer():
    for keyword in ["鼠标", "键盘", "显卡", "耳机"]:
        for page_num in range(1, 11):
            url = f"https://search.jd.com/Search?keyword={keyword}&page={page_num}"
            meta = {
                "sta_date": time.strftime("%Y-%m-%d"),
                "keyword": keyword,
                "page_num": page_num
            }

            task = json.dumps({
                "url": url,
                "body": '',
                "method": "GET",
                "meta": meta
            })
            redis_con.lpush("jd_search:start_urls", task)


if __name__ == "__main__":
    search_producer()

重写start_requests

代码语言:javascript
复制
    def make_request_from_data(self, data):
        task = json.loads(data.decode("utf-8"))
        return scrapy.http.FormRequest(url=task['url'],
                                       formdata=json.loads(task['body']) if task['body'] else '',
                                       method=task['method'],
                                       meta=task['meta'],
                                       dont_filter=False,
                                       callback=self.parse_search,
                                       errback=self.process_error)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 分布式爬虫
  • scrapy的痛点
  • scrapy-redis
相关产品与服务
消息队列 CMQ 版
消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档