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

使用BS4与Requests爬取西班牙保险公司列表失败的问题排查

解决UNESPA网站保险公司列表爬取请求失败问题

核心原因

UNESPA网站存在基础反爬机制,会拦截无合法请求头的爬虫请求,这是你请求失败的主要原因。

解决方案步骤

1. 配置合法请求头

必须在请求中添加模拟真实浏览器的请求头,重点是User-Agent,可附带Accept-Language和Referer提升请求合法性。

2. 完整实现代码

import requests
from bs4 import BeautifulSoup
import pandas as pd
import time

# 配置请求头,可替换为你当前浏览器的User-Agent(通过浏览器开发者工具查看)
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',
    'Accept-Language': 'en-US,en;q=0.9',
    'Referer': 'https://www.unespa.es/en/directory/'
}

# 遍历A-Z字母页面(网站共24页,无数据的字母会自动跳过)
letters = [chr(ord('A') + i) for i in range(26)]
all_companies = []

for letter in letters:
    url = f'https://www.unespa.es/en/directory/?letter={letter}'
    try:
        # 发送请求,添加超时和异常捕获
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()
        
        # 解析页面
        soup = BeautifulSoup(response.text, 'html.parser')
        # 定位公司列表容器(需根据页面实际结构调整类名,可通过浏览器F12查看)
        company_items = soup.find_all('div', class_='directory-item')
        
        # 提取公司信息
        for item in company_items:
            company_data = {
                '字母分组': letter,
                '公司名称': item.find('h3').text.strip() if item.find('h3') else '无数据',
                '官网链接': item.find('a')['href'] if item.find('a') else '无数据',
                '地址': item.find('div', class_='address').text.strip() if item.find('div', class_='address') else '无数据',
                '联系电话': item.find('div', class_='phone').text.strip() if item.find('div', class_='phone') else '无数据'
            }
            all_companies.append(company_data)
        
        print(f"完成字母{letter}爬取,共获取{len(company_items)}家公司")
        # 添加延时,避免请求频率过高被封
        time.sleep(1)
    
    except requests.exceptions.RequestException as e:
        print(f"字母{letter}爬取失败: {str(e)}")
        continue

# 转换为Pandas DataFrame
df = pd.DataFrame(all_companies)
# 查看前5条数据
print(df.head())
# 保存为CSV文件(可选)
df.to_csv('西班牙保险公司列表.csv', index=False, encoding='utf-8-sig')

注意事项

  • 元素类名调整:代码中使用的directory-item、address等类名需与网站实际DOM结构匹配,可通过浏览器开发者工具查看最新类名。
  • 请求频率控制:添加time.sleep(1)避免短时间内发送大量请求导致IP被封禁。
  • 动态加载处理:如果发现部分公司数据是滚动加载的静态内容,可通过分析接口请求获取;若为完全动态渲染,需改用Selenium模拟浏览器操作。

内容的提问来源于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 17:10:23