python 手机网页源代码下载
(图片来源网络,侵删)
  1. User-Agent (用户代理):很多网站会根据你的 User-Agent 来返回不同版本的网页,手机网页的 User-Agent 通常会包含 "Mobile", "Android", "iPhone" 等关键词。模拟手机浏览器的 User-Agent 是获取手机版网页源代码的核心步骤
  2. 页面布局:即使你用桌面电脑的请求获取了手机版网页,页面的布局(CSS)也会是适应小屏幕的,这可能会影响后续的解析。

下面我将为你介绍几种方法,从最基础到最强大,并附上完整代码示例。


使用 requests 库 (最常用)

这是最简单、最直接的方法,适用于绝大多数静态网页。

核心思路

  1. 使用 requests.get() 发送 HTTP 请求。
  2. 在请求头中设置一个手机的 User-Agent
  3. 获取响应对象 responsetext 属性,即源代码。

完整代码示例

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。

python 手机网页源代码下载
(图片来源网络,侵删)

核心思路

  1. 安装 selenium 和浏览器驱动 (如 ChromeDriver)。
  2. 配置一个手机模拟器或使用 Chrome 的移动设备模拟功能。
  3. 启动浏览器,打开网页。
  4. 等待页面加载完成后,获取源代码。

完整代码示例 (使用 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 设备,它适用于 requestsselenium 都无法处理的复杂场景,比如需要处理原生 App 内的 Hybrid 页面(WebView)。

核心思路

  1. 环境搭建复杂:需要安装 Appium Server、Appium Client (Python库)、手机驱动 (如 Android SDK) 或 iOS 模拟器。
  2. 编写脚本:通过 Appium 的 Python 客户端,启动 Appium 会话,连接到设备。
  3. 获取 Context:对于 Hybrid App,需要先切换到 WebView 的上下文。
  4. 执行脚本:在 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)、需要操作原生系统组件的场景

给你的建议:

  1. requests 开始:先尝试用 requests + 手机 User-Agent,这是 80% 情况下最有效的解决方案。
  2. requests 获取的源代码不完整:再换用 seleniumselenium 的 Chrome 移动设备模拟功能通常足够强大。
  3. 只有当你需要控制真实的 App 内部 WebView 时:才去考虑 appium,它的学习成本和环境配置会让你非常头疼,除非有特殊需求,否则不推荐作为首选。
python 手机网页源代码下载
(图片来源网络,侵删)