如何搜索预定义字符串返回匹配整行,修复Bscscan爬虫代码报错
错误原因
- URL拼接逻辑错误:你在循环内直接修改全局的
url变量,第一次循环结束后url已经被拼接了第一个地址,第二次循环会继续把第二个地址拼到已经修改过的url后面,导致请求的是无效地址,页面返回内容不存在目标pre元素,soup.select_one返回None,调用stripped_strings就会抛出属性错误。 - 缺少空值校验:未判断
pre元素是否存在就直接调用方法,一旦页面请求失败或者结构变化就会直接报错。 - 缺少反爬处理:bscscan有基础反爬策略,未携带浏览器UA的请求很容易被拦截,返回的页面不存在目标元素。
修复后代码
from bs4 import BeautifulSoup as bs import requests addrlist = ['0xe56842ed550ff2794f010738554db45e60730371', '0xe1fd7b4c9debac3c490d8a553c455da4979482e4', '0x88c20beda907dbc60c56b71b102a133c1b29b053'] queries = ["Website", "Telegram", "https://www.", "Twitter", "https://t.me"] # 固定基础地址,不要在循环内修改 base_url = "https://bscscan.com/address/" for addr in addrlist: # 每次循环用基础地址拼接新的目标地址 url = base_url + addr # 模拟浏览器请求头,避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } r = requests.get(url, headers=headers) soup = bs(r.text,'lxml') pre = soup.select_one('pre.js-sourcecopyarea.editor') # 空值校验,不存在目标元素直接跳过当前地址 if not pre: continue ss = (list(pre.stripped_strings)[0]).split('*') for s in ss: for query in queries: if query in s: # 去掉首尾多余空白符后输出 print(s.strip())
核心修改说明
- 拆分基础地址和请求地址,避免循环内拼接URL出错
- 新增浏览器UA请求头,绕过站点基础反爬拦截
- 增加
pre元素的非空判断,避免空对象调用属性报错 - 输出时增加
strip()处理,去掉多余空白和换行,输出格式更符合预期
内容的提问来源于stack exchange,提问作者rbutrnz
相关产品推荐
相关产品推荐

