
(图片来源网络,侵删)
- User-Agent (用户代理):很多网站会根据你的
User-Agent来返回不同版本的网页,手机网页的User-Agent通常会包含 "Mobile", "Android", "iPhone" 等关键词。模拟手机浏览器的User-Agent是获取手机版网页源代码的核心步骤。 - 页面布局:即使你用桌面电脑的请求获取了手机版网页,页面的布局(CSS)也会是适应小屏幕的,这可能会影响后续的解析。
下面我将为你介绍几种方法,从最基础到最强大,并附上完整代码示例。
使用 requests 库 (最常用)
这是最简单、最直接的方法,适用于绝大多数静态网页。
核心思路
- 使用
requests.get()发送 HTTP 请求。 - 在请求头中设置一个手机的
User-Agent。 - 获取响应对象
response的text属性,即源代码。
完整代码示例
import requests
# 1. 定义一个手机浏览器的 User-Agent (这里以 iPhone Safari 为例)
# 你可以从网上搜索 "User-Agent String" 找到更多例子
MOBILE_USER_AGENT = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1"
# 2. 你想要下载的手机网页 URL
# 这里以一个专门检测 User-Agent 的网站为例,方便验证
url = "https://httpbin.org/user-agent"
# 3. 设置请求头
headers = {
"User-Agent": MOBILE_USER_AGENT,
# "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8" # 可选,设置语言偏好
}
try:
# 4. 发送 GET 请求
response = requests.get(url, headers=headers, timeout=10)
# 5. 检查请求是否成功 (状态码 200)
response.raise_for_status() # 如果状态码不是 200,会抛出异常
# 6. 获取并打印网页源代码
html_source_code = response.text
print("成功获取网页源代码!")
print("-" * 30)
print(html_source_code)
print("-" * 30)
# 你可以将源代码保存到文件
# with open("mobile_page.html", "w", encoding="utf-8") as f:
# f.write(html_source_code)
# print("已保存到 mobile_page.html")
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
如何验证?
运行上面的代码,你会看到输出结果中 user_agent 字段的值就是我们设置的 MOBILE_USER_AGENT,这证明服务器确实认为我们是一个手机浏览器。
使用 selenium 库 (处理动态网页)
是通过 JavaScript 动态加载的(比如很多现代的 App 风格网站),requests 获取到的源代码可能是不完整的,这时就需要使用 selenium,它可以模拟一个真实的浏览器来执行 JavaScript。

(图片来源网络,侵删)
核心思路
- 安装
selenium和浏览器驱动 (如 ChromeDriver)。 - 配置一个手机模拟器或使用 Chrome 的移动设备模拟功能。
- 启动浏览器,打开网页。
- 等待页面加载完成后,获取源代码。
完整代码示例 (使用 Chrome 的移动设备模拟)
这种方法最简单,不需要额外下载 Appium 或真机。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
# 1. 配置 Chrome 选项,开启移动设备模拟
chrome_options = Options()
# 使用 Chrome 内置的移动设备模拟器
# 你可以在 Chrome 开发者工具的 "Device Toolbar" (Ctrl+Shift+M) 中找到这些设备名称
chrome_options.add_argument("--headless") # 无头模式,不显示浏览器窗口
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1")
# 设置设备尺寸 (iPhone 13 Pro Max 的尺寸)
chrome_options.add_argument("--window-size=428,926")
# 2. 初始化 WebDriver
# 确保你的 chromedriver 版本与 Chrome 浏览器版本匹配
# chromedriver 在你的系统 PATH 中,或者指定其路径
driver = webdriver.Chrome(options=chrome_options)
try:
# 3. 打开目标网页
# 这里以一个需要动态加载的网站为例
url = "https://m.jd.com/" # 京东手机版
driver.get(url)
# 4. 等待页面加载 (可以根据实际情况调整等待时间)
# 等待 5 秒,确保 JS 有足够时间执行
# 更好的做法是使用 WebDriverWait 等待特定元素出现
time.sleep(5)
# 5. 获取并打印网页源代码
# 这个 .page_source 是执行完 JS 后的完整 HTML
html_source_code = driver.page_source
print("成功获取动态网页源代码!")
print("-" * 30)
# print(html_source_code) # 源代码通常很长,这里只打印前 500 个字符
print(html_source_code[:500])
print("-" * 30)
# 保存到文件
with open("jd_mobile_page.html", "w", encoding="utf-8") as f:
f.write(html_source_code)
print("已保存到 jd_mobile_page.html")
except Exception as e:
print(f"发生错误: {e}")
finally:
# 6. 关闭浏览器
driver.quit()
使用 appium (控制真实手机或模拟器)
这是最专业、最强大的方法,可以完全控制一个真实的 Android 或 iOS 设备,它适用于 requests 和 selenium 都无法处理的复杂场景,比如需要处理原生 App 内的 Hybrid 页面(WebView)。
核心思路
- 环境搭建复杂:需要安装 Appium Server、Appium Client (Python库)、手机驱动 (如 Android SDK) 或 iOS 模拟器。
- 编写脚本:通过 Appium 的 Python 客户端,启动 Appium 会话,连接到设备。
- 获取 Context:对于 Hybrid App,需要先切换到 WebView 的上下文。
- 执行脚本:在 WebView 中执行 JavaScript 获取源代码。
示例代码概览 (仅作概念展示,环境搭建是难点)
from appium import webdriver
import time
# Appium 的 Desired Capabilities 配置
# 这里的配置需要根据你的实际情况修改
caps = {
"platformName": "Android",
"deviceName": "your_device_name", # 设备名称
"appPackage": "com.android.chrome", # Chrome 浏览器的包名
"appActivity": "com.google.android.apps.chrome.Main",
# "noReset": True,
# "autoLaunch": False,
# "automationName": "UiAutomator2" # 推荐使用
}
try:
# 1. 初始化 Appium Driver
driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
# 2. 启动 Chrome 并访问网页
driver.get("https://m.baidu.com")
time.sleep(5) # 等待页面加载
# 3. 获取所有可用的上下文 (Contexts)
# 对于 Hybrid App,需要切换到 "WEBVIEW_com.android.chrome" 这样的上下文
contexts = driver.contexts
print("可用的上下文:", contexts)
if 'WEBVIEW_com.android.chrome' in contexts:
# 4. 切换到 WebView 上下文
driver.switch_to.context('WEBVIEW_com.android.chrome')
print("已切换到 WebView 上下文")
# 5. 获取并打印源代码
# 注意:在 Appium 中,获取源代码通常通过执行 JS
# driver.page_source 有时可能不完整或不工作
source = driver.execute_script("return document.documentElement.outerHTML;")
print("成功获取 WebView 源代码!")
print("-" * 30)
print(source[:500])
print("-" * 30)
# 保存到文件
with open("baidu_mobile_webview.html", "w", encoding="utf-8") as f:
f.write(source)
print("已保存到 baidu_mobile_webview.html")
else:
print("未找到 WebView 上下文。")
except Exception as e:
print(f"发生错误: {e}")
finally:
# 6. 退出 Appium 会话
if 'driver' in locals():
driver.quit()
总结与建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
requests |
简单、快速、轻量 | 无法执行 JS,易被反爬 | 静态网页、API 接口、对速度要求高的任务 |
selenium |
能处理动态 JS、模拟真实用户行为 | 速度慢、配置稍复杂 | 现代动态网页、需要登录或点击的场景 |
appium |
功能最强大,可控制真机 | 环境搭建极其复杂、学习曲线陡峭 | Hybrid App (WebView)、需要操作原生系统组件的场景 |
给你的建议:
- 从
requests开始:先尝试用requests+ 手机User-Agent,这是 80% 情况下最有效的解决方案。 requests获取的源代码不完整:再换用selenium。selenium的 Chrome 移动设备模拟功能通常足够强大。- 只有当你需要控制真实的 App 内部 WebView 时:才去考虑
appium,它的学习成本和环境配置会让你非常头疼,除非有特殊需求,否则不推荐作为首选。

(图片来源网络,侵删)
