鱼C论坛

 找回密码
 立即注册
查看: 1998|回复: 5

找到playwright的page.goto的超时原因了(原页面一直在加载一个广告商的东西),怎么破?

[复制链接]
发表于 2023-10-25 18:08:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 blackantt 于 2023-10-25 21:15 编辑

有头模式下,找到playwright的page.goto的超时导致try-except卡死原因了(原页面一直在加载一个广告商的东西,浏览器标签上的网页图标一直在转,网页下面浏览器的提示条一直显示 waiting for mweb.ck.inmobi.com。 但需要抓取的文本已经出来了),怎么破?

在playwright自带的chromium的goto卡顿时,用 chrome浏览相同网页,却没有卡顿。  chromium 与 chrome 版本不同。不知有没有关系。

能否在无头模式下,让 txt = page.content() 只取需要的文本部分,不等  waiting for mweb.ck.inmobi.com 的广告部分?
page.goto(url1,timeout=20000),
txt = page.content()
pattern = re.compile('<.*?)</tr>', re.S)
items = re.findall(pattern, txt)     


出来了.jpg

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-25 18:08:09 | 显示全部楼层
问题的关键在于页面加载超时导致try-except卡死。在Playwright中,可以通过设置 page.setDefaultTimeout(timeout) 来修改页面加载超时时间。例如,将超时时间设置为10秒:
page.setDefaultTimeout(10000)

这样,当页面加载时间超过10秒时,Playwright会抛出一个超时异常,并且可以在try-except语句中捕获该异常,从而避免程序卡死。下面是一个示例代码:
from playwright.sync_api import sync_playwright

with sync_playwright() as playwright:
    browser = playwright.chromium.launch()
    page = browser.new_page()
    page.set_default_timeout(10000)  # 设置页面加载超时时间为10秒

    try:
        page.goto(url1)
        txt = page.content()
        pattern = re.compile('<.*?)</tr>', re.S)
        items = re.findall(pattern, txt)
        # 处理需要的文本部分
    except playwright._impl._api_types.TimeoutError:
        # 处理超时异常
        pass

    browser.close()

关于在无头模式下只获取需要的文本部分,可以使用Playwright的 page.evaluate() 方法来执行JavaScript代码,从而获取指定元素的文本内容。例如,可以使用以下代码来获取某个元素的文本:
text = page.evaluate('(selector) => document.querySelector(selector).textContent', 'your-selector')

你可以将 'your-selector' 替换为你需要获取文本的元素的选择器。这样,你就可以只获取需要的文本部分,而不等待广告部分加载完毕。

希望以上回答对你有帮助!如有任何疑问,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-25 21:14:48 | 显示全部楼层
isdkz 发表于 2023-10-25 18:08
问题的关键在于页面加载超时导致try-except卡死。在Playwright中,可以通过设置 page.setDefaultTimeout(ti ...

你这是全局的time,如果真设置了,页面没加载完就终止了,压根不会到page.content()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-25 21:18:47 | 显示全部楼层
本帖最后由 cflying 于 2023-10-25 22:31 编辑

我想了哈,你无非就是想实现mweb.ck.inmobi.com不加载,其余链接正常加载,如果这样的话倒有个方法可以实现你的要求
1、获取route信息
2、从里面匹配出你无法加载的链接,即mweb.ck.inmobi.com
3、然后判断后用route.abort()终止该链接的加载(但是不影响页面其他链接的正常加载)
这样你正常的页面既可以加载完,又不受无法加载的链接影响
你可以在你的page.goto()的上一行加入这段代码
page.route("**/*", lambda route: route.abort() if 'mweb.ck.inmobi.com' in route.request.url  else route.continue_())
即:
...
page.route(.....)
page.goto(url1)
...

评分

参与人数 1荣誉 +5 贡献 +3 收起 理由
歌者文明清理员 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-10-26 22:40:39 | 显示全部楼层
cflying 发表于 2023-10-25 21:18
我想了哈,你无非就是想实现mweb.ck.inmobi.com不加载,其余链接正常加载,如果这样的话倒有个方法可以实现 ...

好思路,让我试一下。谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-2 17:08:54 | 显示全部楼层
哪位比较厉害的大神戳戳我,我的一直导航不到想导航的页面,抓狂了好几天了,谢谢大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-28 23:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表