使用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
相关产品推荐
相关产品推荐

