如何使用pyppeteer异步获取url一个浏览器多个标签

如何解决如何使用pyppeteer异步获取url一个浏览器多个标签

我想要我的脚本

  1. 打开说 3 个标签

  2. 异步获取一个 url(每个标签都相同)

  3. 保存回复

  4. 睡眠 4 秒

  5. 使用正则表达式解析响应(我尝试过 BeautifulSoup 但它太慢了)并返回一个令牌

  6. 在 3 个标签中循环多次

我的问题是 2。我有一个示例脚本,但它同步获取 url。我想让它异步。

from pyppeteer import launch

urls = ['https://www.example.com']


async def main():
    browser = await launch(headless=False)
    for url in urls:
        page1 = await browser.newPage()
        page2 = await browser.newPage()
        page3 = await browser.newPage()

        await page1.goto(url)
        await page2.goto(url)
        await page3.goto(url)

        title1= await page1.title()
        title2= await page2.title()
        title3= await page3.title()

        print(title1)
        print(title2)
        print(title3)

    #await browser.close()


asyncio.get_event_loop().run_until_complete(main())

另外,正如你所看到的,代码并不那么简洁。我如何让它异步?

此外,如果有帮助,我还有其他不适合我需要的 pyppeteer 脚本,以防万一转换这些脚本会更容易

import asyncio
from pyppeteer import launch

url = 'http://www.example.com'
browser = None

async def fetchUrl(url):
    # Define browser as a global variable to ensure that the browser window is only created once in the entire process
    global browser
    if browser is None:
        browser = await launch(headless=False)

    page = await browser.newPage()

    await page.goto(url)
    #await asyncio.wait([page.waitForNavigation()])
    #str = await page.content()
    #print(str)

 # Execute this function multiple times for testing
asyncio.get_event_loop().run_until_complete(fetchUrl(url))
asyncio.get_event_loop().run_until_complete(fetchUrl(url))

该脚本是异步的,但它一次执行一个事件循环,因此它与同步一样好。

# cat test.py
import asyncio
import time
from pyppeteer import launch

WEBSITE_LIST = [
    'http://envato.com','http://amazon.co.uk','http://example.com',]

start = time.time()

async def fetch(url):
    browser = await launch(headless=False,args=['--no-sandBox'])
    page = await browser.newPage()
    await page.goto(f'{url}',{'waitUntil': 'load'})
    print(f'{url}')
    await asyncio.sleep(1)
    await page.close()
    #await browser.close()

async def run():
    tasks = []

    for url in WEBSITE_LIST:
        task = asyncio.ensure_future(fetch(url))
        tasks.append(task)

    responses = await asyncio.gather(*tasks)

loop = asyncio.get_event_loop()
future = asyncio.ensure_future(run())
loop.run_until_complete(future)

print(f'It took {time.time()-start} seconds.')

该脚本是异步的,但它为每个 url 启动一个单独的浏览器,这最终会占用太多资源。

解决方法

这将在单独的标签中打开每个 URL:

import asyncio
import traceback

from pyppeteer import launch

URLS = [
    "http://envato.com","http://amazon.co.uk","http://example.com",]


async def fetch(browser,url):
    page = await browser.newPage()

    try:
        await page.goto(f"{url}",{"waitUntil": "load"})
    except Exception:
        traceback.print_exc()
    else:
        html = await page.content()
        return (url,html)
    finally:
        await page.close()


async def main():
    tasks = []
    browser = await launch(headless=True,args=["--no-sandbox"])

    for url in URLS:
        tasks.append(asyncio.create_task(fetch(browser,url)))

    for coro in asyncio.as_completed(tasks):
        url,html = await coro
        print(f"{url}: ({len(html)})")

    await browser.close()


if __name__ == "__main__":
    main = asyncio.run(main())

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?