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

Python爬虫中如何交替处理不同格式URL并适配404异常?

问题分析与修改建议

现有代码的核心问题

  • 变量错误:代码中使用未定义的main_url,实际应为拼接好的url;somthing是拼写错误,正确应为something
  • 404判断不可靠:依赖页面文本包含"404"来识别错误页,部分网站的404页面可能无该关键词,或文本匹配存在偏差
  • 浏览器实例管理错误:遇到404直接调用browser.quit()销毁浏览器,后续再调用browser.get()会触发实例不存在的报错
  • 逻辑不完整:仅尝试一次备选URL,未处理备选URL也返回404的情况,且未覆盖网络异常、页面加载超时等场景

解决思路

  1. 用HTTP状态码判断404:优先通过页面的HTTP状态码识别错误,比文本匹配更准确(需配置浏览器选项支持状态码获取)
  2. 复用浏览器实例:不要频繁销毁浏览器,直到所有URL尝试完成再关闭,避免实例丢失报错
  3. 循环尝试所有URL格式:对每个目标序号,依次遍历所有可能的URL模板,直到找到可用链接或全部尝试失败
  4. 添加异常捕获:捕获网络错误、加载超时、元素查找失败等异常,防止程序直接崩溃

修改后的代码示例

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time

# 配置Chrome选项,启用无头模式可选,支持状态码获取
chrome_options = Options()
chrome_options.add_argument('--headless=new')
chrome_options.add_argument('--disable-gpu')

# 初始化浏览器实例,全程复用
browser = webdriver.Chrome(options=chrome_options)
browser.set_page_load_timeout(10)  # 设置页面加载超时时间

# 定义所有可能的URL格式模板
url_templates = [
    'https://something.com/something-{r}',
    'https://something.com/somethings-{r}-mix'
]

# 遍历目标序号,示例为1-2,可按需调整范围
for r in range(1, 3):
    is_success = False
    # 依次尝试每种URL格式
    for template in url_templates:
        try:
            target_url = template.format(r=r)
            browser.get(target_url)
            
            # 获取HTTP状态码(Selenium 4+支持通过JS获取)
            status_code = browser.execute_script("return window.performance.getEntries()[0].responseStatus")
            if status_code == 404:
                print(f"URL {target_url} 返回404,尝试下一种格式")
                continue
            
            # 页面加载成功,开始解析内容
            soup = BeautifulSoup(browser.page_source, "html.parser")
            # 这里添加你的内容提取逻辑,比如获取标题、正文等
            print(f"成功爬取 {target_url} 的内容")
            is_success = True
            break  # 找到可用URL,跳出当前模板循环
        
        except Exception as e:
            print(f"访问 {target_url} 出错: {str(e)}")
            time.sleep(2)  # 出错后短暂等待,避免频繁请求触发反爬
    
    if not is_success:
        print(f"序号{r}的所有URL格式均无法访问")

# 所有任务完成后,销毁浏览器实例
browser.quit()

额外说明

  • 状态码兼容:如果使用的Selenium版本不支持window.performance,可以先用requests库预请求URL判断状态码,再用Selenium加载有效链接,减少浏览器资源消耗
  • 重试机制:可给失败的URL添加1-2次重试逻辑,避免临时网络波动导致的失败
  • 反爬适配:根据目标网站的反爬规则,添加自定义User-Agent、随机延迟等策略,降低被封禁的风险

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:12:20