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 个浏览器窗口。
尤其是爬的网页比较多的时候,一直不间断的弹窗,感觉跟中了病毒似的,非常不爽。
所以希望可以只创建一个浏览器窗口,爬取新的网页时,就在这个浏览器窗口中添加新的页签。
2. 解决方法
我们知道,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):
global browser
if browser is None:
browser = await launch({'headless': False,'dumpio':True, 'autoClose':True})
page = await browser.newPage()
await page.goto(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))
asyncio.get_event_loop().run_until_complete(fetchUrl(url))
整个过程中,只创建了一个浏览器窗口,其他创建在了新的页签里,清爽多了。
问题解决!
如果文章中有哪里没有讲明白,或者讲解有误的地方,欢迎在评论区批评指正,或者扫描下面的二维码,加我微信,大家一起学习交流,共同进步。
Puppeteer
- 1.4w
-
Tzyito
Puppeteer
Python
- 5488
-
ifreeOvO
Puppeteer
Docker
- 5107
-
JavaScript
Puppeteer
- 503
-
Rocking7522
JavaScript
Puppeteer
- 1.2w
-
Elvis_Yang
Node.js
Puppeteer
- 2225
-
茶无味的一天
Node.js
Puppeteer
- 2838
-
yujian
DNodeJS
Puppeteer
- 5083
-
zhangdianp
Puppeteer
Chrome