python - 从网站上抓取某些字段时无法继续单击下一页按钮
问题描述
我使用 python 与pyppeteer关联创建了一个脚本,以继续单击下一页按钮,直到没有更多内容为止。单击下一页按钮时的脚本会抛出pyppeteer.errors.TimeoutError: Navigation Timeout Exceeded: 30000 ms exceeded.
指向此行的此错误await page.waitForNavigation()
。name
不过,它可以item_type
从该站点的登录页面进行解析。我知道我可以发出带有适当有效负载的 post http 请求以从那里获取数据,但我的意图是pyppeteer
在解析必填字段时使用并继续单击下一页按钮。
import asyncio
from pyppeteer import launch
link = "https://www.e-ports.com/ships"
async def get_content():
wb = await launch(headless=True)
[page] = await wb.pages()
await page.goto(link)
while True:
await page.waitForSelector(".common_card", {'visible':True})
elements = await page.querySelectorAll('.common_card')
for element in elements:
name = await element.querySelectorEval('span.title > a','e => e.innerText')
item_type = await element.querySelectorEval('.bottom > span','e => e.innerText')
print(name.strip(),item_type.strip())
try:
await page.click("button.btn-next")
await page.waitForNavigation()
except Exception: break
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(get_content())
顺便说一句,如果我第一次手动单击下一页按钮,它会成功完成其余部分。
解决方案
我不知道 Pypeteer 中的有效语法,但waitForNavigation
可能是这个的常见语法。
await Promise.all([
page.waitForNavigation(),
page.click("button.btn-next")
])
承诺数组内的迭代器,所有方法都将在变为 true 或完成所需操作时解析。
推荐阅读
- javascript - 如何在 for 循环中使用带有 OR 的 if 语句
- amazon-web-services - 带有 KeyCloak 的 AWS Quicksight SSO
- gnome-shell - 无需重新启动即可安装 GNOME Shell 扩展?
- amazon-web-services - AWS Step Function 教程的权限
- google-chrome - 如何在我的站点中启用来自 Google 的此凭据选择器?
- php - 更改 WordPress 循环以显示类别
- flutter - 使用提供程序从底部导航栏项目当前索引将平面按钮导航到另一个屏幕
- javascript - 是什么阻止了我的 javascript click() 函数?
- python - AttributeError: 'Recognizer' 对象没有属性 'listen''
- javascript - Discord.js 消息未定义