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

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时计算 Flink 版,5000CU*H 3个月
简介: 构建健壮Python爬虫涉及异常处理、代理IP和多线程。通过try/except捕获异常,保证程序在遇到问题时能继续运行。使用代理IP(如亿牛云)防止被目标网站封锁,多线程提升抓取效率。示例代码展示了如何配置代理,设置User-Agent,以及使用SQLite存储数据。通过`fetch_url`函数和`ThreadPoolExecutor`实现抓取与重试机制。

亿牛云爬虫代理.png

概述

在数据收集和数据挖掘中,爬虫技术是一项关键技能。然而,爬虫在运行过程中不可避免地会遇到各种异常情况,如网络超时、目标网站变化、数据格式不一致等。如果不加以处理,这些异常可能会导致爬虫程序中断,影响数据采集效率和完整性。本文将概述如何使用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.proxy.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技术可以避免爬虫被封禁,而多线程技术则可以大幅提升数据采集的速度。希望本文的介绍和示例代码能为您的爬虫开发提供有用的参考。
相关文章
|
9天前
|
数据采集 存储 XML
Python爬虫定义入门知识
Python爬虫是用于自动化抓取互联网数据的程序。其基本概念包括爬虫、请求、响应和解析。常用库有Requests、BeautifulSoup、Scrapy和Selenium。工作流程包括发送请求、接收响应、解析数据和存储数据。注意事项包括遵守Robots协议、避免过度请求、处理异常和确保数据合法性。Python爬虫强大而灵活,但使用时需遵守法律法规。
|
6天前
|
存储 数据库连接 API
Python环境变量在开发和运行Python应用程序时起着重要的作用
Python环境变量在开发和运行Python应用程序时起着重要的作用
45 15
|
10天前
|
数据采集 缓存 定位技术
网络延迟对Python爬虫速度的影响分析
网络延迟对Python爬虫速度的影响分析
|
11天前
|
数据采集 Web App开发 监控
高效爬取B站评论:Python爬虫的最佳实践
高效爬取B站评论:Python爬虫的最佳实践
|
12天前
|
数据采集 存储 JSON
Python爬虫开发中的分析与方案制定
Python爬虫开发中的分析与方案制定
|
16天前
|
数据采集 Web App开发 JavaScript
爬虫策略规避:Python爬虫的浏览器自动化
爬虫策略规避:Python爬虫的浏览器自动化
|
16天前
|
数据采集 存储 XML
Python实现网络爬虫自动化:从基础到实践
本文将介绍如何使用Python编写网络爬虫,从最基础的请求与解析,到自动化爬取并处理复杂数据。我们将通过实例展示如何抓取网页内容、解析数据、处理图片文件等常用爬虫任务。
|
18天前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
60 6
|
3月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
179 4
|
3月前
|
数据采集 存储 搜索推荐
打造个性化网页爬虫:从零开始的Python教程
【8月更文挑战第31天】在数字信息的海洋中,网页爬虫是一艘能够自动搜集网络数据的神奇船只。本文将引导你启航,用Python语言建造属于你自己的网页爬虫。我们将一起探索如何从无到有,一步步构建一个能够抓取、解析并存储网页数据的基础爬虫。文章不仅分享代码,更带你理解背后的逻辑,让你能在遇到问题时自行找到解决方案。无论你是编程新手还是有一定基础的开发者,这篇文章都会为你打开一扇通往数据世界的新窗。