gpt4 book ai didi

python - Pyppeteer: {'waitUntil' : 'networkidle0' } 不等到页面加载完毕

转载 作者:行者123 更新时间:2023-12-05 03:38:49 25 4
gpt4 key购买 nike

因此,如果我使用 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()

谢谢。

最佳答案

这里的代码过于复杂。 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, {"waitUntil": "domcontentloaded"})
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()))

关于python - Pyppeteer: {'waitUntil' : 'networkidle0' } 不等到页面加载完毕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68838959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com