如何使用 Pyppeteer 和代理服务器

Scraping and Proxy Management Expert
为了避免在网页抓取过程中被封禁,将 HTTP 请求路由到多个 IP 地址至关重要。因此,在本教程中,我们将学习如何构建 Pyppeteer 代理!
先决条件
确保您的本地系统运行的是 Python 3.6 或更高版本。
接下来,使用 pip 从 PyPI 安装 Pyppeteer,执行以下命令行:
language
pip install pyppeteer
您是否厌倦了持续的网页抓取阻止?
Scrapeless:最好的在线抓取一体化解决方案!
使用我们的智能、高性能代理轮换保持匿名并避免基于 IP 的封禁:
免费试用!
如何使用 Pyppeteer 作为代理
首先,编写脚本 scraper.py
从 ident.me
请求您当前的 IP 地址。
language
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
python scraper.py
现在,更新您的脚本以包含 Pyppeteer 代理。为此,请从 FreeProxyList 获取一个免费代理(您可能无法使用我们使用的代理)。
scraper.py
脚本使用 launch()
函数,该函数打开一个新的浏览器实例,并允许您传入某些参数。将 --proxy-server
参数设置为 args
以告诉浏览器通过代理路由 Pyppeteer 请求。args
是一个发送到浏览器进程的额外参数列表。
language
# ...
async def main():
# 创建一个新的无头浏览器实例
browser = await launch(args=['--proxy-server=http://20.219.108.109:8080'])
# 创建一个新页面
page = await browser.newPage()
# ...
这是完整代码:
language
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
20.219.108.109
通过代理进行 Pyppeteer 身份验证
如果您使用的是高级代理,则需要用户名和密码进行身份验证。为此,请使用 --proxy-auth 参数。
language
# ...
# 创建一个新的无头浏览器实例
browser = await launch(args=[
'--proxy-server=http://20.219.108.109:8080'
'--proxy-auth=<您的用户名>:<您的密码>'
])
# ...
或者,您可以使用页面 API 进行身份验证,如下所示:
language
# ...
# 创建一个新页面
page = await browser.newPage()
await page.authenticate({ 'username': '<您的用户名>', 'password': '<您的密码>' })
# ...
使用 Pyppeteer 配置动态代理
为了避免被列入黑名单,您必须为网络抓取使用动态代理,而不是以前使用的静态代理。使用 Pyppeteer,您可以创建多个浏览器实例,每个实例都有唯一的代理设置。
首先,获取更多免费代理并编译一个列表:
language
# ...
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
# ...
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
# ...
async def main():
for i in range(3):
await init_pyppeteer_proxy_request(random.choice(proxies))
# ...
这是你的代码目前应该的样子:
language
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
pip install requests
现在你的爬虫正在运行,OpenSea 的 HTML 页面将被抓取并显示在控制台上。
结论
使用 Pyppeteer 和代理可以大大提高你的网络爬虫成功率,你现在知道了如何使用静态和动态代理发送请求。
你还发现了一个不同的工具可以更快更准确地完成任务。如果你需要大规模地抓取数据,而不必担心基础设施,并且有更大的把握获得你需要的數據,那么来自 Scrapeless 的网络爬虫工具可能是你的盟友。
在Scrapeless,我们仅访问公开数据,同时严格遵守适用的法律、法规和网站隐私政策。 本博客内容仅用于演示目的,不涉及任何非法或侵权行为。 对于使用本博客或第三方链接的信息,我们不做任何保证,也不承担任何责任。 在参与任何抓取活动之前,请咨询您的法律顾问并查看目标网站的服务条款或获取必要的权限。