Python爬虫技术 第09节 状态码

news2024/11/17 20:18:52

在使用Python进行网络爬虫开发时,理解HTTP状态码是至关重要的。HTTP状态码是由服务器返回给客户端的响应状态指示,通常用于告知客户端请求是否成功、失败或需要采取进一步的操作。下面是一些常见的HTTP状态码及其含义:

常见的HTTP状态码

  1. 1xx: 信息性状态码

    • 这些状态码表示接收的请求正在处理中。
    • 100 Continue: 表示服务器已经收到请求的一部分,并且客户端应该继续发送剩余部分。
  2. 2xx: 成功状态码

    • 200 OK: 请求已成功,响应中包含所请求的信息。
    • 201 Created: 请求已成功创建新的资源。
    • 204 No Content: 服务器成功处理了请求,但没有返回任何内容。
  3. 3xx: 重定向状态码

    • 301 Moved Permanently: 请求的资源已永久移动到新位置。
    • 302 Found (临时重定向): 请求的资源暂时位于不同的URI。
    • 304 Not Modified: 自从上次请求以来,资源未被修改过。
  4. 4xx: 客户端错误状态码

    • 400 Bad Request: 请求无法被服务器理解。
    • 401 Unauthorized: 请求需要用户的身份认证。
    • 403 Forbidden: 服务器理解请求客户端的请求,但是拒绝执行此请求。
    • 404 Not Found: 请求的资源不存在。
  5. 5xx: 服务器错误状态码

    • 500 Internal Server Error: 服务器遇到了一个未曾预料的情况,导致它无法完成对请求的处理。
    • 502 Bad Gateway: 作为网关或代理工作的服务器从上游服务器收到了无效的响应。
    • 503 Service Unavailable: 服务器目前无法使用(由于超载或停机维护)。

使用Python检查HTTP状态码

在Python中,可以使用requests库来发送HTTP请求并获取状态码。以下是一个简单的示例:

import requests

response = requests.get('https://www.example.com')
print(response.status_code)

如果要根据状态码做出不同反应,可以使用条件语句:

if response.status_code == 200:
    print("请求成功")
elif response.status_code == 404:
    print("页面未找到")
else:
    print("发生了其他错误")

通过检查状态码,你可以确保你的爬虫能够适当地处理请求的结果,避免不必要的数据抓取或重试。在实际应用中,你可能还需要处理更复杂的状态码和异常情况,如重试机制、超时设置等。

在这里插入图片描述

当深入探讨HTTP状态码在Python爬虫中的应用时,我们不仅关注常见状态码的处理,还应考虑如何有效地管理异常和错误,以及如何优化爬虫的行为。下面是一些进阶主题:

异常处理与重试机制

在爬虫中,网络连接可能会不稳定,或者服务器可能会暂时不可用。因此,一个健壮的爬虫应该具备处理这些情况的能力,比如使用重试机制:

from requests.exceptions import RequestException

def fetch(url, retries=3):
    try:
        response = requests.get(url)
        response.raise_for_status()  # 如果状态码不是200,则抛出HTTPError异常
        return response
    except RequestException as e:
        if retries > 0:
            return fetch(url, retries=retries-1)  # 递归重试
        else:
            print(f"Failed to retrieve {url} after {retries} attempts.")
            raise

超时设置

在爬虫中设置合理的超时值可以防止请求长时间挂起,从而提高爬虫的整体效率。requests库允许设置超时参数:

response = requests.get('https://www.example.com', timeout=5)  # 设置超时为5秒

尊重服务器的速率限制

为了避免对目标网站造成过大负担,爬虫应该合理安排请求频率,避免被封禁IP。这可以通过添加延时或使用代理池来实现:

import time

def fetch_with_delay(url):
    response = requests.get(url)
    if response.status_code == 200:
        return response
    elif response.status_code == 429:  # 太多请求
        print("Too many requests, waiting...")
        time.sleep(60)  # 等待一分钟
        return fetch_with_delay(url)

优雅地处理重定向

重定向是网络爬虫中常见的现象,特别是当网站更新URL结构时。requests库默认会自动处理301和302重定向,但有时你可能需要控制这个过程:

response = requests.get('http://old.example.com', allow_redirects=False)
if response.status_code in [301, 302]:
    new_url = response.headers['location']
    response = requests.get(new_url)

使用头部信息

有时候,服务器会根据请求的头部信息(如User-Agent)来改变其行为。为了模拟不同的浏览器或设备,可以在请求中添加特定的头部信息:

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get('https://www.example.com', headers=headers)

以上技巧可以帮助你构建一个更加健壮和高效的网络爬虫,同时也遵守了网络礼仪和法律法规。在实践中,你还应该密切关注目标网站的robots.txt文件,以确保你的爬虫行为合法并且尊重网站的爬虫政策。

当然,我将提供一些具体的Python代码示例,展示如何处理不同的HTTP状态码和网络异常,同时使用一些最佳实践,如重试机制和超时处理。

示例代码:网络爬虫异常处理与状态码检查

import requests
from requests.exceptions import RequestException
import time

def fetch(url, retries=3, backoff_factor=0.3, status_forcelist=(500, 502, 504), timeout=5):
    """
    发送GET请求并处理异常和重试。
    
    参数:
        url: 目标URL
        retries: 最大重试次数
        backoff_factor: 指数退避因子
        status_forcelist: 需要重试的状态码列表
        timeout: 请求超时时间
    """
    for i in range(retries):
        try:
            response = requests.get(url, timeout=timeout)
            response.raise_for_status()  # 抛出非200状态码的异常
            
            # 根据状态码进行额外处理
            if response.status_code in status_forcelist:
                raise RequestException(f"Got error status code: {response.status_code}")
            
            return response
        
        except RequestException as e:
            print(f"Request failed with error: {e}")
            wait_time = backoff_factor * (2 ** i)
            print(f"Retrying in {wait_time} seconds...")
            time.sleep(wait_time)

    raise RequestException("All retries failed")

# 使用示例
url = "https://api.example.com/data"
try:
    response = fetch(url)
    print("Response received successfully.")
    print(response.text)
except RequestException as e:
    print(f"Failed to fetch data from {url}: {e}")

代码解析

  1. 重试机制 (fetch函数):

    • retries 参数定义了最大重试次数。
    • backoff_factor 和指数退避策略确保每次重试之间有逐渐增加的延迟,以避免频繁请求造成的服务器压力。
    • status_forcelist 列出了哪些状态码触发重试,例如500级别的服务器错误。
  2. 超时处理 (timeout参数):

    • 设置了请求的最大等待时间,防止请求无限期挂起。
  3. 异常处理 (raise_for_status方法和RequestException捕获):

    • raise_for_status 方法会在状态码不在200-299范围内时抛出异常。
    • 捕获RequestException来处理所有类型的请求异常,包括网络问题、DNS解析失败等。
  4. 状态码检查

    • 在重试逻辑中,除了raise_for_status之外,我们还检查了status_forcelist中定义的状态码,以便对特定的服务器错误进行重试。

这个示例展示了如何在Python爬虫中构建一个健壮的网络请求系统,能够处理各种网络状况和服务器响应。在实际应用中,你可能需要根据具体需求调整参数和逻辑。

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

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

相关文章

Lua脚本简单理解

目录 1.安装 2.语法 2.1Lua数据类型 2.2变量 2.3lua循环 2.4流程控制 2.5函数 2.6运算符 2.7关系运算符 3.lua脚本在redis中的使用 3.1lua脚本再redis简单编写 3.2普通锁Lua脚本 3.3可重入锁lua脚本 1.安装 centos安装 安装指令: yum -y update yum i…

5. System Design 5.2. 身份验证框架和信任链

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】我的联系方式-自建交流群-学习群 【必看/必看!!】ATF架构开发精讲-专题目录👈…

Unity Android接入SDK 遇到的问题

1. buildtools、platformtools、commandline tools 以及compiled sdk version、buildtools sdk version、target sdk version 的说明 Android targetSdkVersion了解一下 - 简书 2. 查看.class 和.jar文件 jd_gui 官网地址: 下载jd_gui 工具 ,或者 idea 下…

全方位数据管理:一站式爬虫服务解决方案

摘要 面对互联网信息爆炸的时代,如何高效地收集、整理并分析海量数据,成为企业与开发者面临的一大挑战。本文将深入探讨一站式爬虫服务解决方案,揭示如何通过全方位数据管理策略,助力企业轻松驾驭大数据海洋,实现数据…

事务和函数索引

事务 事务的定义 事务(Transaction),就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内 的所有SQL都将被取消执行。 事务的特点 一个事务中如果有一个数据库操作失败,那么整个 事务…

光明乳业:以科技赋能品质,引领乳业绿色新未来

近日,光明乳业再次成为行业焦点,其在科技创新与绿色发展方面的卓越表现赢得了广泛赞誉。作为中国乳制品行业的领军企业,光明乳业始终坚守品质至上的原则,不断探索科技创新之路,致力于为消费者提供更高品质、更健康的乳…

芯片的计算能力由什么决定

芯片的计算能力由什么决定 芯片的计算能力由多个因素决定。 包括但不限于: 架构设计: 芯片的架构设计决定了其计算单元的数量和类型,以及它们之间的连接方式和通信方式。不同的架构可以提供不同的计算能力和性能。处理器速度: 处…

Linux下普通用户无法执行sudo指令

当执行sudo指令时出现: xxx(普通用户名字) is not in the sudoers file 说明在/etc/sudoers文件中没有把xxx加入到可执行sudo指令的名单中,因此需要修改sudoers文件。 解决方法:1、vim /etc/sudoers (要…

【图像标签转换】XML转为TXT图像数据集标签

引言 该脚本用于将包含对象标注的 XML 文件转换为 YOLO(You Only Look Once)对象检测格式的 TXT 文件。脚本读取 XML 文件,提取对象信息,规范化边界框坐标,并将数据写入相应的 TXT 文件。此外,它还生成一个…

深度学习1-简介

人工智能(AI)旨在打造模仿智能行为的系统。它覆盖了众多方法,涵盖了基于逻辑、搜索和概率推理的技术。机器学习是 AI 的一个分支,它通过对观测数据进行数学模型拟合来学习决策制定。这个领域近年来迅猛发展,现在几乎&a…

谷粒商城实战笔记-64-商品服务-API-品牌管理-OSS前后联调测试上传

文章目录 1,拷贝文件到前端工程2,局部修改3,在品牌编辑界面使用上传组件4,OSS配置允许跨域5,测试multiUpload.vue完整代码singleUpload.vue完整代码policy.js代码 在Web应用开发中,文件上传是一项非常常见的…

基于PaddleClas的人物年龄分类项目

目录 一、任务概述 二、算法研发 2.1 下载数据集 2.2 数据集预处理 2.3 安装PaddleClas套件 2.4 算法训练 2.5 静态图导出 2.6 静态图推理 三、小结 一、任务概述 最近遇到个需求,需要将图像中的人物区分为成人和小孩,这是一个典型的二分类问题…

设计模式笔记(一)

目录 设计模式共有23种,也可称为GOF23 单例模式(重点,常用) 工厂模式 代理模式:(SpringAOP的底层原理) 静态代理模式:(写死一个代理类Proxy) 动态代理模…

【Java版数据结构】初识泛型

看到这句话的时候证明:此刻你我都在努力 加油陌生人 br />个人主页:Gu Gu Study专栏:Java版数据结构 喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者&#xff1…

学习笔记:MySQL数据库操作5

1. 触发器(Triggers) 触发器是数据库的一种高级功能,它允许在执行特定数据库操作(如INSERT、UPDATE、DELETE)之前或之后自动执行一段代码。 1.1 创建商品和订单表 商品表(goods) gid: 商品编号…

navicat15安装破解

下载地址: 链接:https://pan.baidu.com/s/19RlXTArDfNxT5n98A0GbvQ 提取码:qtew 破解教程 1、运行注册机,勾选Backup、Host和Navicat v15,如图所示。然后点击Patch按钮,找到Navicat Premium 15安装路径下的…

什么是模型无关方法?

「AI秘籍」系列课程: 人工智能应用数学基础人工智能Python基础人工智能基础核心知识人工智能BI核心知识人工智能CV核心知识AI 进阶:企业项目实战 可直接在橱窗里购买,或者到文末领取优惠后购买: 可以与任何模型一起使用的所有强…

破局产品同质化:解锁3D交互式营销新纪元!

近年来,随着数字体验经济的蓬勃发展,3D交互式营销作为一种创新手段迅速崛起,它巧妙地解决了传统产品展示中普遍存在的缺乏差异性和互动性的问题,使您的产品在激烈的市场竞争中独树一帜,脱颖而出。 若您正面临产品营销…

抖音直播弹幕数据逆向:websocket和JS注入

🔍 思路与步骤详解 🕵️‍♂️ 思路介绍 首先,我们通过抓包工具进入的直播间,捕获其网络通信数据,重点关注WebSocket连接。发现直播弹幕数据通过WebSocket传输,这种方式比传统的HTTP更适合实时数据的传输。…

昇思25天学习打卡营第24天 | Pix2Pix实现图像转换

昇思25天学习打卡营第24天 | Pix2Pix实现图像转换 文章目录 昇思25天学习打卡营第24天 | Pix2Pix实现图像转换Pix2Pix模型cGANCGAN的损失函数 数据网络构建生成器判别器Pix2Pix网络 总结打卡 Pix2Pix模型 Pix2Pix是基于条件生成对抗网络(cGAN, Condition Generativ…