求助:使用BeautifulSoup爬取指定页面并提取数据为CSV格式
搞定EVS认证组织数据爬取与CSV导出(新手友好版)
Hey there! 作为编程新手刚接触爬虫+不熟悉面向对象确实会有点手足无措,别慌,咱们一步步来把这个任务拆解清楚,用你已经上手的BeautifulSoup完成数据提取,最后导出成CSV文件~
第一步:准备依赖库
首先确保你已经安装了必要的工具包,打开终端运行:
pip install requests beautifulsoup4
requests:用来发送请求获取网页内容beautifulsoup4:用来解析HTML结构,提取需要的数据
第二步:获取并解析网页内容
先写基础代码把页面抓下来,解析成BeautifulSoup能处理的对象:
import requests from bs4 import BeautifulSoup # 目标网页URL url = "http://europa.eu/youth/volunteering/evs-organisation_en" try: # 发送GET请求获取页面 response = requests.get(url) response.raise_for_status() # 如果请求失败(比如404/500),抛出异常提示 # 解析HTML soup = BeautifulSoup(response.text, "html.parser") except requests.exceptions.RequestException as e: print(f"请求网页出错啦:{e}") exit()
第三步:提取EVS组织数据
接下来要定位到组织信息的位置。我帮你假设页面里每个认证组织的条目都在一个带有特定class的容器里(你可以根据实际页面源码调整这个选择器)。咱们把每个组织的关键信息(名称、国家、联系方式、认证编号之类的)提取出来:
# 存储所有组织数据的列表 organisations = [] # 找到所有组织条目(这里的选择器请根据你看到的页面源码调整!) organisation_items = soup.find_all("div", class_="evs-organisation-item") for item in organisation_items: # 提取组织名称(示例选择器,实际要对应页面里的标签) name = item.find("h3").get_text(strip=True) if item.find("h3") else "无名称" # 提取国家 country = item.find("span", class_="country").get_text(strip=True) if item.find("span", class_="country") else "无国家" # 提取联系方式(比如邮箱或电话) contact = item.find("a", href=True).get_text(strip=True) if item.find("a", href=True) else "无联系方式" # 提取认证编号(如果有的话) cert_number = item.find("div", class_="cert-id").get_text(strip=True) if item.find("div", class_="cert-id") else "无编号" # 把当前组织的信息存成字典,方便后续处理 org_data = { "组织名称": name, "国家": country, "联系方式": contact, "认证编号": cert_number } organisations.append(org_data)
划重点:页面结构可能会有变化,你要打开浏览器的开发者工具(F12),对着目标数据右键「检查」,找到对应的HTML标签和class/id,替换上面的选择器哦!
第四步:导出成CSV文件
现在咱们把提取到的列表数据写入CSV,用Python自带的csv模块,简单又靠谱:
import csv # 定义CSV的表头(要和上面字典的键对应) headers = ["组织名称", "国家", "联系方式", "认证编号"] try: # 打开文件准备写入(encoding="utf-8-sig"是为了让Excel能正确显示中文) with open("evs_organisations.csv", "w", newline="", encoding="utf-8-sig") as csvfile: # 创建CSV写入对象 writer = csv.DictWriter(csvfile, fieldnames=headers) # 写入表头 writer.writeheader() # 写入所有组织数据 writer.writerows(organisations) print(f"成功导出{len(organisations)}条数据到evs_organisations.csv!") except IOError as e: print(f"写入CSV文件出错啦:{e}")
给新手的小提示
- 如果页面是动态加载的(比如滚动才加载更多数据),上面的代码可能只能抓第一页,这时候可能需要用
selenium模拟浏览器,但先从静态页面入手就好~ - 不要频繁请求网页,避免给服务器造成压力,必要时可以加个
time.sleep(1)在请求之间 - 如果你之后想尝试面向对象写法,可以把爬虫逻辑封装成一个类,比如
EVSOrganisationSpider,把请求、提取、导出写成类的方法,这样代码更规整,但新手先把基础逻辑跑通最重要!
内容的提问来源于stack exchange,提问作者zero
相关产品推荐
相关产品推荐

