Strawpoll投票机器人运行报TypeError及HTTP 403错误如何解决
问题原因
- 第一个错误
urllib.error.HTTPError: HTTP Error 403: Forbidden:调用renewProxyList方法抓取代理列表时,直接用urllib默认配置请求目标站点,urllib默认发送的User-Agent为Python-urllib/xxx,目标网站的反爬策略直接拦截了爬虫请求,返回403拒绝访问。 - 第二个错误
TypeError: can only concatenate str (not "NoneType") to str:代码仅捕获了IOError和KeyboardInterrupt两类异常,urllib抛出的HTTPError虽属于IOError子类,但该类对象没有strerror和filename属性,访问这两个属性会返回None,执行print("[!] " + ex.strerror + ": " + ex.filename)时就会出现字符串拼接None的类型错误。
修复方案
1. 修复异常捕获逻辑
将原来的异常捕获块修改为兼容所有异常的写法,避免类型错误:
# 替换原来的except IOError as ex块 except Exception as ex: print(f"[!] 运行错误: {str(ex)}")
如果需要细分异常类型,也可以单独捕获HTTPError:
except urllib.error.HTTPError as ex: print(f"[!] 请求错误: 状态码{ex.code}, 错误信息{ex.reason}") except IOError as ex: print(f"[!] 读写错误: {ex.strerror}: {ex.filename}") except KeyboardInterrupt as ex: print("[#] 结束运行...") print("[#] 程序已终止") exit()
2. 修复代理抓取403问题
给urllib请求添加浏览器UA头,伪装成正常用户访问,修改renewProxyList方法:
def renewProxyList(self): final_list=[] url = "http://proxy-daily.com/" # 构造带请求头的请求对象 req = urllib.request.Request( url, headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } ) content = urllib.request.urlopen(req).read() # 后续逻辑保持不变 soup = BeautifulSoup(content,features="html5lib") center = soup.find_all("center")[0] div = center.findChildren("div", recursive=False)[0].getText() children= div.splitlines() for child in children: final_list.append(child+"\n") return final_list
额外逻辑优化
- 调整代理列表更新的逻辑顺序:先成功获取到新的代理列表,再删除旧的
proxies.txt写入新内容,避免请求失败导致本地代理文件被清空无法运行。 -v参数转换int失败后仅打印了错误提示,没有终止程序,会导致投票次数默认使用1不符合预期,可在ValueError捕获块中添加exit(1)。- 检查目标代理网站的页面结构是否有变动,若站点改版原有DOM提取逻辑会失效,需要对应调整解析规则。
内容的提问来源于stack exchange,提问作者WeekendHobbist
相关产品推荐
相关产品推荐

