前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于Selenium的Python爬虫抓取动态App图片

基于Selenium的Python爬虫抓取动态App图片

原创
作者头像
小白学大数据
发布于 2025-05-20 08:37:29
发布于 2025-05-20 08:37:29
15800
代码可运行
举报
运行总次数:0
代码可运行

1.引言

在当今数字化时代,互联网上的数据资源丰富多样,其中动态网页和应用程序(App)中的图片数据尤为珍贵。这些图片可能用于数据分析机器学习、内容推荐等多种场景。然而,由于许多 App 的图片加载是动态的,传统的爬虫方法往往难以直接获取。本文将介绍如何利用基于 Selenium 的 Python 爬虫技术来抓取动态 App 图片,详细阐述技术原理、实现步骤以及代码实现过程。

2. 技术选型与工具准备

2.1 为什么选择Selenium?

  • 动态内容加载:许多App采用JavaScript动态加载数据,Selenium可以等待并获取完整渲染后的页面。
  • 模拟用户操作:可以模拟点击、滚动、登录等行为,绕过部分反爬机制。
  • 跨平台兼容:支持Chrome、Firefox、Edge等主流浏览器。

2.2 所需工具

  • Python 3.x(推荐3.8+)
  • Selenium(pip install selenium
  • 浏览器驱动(如ChromeDriver)
  • 图片处理库(Pillow,可选)
  • 存储方案(本地文件、数据库等)

3. 爬取动态App图片的完整流程

3.1 目标分析

假设我们要爬取某个图片社交App(如Instagram、Pinterest等)的公开图片,其特点包括:

  • 动态加载(滚动时加载新图片)
  • 图片URL可能隐藏在JavaScript渲染的DOM中
  • 可能需要模拟登录或处理反爬机制

3.2 代码实现

(1)初始化Selenium WebDriver
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import os

# 设置ChromeDriver路径(根据实际情况修改)
driver_path = "chromedriver.exe"  # 或指定绝对路径
service = Service(driver_path)
options = webdriver.ChromeOptions()

# 可选项:无头模式(不显示浏览器界面)
# options.add_argument("--headless")

# 初始化浏览器
driver = webdriver.Chrome(service=service, options=options)
(2)访问目标页面并模拟滚动
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dfrom selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.proxy import Proxy, ProxyType
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# 设置代理信息
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"

# 配置代理
proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.http_proxy = f"{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"
proxy.ssl_proxy = f"{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"

# 初始化 WebDriver,使用代理
options = webdriver.ChromeOptions()
options.proxy = proxy
driver = webdriver.Chrome(options=options)

def scroll_to_bottom(driver, max_scrolls=10, delay=2):
    """模拟滚动加载更多内容"""
    last_height = driver.execute_script("return document.body.scrollHeight")
    scroll_count = 0
    
    while scroll_count < max_scrolls:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(delay)  # 等待新内容加载
        new_height = driver.execute_script("return document.body.scrollHeight")
        
        if new_height == last_height:
            break  # 已到底部
        last_height = new_height
        scroll_count += 1

# 示例:访问 Pinterest(需替换为目标 App 的 URL)
url = "https://www.pinterest.com/search/pins/?q=cats"

try:
    driver.get(url)

    # 等待页面加载
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.TAG_NAME, "img"))
    )

    # 模拟滚动加载更多图片
    scroll_to_bottom(driver, max_scrolls=5)

except Exception as e:
    print(f"加载网页时遇到问题:{e}")
    print("请检查网页链接的合法性,确保网络连接正常。如果问题仍然存在,请稍后重试。")

finally:
    driver.quit()
(3)提取图片URL并下载
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import requests
from PIL import Image
from io import BytesIO

def download_image(url, save_dir="images"):
    """下载图片并保存到本地"""
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    
    try:
        response = requests.get(url, stream=True)
        if response.status_code == 200:
            img = Image.open(BytesIO(response.content))
            img_name = url.split("/")[-1].split("?")[0]  # 提取文件名
            img_path = os.path.join(save_dir, img_name)
            img.save(img_path)
            print(f"下载成功: {img_path}")
    except Exception as e:
        print(f"下载失败: {url}, 错误: {e}")

# 获取所有图片元素
images = driver.find_elements(By.TAG_NAME, "img")

# 提取src并下载
for img in images:
    img_url = img.get_attribute("src")
    if img_url and "http" in img_url:  # 过滤无效URL
        download_image(img_url)

4、注意事项

反爬虫机制

许多网站会设置反爬虫机制,如限制访问频率、检测用户代理等。在使用 Selenium 爬虫时,需要注意以下几点:

  1. 设置合理的等待时间:在模拟用户行为时,适当增加等待时间,避免触发频率限制。
  2. 使用代理 IP:通过代理 IP 模拟真实用户访问,降低被封禁的风险。
  3. 设置随机用户代理:通过设置随机的用户代理(User-Agent),模拟不同的浏览器访问。

5、总结

本文详细介绍了基于 Selenium 的 Python 爬虫技术抓取动态 App 图片的方法。通过模拟用户行为、提取图片 URL 和下载图片,我们成功实现了动态图片的抓取。Selenium 的强大功能使其能够应对复杂的动态网页环境,为数据采集提供了有力支持。然而,在实际应用中,我们还需要注意反爬虫机制和法律合规性,确保爬虫技术的合法、合理使用。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
Matlab基本函数 length函数
y = length(x) 函数计算指定向量或矩阵的长度y。如果参数变量x是向量,则返回其长度;如果参数变量是非空矩阵,则length(x)与max(size(x))等价
全栈程序员站长
2022/06/27
3.9K0
一起来学matlab-matlab学习笔记10 10_2一般操作符和数据显示格式
本文为matlab自学笔记的一部分,之所以学习matlab是因为其真的是人工智能无论是神经网络还是智能计算中日常使用的,非常重要的软件。也许最近其带来的一些负面消息对国内各个高校和业界影响很大。但是我们作为技术人员,更是要奋发努力,拼搏上进,学好技术,才能师夷长技以制夷,为中华之崛起而读书!
演化计算与人工智能
2020/08/14
5430
一起来学matlab-matlab学习笔记10 10_2一般操作符和数据显示格式
一起来学演化计算-matlab基本函数randn,rand, orth
randn X = randn 随机从正态分布中选一个数作为结果 X = randn(n) 随机从正态分布中选n*n个数组成一个(n,n)的正方形矩阵 r = randn(5) r = 0.5377 -1.3077 -1.3499 -0.2050 0.6715 1.8339 -0.4336 3.0349 -0.1241 -1.2075 -2.2588 0.3426 0.7254 1.4897 0.7172 0.86
演化计算与人工智能
2020/08/14
1.7K0
第二章:MATLAB基础教程:数组和矩阵运算
在MATLAB中,数组和矩阵是进行数值计算的重要工具。本教程将详细讨论MATLAB中数组和矩阵的操作,并提供详细的案例和代码示例。
GeekLiHua
2025/01/21
1960
Matlab学习
此 MATLAB 函数 清除命令行窗口中的所有文本,让屏幕变得干净。运行 clc
裴来凡
2022/05/29
1.4K0
Matlab学习
【STM32F407的DSP教程】第15章 DSP统计函数-标准偏差、均方根和方差
Result = sqrt((sumOfSquares – sum^2 / blockSize) / (blockSize - 1))
Simon223
2020/04/28
5200
【STM32F407的DSP教程】第15章    DSP统计函数-标准偏差、均方根和方差
数学建模启发式算法篇(一)---遗传算法
最近在准备本月亚太赛,第一个学习的是这个模拟退火,但是今天想要更新的不是模拟退火,而是遗传算法;
阑梦清川
2025/02/24
1450
数学建模启发式算法篇(一)---遗传算法
matlab
对于一些nc数据或者遥感影像处理时,虽然一些第三方软件可以出图,但我们往往需要借助python或者matlab软件进行数据处理,但最后保存下来数据如何导入arcgis进行分析呢?
用户6841540
2024/08/05
4210
MATLAB绘图怎么变得更好看[通俗易懂]
同样用的都是MATLAB,为啥大佬们画的图都那么好看,而你画的图都是简单、普通,那是因为我们掌握的基础元素不一样,只有掌握了最基本的基础元素,再加上日益增长的审美,才会有一张好图出来。
全栈程序员站长
2022/08/31
1.2K0
【STM32H7的DSP教程】第15章 DSP统计函数-标准偏差、均方根和方差
Result = sqrt((sumOfSquares – sum^2 / blockSize) / (blockSize - 1))
Simon223
2020/04/28
9810
【STM32H7的DSP教程】第15章    DSP统计函数-标准偏差、均方根和方差
深入浅出PID控制算法(一)————连续控制系统的PID算法及MATLAB仿真[通俗易懂]
PID控制是将误差信号e(t)的比例(P),积分(I)和微分(D)通过线性组合构成控制量进行控制,其输出信号为:
全栈程序员站长
2022/09/06
3.3K0
深入浅出PID控制算法(一)————连续控制系统的PID算法及MATLAB仿真[通俗易懂]
MATLAB-数组
之前,我们讨论了很多关于MATLAB向量和矩阵的知识,在本章中,我们将讨论多维数组。在MATLAB中所有的数据类型的变量是多维数组,向量是一个一维阵列,矩阵是一个二维数组。
用户9925864
2022/07/27
1.2K0
matlab中wavedec2,wavedec2函数详解[通俗易懂]
这里的小波基函数应该根据实际情况选择,具体选择办法可以搜之或者 help WFILTERS
全栈程序员站长
2022/09/15
3K0
matlab中wavedec2,wavedec2函数详解[通俗易懂]
MATLAB中求矩阵的逆矩阵方法(2种)「建议收藏」
第一步:打开matlab之后,在命令行窗口中输入a=[1 2 3;4 5 6; 7 8 9],新建一个a方矩阵,如下图所示:
全栈程序员站长
2022/09/25
3.4K0
MATLAB中求矩阵的逆矩阵方法(2种)「建议收藏」
Matlab矩阵基本操作(定义,运算)
最简单的建立矩阵的方法是从键盘直接输入矩阵的元素,输入的方法按照上面的规则。建立向量的时候可以利用冒号表达式,冒号表达式可以产生一个行向量,一般格式是: e1:e2:e3,其中e1为初始值,e2为步长,e3为终止值。还可以用linspace函数产生行向量,其调用格式为:linspace(a,b,n) ,其中a和b是生成向量的第一个和最后一个元素,n是元素总数。
全栈程序员站长
2022/07/31
3K0
matlab中矩阵的秩,matlab矩阵的秩
如下所示为一方阵 在 matlab 输入矩阵: A = [1 2 4; 407 9 1 3]; 2. 2 查阅 matlab help 可以知道,利用 eig 函数可以快速求解矩阵的特征值与特 征……
全栈程序员站长
2022/09/02
1.3K0
MATLAB求解线性规划(含整数规划和0-1规划)问题[通俗易懂]
线性规划是数学规划中的一类最简单规划问题,常见的线性规划是一个有约束的,变量范围为有理数的线性规划。如:
全栈程序员站长
2022/09/18
1.5K0
MATLAB求解线性规划(含整数规划和0-1规划)问题[通俗易懂]
matlab中ode45函数解二阶微分方程_matlab求常微分方程组
求解单变量微分方程的解 x ˙ ( t ) = 2 ∗ x ( t ) \dot{x}(t) = 2 * x(t) x˙(t)=2∗x(t)
全栈程序员站长
2022/11/03
3.9K0
神经网络学习笔记1——BP神经网络原理到编程实现(matlab,python)[通俗易懂]
不好意思拖了这么久才整理,弄完考试的事情就在研究老师给安排的新任务,一时间还有点摸不到头脑,就直接把百度网盘链接放在视频下面了但是最近才发现那个链接发出来了看不到,所以现在有时间了就来重新整理一下!
全栈程序员站长
2022/09/09
1.5K0
神经网络学习笔记1——BP神经网络原理到编程实现(matlab,python)[通俗易懂]
matlab 用循环求和,matlab循环求和函数[通俗易懂]
举个例子吧:D=[345];A=7;fsolve(@(X)sum(10.^(X-D))-A,0)则ans=3.7998就这么简单.(还想补充说明一点,fsolve中第一个变量是一个函数句柄,第二个变量
全栈程序员站长
2022/11/08
2.3K0
推荐阅读
相关推荐
Matlab基本函数 length函数
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 1.引言
  • 2. 技术选型与工具准备
    • 2.1 为什么选择Selenium?
    • 2.2 所需工具
  • 3. 爬取动态App图片的完整流程
    • 3.1 目标分析
    • 3.2 代码实现
      • (1)初始化Selenium WebDriver
      • (2)访问目标页面并模拟滚动
      • (3)提取图片URL并下载
  • 4、注意事项
  • 5、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档