Python3使用requests_html中HTMLSession()的render方法渲染时报错Unable to render the page. Try increasing timeout

问题背景

问题发生在公司的一个js渲染的工具应用中。

环境

  • python3.6
  • requests_html 0.10.0
  • Aliyun FC (函数计算)

基础代码

由于涉及到内部代码,这里仅给出问题的基础代码实现

from requests_html import HTMLSession

def main(url):
	session = HTMLSession()
	r = session.get(url, headers=headers)
	r.html.render() # 进行渲染
	print(r.html.html)

问题描述

今天测试在验证的时候,测试反馈,代码执行会超时报错:

Unable to render the page. Try increasing timeout
		[
            "File \"/opt/python/requests_html.py\"",
            "line 605",
            "in render",
            "raise MaxRetries(\"Unable to render the page. Try increasing timeout\")"
        ]

问题排查

在排查日志后发现如下规律

  • 一个实例启动后的前几次调用都是正常的
  • 大约从第6次调用开始,会出现超时情况
  • 新启动的实例运行时复现上述问题

异常原因

经过百度搜索,AI询问,找到了stackoverflow中的一个问题:Python Requests-HTML Render() - No Content
在它的问题描述中,发现对方使用HTMLSession的方式是这样的:

with HTMLSession() as session:
    p = session.post(login_url, data=payload)
    r = session.get(content_url)
    r.html.render()
    print(r.text)

也就是说:HTMLSession可以作为资源被close
而我在使用中,既没有显式调用.close()方法,也没有使用with xxxxx as xxx:的语法

问题修复

找到了原因, 就可以修复了。上述实例代码修复如下:

from requests_html import HTMLSession

def main(url):
	with HTMLSession() as session: # 通过with xxx语法,可以在使用完毕后自动关闭资源
		r = session.get(url, headers=headers)
		r.html.render() # 进行渲染
		print(r.html.html)

思考

其实这个代码上线很久了。线上没有暴露问题,实际原因是:线上调用量低,负载在空闲5分钟后,会被关闭。几乎每次调用都是冷启动,不会导致资源堆积报错

而此次被发现的原因是测试同学一直在进行较高强度的测试。使得渲染后的资源得不到释放。

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术流奶爸奶爸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值