使用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通用)
- 提前准备:电脑安装ADB工具,手机开启USB调试并授权当前电脑访问
- 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
相关产品推荐
相关产品推荐

