🥳加入Scrapeless 社区申请免费试用以访问我们强大的网页抓取工具包!
返回博客

如何使用 Pyppeteer 和代理服务器

James Thompson
James Thompson

Scraping and Proxy Management Expert

18-Sep-2024

为了避免在网页抓取过程中被封禁,将 HTTP 请求路由到多个 IP 地址至关重要。因此,在本教程中,我们将学习如何构建 Pyppeteer 代理!

先决条件

确保您的本地系统运行的是 Python 3.6 或更高版本。

接下来,使用 pip 从 PyPI 安装 Pyppeteer,执行以下命令行:

language Copy
pip install pyppeteer

您是否厌倦了持续的网页抓取阻止?

Scrapeless:最好的在线抓取一体化解决方案!

使用我们的智能、高性能代理轮换保持匿名并避免基于 IP 的封禁:

免费试用!

如何使用 Pyppeteer 作为代理

首先,编写脚本 scraper.pyident.me 请求您当前的 IP 地址。

language Copy
import asyncio
from pyppeteer import launch
 
async def main():
    # 创建一个新的无头浏览器实例
    browser = await launch()
    # 创建一个新页面
    page = await browser.newPage()
    # 导航到目标网站
    await page.goto('https://ident.me')
    # 选择 body 元素
    body = await page.querySelector('body')
    # 获取所选元素的文本内容
    content = await page.evaluate('(element) => element.textContent', body)
    # 导出结果
    print(content)
    await browser.close()
 
asyncio.get_event_loop().run_until_complete(main())

要获取目标页面的 body 内容,请运行该脚本。

language Copy
python scraper.py

现在,更新您的脚本以包含 Pyppeteer 代理。为此,请从 FreeProxyList 获取一个免费代理(您可能无法使用我们使用的代理)。

scraper.py 脚本使用 launch() 函数,该函数打开一个新的浏览器实例,并允许您传入某些参数。将 --proxy-server 参数设置为 args 以告诉浏览器通过代理路由 Pyppeteer 请求。args 是一个发送到浏览器进程的额外参数列表。

language Copy
# ...
async def main():
    # 创建一个新的无头浏览器实例
    browser = await launch(args=['--proxy-server=http://20.219.108.109:8080'])
    # 创建一个新页面
    page = await browser.newPage()
# ...

这是完整代码:

language Copy
import asyncio
from pyppeteer import launch
 
async def main():
    # 创建一个新的无头浏览器实例
    browser = await launch(args=['--proxy-server=http://20.219.108.109:8080'])
    # 创建一个新页面
    page = await browser.newPage()
    # 导航到目标网站
    await page.goto('https://ident.me')
    # 选择 body 元素
    body = await page.querySelector('body')
    # 获取所选元素的文本内容
    content = await page.evaluate('(element) => element.textContent', body)
    # 导出结果
    print(content)
    await browser.close()
 
asyncio.get_event_loop().run_until_complete(main())

这次,当您再次使用命令行选项 python scraper.py 运行脚本时,您的代理的 IP 地址应该会显示在屏幕上。

language Copy
20.219.108.109

通过代理进行 Pyppeteer 身份验证

如果您使用的是高级代理,则需要用户名和密码进行身份验证。为此,请使用 --proxy-auth 参数。

language Copy
# ...
    # 创建一个新的无头浏览器实例
    browser = await launch(args=[
        '--proxy-server=http://20.219.108.109:8080'
        '--proxy-auth=<您的用户名>:<您的密码>'
        ])
# ...

或者,您可以使用页面 API 进行身份验证,如下所示:

language Copy
# ...
    # 创建一个新页面
    page = await browser.newPage()
    await page.authenticate({ 'username': '<您的用户名>', 'password': '<您的密码>' })
# ...

使用 Pyppeteer 配置动态代理

为了避免被列入黑名单,您必须为网络抓取使用动态代理,而不是以前使用的静态代理。使用 Pyppeteer,您可以创建多个浏览器实例,每个实例都有唯一的代理设置。

首先,获取更多免费代理并编译一个列表:

language Copy
# ...
import random
 
proxies = [
'http://20.219.108.109:8080',
'http://210.22.77.94:9002',
'http://103.150.18.218:80',
]
# ...

接下来,编写一个异步函数,该函数使用一个接受代理作为参数的异步函数向 ident.me 发出 Pyppeteer 请求:

language Copy
# ...
async def init_pyppeteer_proxy_request(url):
    # 创建一个新的无头浏览器实例
    browser = await launch(args=[
        f'--proxy-server={url}',
        ])
    # 创建一个新页面
    page = await browser.newPage()
    # 导航到目标网站
    await page.goto('https://ident.me')
    # 选择 body 元素
    body = await page.querySelector('body')
    # 获取所选元素的文本内容
    content = await page.evaluate('(element) => element.textContent', body)
    # 导出结果
    print(content)

现在,修改 main() 函数,使其通过随机选择的代理调用新构造的函数:

language Copy
# ...
async def main():
    for i in range(3):
        await init_pyppeteer_proxy_request(random.choice(proxies))
# ...

这是你的代码目前应该的样子:

language Copy
import asyncio
from pyppeteer import launch
import random
 
proxies = [
'http://20.219.108.109:8080',
'http://210.22.77.94:9002',
'http://103.150.18.218:80',
]
 
async def init_pyppeteer_proxy_request(url):
    # 创建一个新的无头浏览器实例
    browser = await launch(args=[
        f'--proxy-server={url}',
        ])
    # 创建一个新页面
    page = await browser.newPage()
    # 导航到目标网站
    await page.goto('https://ident.me')
    # 选择主体元素
    body = await page.querySelector('body')
    # 获取所选元素的文本内容
    content = await page.evaluate('(element) => element.textContent', body)
    # 转储结果
    print(content)
    await browser.close()
 
async def main():
    for i in range(3):
        await init_pyppeteer_proxy_request(random.choice(proxies))
    
 
asyncio.get_event_loop().run_until_complete(main())

将请求构建器生成的 Python 爬虫代码放入一个新文件中后,安装 Python Requests(或任何其他 HTTP 请求库):

language Copy
pip install requests

现在你的爬虫正在运行,OpenSea 的 HTML 页面将被抓取并显示在控制台上。

结论

使用 Pyppeteer 和代理可以大大提高你的网络爬虫成功率,你现在知道了如何使用静态和动态代理发送请求。

你还发现了一个不同的工具可以更快更准确地完成任务。如果你需要大规模地抓取数据,而不必担心基础设施,并且有更大的把握获得你需要的數據,那么来自 Scrapeless 的网络爬虫工具可能是你的盟友。

在Scrapeless,我们仅访问公开数据,同时严格遵守适用的法律、法规和网站隐私政策。 本博客内容仅用于演示目的,不涉及任何非法或侵权行为。 对于使用本博客或第三方链接的信息,我们不做任何保证,也不承担任何责任。 在参与任何抓取活动之前,请咨询您的法律顾问并查看目标网站的服务条款或获取必要的权限。

最受欢迎的文章

目录