用 Python 的 playwright 库 爬取 Pexels 网站的图片

一、背景介绍:为什么要爬取 Pexels 的图片?

想象一下,你正在做一份与鲜花相关的 PPT,或者你是一名电商运营,需要一批精美的花卉图片来装点你的商品页面。然而,每次手动去 Pexels 找图、下载、整理,简直太费时间了!🙄 有没有办法用 Python 实现自动下载呢?当然有!

今天我们就来聊聊如何使用 playwright,一个强大的 Python 爬虫库,来批量爬取 Pexels 网站上关于鲜花的高清图片,让你的办公效率直接起飞 🚀。


二、技术方案:用 playwright 自动化浏览器操作

在开始编码之前,我们需要明确这次爬取的核心目标:

  1. 访问 Pexels 网站https://www.pexels.com/zh-cn/)。
  2. 接受 Cookie 授权,确保正常浏览。
  3. 搜索"鲜花"关键词,获取相关图片。
  4. 获取图片的下载链接,并自动保存。
  5. 避免反爬,模拟用户浏览行为

1. 安装 playwright

如果你还没有安装 playwright,先执行以下命令:

bash 复制代码
pip install playwright
playwright install  # 安装浏览器内核

💡 为什么选 playwright

  • 支持多种浏览器(Chromium、Firefox、WebKit)。
  • 可以无头模式运行,避免占用屏幕。
  • 操作 API 直观,可以像用户一样点击、输入、滚动。

三、代码实现:自动爬取 Pexels 的鲜花图片

1. 启动浏览器并访问 Pexels

我们先写一个简单的代码,让 playwright 自动打开 Pexels 网站,接受 Cookie 并搜索"鲜花"。

python 复制代码
from playwright.sync_api import sync_playwright

def open_pexels():
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)  # 先开启可视化模式,调试方便
        page = browser.new_page()
        
        page.goto("https://www.pexels.com/zh-cn/search/鲜花/") #search后面的内容为搜索内容
        
        # 接受 Cookie
        if page.query_selector("button:has-text('接受所有')"):
            page.click("button:has-text('接受所有')")
    
        # 等待搜索结果加载
        page.wait_for_load_state("networkidle")
        
        print("搜索完成!")
        
        browser.close()

open_pexels()

运行代码后,浏览器会自动打开 Pexels 搜索"鲜花"页面,接受 Cookie 然后开始爬取图片内容。


2. 获取图片链接并下载

接下来,我们提取页面上的图片地址,并自动下载。

python 复制代码
import os
import requests
from playwright.sync_api import sync_playwright

def download_images():
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)  # 设为无头模式
        page = browser.new_page()
        page.goto("https://www.pexels.com/zh-cn/search/鲜花/")
        
        # 接受 Cookie
        if page.query_selector("button:has-text('接受所有')"):
            page.click("button:has-text('接受所有')")
        
        # 等待图片加载
        page.wait_for_selector("img[src]")
        
        # 获取图片的链接
        img_elements = page.query_selector_all("img[src]")
        img_urls = [img.get_attribute("src") for img in img_elements]
        
        # 创建存储目录
        os.makedirs("flowers", exist_ok=True)
        
        for i, url in enumerate(img_urls):
            if url.startswith("https"):
                response = requests.get(url)
                with open(f"flowers/flower_{i+1}.jpg", "wb") as f:
                    f.write(response.content)
                print(f"下载成功:flower_{i+1}.jpg")
        
        browser.close()

download_images()

💡 代码解读:

  • page.wait_for_selector("img[src]"):确保图片加载完毕。
  • query_selector_all("img[src]"):获取所有图片元素。
  • requests.get(url):下载图片并保存到 flowers/ 目录。
  • page.click("button:has-text('接受全部')"):接受 Cookie,避免弹窗影响。

运行代码后,flowers/ 目录下会出现下载好的花卉图片!🎉


四、代码优化------爬取高清图

查看下载的图片属性,我们发现图片大小普遍在50kb左右,这显然是经过压缩的,如果你对图片质量没有要求,那到这一步基本上就可以实现我们的要求了。

但是花姐要下载高清图,通过在网页上观察html格式,我们发现当鼠标悬浮在图片上以后就会出现一个下载的按钮,按钮对应的URL就是高清图的下载地址。

对应下载按钮的html如下:

html 复制代码
<a download="" title="下载" class="Button_button__RDDf5 spacing_noMargin__F5u9R  
spacing_pr20__ZH8T3  spacing_pl20__MrrA1 DownloadButton_downloadButton__0aNOo 
DownloadButton_fullButtonOnDesktop__EWWUC Button_clickable__DqoNe 
Button_responsiveButton__9BBRz
 Button_color-white__Wmgol Link_link__Ime8c spacing_noMargin__F5u9R" 
 href="https://images.pexels.com/photos/31213458/pexels-photo-31213458.jpeg?cs=srgb&amp;
 dl=pexels-andy-lee-222330306-31213458.jpg&amp;fm=jpg&amp;
 _gl=1*v1y7x4*_ga*Njc3ODAyMzE3LjE3Mzk5NTA1ODk.
 *_ga_8JE65Q40S6*MTc0MjM1MDM2Ni40LjEuMTc0MjM1MDY4Ny4wLjAuMA..">
 <span class=""><svg class="spacing_noMargin__F5u9R" viewBox="0 0 24 24" width="24" 
 height="24"><use xlink:href="#file_download-c05dabe6d58e960ac55b98a0a0d0d223">
 </use></svg><span class="Button_text__Yp1Qo"><span 
 class="DownloadButton_downloadButtonText__04wa_">下载</span></span></span></a>

根据上面的规律我们把代码做一个简单的优化:

python 复制代码
import os
import requests
from playwright.sync_api import sync_playwright

def download_images():
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)  # 设为无头模式
        page = browser.new_page()
        page.goto("https://www.pexels.com/zh-cn/search/鲜花/")
        
        # 接受 Cookie
        if page.query_selector("button:has-text('接受所有')"):
            page.click("button:has-text('接受所有')")

        # 等待图片加载
        page.wait_for_selector("img[src]")
        img_elements = page.query_selector_all("img[src]")

        if img_elements:
            print("悬浮在第一张图片上...")
            img_elements[0].hover()  # 让鼠标悬停在第一张图片上使得<a download="" >标签可以显示出来

        # 等待图片加载
        page.wait_for_selector("a[download]")
        
        # 获取前10张图片的链接
        a_elements = page.query_selector_all("a[download]")
        img_urls = [img.get_attribute("href") for img in a_elements]
        
        # 创建存储目录
        os.makedirs("flowers", exist_ok=True)
        
        for i, url in enumerate(img_urls):
            if url.startswith("https"):
                response = requests.get(url)
                with open(f"flowers/flower_{i+1}.jpg", "wb") as f:
                    f.write(response.content)
                print(f"下载成功:flower_{i+1}.jpg")
        
        browser.close()

download_images()

五、爬取更多图片

上面的方法只能爬取几十张图片,我们可以通过模拟滚动,让网页加载更多图片从而能下载更多的图片。同时为了避免重复下载,可以使用Python中的集合(set)来存放图片的url。更改后的代码如下:

python 复制代码
import os
import requests
from playwright.sync_api import sync_playwright
import time

def download_images(max_images=100):
    
    """
    max_images 要下载的数量,默认100张
    """
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)  # 设为无头模式
        page = browser.new_page()
        page.goto("https://www.pexels.com/zh-cn/search/鲜花/")
        
        # 接受 Cookie
        if page.query_selector("button:has-text('接受所有')"):
            page.click("button:has-text('接受所有')")
        
        # 等待图片加载
        page.wait_for_selector("img[src]")
        img_elements = page.query_selector_all("img[src]")

        if img_elements:
            print("悬浮在第一张图片上...")
            img_elements[0].hover()  # 让鼠标悬停在第一张图片上使得<a download="" >标签可以显示出来
        # 等待图片加载
        page.wait_for_selector("a[download]")
        
        img_urls = set()  # 使用集合防止重复

        scroll_pause_time = 2  # 每次滚动后等待时间
        
        while len(img_urls) < max_images:
            # 获取当前页面上的图片链接
            a_elements = page.query_selector_all("a[download]")
            for img in a_elements:
                url = img.get_attribute("href")
                if url and url.startswith("https"):
                    img_urls.add(url)

            print(f"已获取 {len(img_urls)} 张图片")

            # 模拟滚动鼠标(向下滚 1000 像素)
            page.mouse.wheel(0,1000)
            time.sleep(scroll_pause_time)
            
        
        # 创建存储目录
        os.makedirs("flowers", exist_ok=True)
        
        for i, url in enumerate(list(img_urls)[:max_images]):
            response = requests.get(url)
            with open(f"flowers/flower_{i+1}.jpg", "wb") as f:
                f.write(response.content)
            print(f"下载成功:flower_{i+1}.jpg")
        
        browser.close()

download_images(100)

思考: 如果下载图片的过程中由于网络问题下载失败怎么办?可以尝试加个try except然后把下载失败的图片存放到本地csv文件中,等程序运行结束后重新把csv文件里的图片下载即可。


六、总结:你学到了什么?

  1. 了解了 playwright 的基本用法,包括如何打开网页、输入搜索内容、提取数据。
  2. 学会了如何爬取 Pexels 网站的图片,并自动化下载。
  3. 掌握了反爬技巧,如等待元素加载、模拟用户操作、接受 Cookie。

这个方法不仅可以用来爬取鲜花图片,还可以扩展到其他类别,比如风景、动物、城市等。🎨 你可以试试改进代码,让它支持更多功能,比如批量下载更多图片、按关键词分类存储等。

学会了就快去试试吧!💪 如果你觉得这篇文章有用,别忘了分享给你的朋友们,一起提高 Python 自动化办公技能!🎉

相关推荐
程序猿chen9 分钟前
JVM考古现场(十九):量子封神·用鸿蒙编译器重铸天道法则
java·jvm·git·后端·程序人生·java-ee·restful
xiongmaodaxia_z713 分钟前
python每日一练
开发语言·python·算法
1024小神22 分钟前
在GitHub action中使用添加项目中配置文件的值为环境变量
前端·javascript
Chandler2426 分钟前
Go:接口
开发语言·后端·golang
ErizJ28 分钟前
Golang|Channel 相关用法理解
开发语言·后端·golang
automan0228 分钟前
golang 在windows 系统的交叉编译
开发语言·后端·golang
Pandaconda29 分钟前
【新人系列】Golang 入门(十三):结构体 - 下
后端·golang·go·方法·结构体·后端开发·值传递
齐尹秦30 分钟前
CSS 列表样式学习笔记
前端
Mnxj34 分钟前
渐变边框设计
前端
我是谁的程序员37 分钟前
Flutter iOS真机调试报错弹窗:不受信任的开发者
后端