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
相关产品推荐
相关产品推荐

