在爬虫代码中设置请求间隔是确保爬虫稳定运行并避免对目标服务器造成过大压力的重要措施。合理设置请求间隔可以有效降低被目标网站封禁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秒
三、使用asyncio
和aiohttp
实现异步请求
对于需要高并发的爬虫任务,可以使用asyncio
和aiohttp
库来实现异步请求。虽然异步请求本身不会直接设置请求间隔,但可以通过在异步任务中添加延时来实现。
示例代码:
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的风险。常见的方法包括:
-
使用
time.sleep()
直接设置固定延时。 -
使用
random.uniform()
或random.randint()
设置随机延时。 -
使用
asyncio
和aiohttp
实现异步请求,并在异步任务中添加延时。 -
使用
ratelimit
库限制函数调用频率。
根据实际需求和目标网站的特点,可以选择合适的策略来设置请求间隔,确保爬虫程序的稳定运行。