爬虫代码中如何设置请求间隔?

news2025/2/13 19:02:56

在爬虫代码中设置请求间隔是确保爬虫稳定运行并避免对目标服务器造成过大压力的重要措施。合理设置请求间隔可以有效降低被目标网站封禁IP的风险,同时也有助于爬虫程序的稳定运行。以下是几种常见的方法来设置请求间隔:

一、使用time.sleep()

time.sleep()是Python中用于暂停程序执行的函数,可以在每次请求之间添加适当的延时。这是最简单直接的方法。

示例代码:

import requests
import time

def fetch_data(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    }
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.text
    else:
        return None

# 示例:爬取多个页面
urls = ["https://example.com/page1", "https://example.com/page2", "https://example.com/page3"]
for url in urls:
    data = fetch_data(url)
    if data:
        print(f"成功获取数据: {url}")
    else:
        print(f"请求失败: {url}")
    time.sleep(2)  # 每次请求间隔2秒

二、使用随机延时

为了避免被目标网站识别出规律性请求,可以使用随机延时。random.randint()random.uniform()可以生成随机的延时时间。

示例代码:

import requests
import time
import random

def fetch_data(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    }
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.text
    else:
        return None

# 示例:爬取多个页面
urls = ["https://example.com/page1", "https://example.com/page2", "https://example.com/page3"]
for url in urls:
    data = fetch_data(url)
    if data:
        print(f"成功获取数据: {url}")
    else:
        print(f"请求失败: {url}")
    time.sleep(random.uniform(1, 3))  # 随机延时1到3秒

三、使用asyncioaiohttp实现异步请求

对于需要高并发的爬虫任务,可以使用asyncioaiohttp库来实现异步请求。虽然异步请求本身不会直接设置请求间隔,但可以通过在异步任务中添加延时来实现。

示例代码:

import asyncio
import aiohttp

async def fetch_data(session, url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    }
    async with session.get(url, headers=headers) as response:
        if response.status == 200:
            return await response.text()
        else:
            return None

async def main(urls):
    async with aiohttp.ClientSession() as session:
        tasks = []
        for url in urls:
            tasks.append(fetch_data(session, url))
            await asyncio.sleep(2)  # 每次请求间隔2秒
        results = await asyncio.gather(*tasks)
        for result in results:
            if result:
                print("成功获取数据")
            else:
                print("请求失败")

# 示例:爬取多个页面
urls = ["https://example.com/page1", "https://example.com/page2", "https://example.com/page3"]
asyncio.run(main(urls))

四、使用ratelimit

ratelimit是一个Python库,专门用于限制函数调用的频率。它可以方便地设置请求间隔,而无需手动编写延时逻辑。

安装ratelimit库:

pip install ratelimit

示例代码:

import requests
from ratelimit import limits, sleep_and_retry

# 设置每分钟最多请求10次
@sleep_and_retry
@limits(calls=10, period=60)
def fetch_data(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    }
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.text
    else:
        return None

# 示例:爬取多个页面
urls = ["https://example.com/page1", "https://example.com/page2", "https://example.com/page3"]
for url in urls:
    data = fetch_data(url)
    if data:
        print(f"成功获取数据: {url}")
    else:
        print(f"请求失败: {url}")

五、总结

合理设置请求间隔是爬虫开发中的重要环节,可以有效避免对目标服务器造成过大压力,降低被封禁IP的风险。常见的方法包括:

  1. 使用time.sleep()直接设置固定延时。

  2. 使用random.uniform()random.randint()设置随机延时。

  3. 使用asyncioaiohttp实现异步请求,并在异步任务中添加延时。

  4. 使用ratelimit库限制函数调用频率。

根据实际需求和目标网站的特点,可以选择合适的策略来设置请求间隔,确保爬虫程序的稳定运行。

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

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

相关文章

基于Spring Security 6的OAuth2 系列之十五 - 高级特性--客户端认证方式

之所以想写这一系列,是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器,但当时基于spring-boot 2.3.x,其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0,结果一看Spring Security也升级…

排序合集之快排详解(二)

摘要:快速排序是一种在实践中广泛使用的高效排序算法。它基于分治策略,平均时间复杂度为O(n log n),使其成为处理大型数据集的理想选择。本文将深入探讨快速排序的各种实现方式、优化技巧以及非递归实现,并通过C语言代码示例进行详…

前缀树算法篇:前缀信息的巧妙获取

前缀树算法篇:前缀信息的巧妙获取 那么前缀树算法是一个非常常用的算法,那么在介绍我们前缀树具体的原理以及实现上,我们先来说一下我们前缀树所应用的一个场景,那么在一个字符串的数据集合当中,那么我们查询我们某个字…

大数据系列 | 白话讲解大数据技术生态中Hadoop、Hive、Spark的关系介绍

大数据属于数据管理系统的范畴,数据管理系统无非就两个问题:数据怎么存、数据怎么算    现在的信息爆炸时代,一台服务器数据存不下,可以找10台服务器存储,10台存储不下,可以再找100台服务器存储。但是这1…

华为云函数计算FunctionGraph部署ollma+deepseek

1 概述 ollama和deepseek如果需要多实例,一种方式是部署在kubernetes集群中,一种是使用云厂商的云函数服务。云函数服务是按量付费,并且底层支持GPU,不需要维护kubernetes集群。本文介绍使用华为云函数计算FunctionGraph来部署ol…

尚硅谷爬虫note001

一、模板设置 file——setting——editor——code style——file and code template——python script # _*_ coding : utf-8 _*_ # Time : ${DATE} ${TIME} # Author : 20250206-里奥 # File : ${NAME} # Project : ${PROJECT_NAME} 二、数据类型 2-1. 数字 整型int 浮点型f…

35~37.ppt

目录 35.张秘书-《会计行业中长期人才发展规划》 题目​ 解析 36.颐和园公园(25张PPT) 题目​ 解析 37.颐和园公园(22张PPT) 题目 解析 35.张秘书-《会计行业中长期人才发展规划》 题目 解析 插入自定义的幻灯片:新建幻灯片→重用…

FPGA简介|结构、组成和应用

Field Programmable Gate Arrays(FPGA,现场可编程逻辑门阵列),是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物, 是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的&#xff0c…

4. React 中的 CSS

用例中的干净的脚手架的创建可以参考另一篇文章:3.React 组件化开发React官方并没有给出在React中统一的样式风格: 由此,从普通的css,到css modules,再到css in js,有几十种不同的解决方案,上百…

django中间件,中间件给下面传值

1、新建middleware.py文件 # myapp/middleware.py import time from django.http import HttpRequest import json from django.http import JsonResponse import urllib.parse from django.core.cache import cache from comm.Db import Db class RequestTimeMiddleware:def …

【论文阅读】Revisiting the Assumption of Latent Separability for Backdoor Defenses

https://github.com/Unispac/Circumventing-Backdoor-Defenses 摘要和介绍 在各种后门毒化攻击中,来自目标类别的毒化样本和干净样本通常在潜在空间中形成两个分离的簇。 这种潜在的分离性非常普遍,甚至在防御研究中成为了一种默认假设,我…

Python基于Django的微博热搜、微博舆论可视化系统(V3.0)【附源码】

博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…

不小心删除服务[null]后,git bash出现错误

不小心删除服务[null]后,git bash出现错误,如何解决? 错误描述:打开 git bash、msys2都会出现错误「bash: /dev/null: No such device or address」 问题定位: 1.使用搜索引擎搜索「bash: /dev/null: No such device o…

【云安全】云原生- K8S kubeconfig 文件泄露

什么是 kubeconfig 文件? kubeconfig 文件是 Kubernetes 的配置文件,用于存储集群的访问凭证、API Server 的地址和认证信息,允许用户和 kubectl 等工具与 Kubernetes 集群进行交互。它通常包含多个集群的配置,支持通过上下文&am…

【工业场景】用YOLOv8实现火灾识别

火灾识别任务是工业领域急需关注的重点安全事项,其应用场景和背景意义主要体现在以下几个方面: 应用场景:工业场所:在工厂、仓库等工业场所中,火灾是造成重大财产损失和人员伤亡的主要原因之一。利用火灾识别技术可以及时发现火灾迹象,采取相应的应急措施,保障人员安全和…

(2025)深度分析DeepSeek-R1开源的6种蒸馏模型之间的逻辑处理和编写代码能力区别以及配置要求,并与ChatGPT进行对比(附本地部署教程)

(2025)通过Ollama光速部署本地DeepSeek-R1模型(支持Windows10/11)_deepseek猫娘咒语-CSDN博客文章浏览阅读1k次,点赞19次,收藏9次。通过Ollama光速部署本地DeepSeek-R1(支持Windows10/11)_deepseek猫娘咒语https://blog.csdn.net/m0_70478643/article/de…

【自然语言处理】TextRank 算法提取关键词、短语、句(Python源码实现)

文章目录 一、TextRank 算法提取关键词 [工具包]二、TextRank 算法提取关键短语[工具包]三、TextRank 算法提取关键句[工具包]四、TextRank 算法提取关键句(Python源码实现) 一、TextRank 算法提取关键词 [工具包] 见链接 【自然语言处理】TextRank 算法…

记一次Self XSS+CSRF组合利用

视频教程在我主页简介或专栏里 (不懂都可以来问我 专栏找我哦) 目录:  确认 XSS 漏洞 确认 CSRF 漏洞 这个漏洞是我在应用程序的订阅表单中发现的一个 XSS 漏洞,只能通过 POST 请求进行利用。通常情况下,基于 POST 的…

JDBC如何连接数据库

首先,我们要去下载JDBC的驱动程序 官网下载地址:https://downloads.mysql.com/archives/c-j/ 选择最新版本就可以 然后回到我们idea点击file - project Structure - Modules, 就行了 参考1:如何解决JDBC连接数据库出现问题且对进行数据库操…

AI语言模型的技术之争:DeepSeek与ChatGPT的架构与训练揭秘

云边有个稻草人-CSDN博客 目录 第一章:DeepSeek与ChatGPT的基础概述 1.1 DeepSeek简介 1.2 ChatGPT简介 第二章:模型架构对比 2.1 Transformer架构:核心相似性 2.2 模型规模与参数 第三章:训练方法与技术 3.1 预训练与微调…