pyppeteer用法总结

Pyppeteer异步爬虫实战
本文介绍如何使用Pyppeteer进行异步网页爬取,包括浏览器实例化、页面操作、元素定位及交互,同时展示了如何处理验证码及获取cookies等高级功能。

pypeteer基于asyncio异步模块

基本使用

导入模块

from pyppeteer import launch

实例化一个浏览器

browser = await launch() # 实例化一个浏览器对象
# browser = await launch({'headless':False,'dumpio':True,'ignoreDefaultArgs':['--enable-automation']})

实例化一个页面

page = await self.browser.newPage()

页面打开网站

await page.goto('https://www.baidu.com/',{'timeout':100*1000})

定位页面元素

ele = (await page.xpath('//div[text()="免密码登录"]'))[0]
await ele.click() # 点击页面元素

输入框中输入内容

await page.type('input[name=username]',uname,{'delay':100})

获取元素属性值

check = await page.Jeval('img[alt=图形验证码]','node => node.getAttribute("src")')

获取cookies

cookies = await page.evaluate('document.cookie',force_expr=True)
示例
import asyncio
from pyppeteer import launch
import traceback

class Spider:
    def __init__(self):
        self.browser = None
        self.regist_url = 'https://www.zhihu.com/signin?next=%2F'
        


    def input_time_random(self):
        return randint(100, 151)

    async def registered(self,unames:tuple):
        if not self.browser:
            self.browser = await launch({'headless':False,'dumpio':True,'ignoreDefaultArgs':['--enable-automation']})
        
        for uname in unames:
            try:
                page = await self.browser.newPage()
                

                await page.goto(self.regist_url,{'timeout':100*1000})
                # 选择免密码登录
                await (await page.xpath('//div[text()="免密码登录"]'))[0].click()
                await asyncio.sleep(1)

                # 输入用户名
                await page.type('input[name=username]',uname,{'delay': self.input_time_random() - 50})
                check = await page.Jeval('img[alt=图形验证码]','node => node.getAttribute("src")')
                print('check',check)
                # # check = await page.evaluate('img[alt=图形验证码].getAttribute("src")', force_expr=True)
                if 'null' not in check:
                     pass # 打码平台
                    
                # 点击获取验证码
                await (await page.xpath('//button[text()="获取短信验证码"]'))[0].click()
                await asyncio.sleep(60)
                cookies = await page.evaluate('document.cookie',force_expr=True)
                print('cookies',cookies)
            except:
                traceback.print_exc()


    async def run(self):
        self.browser = await launch({'headless':False,'dumpio':True,'ignoreDefaultArgs':['--enable-automation']})
        
        tasks = []
        for i in range(1):
            tasks.append(asyncio.create_task(self.registered(('XXXXX',))))


        await asyncio.wait(tasks)

if __name__=="__main__":
    spider = Spider()

    asyncio.run(spider.run())


<think>好的,用户的问题是关于如何在Pyppeteer中切换iframe。首先,我需要回忆一下Pyppeteer的相关知识,毕竟之前接触过一些。Pyppeteer是Python的一个无头浏览器库,基于Chromium,主要用于自动化操作和爬虫。处理iframe的问题在前端自动化中比较常见,因为很多网页会使用iframe来嵌入其他内容。 用户提到了参考资料的几个引用,都是关于Selenium切换iframe的方法,比如通过name、id或者WebElement来切换。但用户现在想用Pyppeteer,所以需要找出对应的Pyppeteer方法。首先,我得确认Pyppeteer处理iframe的方式是否和Selenium类似。根据记忆,Pyppeteer使用的是Page对象的方法,可能需要通过XPath或CSS选择器来定位iframe元素,然后获取对应的Frame对象进行操作。 接下来,我应该验证具体的步骤。首先,加载页面后,用户需要找到目标iframe元素。Pyppeteer中可以使用page.querySelector()或者page.xpath()来获取元素句柄。然后,获取该iframe对应的Frame对象。可能需要使用contentFrame()方法,这个方法可以将元素句柄转换为Frame对象。之后,切换到该Frame,就可以在iframe内部进行操作了。 另外,处理完iframe内的操作后,如何切换回主文档?在Selenium中是使用switch_to.default_content(),Pyppeteer中可能需要通过page对象直接操作,或者切换回主Frame。可能需要使用page.mainFrame来返回到顶层。 需要确保步骤正确,比如获取iframe元素,转换成Frame,然后执行操作。可能还需要处理异步的问题,因为Pyppeteer是基于asyncio的,所有操作都需要await。用户提供的示例代码中可能有同步写法,需要调整为异步方式。 还要考虑错误处理,比如如果iframe不存在或者加载失败的情况。可能需要添加等待,确保iframe加载完成后再进行操作,比如使用page.waitForSelector()或者page.waitForXPath()。 最后,是否需要生成相关问题?根据用户之前的示例,需要生成三个相关问题。可能包括如何处理多个iframe、如何切换回主Frame,以及如何处理动态加载的iframe。这些问题可以帮助用户进一步理解Pyppeteer中iframe的操作。 总结步骤:定位iframe元素,获取Frame对象,执行操作,切换回主Frame。需要将这些步骤用Pyppeteer的语法正确表达,并确保示例代码正确无误。同时,引用用户提供的资料中的方法,但注意这些资料是关于Selenium的,所以需要明确说明Pyppeteer的不同之处。</think>在 Pyppeteer 中切换 iframe 主要通过定位 iframe 元素并获取其对应的 `Frame` 对象实现。以下是具体步骤: --- ### **1. 定位 iframe 元素** 使用 CSS 选择器或 XPath 定位目标 iframe,例如: ```python # 通过 CSS 选择器定位 iframe_element = await page.querySelector('iframe[name="login_frame_qq"]') # 或通过 XPath 定位 iframe_element = await page.xpath('//iframe[@name="login_frame_qq"]') iframe_element = iframe_element[0] # XPath 返回列表,取第一个元素 ``` --- ### **2. 获取 iframe 的 Frame 对象** 通过 `contentFrame()` 方法将元素转换为 `Frame` 对象: ```python iframe_frame = await iframe_element.contentFrame() ``` --- ### **3. 在 iframe 内操作** 切换到 iframe 后,所有操作将在其上下文中执行: ```python # 在 iframe 内输入文本 await iframe_frame.type('#input_02', 'Hello Pyppeteer') # 点击 iframe 内的按钮 await iframe_frame.click('#submit_btn') ``` --- ### **4. 切换回主文档** 操作完成后,通过以下方式返回主文档: ```python # 回到顶层 Frame await page.mainFrame() ``` --- ### **完整示例** ```python import asyncio from pyppeteer import launch async def switch_iframe(): browser = await launch(headless=False) page = await browser.newPage() await page.goto('http://example.com') # 定位 iframe iframe_element = await page.querySelector('iframe[name="login_frame_qq"]') iframe_frame = await iframe_element.contentFrame() # 在 iframe 内操作 await iframe_frame.type('#input_02', 'test@example.com') await iframe_frame.click('#login_button') # 返回主文档 await page.mainFrame() await browser.close() asyncio.get_event_loop().run_until_complete(switch_iframe()) ``` --- ### **注意事项** 1. **异步操作**:所有 Pyppeteer 方法需配合 `await` 使用。 2. **iframe 加载等待**:若 iframe 动态加载,需先等待其存在: ```python await page.waitForSelector('iframe[name="login_frame_qq"]') ``` 3. **多层 iframe**:若存在嵌套 iframe,需逐层切换[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值