在移动互联网数据分析、竞品调研、行业报告制作等场景中,应用商店的 APP 分类数据是核心数据源之一。无论是分析某一赛道的应用分布,还是监控同类 APP 的核心指标,通过 Python 爬虫批量抓取应用商店分类应用数据,都是高效且低成本的解决方案。本文将以主流安卓应用商店为例,从环境搭建、爬虫设计、数据解析到存储落地,完整讲解如何实现应用商店分类应用的批量爬取,帮助你快速掌握实战爬虫开发的核心逻辑。
一、爬虫开发前期准备
1.1 技术选型与环境搭建
本次实战选用 Python 作为开发语言,核心依赖以下库:
● requests:发送 HTTP 请求获取网页 / 接口数据;
● BeautifulSoup4:解析 HTML 页面提取目标数据;
● pandas:数据清洗与 Excel 存储;
● fake-useragent:生成随机 User-Agent,规避基础反爬;
● time:设置请求间隔,降低服务器压力。
1.2 目标分析与反爬注意事项
本文以某公开安卓应用商店的「工具类」分类为例(实际可替换为任意分类),核心抓取字段包括:APP 名称、下载量、评分、简介、所属分类。
爬取前需注意:
- 遵守网站robots.txt协议,避免高频请求;
- 仅用于学习研究,勿将数据用于商业用途;
- 加入随机请求间隔、随机 User-Agent,模拟正常用户访问;
- 若遇到验证码、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 格式为https://xxx.com/category/tool?p={page},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 选择器(如div.app-item、h3.app-name)是通用示例,实际使用时需根据目标应用商店的页面结构调整:
- 打开目标应用商店分类页,按 F12 打开开发者工具;
- 定位 APP 列表项的外层标签,替换app_items = soup.select("div.app-item")中的选择器;
- 依次定位 APP 名称、下载量等字段的标签,修改解析函数中的选择器。
3.2 进阶优化策略 - 异步爬取:使用aiohttp替代requests,实现异步请求,提升爬取效率(适合大量页码);
- IP 代理池:若遇到 IP 封禁,可接入代理池,在请求时添加proxies参数;推荐使用亿牛云爬虫代理
- 断点续爬:将已爬取的页码和数据实时保存,避免程序中断后重新爬取;
- 数据校验:添加字段格式校验(如评分需为 0-5 的数值),提升数据质量。
四、常见问题与解决方案 - 页面解析为空:检查 CSS 选择器是否匹配目标页面,或目标页面是否为动态加载(若为动态加载,需使用Selenium或Playwright渲染页面);
- 请求被拒绝:增加请求间隔、更换 User-Agent,或检查是否被网站拉黑 IP;
- Excel 中文乱码:确保to_excel时指定encoding="utf-8",或使用openpyxl引擎:df.to_excel("xxx.xlsx", index=False, engine="openpyxl");
- 数据重复:通过drop_duplicates去重,或爬取前记录已爬取的 APP 名称。
五、合规与伦理说明 - 爬取数据前需确认目标网站的用户协议,禁止爬取非公开数据;
- 控制爬取频率,避免给目标服务器造成压力;
- 爬取的数据仅用于学习、研究,禁止用于商业售卖或恶意分析;
- 若网站明确禁止爬虫,需立即停止操作。