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

使用BeautifulSoup爬取会员列表生成DataFrame时出现空表问题

爬虫空DataFrame问题排查与修复

问题说明

开发爬虫遍历会员列表页面,获取每个会员的kontaktinformationen页面联系信息并存储到Pandas DataFrame,但运行后得到空DataFrame。

核心问题排查

  • 会员链接定位错误:原代码使用soup.find_all("a", class_="font1")查找会员链接,但实际页面中会员名称链接的class为member-name,导致member_links为空列表,后续循环无法执行。
  • 请求可能被拦截:未添加请求头(User-Agent),部分网站会拦截无标识的爬虫请求,导致无法正确获取页面内容。
  • 联系信息区域定位错误:原代码查找class="contact"的div,但实际页面中联系信息区域的class为contact-details。

修复后的代码

import requests
from bs4 import BeautifulSoup
import pandas as pd

# 添加请求头模拟浏览器访问,避免被拦截
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"
}

url = "https://vvonet.vvo.at/vvonet_mitgliederverzeichnisneu"
response = requests.get(url, headers=headers)

if response.status_code == 200:
    soup = BeautifulSoup(response.content, "html.parser")
    
    # 修正会员链接的class定位
    member_links = soup.find_all("a", class_="member-name")
    
    member_data = []
    
    for member_link in member_links:
        member_name = member_link.text.strip()
        # 拼接正确的联系信息页面URL
        member_url = f"https://vvonet.vvo.at{member_link['href']}/kontaktinformationen"
        
        member_response = requests.get(member_url, headers=headers)
        
        if member_response.status_code == 200:
            member_soup = BeautifulSoup(member_response.content, "html.parser")
            
            # 修正联系信息区域的class定位
            contact_info_div = member_soup.find("div", class_="contact-details")
            
            if contact_info_div:
                contact_info_text = contact_info_div.get_text(separator="\n", strip=True)
                # 同时存储会员名称和联系信息,提升数据可读性
                member_data.append({"会员名称": member_name, "联系信息": contact_info_text})
            else:
                member_data.append({"会员名称": member_name, "联系信息": "未找到联系信息"})
        else:
            member_data.append({"会员名称": member_name, "联系信息": f"获取失败,状态码:{member_response.status_code}"})
    
    # 创建结构化的DataFrame
    df = pd.DataFrame(member_data)
    
    print(df)
    # 可选:保存为CSV文件,指定编码避免乱码
    # df.to_csv("会员联系信息.csv", index=False, encoding="utf-8-sig")
else:
    print(f"获取会员列表失败,状态码:{response.status_code}")

优化说明

  • 新增User-Agent请求头,模拟浏览器访问规避反爬拦截;
  • 修正两处元素定位的class值,确保能正确抓取目标内容;
  • 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.27 15:45:03