【问题标题】:Pyppeteer: {'waitUntil': 'networkidle0'} not waiting till page is loadedPyppeteer: {'waitUntil': 'networkidle0'} 不等到页面加载
【发布时间】:2021-08-18 20:30:22
【问题描述】:

所以如果我使用await page.waitFor(9000) 或一些硬编码的等待号码, 我的函数会等到页面加载完毕。

但是,await page.goto(url, {'waitUntil': 'networkidle0'}) 导致函数在整个页面加载之前运行,因此脚本失败。

这是完整的代码:

import requests
from bs4 import BeautifulSoup
import time
import os
import pyppeteer
from pyppeteer import launch
import asyncio
import subprocess



AGENT_DIR = os.path.dirname(__file__) + r'\data\agents'
SAVE_FILE = os.path.join(AGENT_DIR, 'latest.txt')
URL = 'https://techblog.willshouse.com/2012/01/03/most-common-user-agents/'


def get_latest_agents():

    ''' We are getting most
        common lastest user agents
        from the {URL} site
        and then saving it to text file {SAVE_FILE}

    '''

    
    
    async def scrape():

        url = URL
        browser = await launch(headless = False)
        page = await browser.newPage()
        await page.goto(url, {'waitUntil': 'networkidle0'})
        await page.waitFor(9000)
        
        content = await page.content()
        
        soup = BeautifulSoup(content, 'html.parser')
    
        agents = soup.select('.get-the-list')[0].text
        #agents = agents.split('\n')

        print(agents)
        
        await browser.close()

    loop = asyncio.get_event_loop()
    response = loop.run_until_complete(scrape())

if __name__ == '__main__':

    # first kill all chrome.exe as pypetter doesn't close properly
    subprocess.call(['taskkill', '/F', '/im', 'chrome.exe'])
    get_latest_agents()

谢谢。

【问题讨论】:

    标签: python pyppeteer


    【解决方案1】:

    这里的代码过于复杂。 Pyppeteer 已经有了选择器,因此不需要 BeautifulSoup、requests 或其他可能会增加混乱的未使用的库/变量。

    BS 是一个静态 HTML 解析器,通常用于请求,而 Pyppeteer 是一个与浏览器实时工作的驱动程序。使用 BS 的唯一原因是如果所有数据都是静态可用的,在这种情况下就不需要 Pyppeteer。

    Pyppeteer 提供了一个函数page.waitForSelector,它可以让你做你需要的事情——阻塞代码直到你想要数据的选择器准备好。完成后,您可以使用 page.Jeval 或类似的函数提取值,让您在浏览器控制台中运行代码。

    "networkidle2" 只会减慢您的速度,因为waitForSelector 很可能会在只有 2 个网络请求未完成之前找到您需要的数据。

    这是一个简单的例子:

    import asyncio
    from pyppeteer import launch
    
    URL = "https://techblog.willshouse.com/2012/01/03/most-common-user-agents/"
    
    async def scrape():
        browser = await launch(headless=False)
        page, = await browser.pages()
        await page.goto(URL)
        await page.waitForSelector(".get-the-list", timeout=1e5)
        agents = await page.Jeval(".get-the-list", "e => e.value")    
        await browser.close()
        return agents
    
    if __name__ == "__main__":
        print(asyncio.get_event_loop().run_until_complete(scrape()))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多