Python爬虫爬取网页字符串转整数偶发ValueError问题排查
问题根因
固定位置字符串切片的写法鲁棒性极差,完全依赖返回文本的固定字符长度和排版。Indeed会根据访问IP的地区、账号语言设置、前端灰度A/B测试调整统计文案的措辞和长度,一旦文案格式变化,预设的切片偏移量就会错位,把非数字的文本内容切出来,转整数时必然抛出ValueError。你报错里提到的切取结果s | Page 1 of 就是典型的切片偏移不匹配问题。
修复方法
放弃硬编码位置切片的逻辑,改用正则表达式定向提取文本中的职位总数,适配不同格式的文案:
- 新增正则模块依赖,匹配文案中符合“千分位格式数字+jobs”规则的片段,精准定位总职位数
- 增加元素非空判断、匹配结果非空判断作为兜底,避免页面结构变动、反爬拦截时程序直接崩溃
修复后的可运行代码:
import requests import re from bs4 import BeautifulSoup # 建议补充真实请求头降低反爬拦截概率 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" } result = requests.get("https://www.indeed.com/jobs?q=web%20development&start=0", headers=headers) source = result.content soup = BeautifulSoup(source, "lxml") count_element = soup.find("div", {"id": "searchCountPages"}) if not count_element: raise RuntimeError("未找到职位总数元素,可能触发了反爬验证") job_count_text = count_element.text.strip() # 正则匹配总职位数:匹配数字+千分位逗号组成的数字串,后接jobs关键词 count_match = re.search(r'([\d,]+)\s+jobs', job_count_text) if not count_match: raise ValueError(f"未从文本中匹配到职位总数,当前文本内容:{job_count_text}") job_posted = int(count_match.group(1).replace(",", "")) print(job_posted)
额外提示:如果短时间内请求频率过高,即使加了请求头也可能被Indeed重定向到人机验证页面,建议控制请求间隔,搭配代理池使用提升稳定性。
内容的提问来源于stack exchange,提问作者Wisam
相关产品推荐
相关产品推荐

