惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Vulnerabilities – Threatpost
aimingoo的专栏
aimingoo的专栏
B
Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志
Engineering at Meta
Engineering at Meta
IT之家
IT之家
V
Visual Studio Blog
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
A
About on SuperTechFans
博客园 - 聂微东
Blog — PlanetScale
Blog — PlanetScale
N
News and Events Feed by Topic
A
Arctic Wolf
WordPress大学
WordPress大学
小众软件
小众软件
C
CERT Recently Published Vulnerability Notes
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
D
Darknet – Hacking Tools, Hacker News & Cyber Security
F
Fortinet All Blogs
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Y
Y Combinator Blog
T
Threat Research - Cisco Blogs
Latest news
Latest news
Simon Willison's Weblog
Simon Willison's Weblog
Cyberwarzone
Cyberwarzone
S
Schneier on Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
Lohrmann on Cybersecurity
Stack Overflow Blog
Stack Overflow Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy International News Feed
J
Java Code Geeks
Spread Privacy
Spread Privacy
宝玉的分享
宝玉的分享
I
Intezer
L
LangChain Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
G
GRAHAM CLULEY
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
The GitHub Blog
The GitHub Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
N
News and Events Feed by Topic
AWS News Blog
AWS News Blog
Attack and Defense Labs
Attack and Defense Labs
Security Archives - TechRepublic
Security Archives - TechRepublic
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

博客 on 打工人日志

k8s RKE2 cilium L2 + envoy gateway 安装配置 k8s RKE2 vSphere 存储配置 OpenClaw 全能指南:从安装到进阶自动化实战 (2026 最终版) Kubernetes — skywalking + banyanDB APM监控部署 Kubernetes — promtail + loki + grafana 日志系统部署 k8s master 节点 Unauthorized Kubernetes — metalLB + Traefik 部署 Kubernetes — SSL 证书自动更新 Kubernetes — RKE2 + kube-vip + cilium 部署 使用TLSv1.3 升级nginx和openssl Proxmox VE(PVE) 更新到最新版本 kindle 邮件发送失败,错误代码E999 metallb + ingress-nginx + argocd 本地部署 iStoreOS(旁路由)使用openclash实现dns劫持 异常流量分析:图片库服务黑客入侵 openwrt 硬盘扩容 搭建ip地址检索服务 Kubernetes — k8s 手动安装 1.17.9 SELinux 问题:导致端口无法创建,无法访问 【福利】免费!本地部署!去除视频中移动的物体 通知:《打工人日报》迁移到独立板块 KyBook 3 | calibre-web - IOS系统最佳图书伴侣 Tmux 安装和使用教程 DockerHub 加速镜像部署 - 使用cloudflare 代理 docker的零停机部署 SD-webui 批量处理图片 ubuntu 安装 ComfyUI ubuntu 安装 stable-diffusion-webui 测试策略:微服务架构 单元测试:测试单元质量提升 端到端测试:模拟用户体验 Kubernetes — containerd 安装和部署 CI/CD 可观察性-基于grafana Argo cd 安装和部署 linux服务器进程打开文件过多导致服务异常 使用 ElasticSearch Curator 7天定期删除日志 sonarqube docker安装和配置 SSH 通过 443 端口连接 GitHub iOS 17 「待机显示」适配普通 iPhone(非 Pro/Max),屏幕在充电时常亮 GNU/Linux 一键更换系统软件源脚本 解决Elasticsearch索引只读(read-only) 【福利】埃隆·马斯克传 [沃尔特·艾萨克森] 在线下载 【破解】小鹏P5和小鹏G9开启adb和网络adb Kubernetes — kubecost 分析 Kubernetes 成本 3D Gaussian Splatting:3D模型渲染 Linux 系统收包流程以及内核参数优化 2023亚运会电竞门票民购买指南(报名+抽签) Vue3 + vite + nginx项目部署后404问题 大麦抢票辅助软件(福利 TFBOYS十年之约演唱会 2023 全机位 视频) 黑群晖最新安装教程 Ansible部署ceph集群 最好的微信朋友圈集赞神器-福利推荐 推荐一下 容器云资源 2010年的天涯神贴聊房价 如何礼貌回绝不合理的需求 nginx 配置和编译 github 国内代理访问下载 逆境和成长-2022年终总结 优雅的使用Conda管理python环境 Jenkins 编译Android apk 流水线 Kubernetes — 更新证书 shell功能脚本集合 Nexus3 使用和部署 githubAction set-output弃用错误 Kubernetes — Rook云存储介绍和部署 Kubernetes — 基于K8S搭建Ceph分布式存储 Kubernetes — 探针和生命周期 Kubernetes — 开放标准(OCI、CRI、CNI、CSI、SMI、CPI)概述 kubernetes 部署插件 (Flannel、Web UI、CoreDNS、Ingress Controller) Cloudflare Zero Trust 内网穿透 k8s CNI 问题 连接认证失效 k8s.gcr.io国内无法连接解决方法 headscale 部署使用 羊了个羊小程序 破解通关 K8S 问题排查:cgroup 内存泄露问题 RocketMQ k8s部署 4主4从集群 docker 问题处理 kubernetes 存储 linux服务器 删除空间却未释放 kubernetes 从1.23.x 升级到 1.24.x 编写 kubernetes 资源描述文件 nginx ssh-key connection exception kubernetes manual expansion VSCode插件推荐=> Code Runner ant build.xml 编写 kubernetes 调度过程 记录一次上门打散工 k8s本地联调神器kt-connect Ant中如何添加第三方jar包依赖 OpenELB:让k8s私有环境对外暴露端口 linux 网络测速 安装 docker 出现 ERROR: Unsupported distribution 'ol' 问题 logrotate 日志滚动的使用 nginx 编译参数详解 nginx 重写规则 rewrite模块 nginx.conf 配置文件详解 rsync 文件同步 nginx 日志格式整理 163企业邮箱设置教程 2021年第50周记
使用scrapy-redis实现增量爬取
2023-03-30 · via 博客 on 打工人日志

使用scrapy-redis实现增量爬取

Scrapy-RedisScrapy框架的一个插件,可以使用Redis实现Scrapy的分布式爬虫。它使用Redis作为分布式队列,可以轻松地将爬虫分布在多个机器上。同时,它还提供了一些功能,如去重、持久化、增量爬取等。

要使用Scrapy-Redis实现增量爬取,可以采取以下步骤:

  1. 在Scrapy项目中安装Scrapy-Redis插件。可以使用pip安装:pip install scrapy-redis
  2. 在Scrapy的settings.py中添加如下配置:
1# 使用Redis调度器
2SCHEDULER = "scrapy_redis.scheduler.Scheduler"
3# 使用Redis去重过滤器
4DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
5# 允许暂停、恢复爬取
6SCHEDULER_PERSIST = True
  1. 将Spider的爬取链接放入Redis队列中。可以在Spider中重载start_requests()方法,从Redis队列中获取链接开始爬取。
 1import scrapy
 2from scrapy_redis.spiders import RedisSpider
 3
 4class MySpider(RedisSpider):
 5    name = 'myspider'
 6    redis_key = 'myspider:start_urls'
 7
 8    def parse(self, response):
 9        # 处理响应
10        pass
  1. 在Spider中实现增量爬取。可以通过重载Spider中的start_requests()方法或者使用SpiderMiddleware来实现增量爬取。这里提供一种通过修改Redis队列来实现增量爬取的方法。
 1import scrapy
 2import redis
 3from scrapy_redis.spiders import RedisSpider
 4from scrapy.utils.project import get_project_settings
 5
 6class MySpider(RedisSpider):
 7    name = 'myspider'
 8    redis_key = 'myspider:start_urls'
 9    redis_conn = None
10
11    def __init__(self, *args, **kwargs):
12        super(MySpider, self).__init__(*args, **kwargs)
13        settings = get_project_settings()
14        self.redis_conn = redis.StrictRedis(
15            host=settings.get('REDIS_HOST'),
16            port=settings.get('REDIS_PORT'),
17            db=settings.get('REDIS_DB')
18            )
19
20    def start_requests(self):
21        # 获取最新的链接列表
22        latest_links = self.get_latest_links()
23        # 将最新的链接放入Redis队列
24        for link in latest_links:
25            self.redis_conn.lpush(self.redis_key, link)
26
27        # 开始爬取
28        return super(MySpider, self).start_requests()
29
30    def get_latest_links(self):
31        # 获取最新的链接列表
32        latest_links = []
33        # 这里只是简单的示例,实际可以从数据库、文件、API等获取最新的链接
34        for i in range(10):
35            latest_links.append(f'http://example.com/page{i}')
36        return latest_links
37
38    def parse(self, response):
39        # 处理响应
40        pass

以上代码实现了在Spider启动时获取最新的链接列表,并将最新的链接放入Redis队列中,从而实现增量爬取。需要注意的是,这种方法仅适用于Spider启动时获取最新链接的情况。如果需要实时获取最新链接,可以使用SpiderMiddleware来实现。这里提供一种使用SpiderMiddleware实现增量爬取的方法。

SpiderMiddleware实现增量爬取的方法

  1. 创建一个Middleware,并在process_request()方法中判断请求是否需要进行增量处理。如果需要,则修改请求的链接,将增量参数添加到链接中。示例代码如下:
 1import time
 2import scrapy
 3from scrapy import Request
 4
 5class MyMiddleware:
 6    def process_request(self, request, spider):
 7        # 判断是否需要进行增量处理
 8        if 'incremental' in request.meta:
 9            # 获取增量参数
10            incremental_param = request.meta['incremental']
11            # 将增量参数添加到请求链接中
12            url = request.url
13            if '?' in url:
14                url += f'&incremental={incremental_param}'
15            else:
16                url += f'?incremental={incremental_param}'
17            # 修改请求链接
18            request = Request(url, callback=request.callback, headers=request.headers, meta=request.meta)
19        return request
  1. Spider中添加一个增量参数,并在start_requests()方法中设置增量参数。示例代码如下:
 1import scrapy
 2from myproject.middleware import MyMiddleware
 3
 4class MySpider(scrapy.Spider):
 5    name = 'myspider'
 6    start_urls = ['http://example.com']
 7    incremental_param = None
 8
 9    custom_settings = {
10        'DOWNLOADER_MIDDLEWARES': {
11            'myproject.middleware.MyMiddleware': 543,
12        }
13    }
14
15    def start_requests(self):
16        # 获取最新的增量参数
17        self.incremental_param = self.get_incremental_param()
18        # 设置增量参数
19        for url in self.start_urls:
20            yield scrapy.Request(url, callback=self.parse, meta={'incremental': self.incremental_param})
21
22    def parse(self, response):
23        # 处理响应
24        pass
25
26    def get_incremental_param(self):
27        # 获取最新的增量参数
28        return int(time.time())
  1. 在SpiderMiddleware中判断响应是否需要进行增量处理。如果需要,则使用yield生成一个新的请求,将增量参数添加到链接中。示例代码如下:
 1import time
 2import scrapy
 3from scrapy import Request
 4
 5class MySpiderMiddleware:
 6    def process_spider_output(self, response, result, spider):
 7        for r in result:
 8            # 判断是否需要进行增量处理
 9            if 'incremental' in response.request.meta:
10                incremental_param = response.request.meta['incremental']
11                # 判断响应是否需要进行增量处理
12                if self.need_incremental_processing(response, r):
13                    # 获取原始链接
14                    url = r.url
15                    # 将增量参数添加到链接中
16                    if '?' in url:
17                        url += f'&incremental={incremental_param}'
18                    else:
19                        url += f'?incremental={incremental_param}'
20                    # 生成一个新的请求,将增量参数添加到链接中
21                    yield Request(url, callback=r.callback, headers=r.headers, meta=r.meta)
22                    continue
23            yield r
24
25    def need_incremental_processing(self, response, request):
26        # 判断响应是否需要进行增量处理
27        return True # TODO: 根据实际情况进行判断

以上代码实现了使用SpiderMiddleware实现增量爬取。需要注意的是这里只是一个示例实现,需要根据实际情况进行修改。以下是一些需要注意的事项:

  • 增量参数的生成方式可以根据实际情况进行修改。这里使用了当前时间戳作为增量参数,可以根据需要使用其他方式生成增量参数,例如使用数据库中的记录时间作为增量参数。
  • need_incremental_processing()方法中需要根据实际情况进行判断。例如,可以根据响应的内容进行判断,如果响应的内容与上一次爬取的内容相同,则不进行增量处理。
  • 在修改链接时,需要注意链接中是否已经包含了增量参数。如果已经包含了增量参数,则不需要添加新的增量参数。
  • 在使用yield生成新的请求时,需要注意将原始请求中的callback、headers和meta参数复制到新的请求中,否则可能会导致一些错误。
  • 在处理响应时,需要注意将响应中包含的增量参数传递给下一次请求。这里使用了meta参数传递增量参数,也可以使用其他方式进行传递。

最后需要注意的是,使用增量爬取需要对爬取的网站有一定的了解,否则可能会导致一些错误。例如,在爬取新闻网站时,如果没有对新闻的发布时间进行处理,则可能会重复爬取相同的新闻。因此,在使用增量爬取时,需要根据实际情况进行调整,以确保爬取的数据的准确性和完整性。