Pyppeteer与selenium的区别及示例
原创Pyppeteer和selenium都是用于浏览器自动化的工具,可以用来测试、爬取或操作网页。它们都支持多种编程语言,可以跨平台运行,并提供了丰富的API和文档。
Pyppeteer是puppeteer的Python版本,puppeteer是一个基于Node.js的库,可以控制无头或有头的Chrome或Chromium浏览器。Pyppeteer使用了asyncio库来实现异步编程,可以提高性能和效率。Pyppeteer还可以利用puppeteer的特性,如生成PDF、截图、拦截请求等。
selenium是一个更成熟和广泛使用的浏览器自动化项目,它可以控制多种浏览器,如Chrome、Firefox、Edge等。selenium遵循了W3C WebDriver标准,可以让用户编写可互换的代码,适应不同的浏览器环境。selenium还提供了一个分布式服务器,称为Grid,可以在多台机器上并行运行测试。
Pyppeteer和selenium的区别和优点主要有以下几点:
- Pyppeteer只能控制Chrome或Chromium浏览器,而selenium可以控制多种浏览器。这意味着Pyppeteer可能更适合针对Chrome或Chromium的特定功能或优化,而selenium可能更适合跨浏览器的兼容性测试。
- Pyppeteer使用了asyncio库来实现异步编程,而selenium通常使用同步编程。这意味着Pyppeteer可能更能利用CPU和内存资源,提高并发性和响应速度,而selenium可能更容易编写和理解。
- Pyppeteer可以直接调用puppeteer的API和功能,而selenium需要依赖于浏览器驱动程序(如chromedriver、geckodriver等)来实现通信和控制。这意味着Pyppeteer可能更灵活和强大,能够访问更多的浏览器内部信息和操作,而selenium可能更稳定和标准化,能够避免一些版本或兼容性的问题。
- Pyppeteer是一个相对较新的项目,还在不断更新和完善中,而selenium是一个相对较旧的项目,已经有了很多用户和社区支持。这意味着Pyppeteer可能更有创新和潜力,能够跟随puppeteer的发展趋势,而selenium可能更有经验和信誉,能够提供更多的教程和解决方案。
例如采集美团的商家信息和评论,用Pyppeteer的代码示例如下:
import asyncio
from pyppeteer import launch
import pandas as pd
# 亿牛云(动态转发隧道代理)爬虫代理加强版 设置用户名、密码、地址和端口
proxy_user = "16YUN"
proxy_pass = "16IP"
proxy_host = "www.16yun.cn"
proxy_port = "3100"
# 设置采集的网址和页数
url = "https://meishi.meituan.com/i/?ci=1&stid_b=1&cevent=imt%2Fhomepage%2Fcategory1%2F1"
pages = 5
# 定义一个函数,用来获取每个商家的名称和评论
async def get_info(page):
# 等待页面加载完成
await page.waitForSelector(".list-ul")
# 获取所有商家的元素
shops = await page.querySelectorAll(".list-item")
# 定义一个空列表,用来存储数据
data = []
# 遍历每个商家
for shop in shops:
# 获取商家的名称
name = await page.evaluate("(element) => element.querySelector('.title').textContent", shop)
# 获取商家的评论数
comments = await page.evaluate("(element) => element.querySelector('.comment-num').textContent", shop)
# 去掉空格和换行符
name = name.strip()
comments = comments.strip()
# 把数据添加到列表中
data.append([name, comments])
# 返回数据列表
return data
# 定义一个函数,用来采集多页的数据,并整理归类
async def scrape(url, pages):
# 启动浏览器,设置代理服务器和无头模式
browser = await launch({"args": [f"--proxy-server={proxy_host}:{proxy_port}"], "headless": True})
# 新建一个页面
page = await browser.newPage()
# 设置页面视口大小
await page.setViewport({"width": 1280, "height": 800})
# 访问网址
await page.goto(url)
# 输入代理IP的用户名和密码
await page.authenticate({"username": proxy_user, "password": proxy_pass})
# 定义一个空列表,用来存储所有数据
all_data = []
# 循环采集每一页的数据
for i in range(pages):
# 调用获取信息的函数,并把返回的数据添加到总列表中
info = await get_info(page)
all_data.extend(info)
# 如果不是最后一页,就点击下一页按钮,并等待页面跳转
if i < pages - 1:
next_button = await page.querySelector(".pagination-item.next")
await next_button.click()
await page.waitForNavigation()
# 关闭浏览器
await browser.close()
# 把总列表转换成数据框,并设置列名
df = pd.DataFrame(all_data, columns=["name", "comments"])
# 把评论数转换成整数类型,并按降序排序
df["comments"] = df["comments"].astype(int)
df = df.sort_values(by="comments", ascending=False)