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

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

在爬虫代码中设置请求间隔是确保爬虫稳定运行并避免对目标服务器造成过大压力的重要措施。合理设置请求间隔可以有效降低被目标网站封禁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.kler.cn/a/545307.html

相关文章:

  • Android 原生层SurfaceView截屏
  • PL/SQL 变量以及数据类型(上篇)
  • 【React】react-redux+redux-toolkit实现状态管理
  • 基于WebAssembly的后端服务突破:打造高性能、安全的新型微服务架构
  • 27、深度学习-自学之路-NLP自然语言处理-做一个简单的项目识别一组电影评论,来判断电影评论是积极的,还是消极的。
  • Golang 进阶训练营
  • Rocky Linux系统修改网卡全攻略
  • 【清晰教程】本地部署DeepSeek-r1模型
  • C语言插入排序之直接插入排序
  • 【网络安全 | 漏洞挖掘】价值3133美元的Google IDOR
  • VS Code 通知中一直显示“Reactivating terminals...”的问题解决
  • 解决 paddle ocr 遇到 CXXABI_1.3.13 not found 的问题
  • JAVA DDD设计模式:用策略模式干掉满屏if-else
  • 吉祥汽车泰国首发,用 Unity 实现行业首创全 3D 座舱虚拟世界
  • 【深度学习】计算机视觉(CV)-目标检测-SSD(Single Shot MultiBox Detector)—— 单次检测多框检测器
  • 了解卷积神经网络(Convolutional Neural Network,CNN)
  • React组件重新渲染机制
  • App UI自动化--Appium学习--第二篇
  • 【Elasticsearch】标准化器(Normalizers)
  • Excel文件的读取