如何从指定网页抓取展商信息并导出CSV?解决链接及提取难题
解决展商信息抓取与CSV导出问题
下面给你梳理完整的实现步骤,代码附带详细注释,适合新手理解:
1. 前期准备
先确保安装好所需依赖库:
pip install requests beautifulsoup4 pandas
2. 修正展商链接抓取逻辑
你的原代码抓取了页面所有<a>标签的链接,自然会包含导航栏、页脚等无关链接。观察目标网站结构后,展商详情页的链接都包含/exhibitor/路径,我们可以基于这个特征过滤有效链接:
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' } # 获取展商列表页的HTML内容 response = requests.get('https://asiatechxsg.com/exhibitors/', headers=headers) response.encoding = 'utf-8' # 确保中文编码正确 soup = BeautifulSoup(response.text, 'html.parser') # 过滤并收集有效展商链接,同时去重 exhibitor_links = [] seen_links = set() for link in soup.find_all('a', href=True): href = link['href'] if '/exhibitor/' in href and href not in seen_links: # 拼接完整URL(处理相对路径情况) full_link = 'https://asiatechxsg.com' + href if href.startswith('/') else href exhibitor_links.append(full_link) seen_links.add(href) print(f"共筛选出{len(exhibitor_links)}个展商详情链接")
3. 抓取单展商详情信息
遍历每个展商链接,提取名称和详情内容。这里的选择器可以根据实际网页结构调整,你可以用浏览器F12开发者工具查看对应元素的标签或类名:
# 存储所有展商数据的列表 exhibitor_data = [] for link in exhibitor_links: try: # 请求展商详情页 detail_response = requests.get(link, headers=headers) detail_response.encoding = 'utf-8' detail_soup = BeautifulSoup(detail_response.text, 'html.parser') # 提取展商名称(示例用h1标签,可根据实际调整) name = detail_soup.find('h1').get_text(strip=True) if detail_soup.find('h1') else '未知名称' # 提取展商详情内容(示例抓取指定容器内的所有段落文本) details = [] detail_container = detail_soup.find('div', class_='exhibitor-content') # 替换为实际的容器类名 if detail_container: for p in detail_container.find_all('p'): text = p.get_text(strip=True) if text: details.append(text) info = '\n'.join(details) if details else '无详情信息' # 将数据存入列表 exhibitor_data.append({ '展商名称': name, '展商详情': info, '详情链接': link }) print(f"已完成抓取:{name}") except Exception as e: print(f"抓取{link}时出错:{str(e)}") continue
4. 转换为DataFrame并导出CSV
# 将列表数据转换为DataFrame df = pd.DataFrame(exhibitor_data) # 导出CSV文件,用utf-8-sig编码避免中文乱码 df.to_csv('asia_tech_exhibitors.csv', index=False, encoding='utf-8-sig') print("展商信息已成功导出到CSV文件!")
关键注意点
- 网页结构变化:如果网站后续更新页面布局,需要重新用开发者工具查看元素,调整代码中的标签选择器(比如类名、标签类型)。
- 反爬限制:如果频繁请求被拦截,可以添加
time.sleep(1)(需导入time库)设置请求间隔,降低被封IP的风险。 - 数据清洗:提取的文本可能存在多余空格或换行,可使用
strip()、replace()等方法进一步整理。
内容的提问来源于stack exchange,提问作者user22279494
相关产品推荐
相关产品推荐

