前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pyppeteer与selenium的区别及示例

Pyppeteer与selenium的区别及示例

原创
作者头像
jackcode
发布2023-05-22 16:30:43
1.1K0
发布2023-05-22 16:30:43
举报
文章被收录于专栏:爬虫资料
亿牛云代理
亿牛云代理

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的代码示例如下:

代码语言:python
代码运行次数:0
复制
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)
    # 把数据框保存成csv文件,并打印前50行
    df.to_csv("meituan.csv", index=False)
    print(df.head(50))

# 运行采集函数,并传入网址和页数参数
asyncio.get_event_loop().run_until_complete(scrape(url, pages))

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档