Pyppeteer 是一个 Python 库,可以控制无头 Chrome 或 Chromium 浏览器,并在网页加载过程中加载扩展来增强浏览器功能。Pyppeteer 提供了一个 API,让您可以与无头浏览器交互,完成网页抓取、自动化测试、网页截图或 PDF 生成等任务。加载扩展的功能可以让您在浏览器导航到网页时,运行自定义的 JavaScript 代码,从而改变浏览器的行为。您可以在页面加载之前对页面进行操作,例如修改 DOM(文档对象模型)、拦截网络请求、注入其他脚本等。一些常见的加载扩展的用例有:
- 网络请求拦截:您可以修改页面发出的网络请求或响应,实现自定义的请求处理逻辑、阻止某些请求或向请求中添加额外数据。
- 页面内容修改:您可以在加载过程中改变页面的 DOM,删除或更改元素、修改 HTML、CSS 或 JavaScript 代码等。
- 附加功能注入:您可以添加自定义的 JavaScript 代码,在加载页面的上下文中运行,执行特定操作或与页面内容交互。
总之,Pyppeteer 的加载扩展功能可以让您扩展浏览器功能并自定义网页加载时的行为,实现更强大、更灵活的自动化和 Web 内容交互。要使用这个功能,您需要在启动浏览器时指定扩展路径,并使用 --disable-extensions-except 和 --load-extension 标志。例如:
代码语言:python代码运行次数:0复制import asyncio
from pyppeteer import launch
from pyppeteer_stealth import stealth
# 定义扩展路径,用于屏蔽广告、图片和视频
extension_path = "C:\Users\PC_USER\AppData\Local\BraveSoftware\Brave-Browser\User Data\Default\Extensions\ofjjanaennfbgpccfpbghnmblpdblbef\1.3_0"
# 亿牛云 爬虫代理加强版
# 定义 代理IP用户名、密码、主机、端口
proxy_username = "16YUN"
proxy_password = "16IP"
proxy_ip = "www.16yun.cn"
proxy_port = "31000"
# 定义一个异步函数,用于采集头条网站的新闻标题
async def scrape_toutiao():
# 启动浏览器,加载扩展,并设置代理 IP
browser = await launch({
'headless': False,
'slowMo': 5,
'options': {
'args': [
f'--disable-extensions-except={extension_path}',
f'--load-extensions={extension_path}',
'--enable-automation',
'--start-maximized',
'--hide-scrollbars',
'--disable-bundled-ppapi-flash',
'--mute-audio',
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-gpu',
f'--proxy-server=http://{proxy_ip}:{proxy_port}' #代理IP地址和端口 ]
},
'defaultViewport': None
})
# 创建一个新页面,并使用 stealth 模式
page = await browser.newPage()
await stealth(page)
# 导航到头条网站,并等待页面加载完成
await page.goto('https://www.toutiao.com', {'waitUntil': 'networkidle2'})
# 输入代理 IP 的用户名和密码,并点击确认按钮
await page.type('#username', proxy_username)
await page.type('#password', proxy_password)
await page.click('#confirm')
# 获取页面中的新闻标题元素,并提取文本内容
titles = await page.evaluate('''() => {
let elements = document.querySelectorAll('.title-box a')
let titles = []
for (let element of elements) {
titles.push(element.innerText)
}
return titles
}''')
# 打印前 100 个新闻标题
for i, title in enumerate(titles[:100]):
print(f'{i 1}. {title}')
# 关闭浏览器
await browser.close()
# 运行异步函数
asyncio.get_event_loop().run_until_complete(scrape_toutiao())