解决requests库进行爬虫ip请求时遇到的错误的方法

news/2024/11/17 20:41:27/

目录

一、超时错误

二、连接错误

三、拒绝服务错误

四、内容编码错误

五、HTTP错误


在利用requests库进行网络爬虫的IP请求时,我们可能会遇到各种错误,如超时、连接错误、拒绝服务等等。这些错误通常是由目标网站的限制、网络问题或我们的爬虫代码中的问题引起的。下面是一些常见的错误及其解决方法。

一、超时错误

超时错误通常是因为网络延迟或服务器响应时间过长导致的。要解决这个问题,我们可以尝试增加请求的超时时间。在requests库中,可以通过在请求中设置timeout参数来实现。例如:

import requests  try:  response = requests.get('http://example.com', timeout=3.0)  
except requests.exceptions.RequestException as e:  print(e)

在这个例子中,我们设置了timeout参数为3.0秒,如果服务器在3秒内没有响应,就会引发RequestException异常。

二、连接错误

连接错误通常是因为网络连接问题或目标服务器不可达导致的。要解决这个问题,我们可以尝试更换请求的代理、重试请求或检查网络连接。例如:

import requests  
import random  proxies = {  'http': 'http://%s:%s@%s:%d/' % (random.choice('abcdefghijklmnopqrstuvwxyz'), random.randint(1000, 9999), 'localhost', random.randint(8000, 9999)),  'https': 'http://%s:%s@%s:%d/' % (random.choice('abcdefghijklmnopqrstuvwxyz'), random.randint(1000, 9999), 'localhost', random.randint(8000, 9999))  
}  def get_content(url):  for i in range(3):  # 重试3次  try:  response = requests.get(url, proxies=proxies)  if response.status_code == 200:  # 请求成功,返回结果  return response.text  except requests.exceptions.RequestException as e:  # 若请求失败,抛出异常并继续尝试  print(e)  return None  # 若所有尝试都失败,返回None

在这个例子中,我们使用了代理并设置了最大重试次数为3次。每次请求失败都会抛出异常并打印错误信息,然后继续尝试直到成功或所有尝试都失败。如果所有尝试都失败,函数将返回None。

三、拒绝服务错误

拒绝服务错误通常是因为目标网站识别出我们的爬虫行为并限制了我们的访问。要解决这个问题,我们可以尝试更换User-Agent、使用代理或限制请求的频率。例如:

import requests  
import random  
import time  proxies = {  'http': 'http://%s:%s@%s:%d/' % (random.choice('abcdefghijklmnopqrstuvwxyz'), random.randint(1000, 9999), 'localhost', random.randint(8000, 9999)),  'https': 'http://%s:%s@%s:%d/' % (random.choice('abcdefghijklmnopqrstuvwxyz'), random.randint(1000, 9999), 'localhost', random.randint(8000, 9999))  
}  
user_agents = [  # 更换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',  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',  # 其他User-Agent...  
]  
delay = 2  # 设置请求间隔为2秒  def get_content(url):  for i in range(3):  # 重试3次  try:  user_agent = random.choice(user_agents)  # 随机选择一个User-Agent  headers = {'User-Agent': user_agent}  # 设置请求头,添加User-Agent参数  response = requests.get(url, proxies=proxies, headers=headers)  # 在请求中添加headers参数  if response.status_code == 200:  # 请求成功,返回结果  return response.text  except requests.exceptions.RequestException as e:  # 若请求失败,抛出异常并继续尝试  print(e)  return None  # 若所有尝试都失败,返回None

在这个例子中,我们增加了headers参数到请求中,并设置了User-Agent参数。每次请求都会随机选择一个User-Agent,以避免目标网站通过User-Agent识别出我们的爬虫行为并进行限制。同时,我们设置了请求间隔为2秒,以避免过快的请求频率导致目标网站拒绝服务。

四、内容编码错误

内容编码错误通常是因为网页内容的编码方式与requests库默认的编码方式不匹配。要解决这个问题,我们可以尝试设置请求的编码方式。例如:

import requests  url = 'http://example.com'  
encoding = 'utf-8'  # 设置编码方式为utf-8  
try:  response = requests.get(url, encoding=encoding)  if response.status_code == 200:  # 请求成功,返回结果  content = response.text

在这个例子中,我们设置了请求的编码方式为utf-8。如果网页内容的编码方式与utf-8不匹配,仍然可能会出现编码错误。这时,我们可以尝试使用chardet库来猜测网页内容的编码方式,并使用猜测的编码方式解码响应内容。例如:

import requests  
import chardet  # 导入chardet库用于猜测编码方式  url = 'http://example.com'  
try:  response = requests.get(url)  if response.status_code == 200:  # 请求成功,进行编码猜测并进行解码  rawdata = response.content  result = chardet.detect(rawdata)  encoding = result['encoding']  content = response.content.decode(encoding)

在这个例子中,我们使用chardet库来猜测响应内容的编码方式,并使用猜测的编码方式解码响应内容。如果猜测的编码方式不准确,可能会导致解码后的内容出现乱码或其他错误。因此,在实际使用中,最好结合其他方法和工具来进行更全面和准确的判断和处理。

五、HTTP错误

除了上述常见的错误外,requests库在进行爬虫IP请求时还可能遇到其他HTTP错误,如HTTP状态码错误、HTTP重定向错误等。这些错误通常是由目标网站的特定行为或请求参数错误引起的。要解决这些问题,我们需要根据具体的错误类型和错误信息进行分析和处理。

对于HTTP状态码错误,我们可以根据状态码的不同进行不同的处理。常见的状态码包括:

404:请求的资源不存在,可以尝试更换请求的URL或进行错误处理。
500:服务器内部错误,可以尝试更换代理或进行错误处理。
301/302:永久/暂时重定向,可以尝试更换请求的URL或跟随重定向。
对于HTTP重定向错误,requests库默认会跟随重定向。如果需要禁止跟随重定向,可以在请求中设置allow_redirects=False参数。如果需要自定义重定向行为,可以使用Session对象和重定向相关的属性和方法。例如:

import requests  s = requests.Session()  # 创建Session对象  
url = 'http://example.com'  
headers = {'Referer': 'http://www.example.com'}  # 设置请求头中的Referer参数  
s.headers.update(headers)  # 将请求头更新到Session对象中  
r = s.get(url, allow_redirects=False)  # 进行请求,禁止跟随重定向  
if r.status_code == 302:  # 如果状态码为302,进行自定义重定向处理  location = r.headers['Location']  # 获取重定向的URL  r = s.get(location)  # 进行重定向请求

在这个例子中,我们使用Session对象来存储请求头中的Referer参数,并在进行请求时禁止跟随重定向。如果状态码为302,我们获取重定向的URL并进行自定义的重定向请求。

除了以上常见的错误和HTTP错误外,requests库在进行爬虫IP请求时还可能遇到其他类型的错误,如网络连接问题、代理问题等。在实际使用中,我们需要根据具体的错误类型和错误信息进行分析和处理,并采取相应的措施进行优化和改进。


http://www.ppmy.cn/news/1234366.html

相关文章

「Docker」如何在苹果电脑上构建简单的Go云原生程序「MacOS」

介绍 使用Docker开发Golang云原生应用程序,使用Golang服务和Redis服务 注:写得很详细 为方便我的朋友可以看懂 环境部署 确保已经安装Go、docker等基础配置 官网下载链接直达:Docker官网下载 Go官网下载 操作步骤 第一步 创建一个…

初识JVM(简单易懂),解开JVM神秘的面纱

目录 一、什么是JVM(Java虚拟机)? 二、JVM的功能 三、JVM的功能-即时编译 四、常见的JVM 五、JVM的组成 五、JVM的工作流程 参考资料 一、什么是JVM(Java虚拟机)? 在Java的世界里,Java虚…

【译】什么时候使用 Spring 6 JdbcClient

原文地址:Spring 6 JdbcClient: When and How to Use it? 一、前言 自 Spring 6.1 起,JdbcClient 为 JDBC 查询和更新操作提供了统一的客户端 API,从而提供了更流畅、更简化的交互模型。本教程演示了如何在各种场景中使用 JdbcClient。 二…

Spark---集群搭建

Standalone集群搭建与Spark on Yarn配置 1、Standalone Standalone集群是Spark自带的资源调度框架,支持分布式搭建,这里建议搭建Standalone节点数为3台,1台master节点,2台worker节点,这虚拟机中每台节点的内存至少给…

Nginx 开源版安装

下载 tar.gz安装包,上传。 解压 [rootlocalhost ~]# tar zxvf nginx-1.21.6.tar.gz nginx-1.21.6/ nginx-1.21.6/auto/ nginx-1.21.6/conf/ nginx-1.21.6/contrib/ nginx-1.21.6/src/ ... ...安装gcc [rootlocalhost nginx-1.21.6]# yum install -y gcc 已加载插件…

Unity中Shader的PBR的基础知识与理论

文章目录 前言一、什么是PBR二、什么是PBS在这里插入图片描述 三、PBS的核心理论1、物质的光学特性(Substance Optical Properties)2、微平面理论(Microfacet Theory)3、能量守恒(Energy Conservation)4、菲…

达索系统SOLIDWORKS流体分析网格划分失败,大多是这2种原因

SOLIDWORKS Flow Simulation 是直观的流体力学 (CFD) 分析软件,该软件功能强大、操作人性化,快速轻松的分析产品内部或外部流体的流动情况,以用来改善产品性能和功能。 当流体分析运行网格划分时,提示失败。 这是由于凸起面与圆…

uniapp 富文本以及移动端富文本的展示问题

富文本展示有几种方式: 1.<view v-html"content"></view> 2. uniapp自带组件 rich-text rich-text | uni-app官网 <rich-text :nodes"content"></rich-text> 3.uView组件 u-parse Parse 富文本解析器 | uView 2.0 - 全面兼…