pyppeteer如何使用如下的代理?

我在使用代理的时候,按照这样配置

start_parm = {
                    # 启动chrome的路径
                    "executablePath": r"C:\Users\1\Desktop\spider(1)\spider\spider\chrome-win\chrome.exe",
                    # 关闭无头浏览器
                    "headless": False,
                    "dumpio": True,
                    "args": [
                        '--disable-infobars',  # 关闭自动化提示框
                        # '--window-size=1920,1080',  # 窗口大小
                        '--log-level=30',  # 日志保存等级, 建议设置越好越好,不然生成的日志占用的空间会很大 30为warning级别
                        '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',  # UA
                        '--no-sandbox',  # 关闭沙盒模
                        '--start-maximized',  # 窗口最大化模式
                        # '--proxy-server=' + f'{proxy_ip[a]["ip"]:{proxy_ip[a]["port"]}}'
                        f'--proxy-server=xxxxxx:11111',
                        'userDataDir="D:/UserData"'  # 用户文件地址
                    ],
                }

然后再await page.authenticate({'username': 'xxx', 'password': 'xxx'})
这样是OK的。
但是,由于我想使用的是隧道代理,代理有多个通道,用requests库是这样的实例代码:

import requests
proxyAddr = ""
authKey = ""
password = ""
proxyUrl = "http://%(user)s:%(password)s:%(channel)s@%(server)s" % {
    "user": authKey,
    "password": password,
    "channel": "channel-1",
    "server": proxyAddr,
}
proxies = {
    "http": proxyUrl,
    "https": proxyUrl,
}
resp = requests.get("https://ip.cn/api/index?ip=&type=0", proxies=proxies)
print(resp.text)

多了一个参数channel,如果直接把proxy-server改成proxyUrl会报错,net::ERR_NO_SUPPORTED_PROXIES
而如果这样

await page.authenticate({'username': 'xxx', 'password': 'xxx', 'channel': 'channel-1'})
await page2.authenticate({'username': 'xxx', 'password': 'xxx', 'channel': 'channel-2'})

,看似能连着用,但实际上无法使用1和2两个通道,都是用的隧道代理中默认的channel-1。
请pyppetter问该如何使用同一个代理服务器的多个通道呢?

阅读 3.2k
1 个回答
import asyncio
from pyppeteer import launch

async def main():
    browser1 = await launch(args=['--proxy-server=http://proxyserver:port'])
    page1 = await browser1.newPage()
    await page1.authenticate({'username': 'user1', 'password': 'pass1'})
    await page1.goto('http://example.com')
    await page1.screenshot({'path': 'example1.png'})

    browser2 = await launch(args=['--proxy-server=http://proxyserver:port'])
    page2 = await browser2.newPage()
    await page2.authenticate({'username': 'user2', 'password': 'pass2'})
    await page2.goto('http://example.com')
    await page2.screenshot({'path': 'example2.png'})

    await browser1.close()
    await browser2.close()

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

把username、password和proxyAddr换为你实际值。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题