You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python网络爬虫:如何跳过缺失条目与404页面?

解决politicalemails.org邮件爬取的404与索引错误问题

你当前的爬取代码在小范围测试时正常,但扩大爬取范围后,遇到无效链接(返回404)或页面无目标元素时会触发IndexError。可以通过状态码校验、元素存在性检查和异常捕获来实现跳过机制,修改后的代码如下:

修改后的完整代码

# Import libraries
import numpy as np
import requests
from bs4 import BeautifulSoup
import pandas as pd

# 初始化空列表存储数据(比直接append DataFrame效率更高)
email_data = []

# 爬取范围:可自行调整起始/结束ID
url_base = 'https://politicalemails.org/messages/'
start_id = 1
end_id = 100

for i in range(start_id, end_id + 1):
    url_full = url_base + str(i)
    page = requests.get(url_full)
    
    # 1. 检查请求状态:非200状态直接跳过
    if page.status_code != 200:
        print(f"页面 {url_full} 返回 {page.status_code},跳过")
        continue
    
    soup = BeautifulSoup(page.text, 'lxml')
    email = soup.find_all('td', class_='content-box-meta__value')
    message = soup.find_all('div', class_='message-text')
    
    # 2. 检查关键元素是否存在:确保有足够的meta信息和邮件正文
    if len(email) < 3 or len(message) < 1:
        print(f"页面 {url_full} 无有效邮件数据,跳过")
        continue
    
    # 提取数据,兜底捕获意外异常
    try:
        sender = email[0].text.strip()
        subject = email[1].text.strip()
        date = email[2].text.strip()
        body = message[0].text.strip()
        
        email_data.append({
            'sender': sender,
            'subject': subject,
            'date': date,
            'body': body
        })
    except Exception as e:
        print(f"处理页面 {url_full} 时出错:{str(e)},跳过")
        continue

# 将列表转为DataFrame
df = pd.DataFrame(email_data)
print(df.head())

关键修改说明

  • 状态码校验:通过page.status_code != 200直接跳过404/500等无效页面,避免解析错误页面浪费资源
  • 元素存在性检查:通过len(email) < 3和len(message) < 1判断页面是否包含所需邮件元素,从根源避免索引越界
  • 异常捕获:外层try-except块捕获提取数据时的意外错误(如文本格式异常),保证循环持续执行
  • 存储优化:用列表暂存数据后统一转为DataFrame,比循环中频繁调用df.append()效率更高(爬取大量数据时差异明显)

内容的提问来源于stack exchange,提问作者user2813606

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 14:45:41