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