Python爬虫中如何交替处理不同格式URL并适配404异常?
问题分析与修改建议
现有代码的核心问题
- 变量错误:代码中使用未定义的
main_url,实际应为拼接好的url;somthing是拼写错误,正确应为something - 404判断不可靠:依赖页面文本包含"404"来识别错误页,部分网站的404页面可能无该关键词,或文本匹配存在偏差
- 浏览器实例管理错误:遇到404直接调用
browser.quit()销毁浏览器,后续再调用browser.get()会触发实例不存在的报错 - 逻辑不完整:仅尝试一次备选URL,未处理备选URL也返回404的情况,且未覆盖网络异常、页面加载超时等场景
解决思路
- 用HTTP状态码判断404:优先通过页面的HTTP状态码识别错误,比文本匹配更准确(需配置浏览器选项支持状态码获取)
- 复用浏览器实例:不要频繁销毁浏览器,直到所有URL尝试完成再关闭,避免实例丢失报错
- 循环尝试所有URL格式:对每个目标序号,依次遍历所有可能的URL模板,直到找到可用链接或全部尝试失败
- 添加异常捕获:捕获网络错误、加载超时、元素查找失败等异常,防止程序直接崩溃
修改后的代码示例
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
相关产品推荐
相关产品推荐

