当前位置: 首页 > news >正文

【python爬虫】python+selenium实现Google Play Store应用信息爬虫+apk下载

实验要求:利用python+selenium实现Google Play Store应用信息爬虫+apk下载。
在这里插入图片描述
其中:
1、热门应用列表包含200个app,需要点击右侧按钮滑动产生下一页数据,所以需要Selenium来控制页面操作。
2、每个应用的爬虫信息包括:app名、详情页链接、应用评分、评论数、下载量。

实验使用的各个工具版本

selenium 4.1.1
chrome浏览器版本 125.0.6422.113 (查看方式:浏览器右上角——设置——关于chrome)
chromedriver 125.0.xx

因为selenium4.x版本与selenium3.x版本的api略有不同,版本与api调用不匹配会造成警告或报错,建议选用4.x版本的

selenium安装与使用

Selenium是一个功能强大的自动化测试工具,主要用于Web应用程序的测试和网页爬虫,比如用于爬取网页上的数据,抓取网页内容、分析页面结构、提取信息等。
Selenium使用教程: selenium入门超详细教程——网页自动化操作

在pycharm终端执行:

# 安装4.1.1版本
pip3 install selenium==4.1.1

安装chromedriver

安装chromedriver需要注意浏览器版本对应问题。
如果自己的chrome浏览器版本很新,上面的教程里没有对应的网站,可以去这个网站里找下载链接——Chrome for Testing availability

在这里选择合适版本的chromedriver,打开对应网址即可下载。
在这里插入图片描述
注:如果下载了对应版本的chromedriver,运行driver.get()时还是有网页闪退问题需要检查selenium版本是否安装了较高的版本,我实验时最开始安装的4.21.x会有闪退的情况,后面卸载了重装了一个4.1.1版本的selenium,解决了闪退问题。

//卸载selenium  
pip uninstall selenium
//下载4.1.1版本
pip3 install selenium==4.1.1

google play store热门应用列表爬虫

使用chromedriver打开网页

【注意这里是selenium4.x版本的写法 如果你的selenium是3.x版本可能代码略有不同】
代码中需要先指定chromedriver的存放位置。然后在初始化webdriver时传入参数service=s。
如果爬虫过程中需要最大化窗口(小窗口遮挡了某些元素时,比如遮挡了Button不能点击,无法获取对应数据,需要改变初始窗口大小),需要在打开网站之前进行窗口大小设置

# 指定chromedriver存储地址
chromedriver_path = r"D:\ChromeDriver\chromedriver.exe"
# 初始化 ChromeDriver 服务
s = Service(chromedriver_path)
# 初始化 WebDriver
driver = webdriver.Chrome(service=s)
# 必须最大化窗口 不然不能点击按钮滑动界面
driver.maximize_window()        #最大化窗口
# 指定要爬虫的网站地址
target_web_site = 'https://play.google.com/store/apps'
# 指定要爬虫的网站地址
target_web_site = 'https://play.google.com/store/apps'# 打开页面
page = driver.get(target_web_site)

控制网页滑动到指定位置

因为我需要的数据在页面下方,所以打开网页后还需要下滑一些距离,这样方便调试时观察。

# 设置滚动一定的像素距离
pixels_to_scroll = 300
driver.execute_script(f"window.scrollTo(0, {pixels_to_scroll});")
time.sleep(2)

注意爬虫时要尽量等待页面加载完成,以免数据没有渲染出来。

使用css选择器定位元素

在爬虫获取数据时,通常需要定位到信息所在的标签,然后通过标签的某个属性拿到信息的具体值。这个过程可以通过下面几种方式完成,但都需要driver.find_elements方法实现。
1、XPath
通过在页面上定位需要的标签值,然后右键——copy——选择copy xpath
在这里插入图片描述

2、CSS selector
同理,通过在页面上定位需要的标签值,然后右键——copy——选择copy selector

3、标签名
适用于标签名很特殊的情况,比如很多嵌套div的结构中出现了a标签,就可以直接指定a标签找到对应元素。

copy到对应筛选方式的值之后,在代码中执行:
(我这里复制的是css selector)

# 寻找目标标签的位置 复制选择器
swipeRight_selector = '#yDmH0d > c-wiz.SSPGKf.glB9Ve > div > div > div.N4FjMb.Z97G4e > c-wiz > div > c-wiz > c-wiz:nth-child(3) > c-wiz > section > div > div > div > div > div > div.hWUu9.n1lOjd.CrjwJd.Z3h6Kb.adMLdd > button'
isButtonActive = len(driver.find_elements(by=By.CSS_SELECTOR, value=swipeRight_selector))

控制鼠标悬浮在某个位置

由于我要获取的数据要不断的点击右侧的翻页按钮,且这个按钮在鼠标悬浮之前是隐藏的。
所以我需要在每次翻页之前,把鼠标悬停在这个列表所在的div容器内。
在这里插入图片描述
方法与上面定位的一样,然后使用ActionChains的move_to_element实现即可。

# 定位到想要悬停的元素
element_to_hover = driver.find_element(By.CSS_SELECTOR, '#yDmH0d > c-wiz.SSPGKf.glB9Ve > div > div > div.N4FjMb.Z97G4e > c-wiz > div > c-wiz > c-wiz:nth-child(3) > c-wiz > section > div > div > div > div > div')
# 创建 ActionChains 对象
actions = ActionChains(driver)
# 调用 move_to_element 方法来模拟鼠标移动到元素上
actions.move_to_element(element_to_hover).perform()

模拟点击滑动按钮

由于这个排行榜是有限的,需要不断点击右侧按钮获取下一页数据,才能拿到完整的信息,否则信息是不全的,所以在获取数据之前还要控制页面滑动到最后一页。

# 寻找目标标签的位置 复制选择器
swipeRight_selector = '#yDmH0d > c-wiz.SSPGKf.glB9Ve > div > div > div.N4FjMb.Z97G4e > c-wiz > div > c-wiz > c-wiz:nth-child(3) > c-wiz > section > div > div > div > div > div > div.hWUu9.n1lOjd.CrjwJd.Z3h6Kb.adMLdd > button'
isButtonActive = len(driver.find_elements(by=By.CSS_SELECTOR, value=swipeRight_selector))
count = 1
print("len:",isButtonActive)
while isButtonActive>0:actions.move_to_element(element_to_hover).perform()swipeRight_button = driver.find_element(by=By.CSS_SELECTOR, value=swipeRight_selector)swipeRight_button.click()print(f'这是第{count}页...')count += 1time.sleep(1)isButtonActive = len(driver.find_elements(by=By.CSS_SELECTOR, value=swipeRight_selector))
print(f'收集完成 共{count}页数据')

定位热门应用的数据

同上,定位热门应用的列表位置,注意这里用driver.find_elements,加了s,返回值是一个列表。

# 找热门应用
base_css_selector = 'section > div > div > div > div > div > div.aoJE7e.b0ZfVe > div.ULeU3b.neq64b'# 使用列表推导式和 f-string 来构建多个选择器,并找到对应的元素elements = driver.find_elements(by=By.CSS_SELECTOR, value=base_css_selector)# selenium 3.x的写法# elements = driver.find_elements_by_css_selector(base_css_selector)print(f"target_div_len:{len(elements)}")

google play store热门应用列表信息处理

找到对应元素之后,处理元素属性值即可获取信息。

google play store对应apk下载

方法:在APKCombo上根据对应包名(前面爬虫获取的)找到对应的网址进行下载
参考:利用python selenium动态爬取Google play store apks

http://www.xdnf.cn/news/454357.html

相关文章:

  • 内存泄漏系列专题分析之十四:高通相机CamX ION/dmabuf内存管理机制ImageBuffer之GrallocBuffer原理
  • 代码随想录算法训练营Day58
  • 01-three.js vite基础示例
  • 机器视觉助力轨道缺陷检测
  • Python常用魔术方法
  • 分布式2(限流算法、分布式一致性算法、Zookeeper )
  • 解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs-强化学习算法AlphaGo
  • sqlalchemy库详细使用
  • 【C++】17. 多态
  • AI智能体应用平台-智能体定制-企业级agent开发平台哪个更好?
  • 【嵌入式开发-按键扫描】
  • 从构想到交付:专业级软开发流程详解
  • c++中的函数(默认参数,占位参数,重载)
  • Arduino使用红外收发模块
  • MySQL基础之开窗函数
  • 嵌入式(c语言篇)Day9
  • 基于nacos2.5.1的java微服务项目开发环境配置简介
  • Spyglass:跨时钟域同步(同步单元)
  • Gin 框架指南(代码+通俗解析版)
  • 2025前四月新能源汽车出口增长52.6%,外贸ERP数字化助力汽企持续跃升
  • 给 DBGridEh 增加勾选用的检查框 CheckBox
  • 通用软件项目技术报告 - 导读I
  • C++ 并发编程(1)再学习,为什么子线程不调用join方法或者detach方法,程序会崩溃? 仿函数的线程启动问题?为什么线程参数默认传参方式是值拷贝?
  • 阿里的库存秒杀实现与Inventory Hint技术解析
  • Windows系统Anaconda/Miniconda的安装、配置、基础使用、清理缓存空间和Pycharm/VSCode配置指南
  • Linux系统编程——fork函数的使用方法
  • idea插件使用
  • Prometheus 的介绍与部署(入门)
  • Spring 的 异常管理的相关注解@ControllerAdvice 和@ExceptionHandler
  • 2011-2019年各省总抚养比数据