Pyppeteer 是一个基于 Chrome DevTools Protocol 的 Python 库,可以用于控制无头 Chrome 或 Chromium 浏览器,实现自动化测试、数据爬取、屏幕截图等功能。除了模拟鼠标操作和拖动元素外,Pyppeteer 还提供了许多其他的功能,包括:
页面操作:可以使用 page.goto() 方法打开网页,使用 page.click() 方法模拟鼠标点击,使用 page.type() 方法模拟键盘输入等。
元素操作:可以使用 page.querySelector() 方法和 page.querySelectorAll() 方法查找元素,使用 elementHandle.click() 方法模拟鼠标点击,使用 elementHandle.type() 方法模拟键盘输入等。
文件上传:可以使用 elementHandle.uploadFile() 方法上传文件,也可以使用 page.waitForFileChooser() 方法等待文件选择器出现,并使用 fileChooser.accept() 方法选择文件上传。
页面截图:可以使用 page.screenshot() 方法对页面进行截图,并可以指定截图区域、截图格式等参数。
网络请求:可以使用 page.setRequestInterception() 方法拦截网络请求,并可以使用 request.respond() 方法模拟请求的响应。
JavaScript 执行:可以使用 page.evaluate() 方法执行 JavaScript 代码,并可以在代码中访问页面的 DOM 元素和 JavaScript 对象。
PDF 生成:可以使用 page.pdf() 方法生成 PDF 文件,并可以指定页面大小、页面方向、页边距等参数。
以上是 Pyppeteer 的一些常用功能,Pyppeteer 还提供了许多其他的 API 和功能,可以根据具体需求进行使用。需要注意的是,Pyppeteer 的 API 和 Chrome DevTools Protocol 的 API 是一一对应的,因此可以参考 Chrome DevTools Protocol 的文档进行学习和使用。
pyppeteer的使用方法总结
Pyppeteer 是一个用 Python 操作 Headless Chrome 浏览器的工具,它提供了对 Chrome DevTools 协议的高级封装,可以方便地实现对浏览器的控制、页面的操作和数据的抓取。以下是 Pyppeteer 的使用方法总结:
1、安装 Pyppeteer
使用 pip 命令安装 Pyppeteer:
pip install pyppeteer
2、启动浏览器
通过 pyppeteer.launch 函数启动浏览器:
import asyncio
from pyppeteer import launch
async def main():
browser = await launch(headless=False) # 设置headless为False以显示浏览器
page = await browser.newPage()
await page.goto('https://www.google.com')
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
在这个例子中,我们创建了一个asyncio的事件循环,并使用pyppeteer的launch()方法连接到Chrome浏览器。然后我们创建了一个新的页面,并使用goto()方法导航到Google的主页。最后,我们使用close()方法关闭浏览器。
3、控制页面
可以通过 page 对象控制页面,例如模拟键盘输入、鼠标点击等操作:
# 模拟键盘输入
await page.type('#kw', 'Hello, World!')
# 点击搜索按钮
await page.click('#su')
# 等待页面加载完成
await page.waitForNavigation()
4、获取页面内容
可以通过 page 对象获取页面内容,例如获取元素的文本、属性、截图等:
# 获取元素的文本
text = await page.querySelectorEval('#content_left h3', 'node => node.innerText')
print(text)
# 获取元素的属性
href = await page.querySelectorEval('#content_left h3 a', 'node => node.getAttribute("href")')
print(href)
# 截取页面截图
await page.screenshot({'path': 'example.png'})
5、使用 Cookie
可以通过 page 对象管理页面的 Cookie,例如设置、获取、清除 Cookie:
# 设置 Cookie
await page.setCookie({'name': 'name', 'value': 'value', 'domain': 'example.com'})
# 获取 Cookie
cookies = await page.cookies()
print(cookies)
# 清除 Cookie
await page.deleteCookie({'name': 'name'})
await page.deleteCookies()
6、处理 JavaScript
可以通过 page 对象执行页面上的 JavaScript 代码:
# 执行 JavaScript 代码
result = await page.evaluate('1 + 2')
print(result)
# 注入 JavaScript 代码
await page.evaluate('console.log("Hello, World!")')
7、延迟加载
可以通过 page.waitFor 系列函数实现延迟加载,例如等待元素出现、等待元素隐藏、等待 XPath 表达式等:
# 等待元素出现
await page.waitFor('#element')
# 等待元素隐藏
await page.waitFor('#element', hidden=True)
# 等待 XPath 表达式
await page.waitForXPath('//div[@class="example"]')
8、页面事件
可以通过 page 对象模拟页面事件,例如触发表单提交、触发键盘事件、触发鼠标事件等
# 提交表单
await page.evaluate('document.forms[0].submit()')
# 触发键盘事件
await page.keyboard.press('Enter')
# 触发鼠标事件
await page.mouse.click(10, 10)
9、通过调试模式操作浏览器
async def main():
# 连接到已经打开的浏览器 data_dic["webSocketDebuggerUrl"]为调试的编号,可以通过 http://localhost:9222/json/version获取
browser = await connect({'browserWSEndpoint': '%s'%data_dic["webSocketDebuggerUrl"]})
page = await browser.newPage()
await page.setViewport({'width': 1200, 'height': 800})
await page.goto('https://baidu.com')
await page.screenshot({'path': 'example.png'})
time.sleep(3)
await page.type('#kw',"您好")
await page.click('#su')
# await browser.close()
asyncio.get_event_loop().run_until_complete(main())
10、设置浏览器窗口大小和位置
可以通过 pyppeteer.launch 函数的 args 参数来设置浏览器窗口的大小和位置:
import asyncio
from pyppeteer import launch
async def main():
browser = await launch(args=['--window-size=1366,768', '--window-position=0,0'])
page = await browser.newPage()
await page.goto('https://www.baidu.com')
await browser.close()
asyncio.run(main())
11、使用代理服务器
可以通过 pyppeteer.launch 函数的 args 参数来使用代理服务器访问网站:
import asyncio
from pyppeteer import launch
async def main():
browser = await launch(args=['--proxy-server=127.0.0.1:8080'])
page = await browser.newPage()
await page.goto('https://www.baidu.com')
await browser.close()
asyncio.run(main())
12、禁止加载图片和 CSS
可以通过 pyppeteer.launch 函数的 args 参数来禁止加载图片和 CSS:
import asyncio
from pyppeteer import launch
async def main():
browser = await launch(args=['--blink-settings=imagesEnabled=false'])
page = await browser.newPage()
await page.goto('https://www.baidu.com')
await browser.close()
asyncio.run(main())
13、处理弹出窗口
可以通过监听 page 对象的 dialog 事件来处理弹出窗口:
import asyncio
from pyppeteer import launch
async def main():
browser = await launch()
page = await browser.newPage()
await page.goto('https://www.baidu.com')
# 监听弹出窗口事件
def dialog_handler(dialog):
print(dialog.type, dialog.message)
asyncio.ensure_future(dialog.dismiss())
page.on('dialog', dialog_handler)
# 点击页面上的按钮,会弹出一个提示框
await page.evaluate('alert("Hello, World!")')
await browser.close()
asyncio.run(main())
14、使用 Chrome 插件
可以通过 pyppeteer.launch 函数的 args 参数来使用 Chrome 插件,例如使用 AdBlock Plus 插件屏蔽广告:
import asyncio
from pyppeteer import launch
async def main():
browser = await launch(args=[
'--disable-extensions-except=./adblock.crx',
'--load-extension=./adblock.crx',
])
page = await browser.newPage()
await page.goto('https://www.baidu.com')
await browser.close()
asyncio.run(main())
15、使用自定义的 User-Agent
可以通过 page.setUserAgent 方法设置自定义的 User-Agent:
import asyncio
from pyppeteer import launch
async def main():
browser = await launch()
page = await browser.newPage()
# 设置自定义的 User-Agent
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36')
await page.goto('https://www.baidu.com')
await browser.close()
asyncio.run(main())
16、使用无头模式
可以通过 pyppeteer.launch 函数的 headless 参数来设置是否使用无头模式,默认为 True:
import asyncio
from pyppeteer import launch
async def main():
browser = await launch(headless=False)
page = await browser.newPage()
await page.goto('https://www.baidu.com')
await browser.close()
asyncio.run(main())
17、控制页面加载超时时间
可以通过 page.setDefaultNavigationTimeout 方法设置页面加载超时时间:
import asyncio
from pyppeteer import launch
async def main():
browser = await launch()
page = await browser.newPage()
# 设置页面加载超时时间为 10 秒
await page.setDefaultNavigationTimeout(10000)
await page.goto('https://www.baidu.com')
await browser.close()
asyncio.run(main())
18、使用 XPath 表达式
可以通过 page.xpath 方法使用 XPath 表达式选择元素
import asyncio
from pyppeteer import launch
async def main():
browser = await launch()
page = await browser.newPage()
await page.goto('https://www.baidu.com')
# 使用 XPath 表达式选择元素
element = await page.xpath('//div[@id="wrapper"]')
print(element)
await browser.close()
asyncio.run(main())
19、获取元素坐标,模拟人工拖动 随机延时
方法未人工完全验证,需要测试后具体调整细节
首先,我们可以通过 JavaScript 的 getBoundingClientRect() 方法获取元素的位置和大小信息。该方法返回的是一个包含 top、right、bottom、left、width 和 height 属性的对象,分别表示元素的上边界、右边界、下边界、左边界、宽度和高度。然后,可以通过 Pyppeteer 的 page.mouse 对象来模拟鼠标拖动操作,包括按下鼠标、拖动鼠标和释放鼠标。其中,按下鼠标和释放鼠标的方法分别是 down 和 up,拖动鼠标的方法是 move。延时可以使用 Python 的 time.sleep() 方法进行实现,可以使用 random 模块生成随机的延时时间。
下面是一个示例代码,演示如何使用 Pyppeteer 模拟人工拖动元素:
import asyncio
import random
import time
from pyppeteer import launch
async def drag_element(page, selector):
# 获取元素的位置和大小信息
elem = await page.querySelector(selector)
box = await elem.boundingBox()
x = box['x']
y = box['y']
width = box['width']
height = box['height']
# 鼠标按下
await page.mouse.down(x + width / 2, y + height / 2)
# 随机延时
await asyncio.sleep(random.uniform(0.1, 0.3))
# 鼠标拖动
await page.mouse.move(x + width / 2 + 50, y + height / 2 + 50, options={'steps': 10})
# 随机延时
await asyncio.sleep(random.uniform(0.1, 0.3))
# 鼠标释放
await page.mouse.up()
async def main():
browser = await launch()
page = await browser.newPage()
await page.goto('https://www.baidu.com')
await drag_element(page, '#su')
# 关闭浏览器
await browser.close()
asyncio.run(main())
在上面的示例中,我们首先打开百度搜索页面,然后通过 drag_element 函数模拟人工拖动搜索按钮。该函数接受两个参数:page 表示页面对象,selector 表示要拖动的元素的 CSS 选择器。在函数内部,我们先获取元素的位置和大小信息,然后按下鼠标、拖动鼠标和释放鼠标,期间使用 asyncio.sleep() 方法随机延时,模拟人工拖动快慢速度。最后,我们调用 drag_element 函数对搜索按钮进行拖动。
20、禁用js
# 禁用JavaScript
await page.setJavaScriptEnabled(False)
21、pyppeteer中 几种等待的区别waitForNavigation(),waitForNavigation(),waitForSelector(),waitForXPath()的区别
waitForNavigation():等待页面的主要导航完成,即页面URL的变化。主要用于等待页面的跳转和刷新等操作完成。如果页面中使用了 AJAX 或者其他异步加载的方式,可能会导致页面URL不会变化,此时 waitForNavigation() 方法会一直等待,直到超时报错。
waitForSelector():等待页面中指定的元素出现。主要用于等待页面异步加载的元素出现,例如在使用 AJAX 加载数据时,页面中的某些元素需要等待异步加载完成才会出现。
waitForXPath():等待页面中指定的 XPath 表达式所匹配的元素出现。与 waitForSelector() 类似,但是可以使用更复杂的 XPath 表达式来选择元素。
waitFor():等待指定的时间或者指定的条件。可以用于等待页面的加载、元素的出现、特定条件的满足等。
以上方法都是 Puppeteer 库中的等待方法,用于等待页面或者元素加载完成。具体使用哪个方法,取决于具体需要等待的内容。
js pyppeteer子元素获取
'''可以使用querySelectorAll()方法获取'#primaryInfo > div > div.overview'下的所有子元素,然后使用evaluate()方法获取每个子元素的innerText属性,最后打印出来。'''
elements = await target_page.querySelectorAll('#primaryInfo > div > div.overview > *')
for element in elements:
content = await target_page.evaluate('(element) => element.innerText', element)
print(content)
querySelector 判断元素是否存在,不存在返回None
is_element = await page.querySelector('''
#sd-body > section > section > main > section > main > div > div.ant-card.sd-has-table > div > div > div.ant-table-wrapper > div > div > div > div > div > table > tbody
''')
if is_element is None:
print('没有检测到需要下载的数据')
win32api.MessageBox(0, '没有需要下载的文件,点击确认后退出程序', '提醒', win32com.MB_OK)
exit()
pyppeteer是一个基于asyncio和Chrome DevTools Protocol(CDP)的Python库,可以通过CDP连接到Chrome浏览器实例,并通过Python代码控制浏览器。与playwright类似,pyppeteer也是使用WebSocket连接来与浏览器进行通信的。
在使用pyppeteer连接浏览器时,需要使用webSocketDebuggerUrl参数来指定WebSocket连接的URL。这个URL通常是以ws://或wss://开头,后面跟着浏览器的地址和端口号。例如:
import asyncio
from pyppeteer import launch
async def main():
browser = await launch(
headless=False,
args=['--disable-infobars'],
executablePath='C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
userDataDir='C:\\Users\\UserName\\AppData\\Local\\Google\\Chrome\\User Data',
timeout=0,
ignoreHTTPSErrors=True,
dumpio=True,
logLevel='INFO',
devtools=False,
autoClose=False,
handleSIGINT=True,
handleSIGTERM=True,
handleSIGHUP=True,
env={},
slowMo=0,
ignoreDefaultArgs=False,
appMode=False,
remoteDebuggingPort=9222, # 用于连接浏览器的端口号
)
page = await browser.newPage()
await page.goto("https://www.baidu.com")
await asyncio.sleep(5)
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
在上述代码中,我们通过launch()方法来启动一个Chrome浏览器实例,并指定了一个remoteDebuggingPort参数来指定连接浏览器时使用的端口号。在launch()方法执行后,我们可以通过browser.newPage()方法来创建一个新的浏览器页面,并通过page.goto()方法来导航到指定的URL。在这里,我们并没有使用webSocketDebuggerUrl参数来连接浏览器,而是使用了remoteDebuggingPort参数来指定连接端口号。这是因为pyppeteer库会自动使用指定的端口号来构造WebSocket连接的URL,因此我们不需要手动指定webSocketDebuggerUrl参数。