【Pyppeteer】爬取多个网页时,如何只创建一个浏览器窗口,打开多个页签

【问题描述】

使用 Pyppeteer 工具写爬虫时,我们一般可以用这样的方式来爬取网页。

import asyncio
from pyppeteer import launch
 
url = 'http://www.baidu.com'
 
async def fetchUrl(url):
    browser = await launch({'headless': False,'dumpio':True, 'autoClose':True})
    page = await browser.newPage()
 
    await page.goto(url)
    await asyncio.wait([page.waitForNavigation()])
    str = await page.content()
    print(str)
 
asyncio.get_event_loop().run_until_complete(fetchUrl(url))

但是一般情况下,我们要爬取多个网页时,这个函数我们要调用 n 次,也就会创建 n 个浏览器窗口。

尤其是爬的网页比较多的时候,一直不间断的弹窗,感觉跟中了病毒似的,非常不爽。

【Pyppeteer】爬取多个网页时,如何只创建一个浏览器窗口,打开多个页签

所以希望可以只创建一个浏览器窗口,爬取新的网页时,就在这个浏览器窗口中添加新的页签。 

 

【解决方法】

 我们知道,Pyppeteer 创建浏览器的窗口的函数是 await launch() ,创建新的页签的函数是 await browser.newPage() ,所以我们只需要想办法,在调用该函数时,newPage() 函数每次都执行,而 launch() 函数只执行一次。

import asyncio
from pyppeteer import launch
 
url = 'http://www.baidu.com'
browser = None
 
async def fetchUrl(url):
    # 将 browser 定义成全局变量,保证整个过程中只创建一次浏览器窗口
    global browser
    if browser is None:
        browser = await launch({'headless': False,'dumpio':True, 'autoClose':True})
    
    page = await browser.newPage()
 
    await page.goto(url)
    #await asyncio.wait([page.waitForNavigation()])
    #str = await page.content()
    #print(str)
 
# 执行多次该函数进行测试
asyncio.get_event_loop().run_until_complete(fetchUrl(url))
asyncio.get_event_loop().run_until_complete(fetchUrl(url))
asyncio.get_event_loop().run_until_complete(fetchUrl(url))
asyncio.get_event_loop().run_until_complete(fetchUrl(url))
asyncio.get_event_loop().run_until_complete(fetchUrl(url))

整个过程中,只创建了一个浏览器窗口,其他创建在了新的页签里,清爽多了。

【Pyppeteer】爬取多个网页时,如何只创建一个浏览器窗口,打开多个页签

 问题解决!


上一篇:【Pyppeteer】如何避开网站的反爬检测


下一篇:【Pyppeteer】如何进行超时时时间设置