首页 > 编程语言 >如何让Python爬虫在遇到异常时继续运行

如何让Python爬虫在遇到异常时继续运行

时间:2024-07-18 11:27:27浏览次数:10  
标签:遇到 Python db 抓取 爬虫 url proxy 多线程

概述

在数据收集和数据挖掘中,爬虫技术是一项关键技能。然而,爬虫在运行过程中不可避免地会遇到各种异常情况,如网络超时、目标网站变化、数据格式不一致等。如果不加以处理,这些异常可能会导致爬虫程序中断,影响数据采集效率和完整性。本文将概述如何使用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 = 0
    while 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)
            return
        except requests.RequestException as e:
            retries += 1
            print(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数据库中。



代码说明:

  1. 代理IP配置:设置亿牛云爬虫代理的主机、端口、用户名和密码。
  2. 设置User-Agent:在请求头中添加User-Agent字段。
  3. 目标URL列表:定义需要抓取的URL列表。
  4. 设置代理:通过proxies字典设置HTTP和HTTPS代理。
  5. 数据库配置:选择SQLite作为数据库,并定义数据库名称db_name
  6. 初始化数据库init_db函数创建一个表pages,包含URL、内容、状态码和时间戳。
  7. 存储数据到数据库save_to_db函数将抓取到的内容存储到数据库中。
  8. 抓取URL并处理fetch_url函数尝试抓取URL,最多重试5次。使用try/except处理异常,成功抓取后将内容存储到数据库。
  9. 使用多线程进行爬取run_crawler函数使用ThreadPoolExecutor实现多线程抓取。
  10. 主程序:调用init_db函数初始化数据库,然后调用run_crawler函数并计算总共用时。

结论

通过合理地使用异常处理、代理IP和多线程技术,可以显著提高Python爬虫的健壮性和效率。异常处理确保爬虫在遇到问题时能够继续运行,代理IP技术可以避免爬虫被封禁,而多线程技术则可以大幅提升数据采集的速度。希望本文的介绍和示例代码能为您的爬虫开发提供有用的参考。

最后这里免费分享给大家一份Python全台学习资料,包含视频、源码。课件,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以和我一起来学习交流呀。
编程资料、学习路线图、源代码、软件安装包等!【点击这里】领取!

① Python所有方向的学习路线图,清楚各个方向要学什么东西
② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析
③ 100多个Python实战案例,学习不再是只会理论
④ 华为出品独家Python漫画教程,手机也能学习
⑤ 历年互联网企业Python面试真题,复习时非常方便
在这里插入图片描述

标签:遇到,Python,db,抓取,爬虫,url,proxy,多线程
From: https://blog.csdn.net/m0_62283350/article/details/140517997

相关文章

  • 【2024版】超详细Python+Pycharm安装保姆级教程,Python+Pycharm环境配置和使用指南,看完
    目录一、Python开发环境配置1.Python下载与安装二、PyCharm安装+运行测试+汉化1.PyCharm下载及安装2.解释器配置及项目测试3.PyCharm汉化本文将从Python解释器安装到Pycharm专业版安装和配置汉化等使用都进行了详细介绍,希望能够帮助到大家。Python解释器&Pycharm安......
  • 七、python函数基础
    文章目录学习目标一、函数的介绍二、函数的参数三、函数的返回值四、函数的注释五、函数调用函数六、函数高级6.1全局变量和局部变量6.2函数多个返回值6.3默认参数的使用6.4可变参数的使用6.5可变数据类型和不可变数据类型6.6函数的注意事项......
  • 五、python列表
    文章目录学习目标一、列表的基本使用二、列表的遍历2.1while循环遍历2.2for...in循环遍历三、列表的排序3.1交换两个变量的值3.2冒泡排序3.3列表的排序与反转方法四、列表的复制4.1可变数据类型与不可变数据类型4.2列表的复制五、列表......
  • 【Python】pyppeteer 简单使用2
    importsyssys.path.append("/home/user/.local/lib/python3.9/site-packages")#将包的路径添加到环境变量importasynciofrompyppeteerimportlaunchfrompyppeteer.errorsimportTimeoutErrorfrompyppeteer_stealthimportstealth#反检测模块,隐藏浏览器特征widt......
  • Java语言,MySQL数据库;基于Node+Vue的健康信息管理系统的设计与实现32355(免费领源码)计算
    Node.js健康信息管理系统的设计摘要在如今IT技术快速发展和Internet广泛应用的时代,电子和网络技术给人们生活带来了便利,同时也会直接或间接损害人们的健康。所以,本次的毕业设计创作的意义就是通过信息化的统一管理,给用户录入和查看健康信息提供了方便。本设计主要实现集人......
  • 量化交易策略:波动性指标Keltner通道(附python代码)
    Keltner通道是由著名技术分析师ChesterW.Keltner在上个世纪60年代发明的一种技术指标。它基于价格和某种市场波动性度量(通常为移动平均)之间的关系,用于预测价格趋势的变化。Keltner通道的上下轨分别表示了价格的上限和下限,反映了市场在一定周期内的波动范围。这使得Keltner......
  • 6个强大且流行的Python爬虫库,强烈推荐!
    Python中有非常多用于网络数据采集的库,功能非常强大,有的用于抓取网页,有的用于解析网页,这里介绍6个最常用的库。1.BeautifulSoupBeautifulSoup是最常用的Python网页解析库之一,可将HTML和XML文档解析为树形结构,能更方便地识别和提取数据。BeautifulSoup可以自动将输入......
  • php中遇到new $a($b)的解法 imagick类的利用绕过open_basedir
    今天做题遇到一个新的知识点,接下来回顾下。源码<?phperror_reporting(0);ini_set('open_basedir',__DIR__.":/tmp");define("FUNC_LIST",get_defined_functions());classfumo_backdoor{public$path=null;public$argv=null;publ......
  • 【python学习】第三方库之tensorflow的定义、功能、使用场景、代码示例和解释
    引言tensorFlow是一个开源的软件库,最初由GoogleBrain团队的研究员和工程师开发,用于数值计算和大规模机器学习tensorFlow提供了丰富的API来支持各种计算任务,并且能够轻松地在多种计算设备上进行部署,包括CPU、GPU和TPU文章目录引言一、安装`tensorflow`第三方......
  • python+flask计算机毕业设计音乐推荐系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着数字音乐产业的蓬勃发展,音乐已成为人们日常生活中不可或缺的一部分。面对海量的音乐资源,用户往往难以从中快速找到符合个人喜好的音乐......