从网站抓取某些字段时无法继续点击下一页按钮

时间:2020-03-19 19:11:23

标签: python python-3.x web-scraping puppeteer pyppeteer

我已经使用python和 pyppeteer 关联创建了一个脚本,以继续单击下一页按钮,直到没有更多内容为止。单击下一页按钮时,脚本将引发错误pyppeteer.errors.TimeoutError: Navigation Timeout Exceeded: 30000 ms exceeded.指向此行await page.waitForNavigation()。不过,它可以从该网站的登录页面解析nameitem_type。我知道我可以发出带有适当负载的http请求,以从那里获取数据,但我的目的是利用pyppeteer并在解析必填字段时继续单击下一页按钮。

website address

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())

顺便说一句,如果我是第一次手动单击下一页按钮,它将成功完成其余操作。

1 个答案:

答案 0 :(得分:1)

我不知道Pypeteer中的有效语法,但是waitForNavigation的常见语法可能就是这个。

await Promise.all([
   page.waitForNavigation(),
   page.click("button.btn-next")
])

在数组中包含迭代器的前提下,所有方法在变为true或完成所需的操作时都将解析。