JSON网页抓取字符串操作问题:requests.get拼接无输出排查
解决requests.get()字符串拼接导致无法获取超长矩阵数据的问题
嘿,我来帮你排查这个问题!你提到的手动拼接URL确实很容易踩坑,尤其是处理超长矩阵里的地址数据时,编码、格式或者未处理的异常都可能导致程序悄无声息地停住,完全看不到输出。咱们一步步来解决:
核心问题分析
直接用字符串拼接URL参数,很容易出现以下问题:
- URL编码遗漏:虽然以太坊地址通常是
0x开头的十六进制字符,但如果你的DepositMatrix里存在格式异常的地址(比如带空格、特殊符号),手动拼接会导致请求URL无效。 - 无异常捕获:超长矩阵循环请求时,只要某一次请求超时、连接失败或者返回非JSON内容,程序就会直接崩溃,你根本看不到任何输出,还以为是拼接的问题。
- 无进度反馈:处理大量数据时,程序在后台运行但没有任何打印,很容易让你误以为它没在工作。
改进后的代码示例
我把你的代码做了针对性优化,解决这些问题:
import requests import json import time # 用于控制请求速率,避免被封禁 # 假设DepositMatrix已提前声明并赋值 balance = [] total_addresses = len(DepositMatrix) for q in range(total_addresses): target_address = DepositMatrix[q][0] try: # 用requests的params参数自动处理编码,替代手动拼接URL response = requests.get( "https://ethplorer.io/service/service.php", params={"data": target_address}, timeout=15 # 设置超时,避免卡壳 ) # 检查HTTP响应状态码,4xx/5xx错误直接抛出异常 response.raise_for_status() # 解析JSON数据 data4 = response.json() balance.append(data4) # 打印进度,让你知道程序在运行 print(f"✅ 处理第 {q+1}/{total_addresses} 个地址成功") # 加个小延时,避免请求太频繁被网站限制 time.sleep(0.5) except requests.exceptions.RequestException as e: # 捕获所有请求相关异常,打印错误信息 print(f"❌ 处理第 {q+1} 个地址失败: {str(e)}") continue except json.JSONDecodeError as e: # 捕获JSON解析失败的情况,打印部分响应内容排查 print(f"❌ 解析第 {q+1} 个地址响应失败: {str(e)}") print(f"响应内容预览: {response.text[:300]}") continue # 最后输出处理结果统计 print(f"\n🎉 全部处理完成!成功获取 {len(balance)} 个地址的余额数据")
关键优化点说明
- 用
params替代手动拼接:requests会自动对参数做URL编码,彻底避免拼接时的格式问题,这也是官方推荐的传参方式。 - 全面异常捕获:覆盖了请求超时、连接错误、HTTP错误、JSON解析错误等所有可能的异常,确保一个地址处理失败不会导致整个程序终止,还能明确看到错误原因。
- 进度与结果反馈:每处理一个地址就打印进度,最后统计成功数量,再也不会误以为程序没运行。
- 请求速率控制:添加
time.sleep()避免短时间内发送大量请求,防止被目标网站的反爬机制封禁IP。
内容的提问来源于stack exchange,提问作者Wonderer
相关产品推荐
相关产品推荐

