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

BeautifulSoup随机返回[]的原因排查及QThread影响疑问

网页爬取异常排查:BeautifulSoup随机返回空结果及异步代码AttributeError问题

问题背景

我使用BeautifulSoup爬取网页时遇到异常:每隔5分钟请求同一页面提取年龄字段,即便页面内容无变化,也会随机出现返回[]的情况。爬取逻辑为先获取页面ID,再逐个请求页面提取年龄(示例ID=79088),代码运行在QThread中以避免阻塞UI,怀疑这可能是问题诱因。

同步爬取代码及异常现象

同步爬取代码

for id in ids:
    soure = requests.get('https://www.infofunerais.pt/pt/funerais.html?id=' +  id, headers=siteHeaders).text
    soup2 = BeautifulSoup(soure, 'html5lib')
    print("\n")
    print("id antes de idade " + str(id))
    print(soup2.find_all('span',class_='idade-detail',limit=Config.limit))
    for idade in soup2.find_all('span',class_='idade-detail',limit=Config.limit):
        print("idade id   " + str(id))
        print("idade text    " + str(idade.text.strip()))
        try:
            ages.append(idade.text.strip())
        except:
            print("idade map definida")
            ages.append(str("??"))

        print("Tamanho ages " + str(len(ages)))            
        print("\n")

异常输出

正常响应会返回包含年龄的span元素,但随机出现如下空结果:

id antes de idade 79088
[]

异步代码尝试后的新异常

后续尝试了@WorkAholic提供的异步代码(修改为每60秒循环),运行一段时间后出现新的异常:

id 79088
97 anos
id 79092
85 anos
id 79141
92 anos
id 79150
91 anos
id 79155
87 anos
id 79195
99 anos
sleeping 60 secs
id 79088
97 anos
id 79092
85 anos
id 79141
92 anos
Traceback (most recent call last):
  File "/home/pi/PiClock/stackof.py", line 49, in <module>
    SrartInfofuneraisPT(id_person)
  File "/home/pi/PiClock/stackof.py", line 42, in SrartInfofuneraisPT
    run(InfofuneraisPT().LoggerParser(id_person))
  File "/usr/lib/python3.9/asyncio/runners.py", line 44, in run
    return loop.run_until_complete(main)
  File "/usr/lib/python3.9/asyncio/base_events.py", line 642, in run_until_complete
    return future.result()
  File "/home/pi/PiClock/stackof.py", line 37, in LoggerParser
    await self.Parser(session, id_person)
  File "/home/pi/PiClock/stackof.py", line 28, in Parser
    anos = soup.find("div", {"class": "detailfalecido_header"}).find("span", {"class": "idade-detail"}).text
AttributeError: 'NoneType' object has no attribute 'find'

可能的原因

  • 反爬机制拦截:目标网站可能针对频繁请求(哪怕间隔5分钟/60秒)触发反爬策略,返回空页面或结构异常的内容,比如临时封禁IP、返回不含目标元素的页面。
  • 请求不稳定:网络波动导致请求未完整获取页面内容,返回的HTML不完整,BeautifulSoup解析后找不到目标元素。
  • 线程/异步环境资源冲突:QThread或异步任务中如果共享siteHeaders等全局资源且未正确处理,可能导致请求头异常,服务器返回异常内容;异步代码中session复用不当也可能引发连接问题。
  • 页面动态渲染异常:即便页面视觉内容无变化,网站后端可能动态渲染页面,偶尔返回不同的DOM结构(比如某些场景下不渲染年龄字段)。
  • 解析逻辑健壮性不足:同步代码仅在append阶段做了异常捕获,未处理解析阶段的问题;异步代码连续调用find(),一旦上层元素找不到就直接抛出异常,缺乏容错处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:09:59