使用Scrapy进行网络爬取时的缓存策略与User-Agent管理

Python_00058.png

缓存策略的重要性

缓存策略在网络爬虫中扮演着至关重要的角色。合理利用缓存可以显著减少对目标网站的请求次数,降低服务器负担,同时提高数据抓取的效率。Scrapy提供了多种缓存机制,包括HTTP缓存和Scrapy内置的缓存系统。

HTTP缓存

HTTP缓存是基于HTTP协议的缓存机制,通过设置HTTP响应头中的Cache-Control、Expires等字段来实现。Scrapy默认情况下会遵守HTTP缓存规则,但可以通过设置HTTPCACHE_ENABLED和HTTPCACHE_POLICY来自定义缓存策略。

Scrapy内置缓存

Scrapy内置的缓存系统可以存储请求的响应,避免重复请求相同的URL。通过设置MEMUSAGE_ENABLED和MEMUSAGE_WARNING_MB,可以开启内存使用监控,防止内存溢出。

User-Agent管理

User-Agent(UA)是HTTP请求中的一个重要字段,用于标识发起请求的客户端类型。在爬虫开发中,合理管理User-Agent可以模拟正常用户行为,避免被网站识别为爬虫。

默认User-Agent

Scrapy默认使用一个预定义的User-Agent字符串,但可以通过USER_AGENT设置自定义User-Agent。

随机User-Agent

为了更好地模拟用户行为,可以创建一个随机User-Agent中间件,为每个请求分配不同的User-Agent。

实现随机User-Agent中间件

以下是一个使用fake_useragent库实现随机User-Agent中间件的示例。

  1. 安装fake_useragent库:
pip install fake_useragent

创建middlewares.py文件,并定义RandomUserAgentMiddleware中间件:

from fake_useragent import UserAgent
from scrapy import signals
from scrapy.http import Requestclass RandomUserAgentMiddleware(object):def __init__(self, proxyHost, proxyPort, proxyUser, proxyPass):self.ua = UserAgent(use_cache_server=False)self.proxyHost = proxyHostself.proxyPort = proxyPortself.proxyUser = proxyUserself.proxyPass = proxyPass@classmethoddef from_crawler(cls, crawler):proxyHost = crawler.settings.get('PROXY_HOST', '')proxyPort = crawler.settings.get('PROXY_PORT', '')proxyUser = crawler.settings.get('PROXY_USER', '')proxyPass = crawler.settings.get('PROXY_PASS', '')return cls(proxyHost, proxyPort, proxyUser, proxyPass)def spider_opened(self, spider):self.ua.update()def process_request(self, request, spider):request.headers.setdefault('User-Agent', self.ua.random)request.meta['proxy'] = self._get_proxy()def _get_proxy(self):return f"{self.proxyUser}:{self.proxyPass}@{self.proxyHost}:{self.proxyPort}"

然后,需要在Scrapy项目的settings.py文件中添加代理相关的配置:

# 代理设置
PROXY_HOST = "www.16yun.cn"
PROXY_PORT = "5445"
PROXY_USER = "16QMSOML"
PROXY_PASS = "280651"# 中间件配置
DOWNLOADER_MIDDLEWARES = {'myproject.middlewares.RandomUserAgentMiddleware': 400,
}

在settings.py中配置中间件:

DOWNLOADER_MIDDLEWARES = {'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,'myproject.middlewares.RandomUserAgentMiddleware': 400,
}

缓存策略配置

在settings.py中,可以设置以下参数来配置缓存策略:

复制
HTTPCACHE_ENABLED = True  # 开启HTTP缓存
HTTPCACHE_EXPIRATION_SECS = 0  # 设置缓存过期时间
HTTPCACHE_POLICY = 'scrapy.extensions.httpcache.RFC2616Policy'  # 使用HTTP协议的缓存策略
HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'  # 使用文件系统存储缓存

结论

通过合理配置Scrapy的缓存策略和User-Agent管理,可以显著提高爬虫的性能和安全性。本文提供了实现随机User-Agent中间件的代码示例和缓存策略的配置方法,希望对爬虫开发者有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/40344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

飞书机器人:企业级自动化办公的智能助手

在数字化转型的浪潮中,企业办公自动化成为提升工作效率的关键。飞书机器人以其强大的自动化功能,为企业提供了一个智能、高效的办公管理解决方案。 引言 随着企业规模的扩大和业务的复杂化,传统的办公方式逐渐显得力不从心。飞书机器人通过…

ueditor集成秀米编辑器

ueditor集成秀米编辑器 一、背景二、集成秀米编辑器流程2.1、新增秀米插件的按钮,显示在我们的富文本编辑器上2.2、点击该按钮,可以呼出一个iframe,这个iframe引用的是秀米自己的编辑器页面2.3、要是有图片,需要再修改配置哈2.4、…

tkinter给按钮设置背景图片

tkinter给按钮设置背景图片 效果代码 效果 代码 import tkinter as tk from PIL import Image, ImageTk# 创建主窗口 root tk.Tk() root.title("按钮背景图片示例")# 加载图片 image Image.open("new.png") photo ImageTk.PhotoImage(image)# 创建按钮…

【代码随想录】【算法训练营】【第58天】 [卡码101]孤岛的总面积 [卡码102]沉没孤岛 [卡码103]水流问题 [卡码104]建造最大岛屿

前言 思路及算法思维,指路 代码随想录。 题目来自 卡码网。 day 58,周四,ding~ 题目详情 [卡码101] 孤岛的总面积 题目描述 卡码101 孤岛的总面积 解题思路 前提: 思路: 重点: 代码实现 C语言 […

【TS】TypeScript 中的 any 与 unknown:理解与实践

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 TypeScript 中的 any 与 unknown:理解与实践一、引言二、any&#x…

如何学习大型语言模型中的量化

前言 图片来自作者:Flow 展示了量化的必要性。(笑脸和生气脸图片来自Yan Krukau) 在我解释上面的图表之前,让我先介绍一下您将在本文中学习的重点内容。 首先,您将了解量化是什么以及为什么量化。接下来,您将深入了解…

回文数(leetcode)

题目描述: 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数 是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 示例: …

the problem when using langchain chat openai model and crewai same llm models

题意: when i am using langchain chat openai model and invoking method its working but when using in crewai same llm models it gives invalid api key 当你提到在使用 langchain 的 chatopenai 模型并调用方法时一切正常,但在 crewai 中使用相…

MySQL中使用PROFILING来查看SQL执行流程

在MySQL中,PROFILING功能提供了一种方式来分析SQL语句的执行时间,包括查询执行的各个阶段,如发送、解析、优化、执行等。这对于诊断性能问题非常有用。然而,需要注意的是,从MySQL 5.7.7版本开始,PROFILING功…

Java 线程池之FixedThreadPool

引言 在并发编程中,线程池是一种常用的资源管理模式,用于限制并发线程的数量,优化系统性能和资源使用。Java 提供了多种类型的线程池,其中 FixedThreadPool 是一种固定大小的线程池,适用于需要固定数量线程执行任务的…

小程序 npm 支持

使用 npm 包 目前小程序已经支持使用 npm 安装第三方包,因为 node_modules 目录中的包不会参与小程序项目的编译、 上传和打包,因此在小程序 项目中要使用的 npm 包,必须走一遍构建 npm 的过程。在构建成功以后,默认 会在小程序目…

【keil5问题】keil5中突然debug调试不能全速运行的问题

1、问题现象: 原本的项目工程是正常debug单步调试,然后突然出现是点击左上角的run全速运行,也全速运行不了,出现如下图的情况,点一次一步走的现象 2、问题解决: 2-1、问题分析: 点击reset、…

关于pytorch的加载数据,cpu init, cpu getitem, gpu init

文章目录 一. (cpu,init)图像加载到CPU内存,是在 __init__中函数中全部数据, 然后在item中取图像二.(cpu,get_item)是图像在 get_item函数中,载入图像到CPU三(gpu,init)是将图像加载到GPU, 在init函数中 跑多光谱估计的代码,参考:…

如何使用 uni-app 快速集成聊天会话能力?

移动互联网时代,即时通讯(IM)功能是许多app不可或缺的一部分,然而在即时通讯app开发时,开发者常常面临着选择困难:是为每个平台单独开发应用,还是有限开发某个平台?uni-app的出现&am…

BLOB视频技术原理,如何将Blob视频转换为MP4格式?

BLOB视频的制作涉及将视频数据转换为二进制大对象(BLOB)格式,然后对其进行编码、分割、封装和传输。在目标设备上,BLOB数据被解析、解码和播放,同时可能需要进行实时的优化以适应播放条件。这种制作方式旨在提供一种高…

linux监控服务器磁盘、内存空间使用率到达90%发送邮件脚本

以下是一个使用Python编写的Linux监控服务器磁盘、内存空间使用率并在达到90%时发送邮件的脚本: import os import smtplib from email.mime.text import MIMEText from email.header import Header# 设置阈值 DISK_THRESHOLD 90 MEMORY_THRESHOLD 90# 获取磁盘使…

7月11日云技术研讨会 | 车载信息安全全流程实施方案

伴随着汽车的智能网联化发展,网络攻击也逐渐渗透漫延至汽车领域,汽车行业面临着重大的信息安全挑战。此外,UNECE WP.29 R155和ISO/SAE 21434等标准也对汽车的信息安全提出了规范化要求,旨在分阶段将产品全生命周期中由信息安全威胁…

中介子方程四十二

XXFXXuXXWXXuXXdXXrXXαXXuXpXXKXηXiXXnXXyXηXuXXrXXaXnXXαXLXyXXWXuXeXuXWXXyXLXαXXnXaXXrXXuXηXyXXnXXiXηXKXXpXuXXαXXrXXdXXuXWXπXXWXeXyXeXbXπXpXXNXXqXeXXrXXαXXuXpXXKXηXiXXnXXyXηXuXXrXXaXnXXαXLXyXXWXuXeXuXWXXyXLXαXXnXaXXrXXuXηXyXXnXXiXηXKXXpXuXXα…

JavaScript中的this指向

1. 全局环境下的this 在全局环境中(在浏览器中是window对象,在Node.js中是global对象),this指向全局对象。 console.log(this window); // 在浏览器中为true console.log(this.document ! undefined); // true,因为…

opencv编译报错OpenCV does not recognize MSVC_VERSION “1940“

具体如下: CMake Warning at cmake/OpenCVDetectCXXCompiler.cmake:182 (message):OpenCV does not recognize MSVC_VERSION "1940". Cannot set OpenCV_RUNTIME Call Stack (most recent call first):CMakeLists.txt:174 (include) 打开源码\opencv\sources\cmak…