You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于BeautifulSoup的欧洲志愿服务爬虫遍历10万页面报错求助

解决欧盟青年网站爬虫404及ValueError问题的方案

一、解决大量404错误的核心措施

  • 停止盲目遍历ID:欧盟青年网站的placement ID大概率不是连续的1-100000,直接遍历必然产生大量无效请求。正确做法是先获取有效ID列表:
    • 抓列表分页接口:浏览网站志愿服务列表页,打开浏览器开发者工具查看网络请求,通常能找到返回所有有效placement ID或列表数据的API(多为JSON/XML格式),直接爬取这个接口的ID,完全避免无效请求。
    • 爬列表页提取ID:如果没有公开API,就从列表第1页到最后一页逐个爬取,解析页面上的志愿服务详情链接,从中提取有效ID,再针对这些ID访问详情页。
  • 添加请求重试机制:偶尔的404可能是网络波动导致,用requests的重试适配器自动重试:
    import requests
    from requests.adapters import HTTPAdapter
    from urllib3.util.retry import Retry
    
    session = requests.Session()
    retry_strategy = Retry(
        total=3,
        backoff_factor=1,
        status_forcelist=[404, 500, 502, 503, 504]
    )
    adapter = HTTPAdapter(max_retries=retry_strategy)
    session.mount('https://', adapter)
    session.mount('http://', adapter)
    

二、修复ValueError(expected 2, got 0)

这个错误是因为你解析页面时假设某个元素/字符串一定存在,但404页面或异常页面中没有该内容,导致split()、索引取值等操作失败。解决方法:

  • 先校验页面有效性:解析前先判断响应状态码,非200的直接跳过:
    response = session.get(url, headers=headers)
    if response.status_code != 200:
        continue
    
  • 给解析逻辑加容错:每个字段解析前先判断是否存在,避免空值操作:
    # 示例:解析机构名称
    name_elem = soup.find('h2', class_='org-name')
    org_name = name_elem.text.strip() if name_elem else None
    
    # 示例:处理带分隔符的字符串
    country_elem = soup.find('span', class_='country-tag')
    country_text = country_elem.text.strip() if country_elem else ''
    country = country_text.split(':')[1].strip() if ':' in country_text else None
    
  • 捕获异常防崩溃:在解析代码块外层加try-except,单个ID解析失败不影响整体程序:
    try:
        # 你的解析逻辑
        org_info = {
            'name': org_name,
            'country': country,
            'website': website,
            # 其他字段
        }
        data_list.append(org_info)
    except ValueError as e:
        print(f"ID {placement_id} 解析出错: {e}")
        continue
    

三、爬虫优化建议

  • 模拟浏览器请求:添加请求头避免被反爬拦截:
    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'
    }
    
  • 控制请求频率:每次请求后加time.sleep(1),避免短时间内请求过多被封IP。
  • 逐步写入数据:每爬取一条有效数据就写入CSV/XML文件,不要等到全部爬完再处理,防止程序崩溃丢失数据。
  • 校验数据完整性:存入DataFrame前检查字段空值,按需填充默认值或过滤不完整数据。

内容的提问来源于stack exchange,提问作者zero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 05:53:13