Python 爬虫实战:批量抓取应用商店分类应用

在移动互联网数据分析、竞品调研、行业报告制作等场景中,应用商店的 APP 分类数据是核心数据源之一。无论是分析某一赛道的应用分布,还是监控同类 APP 的核心指标,通过 Python 爬虫批量抓取应用商店分类应用数据,都是高效且低成本的解决方案。本文将以主流安卓应用商店为例,从环境搭建、爬虫设计、数据解析到存储落地,完整讲解如何实现应用商店分类应用的批量爬取,帮助你快速掌握实战爬虫开发的核心逻辑。

一、爬虫开发前期准备

1.1 技术选型与环境搭建

本次实战选用 Python 作为开发语言,核心依赖以下库:

  • <font>requests</font>:发送 HTTP 请求获取网页 / 接口数据;
  • <font>BeautifulSoup4</font>:解析 HTML 页面提取目标数据;
  • <font>pandas</font>:数据清洗与 Excel 存储;
  • <font>fake-useragent</font>:生成随机 User-Agent,规避基础反爬;
  • <font>time</font>:设置请求间隔,降低服务器压力。

1.2 目标分析与反爬注意事项

本文以某公开安卓应用商店的「工具类」分类为例(实际可替换为任意分类),核心抓取字段包括:APP 名称、下载量、评分、简介、所属分类。

爬取前需注意:

  1. 遵守网站<font>robots.txt</font>协议,避免高频请求;
  2. 仅用于学习研究,勿将数据用于商业用途;
  3. 加入随机请求间隔、随机 User-Agent,模拟正常用户访问;
  4. 若遇到验证码、IP 封禁,及时停止爬取,切勿对抗。

二、核心代码实现

2.1 基础配置与请求函数封装

首先封装请求函数,实现「发送请求 - 获取响应 - 异常处理」的基础逻辑,同时加入反爬策略:

python

运行

import requests from fake_useragent import UserAgent from bs4 import BeautifulSoup import pandas as pd import time import random # 初始化UserAgent生成器 ua = UserAgent() def get_html(url, timeout=10): """ 发送GET请求获取页面HTML :param url: 目标URL :param timeout: 请求超时时间 :return: 页面HTML文本/None """ headers = { "User-Agent": ua.random, # 随机User-Agent "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", "Referer": "https://www.baidu.com/" # 模拟来路 } try: # 随机延迟1-3秒,避免高频请求 time.sleep(random.uniform(1, 3)) response = requests.get(url, headers=headers, timeout=timeout) response.raise_for_status() # 抛出HTTP状态码异常 response.encoding = response.apparent_encoding # 自动识别编码 return response.text except requests.exceptions.RequestException as e: print(f"请求失败:{url},错误信息:{e}") return None 

2.2 解析页面提取分类应用数据

接下来编写解析函数,从页面 HTML 中提取目标字段。以某应用商店分类页为例(URL 格式为<font>https://xxx.com/category/tool?p={page}</font>,page 为页码),通过 BeautifulSoup 定位元素:

python

运行

def parse_app_list(html): """ 解析应用商店分类页,提取APP数据 :param html: 页面HTML文本 :return: 解析后的APP数据列表 """ app_list = [] if not html: return app_list soup = BeautifulSoup(html, "html.parser") # 定位APP列表项(需根据实际页面结构调整CSS选择器) app_items = soup.select("div.app-item") for item in app_items: try: # 提取核心字段(需根据实际页面标签调整) app_name = item.select_one("h3.app-name").get_text(strip=True) if item.select_one("h3.app-name") else "未知" download_count = item.select_one("span.download-num").get_text(strip=True) if item.select_one("span.download-num") else "0" score = item.select_one("span.score").get_text(strip=True) if item.select_one("span.score") else "0" intro = item.select_one("p.app-intro").get_text(strip=True) if item.select_one("p.app-intro") else "无简介" category = item.select_one("span.category").get_text(strip=True) if item.select_one("span.category") else "工具类" # 构造字典存储单条APP数据 app_info = { "APP名称": app_name, "下载量": download_count, "评分": score, "简介": intro, "所属分类": category } app_list.append(app_info) except Exception as e: print(f"解析单条APP数据失败,错误信息:{e}") continue return app_list 

2.3 批量爬取与数据存储

编写主函数,实现多页数据批量爬取,并将结果存储为 Excel 文件:

python

运行

def batch_crawl(category_url, start_page=1, end_page=5): """ 批量爬取指定分类的多页应用数据 :param category_url: 分类页基础URL(需包含{p}占位符) :param start_page: 起始页码 :param end_page: 结束页码 :return: 所有爬取的APP数据列表 """ all_app_data = [] for page in range(start_page, end_page + 1): # 拼接当前页URL current_url = category_url.format(p=page) print(f"正在爬取第{page}页:{current_url}") # 获取页面HTML并解析 html = get_html(current_url) app_data = parse_app_list(html) if app_data: all_app_data.extend(app_data) print(f"第{page}页爬取完成,共{len(app_data)}条数据") else: print(f"第{page}页无数据,停止爬取") break # 无数据则终止后续页码爬取 return all_app_data if __name__ == "__main__": # 替换为实际的应用商店分类页URL(需包含{p}占位符) # 示例:https://xxx.com/category/tool?p={p} CATEGORY_URL = "https://your-target-url.com/category/tool?p={p}" # 爬取1-5页数据 app_data = batch_crawl(CATEGORY_URL, start_page=1, end_page=5) if app_data: # 将数据转换为DataFrame并存储为Excel df = pd.DataFrame(app_data) # 去重(避免重复爬取) df = df.drop_duplicates(subset=["APP名称"], keep="first") # 保存到本地 df.to_excel("应用商店工具类APP数据.xlsx", index=False, encoding="utf-8") print(f"爬取完成!共获取{len(df)}条有效数据,已保存至「应用商店工具类APP数据.xlsx」") else: print("未爬取到任何数据,请检查URL或页面结构") 

三、代码适配与优化

3.1 页面结构适配说明

上述代码中的 CSS 选择器(如<font>div.app-item</font><font>h3.app-name</font>)是通用示例,实际使用时需根据目标应用商店的页面结构调整:

  1. 打开目标应用商店分类页,按 F12 打开开发者工具;
  2. 定位 APP 列表项的外层标签,替换<font>app_items = soup.select("div.app-item")</font>中的选择器;
  3. 依次定位 APP 名称、下载量等字段的标签,修改解析函数中的选择器。

3.2 进阶优化策略

  1. 异步爬取:使用<font>aiohttp</font>替代<font>requests</font>,实现异步请求,提升爬取效率(适合大量页码);
  2. IP 代理池:若遇到 IP 封禁,可接入代理池,在请求时添加<font>proxies</font>参数;推荐使用亿牛云爬虫代理
  3. 断点续爬:将已爬取的页码和数据实时保存,避免程序中断后重新爬取;
  4. 数据校验:添加字段格式校验(如评分需为 0-5 的数值),提升数据质量。

四、常见问题与解决方案

  1. 页面解析为空:检查 CSS 选择器是否匹配目标页面,或目标页面是否为动态加载(若为动态加载,需使用<font>Selenium</font><font>Playwright</font>渲染页面);
  2. 请求被拒绝:增加请求间隔、更换 User-Agent,或检查是否被网站拉黑 IP;
  3. Excel 中文乱码:确保<font>to_excel</font>时指定<font>encoding="utf-8"</font>,或使用<font>openpyxl</font>引擎:<font>df.to_excel("xxx.xlsx", index=False, engine="openpyxl")</font>
  4. 数据重复:通过<font>drop_duplicates</font>去重,或爬取前记录已爬取的 APP 名称。

五、合规与伦理说明

  1. 爬取数据前需确认目标网站的用户协议,禁止爬取非公开数据;
  2. 控制爬取频率,避免给目标服务器造成压力;
  3. 爬取的数据仅用于学习、研究,禁止用于商业售卖或恶意分析;
  4. 若网站明确禁止爬虫,需立即停止操作。

Read more

多项目开发环境:如何使用update-alternatives管理多版本Java JDK?(Windows、Mac、Ubuntu)

多项目开发环境:如何使用update-alternatives管理多版本Java JDK?(Windows、Mac、Ubuntu)

如何使用update-alternatives管理多版本Java JDK?(Windows、Mac、Ubuntu) 📖 摘要 在实际开发中,往往会遇到既要维护老项目又要跟进新特性的场景,这就需要在一台机器上同时安装并切换多个Java JDK版本。本文将针对三大主流平台——Windows、macOS 和 Ubuntu,详细介绍如何安装多个 JDK,并使用各自平台上的“替代方案”工具来管理与切换。 * Windows:通过系统环境变量与批处理脚本实现版本切换 * macOS:利用 /usr/libexec/java_home 与 jEnv 工具 * Ubuntu:深入剖析 update-alternatives 原理与实战 无论您是新手还是有一定经验的开发者,都能从中获得清晰的思路与操作指南。 文章目录 * 如何使用update-alternatives管理多版本Java JDK?(Windows、Mac、Ubuntu) * 📖 摘要 * 📗 引言 * 作者名片 ✍️ * 加入我们AI共创团队 🌐 * 加入猫头虎的共创圈,一

By Ne0inhk
Flutter 三方库 m_package 的鸿蒙化适配指南 - 实现极简主义的项目基础包集成、支持跨端通用工具函数的模块化聚合实战

Flutter 三方库 m_package 的鸿蒙化适配指南 - 实现极简主义的项目基础包集成、支持跨端通用工具函数的模块化聚合实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 m_package 的鸿蒙化适配指南 - 实现极简主义的项目基础包集成、支持跨端通用工具函数的模块化聚合实战 前言 在进行 Flutter for OpenHarmony 的全场景应用开发时,经常会发现不同的子项目之间存在大量重复的基础逻辑:如字符串处理、十六进制转码、简单的 UI 辅助函数等。m_package(通常指代一种极简的“基础脚手架包”)旨在将这些细碎、高频的 Utility 逻辑进行语义化聚合。本文将探讨如何在鸿蒙端利用这类“全家桶”式的基础库提升项目冷启动的开发效率。 一、原直观解析 / 概念介绍 1.1 基础原理 m_package 采用了“扩展方法(Extension Methods)”和“静态单例”

By Ne0inhk

Ubuntu 20.04 安装微信教程

背景:Linux系统电脑中,有时需要登录微信,但官方没有原生 Linux 版本微信,那如何在Linux系统电脑上使用微信呢?下面介绍一下Ubuntu 20.04 安装微信的简便方法。 具体安装使用步骤: 1、下载Weixin for Linux的安装包 https://linux.weixin.qq.com/en 根据自己电脑的系统版本来下载相对应的安装包。此处下载x86系统的.deb包, WeChatLinux_x86_64.deb。 2、安装WeChatLinux_x86_64.deb包 下载好安装包后,在保存WeChatLinux_x86_64.deb包的文件夹中,右键鼠标选择“在终端打开”,在终端中输入命令:sudo apt install ./WeChatLinux_x86_64.deb 3、

By Ne0inhk
Flutter 三方库 build_cli_annotations 的鸿蒙化适配指南 - 注解驱动的参数解析、自动化命令生成与高效开发工具链构建实战

Flutter 三方库 build_cli_annotations 的鸿蒙化适配指南 - 注解驱动的参数解析、自动化命令生成与高效开发工具链构建实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 build_cli_annotations 的鸿蒙化适配指南 - 注解驱动的参数解析、自动化命令生成与高效开发工具链构建实战 前言 随着 Flutter for OpenHarmony 生态的日益庞大,开发者面临的不仅仅是 UI 适配,还有日益繁琐的项目管理和自动化脚本开发。如何快速编写一个高性能、强类型的命令行工具(CLI),用来自动化执行鸿蒙环境检测、包管理或是代码分发? 传统的 args 库虽然强大,但在处理复杂的多级子命令和参数校验时,代码会迅速变得难以维护。 build_cli_annotations 配合 build_cli 库,为我们提供了一种“代码即文档”的优雅方案。通过在 Dart 类上添加简单的注解,即可自动生成健壮的参数解析逻辑。本文将详细讲解这一技术在鸿蒙开发辅助脚本中的实战落地,助力开发者打造极致的自动化工具链。

By Ne0inhk