如何用BeautifulSoup检测网页body?批量处理500+网页遇问题求助
批量检测网页是否存在body元素的解决方案
核心问题排查
- 脚本中途崩溃:未捕获请求阶段的异常(超时、连接失败、HTTP错误等),单个URL出错就导致整个脚本停止。
- body检测逻辑错误:
soup.select('body')返回的是列表对象,和空字符串''比较永远不成立,无法正确判断body是否存在。 - 超时处理不完善:仅设置单一timeout值不够灵活,且没有应对临时网络波动的重试机制。
修复后的完整代码
import requests import bs4 from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry # 配置会话与重试机制,提升批量请求稳定性 session = requests.Session() retry_strategy = Retry( total=3, # 最多重试3次 backoff_factor=1, # 重试间隔依次为1s、2s、4s status_forcelist=[500, 502, 503, 504] # 遇到服务器错误时自动重试 ) adapter = HTTPAdapter(max_retries=retry_strategy) session.mount('http://', adapter) session.mount('https://', adapter) def check_body_exists(url): try: # 拆分连接超时(10s)和读取超时(40s),适配不同场景 response = session.get(url, timeout=(10, 40)) response.raise_for_status() # 主动抛出HTTP状态码错误 soup = bs4.BeautifulSoup(response.text, 'html.parser') # 直接判断列表是否非空,即可确认body元素存在 if soup.select('body'): print(f"{url} - 检测到body元素") return True else: print(f"{url} - 未检测到body元素") return False except requests.exceptions.RequestException as e: # 捕获所有请求异常,保证脚本继续运行 print(f"{url} - 请求失败: {str(e)}") return False # 替换为你的URL列表 url_list = ["https://example.com", "https://test.com"] for url in url_list: check_body_exists(url)
关键优化说明
- 异常兜底:通过
try-except捕获所有请求相关异常,单个URL出错不会中断整个批量任务。 - 正确的body检测:利用列表的布尔特性,非空列表即为
True,直接判断soup.select('body')即可,无需和空字符串比较。 - 灵活超时与重试:拆分超时参数,同时配置重试策略,应对临时网络波动或服务器错误,提升检测成功率。
- 会话复用:使用
Session对象复用TCP连接,减少重复握手,提升批量请求的效率。
内容的提问来源于stack exchange,提问作者stack overflow
相关产品推荐
相关产品推荐

