爬虫异常处理实战:应对请求频率限制和数据格式异常

2023-09-20 13:29:56

目录

一:请求频率限制的处理

1、设置请求间隔时间

2、使用随机化延迟

3、添加爬虫IP和用户代理

二:数据格式异常的处理

1、异常数据的过滤

2、错误信息的记录

3、动态调整解析规则

总结


在爬虫编程中,我们经常会遇到各种异常情况,比如请求频率限制和数据格式异常。这些异常可能会让我们的爬虫任务陷入困境,因此,学会处理这些异常就显得尤为重要。本文将为你提供一份实战指南,帮助你有效处理这两类异常。

一:请求频率限制的处理

1、设置请求间隔时间

许多网站会限制每个IP地址的请求频率,防止被恶意刷屏。为应对这种情况,我们需要在发送请求之间设置一个合理的间隔时间。以下是一个使用Python的requests库进行HTTP请求的例子:

import requests  
import time  
  
for i in range(100):  # 假设我们要发送100个请求  
    response = requests.get('http://example.com')  # 发送请求  
    time.sleep(1)  # 每次请求后等待1秒

这个简单的time.sleep(1)命令就可以让我们的爬虫在每次请求后等待1秒,从而避免被网站检测到异常请求。

2、使用随机化延迟

虽然固定的延迟可能会被某些网站识别并限制,但使用随机化的延迟可以有效避免这种情况。以下是一个使用Python的random库进行随机化延迟的例子:

import requests  
import time  
import random  
  
for i in range(100):  # 假设我们要发送100个请求  
    response = requests.get('http://example.com')  # 发送请求  
    time.sleep(random.uniform(0.5, 1.5))  # 每次请求后等待0.5至1.5秒的随机时间

在这个例子中,我们使用了random.uniform(0.5, 1.5)来生成一个0.5至1.5秒的随机延迟,使得每个请求之间的时间间隔都略有不同,从而更难以被察觉。

3、添加爬虫IP和用户代理

有些网站会不仅限制请求频率,还会检查请求的来源IP和用户代理(User-Agent)。对于这种情况,我们可以使用代理服务器或者伪装成正常浏览器的用户代理来发送请求。以下是一个使用Python的requests库添加代理和用户代理的例子:

import requests  
  
proxies = {  
    'http': 'http://10.10.1.10:3128',  
    'https': 'http://10.10.1.10:1080',  
}  
  
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',  
}  
  
for i in range(100):  # 假设我们要发送100个请求  
    response = requests.get('http://example.com', proxies=proxies, headers=headers)  # 发送请求

在这个例子中,我们定义了一个代理服务器的地址('http://10.10.1.10:3128'和'http://10.10.1.10:1080'),并且伪装成一个正常的浏览器用户('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537')。然后我们就可以使用这些参数来发送请求。

二:数据格式异常的处理

1、异常数据的过滤

在获取到网页数据后,我们需要根据一定的规则进行解析和处理。但有时,解析出的数据可能会存在异常,如格式错误、缺失值等。这时,我们需要先对数据进行过滤和处理。以下是一个使用Python进行异常数据过滤的例子:

data = [1, 2, 'a', 4, None, 6]  # 数据中包含了非数字和None值  
filtered_data = list(filter(None.__ne__, data))  # 使用filter和None.__ne__过滤出非None值和非数字  
print(filtered_data)  # 输出:[1, 2, 4, 6]

在这个例子中,我们使用了Python内建的filter函数和None.__ne__方法,过滤出了非None值和非数字。

2、错误信息的记录

当数据格式异常时,我们需要及时记录错误信息,以便于后续的分析和处理。以下是一个使用Python的logging库记录错误信息的例子:

import logging  
  
try:  
    # 尝试解析数据  
    data = parse_data(raw_data)  
except Exception as e:  
    logging.error('解析数据时发生异常: %s', e)  # 记录错误信息

在这个例子中,我们使用了Python的logging库来记录错误信息,包括异常类型和异常信息。这样做可以帮助我们及时发现问题并进行处理。

3、动态调整解析规则

当数据格式异常时,我们还可以根据实际情况动态调整解析规则。例如,如果某些数据字段不符合预期格式,我们可以暂时忽略这些字段或者使用备用解析方案。以下是一个使用Python的dict解析json数据的例子:

import json  
  
try:  
    # 尝试使用默认解析规则解析json数据  
    data = json.loads(raw_data)  
except json.JSONDecodeError:  
    # 如果发生JSONDecodeError异常,使用备用解析规则  
    data = parse_backup_data(raw_data)

在这个例子中,我们首先尝试使用默认的json解析规则来解析数据。如果发生JSONDecodeError异常,说明数据可能不符合json格式,这时我们就使用备用的解析方案来解析数据。这种动态调整解析规则的方法可以帮助我们更好地处理数据格式异常。

总结

在爬虫任务中,请求频率限制和数据格式异常是两个比较常见的问题。为了应对这些问题,我们可针对请求频率限制和数据格式异常等问题,我们需要采取相应的措施来应对和处理。这有助于我们更好地进行爬虫任务,获取到更准确、更完整的数据信息。

更多推荐

Nginx面试题

1.什么是Nginx?Nginx是一个轻量级/高性能的反向代理Web服务器,他实现非常高效的反向代理、负载平衡,他可以处理2-3万并发连接数,官方监测能支持5万并发。2.为什么要用Nginx?跨平台、配置简单、反向代理、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发,内存消耗小:开启10个nginx才占15

suricata源码解析

SCInstanceInit初始化suricata实例:程序名设置为程序文件名,其他变量复位。InitGlobalintInitGlobal(void){//调用rust代码初始化contextrs_init(&suricata_context);//初始化引擎状态:SC_ATOMIC_INIT(engine_stag

Python异步编程|ASGI 与 Django(附源码)

异步服务网关接口(AsynchronousServerGatewayInterface,ASGI)秉承WSGI统一网关接口原则,在异步服务、框架和应用之间提供一个标准接口,同时兼容WSGI。01、ASGIASGI是根据统一接口的思想重新设计的新标准,你可能会有疑问,为什么不直接升级WSGI而去创造新的标准呢?WSGI是

以小见大,彻底理解 cookie,session,token 之间的关系,通俗易懂

发展史1、很久很久以前,Web基本上就是文档的浏览而已,既然是浏览,作为服务器,不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议,就是请求加响应,尤其是我不用记住是谁刚刚发了HTTP请求,每个请求对我来说都是全新的。这段时间很嗨皮2、但是随着交互式Web应用的兴起,像在线购物网站,需要登录的

Java关于AbstractProcessor的使用

文章目录Step1项目准备Step2开发一个自定义的AbstractProcessorStep3DebugAbstractProcessor替换源码内容运行SpringBoot应用测试源码内容是否成功替换背景:我们都知道,在正常情况下,我们无法去变更二方,三方包中源码的Java文件的内容,但是在某些场景下,我们又希望可

Android Jetpack Compose之状态持久化与恢复

目录1.概述2.实例解析4.Compose提供的MapSaver和ListSaver4.1mapServer4.2ListSaver1.概述在之前的文章中,我们提到了remember,我们都知道remember可以缓存创建状态,避免因为重组而丢失。使用remember缓存的状态虽然可以跨越重组,但是不能跨Activit

热门免费api接口:含物流api,短信api,天气api等

热门免费api接口:含物流api,短信api,天气api。。。全国快递物流查询:目前已支持600+快递公司的快递信息查询。自动识别快递公司及单号,服务器毫秒响应,数据及时准确。通知短信:短信通知支持三大运营商以及虚拟运营商。短信验证码:支持三大运营商,支持大容量高并发。语音验证码短信:拨打电话告知用户验证码,实现信息验

【C++】动态内存管理 ③ ( C++ 对象的动态创建和释放 | new 运算符 为类对象 分配内存 | delete 运算符 释放对象内存 )

文章目录一、C++对象的动态创建和释放1、C语言对象的动态创建和释放的方式2、C++语言对象的动态创建和释放的方式二、代码示例-对象的动态创建和释放一、C++对象的动态创建和释放使用C语言中的malloc函数可以为类对象分配内存;使用free函数可以释放上述分配的内存;使用C++语言中的new运算符也可以为类对象分配内

【C++】动态内存管理 ② ( new 运算符 为 基础数据类型 / 基础数据数组类型 分配堆内存 )

文章目录一、C++对象的动态创建和释放二、new运算符为基础数据类型/基础数据数组类型分配堆内存1、语法说明2、语法简单示例3、代码示例-基础类型内存分配4、代码示例-基础数组类型内存分配三、完整代码示例-new运算符为基础数据类型/基础数据数组类型分配堆内存一、C++对象的动态创建和释放动态内存管理在C++语言中,就

浅谈C++|多态篇

1.多态的基本概念多态是C++面向对象三大特性之一多态分为两类1.静态多态:函数重载和运算符重载属于静态多态,复用函数名·2.动态多态:派生类和虚函数实现运行时多态静态多态和动态多态区别:·静态多态的函数地址早绑定–编译阶段确定函数地址·动态多态的函数地址晚绑定–运行阶段确定函数地址下面通过案例进行讲解多态动态多态满足

MySQL之优化SELECT语句

MySQL之优化SELECT语句文章目录MySQL之优化SELECT语句摘要:引言:1.MySQL性能提成优化概述2.WHERE子句优化3.范围优化4.哈希联接优化5.储存引擎下的优化6.索引条件下推优化7.嵌套循环联接算法8.嵌套联接优化(JOIN)总结:摘要:本文主题为MySQL优化SELECT语句,涵盖了数据库性

热文推荐