Pyppeteer爬虫神器详解( 三 )

这里我们还使用了一个新的参数设置--window-size , 这个是用来设置浏览器的窗口大小 , 与下面的setViewport相比 , 一个是设置窗口大小 , 一个是设置页面大小 。我们这里调用了createIncogniteBrowserContext方法 , 返回了一个context对象 , 然后用这个对象打开网页 , 就进入了无痕模式 。
在执行这段代码的时候 , 我先执行了一次上面那一次代码 , 发现依然是处于登录状态 , 然后我们执行本次代码后发现显示如下:

Pyppeteer爬虫神器详解

文章插图
 
发现出现了两层窗口 , 一个是launch创建的browser窗口 , 一个是通过createIncogniteBrowserContext创建的无痕窗口 。
  • 关闭
很多时候我们忘记关闭浏览器 , 就会导致它一直存在内存中 。如果是可视模式下 , 我们还能从任务栏看到它 , 但是在后台模式下 , 我们只能在任务管理器里去找它 , 这时候就很容易被忽略掉 。所以一定要记住 , 使用完毕调用一下close方法:
async def main():width = 1366height = 768browser = await launch(headless=False, args=['--disable-infobars', f'--window-size={width}, {height}'])context = await browser.createIncogniteBrowserContext()page = await context.newPage()await page.setViewport({'width': width, 'height': height})await page.goto('https://mp.weixin.qq.com/')await asyncio.sleep(100)await browser.close()PagePage就是页面 , 每一个选项卡就是一个页面 , 它的类定义如下:
class pyppeteer.page.Page(client: pyppeteer.connection.CDPSession, target: Target, frameTree: Dict[KT, VT], ignoreHTTPSErrors: bool, screenshotTaskQueue: list = None)我们上面在使用的过程中都是通过browser对象创建一个新页面 , 这也是我们经常使用它的方式 , 接下来我们看一下它的常用方法 。
  • 选择器
Page对象内置了一些用于选取节点的选择器方法 , 比如J方法传入一个选择器Selector , 则能返回对应匹配的第一个节点 , 相当于querySelector 。JJ方法则是返回符合Selector的列表 , 相当于querySelectorAll 。
下面我们就来看看它的用法:
async def main():browser = await launch()page = await browser.newPage()await page.goto('https://movie.douban.com/chart')await page.waitForSelector('table .item')j1 = await page.J('table .item')j2 = await page.querySelector('table .item')jj1 = await page.JJ('table .item')jj2 = await page.querySelectorAll('table .item')print('J Result: ', j1)print('querySelector Result: ', j2)print('JJ Result: ', jj1)print('querySelectorAll Result: ', jj2)await browser.close()我们分别使用J、JJ、querySelector、querySelectorAll四个方法 , 看一下他们的输出结果:
J Result:<pyppeteer.element_handle.ElementHandle object at 0x1147734d0>querySelector Result:<pyppeteer.element_handle.ElementHandle object at 0x114788c50>JJ Result:[<pyppeteer.element_handle.ElementHandle object at 0x1147324d0>, <pyppeteer.element_handle.ElementHandle object at 0x114732a50>, <pyppeteer.element_handle.ElementHandle object at 0x11472aa90>, <pyppeteer.element_handle.ElementHandle object at 0x11472a110>, <pyppeteer.element_handle.ElementHandle object at 0x11472a0d0>, <pyppeteer.element_handle.ElementHandle object at 0x11478d210>, <pyppeteer.element_handle.ElementHandle object at 0x11478d290>, <pyppeteer.element_handle.ElementHandle object at 0x11478d2d0>, <pyppeteer.element_handle.ElementHandle object at 0x11478d250>, <pyppeteer.element_handle.ElementHandle object at 0x11478d310>]querySelectorAll Result:[<pyppeteer.element_handle.ElementHandle object at 0x114786690>, <pyppeteer.element_handle.ElementHandle object at 0x114786750>, <pyppeteer.element_handle.ElementHandle object at 0x114781610>, <pyppeteer.element_handle.ElementHandle object at 0x114781fd0>, <pyppeteer.element_handle.ElementHandle object at 0x114781b10>, <pyppeteer.element_handle.ElementHandle object at 0x11478dd50>, <pyppeteer.element_handle.ElementHandle object at 0x11478ddd0>, <pyppeteer.element_handle.ElementHandle object at 0x11478de10>, <pyppeteer.element_handle.ElementHandle object at 0x11478dd90>, <pyppeteer.element_handle.ElementHandle object at 0x11478de50>]从结果中可以看出来 , J和querySelector返回单个对象 , JJ和querySelectorAll返回多个对象


推荐阅读