如何让Python爬虫在遇到异常时继续运行
概述
在数据收集和数据挖掘中,爬虫技术是一项关键技能。然而,爬虫在运行过程中不可避免地会遇到各种异常情况,如网络超时、目标网站变化、数据格式不一致等。如果不加以处理,这些异常可能会导致爬虫程序中断,影响数据采集效率和完整性。本文将概述如何使用Python编写一个健壮的爬虫,确保其在遇到异常时能够继续运行。我们将通过使用try/except语句处理异常,结合代理IP技术和多线程技术,以提高爬虫的采集效率。
细节
1. 异常处理
异常处理是编写健壮爬虫程序的基础。在Python中,可以使用try/except语句捕获并处理可能出现的异常,确保程序在遇到问题时不会崩溃,而是能继续执行其他任务。
2. 使用代理IP
为了避免爬虫被目标网站封禁或限制,可以使用代理IP。通过代理服务器,爬虫可以伪装成不同的IP地址,分散请求的来源,提高爬取的成功率。本文将使用爬虫代理服务。
3. 多线程技术
多线程可以显著提高爬虫的采集效率。通过同时运行多个线程,爬虫可以在同一时间发出多个请求,从而加快数据采集速度。
示例代码
以下是一个实现了异常处理、代理IP、多线程技术的Python爬虫示例代码:
import requests
from concurrent.futures import ThreadPoolExecutor
import time
import sqlite3# 代理IP配置 亿牛云爬虫代理加强版
proxy_host = "www.16yun.cn" # 代理IP地址
proxy_port = "8000" # 代理端口
proxy_user = "user123" # 用户名
proxy_pass = "pass123" # 密码# 设置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"
}# 目标URL列表
urls = ["http://example.com/page1", "http://example.com/page2", ...]# 设置代理
proxies = {"http": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}","https": f"https://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}",
}# 数据库配置
db_name = "crawler_data.db"# 初始化数据库
def init_db():conn = sqlite3.connect(db_name)cursor = conn.cursor()cursor.execute('''CREATE TABLE IF NOT EXISTS pages (id INTEGER PRIMARY KEY AUTOINCREMENT,url TEXT NOT NULL,content TEXT NOT NULL,status_code INTEGER NOT NULL,timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)''')conn.commit()conn.close()# 存储数据到数据库
def save_to_db(url, content, status_code):conn = sqlite3.connect(db_name)cursor = conn.cursor()cursor.execute('''INSERT INTO pages (url, content, status_code)VALUES (?, ?, ?)''', (url, content, status_code))conn.commit()conn.close()# 抓取URL并处理
def fetch_url(url, max_retries=5):retries = 0while retries < max_retries:try:response = requests.get(url, headers=headers, proxies=proxies, timeout=10)response.raise_for_status() # 如果响应状态码不是200, 引发HTTPError异常print(f"成功抓取: {url}")save_to_db(url, response.text, response.status_code)returnexcept requests.RequestException as e:retries += 1print(f"抓取失败: {url}, 错误信息: {e}, 重试次数: {retries}")time.sleep(1) # 等待一秒后重试print(f"最终抓取失败: {url},超过最大重试次数: {max_retries}")# 使用多线程进行爬取
def run_crawler(urls, max_workers=5):with ThreadPoolExecutor(max_workers=max_workers) as executor:executor.map(fetch_url, urls)if __name__ == "__main__":init_db() # 初始化数据库start_time = time.time()run_crawler(urls)print(f"总共用时: {time.time() - start_time} 秒")# 这个脚本通过使用 try/except 来处理请求过程中的各种异常情况,
# 并通过代理IP技术来提高抓取成功率。同时,通过多线程技术提高了抓取效率。
# 在抓取失败后,会重复抓取直到成功或达到最大重试次数(5次)。
# 设置了User-Agent,并将抓取的内容存储到SQLite数据库中。
代码说明:
- 代理IP配置:设置亿牛云爬虫代理的主机、端口、用户名和密码。
- 设置User-Agent:在请求头中添加User-Agent字段。
- 目标URL列表:定义需要抓取的URL列表。
- 设置代理:通过
proxies字典设置HTTP和HTTPS代理。 - 数据库配置:选择SQLite作为数据库,并定义数据库名称
db_name。 - 初始化数据库:
init_db函数创建一个表pages,包含URL、内容、状态码和时间戳。 - 存储数据到数据库:
save_to_db函数将抓取到的内容存储到数据库中。 - 抓取URL并处理:
fetch_url函数尝试抓取URL,最多重试5次。使用try/except处理异常,成功抓取后将内容存储到数据库。 - 使用多线程进行爬取:
run_crawler函数使用ThreadPoolExecutor实现多线程抓取。 - 主程序:调用
init_db函数初始化数据库,然后调用run_crawler函数并计算总共用时。
结论
通过合理地使用异常处理、代理IP和多线程技术,可以显著提高Python爬虫的健壮性和效率。异常处理确保爬虫在遇到问题时能够继续运行,代理IP技术可以避免爬虫被封禁,而多线程技术则可以大幅提升数据采集的速度。希望本文的介绍和示例代码能为您的爬虫开发提供有用的参考。
相关文章:
如何让Python爬虫在遇到异常时继续运行
概述 在数据收集和数据挖掘中,爬虫技术是一项关键技能。然而,爬虫在运行过程中不可避免地会遇到各种异常情况,如网络超时、目标网站变化、数据格式不一致等。如果不加以处理,这些异常可能会导致爬虫程序中断,影响数据…...
手把手带你搭建Snort入侵检测系统
在当今数字化社会,网络安全问题日益突出。为了有效防范网络攻击,部署入侵检测系统(IDS)是必要的防护措施。Snort作为一款功能强大的开源IDS工具,被广泛应用于各种网络环境中。本文将手把手教您如何从零开始实现Snort入…...
小程序内嵌uniapp页面跳转回小程序指定页面方式
使用微信小程序提供的Api:wx.miniProgram.navigateTo 在小程序中嵌套uniapp的H5页面,并使用wx.miniProgram.navigateTo进行页面跳转,需要确保满足以下条件: 你的小程序必须是通过uniapp构建的,并且支持小程序嵌套。 你…...
基于 Three.js 的 3D 模型加载优化
作者:来自 vivo 互联网前端团队- Su Ning 作为一个3D的项目,从用户打开页面到最终模型的渲染需要经过多个流程,加载的时间也会比普通的H5项目要更长一些,从而造成大量的用户流失。为了提升首屏加载的转化率,需要尽可能…...
Jlink下载与适配keil ccs theia教程 用jlink代替ti自己的下载仿真器
用jlink代替ti自己的下载仿真器,然后你去买立创的m0g3507才19.9包赚160 安装 J-Link 软件包 J-Link 软件包 v7.88i 或更高版本支持 MSPM0。 从 Segger 网站下载安装程序 按照安装程序说明操作 安装程序将自动请求更新 IAR 或 Keil(如果已安装&#x…...
C# 进制之间的转换(二进制,八进制,十进制,十六进制)
常用的方法是:Convert.ToString(byte value, int toBase), 并且有多个重载方法, value的类型可以为short,int 等,但必须是整数且不能为负数, 一般默认为十进制 toBase: 返回值的基数,必须是 2、…...
Linux 基础开发工具 : Vim编辑器
Vim 是 Linux 和其他类 Unix 系统上广泛使用的文本编辑器之一。它基于更早的 vi 编辑器,但添加了许多增强功能和扩展。Vim 是“Vi IMproved”的缩写,意为“改进的 Vi”,我们常使用Vim编辑器编写c/c代码。 ps:该篇介绍均为最基础介…...
Delphi 11.2 配置Android SDK 环境
打开 Delphi 11 点击 Tools–Options… 然后点击 Deployment–SDK Manager–Add… 这里如果配置64位就选 Android 64-bit,如果配置32位就选 Android 32-bit 点击 Select an SDK version–Add New… 有警告图标的就是有问题的项,需要手动更新一下…...
Spring Boot 学习(10)——固基(Idea 配置 git 访问 gitee)
几转眼就过了两个月,其实也没有闲着,学也学了,只是繁杂事多,学的不如以前多,也没有做过笔记了。 以前做开发因条件受限,没有什么 git ,也没有 gitee。现在出来混要跟上形势才行,学习…...
11 个接口性能优化技巧(上)【送源码】
接口性能优化对于从事后端开发的同学来说,肯定再熟悉不过了,因为它是一个跟开发语言无关的公共问题。 该问题说简单也简单,说复杂也复杂。 有时候,只需加个索引就能解决问题。 有时候,需要做代码重构。 有时候&…...
AIoTedge 智能边缘物联网平台
AIoTedge智能边缘物联网平台是一个创新的边云协同架构,它为智能设备和系统提供了强大的数据处理和智能决策能力。这个平台的核心优势在于其边云协同架构设计,它优化了数据处理速度,提高了系统的可靠性和灵活性,适用于多种场景&…...
深入理解CSS基础【代码审计实战指南】
文章目录 为什么需要cssCSS语法CSS的组成css注释: 快速入门示例:常用样式字体颜色和边框颜色介绍颜色示例:边框边框的宽度与高度 字体样式背景样式文本居中 字体颜色和边框颜色介绍颜色示例:边框边框的宽度与高度 字体样式背景样式…...
html改写vue日志
本人最近学了vue,想着练手的方法就是改写之前在公司开发的小系统前端,将前端的AJAXJSThymeleaf改为axiosvue。 改写html 将<html>中的<head>和<body>结构移除,将css部分移入<style>, 重新定义了全局的&…...
Transformer-Bert---散装知识点---mlm,nsp
本文记录的是笔者在了解了transformer结构后嗑bert中记录的一些散装知识点,有时间就会整理收录,希望最后能把transformer一个系列都完整的更新进去。 1.自监督学习 bert与原始的transformer不同,bert是使用大量无标签的数据进行预训…...
基于术语词典干预的机器翻译挑战赛笔记 Task3 #Datawhale AI 夏令营
书接上回,上回在这捏: 基于术语词典干预的机器翻译挑战赛笔记Task2 #Datawhale AI 夏令营-CSDN博客文章浏览阅读223次,点赞10次,收藏5次。基于术语词典干预的机器翻译挑战赛笔记Task2https://blog.csdn.net/qq_23311271/article/…...
定制QCustomPlot 带有ListView的QCustomPlot 全网唯一份
定制QCustomPlot 带有ListView的QCustomPlot 文章目录 定制QCustomPlot 带有ListView的QCustomPlot摘要需求描述实现关键字: Qt、 QCustomPlot、 魔改、 定制、 控件 摘要 先上效果,是你想要的,再看下面的分解,顺便点赞搜藏一下;不是直接右上角。 QCustomPlot是一款…...
Fast Planner规划算法(一)—— Fast Planner前端
本系列文章用于回顾学习记录Fast-Planner规划算法的相关内容,【本系列博客写于2023年9月,共包含四篇文章,现在进行补发第一篇,其余几篇文章将在近期补发】 一、Fast Planner前端 Fast Planner的轨迹规划部分一共分为三个模块&…...
问题记录-SpringBoot 2.7.2 整合 Swagger 报错
详细报错如下 报错背景,我将springboot从2.3.3升级到了2.7.2,报了下面的错误: org.springframework.context.ApplicationContextException: Failed to start bean documentationPluginsBootstrapper; nested exception is java.lang.NullPo…...
【视觉SLAM】 十四讲ch5习题
1.*寻找一个相机(你手机或笔记本的摄像头即可),标定它的内参。你可能会用到标定板,或者自己打印一张标定用的棋盘格。 参考我之前写过的这篇博客:【OpenCV】 相机标定 calibrateCamera Code来源是《学习OpenCV3》18.…...
Webpack基础学习-Day01
Webpack基础学习-Day01 1.1 webpack 是什么 webpack 是一种前端资源构建工具,一个静态模块打包器(module bundler)。 在 webpack 看来, 前端的所有资源文件(js/json/css/img/less/…)都会作为模块处理。 它将根据模块的依赖关系进行静态分析,打包生成…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
