You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python与Threading爬虫时,如何自动重置网络连接?

解决爬虫403拦截与自动重置手机共享网络方案

一、优先优化爬虫策略(从根源减少被拦截)

  • 控制请求频率:给每个线程的请求加上随机延迟,避免固定间隔的高频请求,示例代码:
    import time
    import random
    time.sleep(random.uniform(1, 3))  # 每次请求间隔1-3秒随机值
    
  • 随机更换User-Agent:维护一个常见浏览器的UA列表,每次请求随机选取,模拟不同设备访问:
    ua_list = [
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_0) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15",
        # 可添加更多UA
    ]
    headers = {"User-Agent": random.choice(ua_list)}
    
  • 复用会话Cookies:用requests.Session()维持会话,模拟正常用户的浏览流程,避免频繁建立新连接
  • 条件允许的话用代理IP池:比重置手机网络更高效,能快速切换IP规避拦截

二、自动重置手机共享网络(针对USB tethering场景)

通过ADB控制安卓手机(Windows/macOS/Linux通用)

  1. 提前准备:电脑安装ADB工具,手机开启USB调试并授权当前电脑访问
  2. Python调用ADB命令自动开关飞行模式:
import subprocess
import time
import requests
import random

ua_list = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_0) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15",
]

def reset_mobile_network():
    # 开启飞行模式
    subprocess.run(["adb", "shell", "settings put global airplane_mode_on 1"])
    subprocess.run(["adb", "shell", "am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true"])
    time.sleep(5)  # 等待飞行模式生效
    # 关闭飞行模式
    subprocess.run(["adb", "shell", "settings put global airplane_mode_on 0"])
    subprocess.run(["adb", "shell", "am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false"])
    time.sleep(10)  # 等待手机重新联网,电脑获取新IP

# 爬虫捕获403时触发重置
def crawl_url(url):
    headers = {"User-Agent": random.choice(ua_list)}
    try:
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        return response.text
    except requests.exceptions.HTTPError as e:
        if e.response.status_code == 403:
            print("触发403,正在重置网络...")
            reset_mobile_network()
            # 重置后重试一次
            return crawl_url(url)
        else:
            raise

无root权限机型的替代方案

如果手机没root,ADB修改系统设置可能失败,可以用ADB模拟点击快捷设置的飞行模式图标(需自己测试机型的坐标):

def reset_mobile_network_no_root():
    # 示例坐标(需根据自己手机的快捷设置位置调整)
    fly_mode_x, fly_mode_y = 500, 100
    # 点击打开飞行模式
    subprocess.run(["adb", "shell", f"input tap {fly_mode_x} {fly_mode_y}"])
    time.sleep(2)
    # 再次点击关闭
    subprocess.run(["adb", "shell", f"input tap {fly_mode_x} {fly_mode_y}"])
    time.sleep(10)

注意事项

  • 不同安卓品牌的ADB命令兼容性可能有差异,比如部分机型需要额外参数
  • 重置网络后必须留足够的等待时间,确保电脑重新获取到手机共享的IP地址

内容的提问来源于stack exchange,提问作者Kenzo Rei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 07:43:15