如何使用Python爬取网页数据并生成包含华硕主板完整技术规格的CSV文件
如何使用Python爬取网页数据并生成包含华硕主板完整技术规格的CSV文件
嘿,我看你已经搭建了基础的爬取框架,不过要抓取页面上全部技术规格细节,咱们得调整下代码逻辑——原来的写法只匹配了你预先定义的表头项,很容易漏掉网页里的其他规格内容。下面我来帮你修改代码,实现完整的规格爬取:
问题分析
原代码的局限在于:
- 只抓取了你预先列出的9项规格,网页里的其他技术细节会被忽略
- 依赖标题的模糊匹配(
header_name.lower() in spec_title.lower()),可能出现匹配不准确的情况
修改后的完整代码
import requests from bs4 import BeautifulSoup import csv import os # 目标网页链接 url = "https://rog.asus.com/pl/motherboards/rog-maximus/rog-maximus-xi-formula-model/spec/" # 获取页面内容 response = requests.get(url) response.encoding = 'utf-8' # 确保编码正确,避免乱码 soup = BeautifulSoup(response.text, 'html.parser') # 定位所有规格项的行元素 spec_elements = soup.find_all('div', class_='ProductSpecSingle__productSpecItemRow__3sjMJ') # 收集所有规格标题和对应的值 spec_data = [] headers = [] for spec_element in spec_elements: # 抓取规格标题 spec_title_element = spec_element.find('h2', class_='ProductSpecSingle__productSpecItemTitle__8gSrN') # 抓取规格内容 spec_value_element = spec_element.find('span', class_='ProductSpecSingle__descriptionItemValue__lVa0O') if spec_title_element and spec_value_element: title = spec_title_element.text.strip() value = spec_value_element.text.strip() # 避免重复表头(如果网页里有重复标题的话) if title not in headers: headers.append(title) spec_data.append((title, value)) # 整理成字典格式,方便写入CSV data_dict = {title: "" for title in headers} for title, value in spec_data: data_dict[title] = value # 确保输出文件夹存在 output_dir = "ASUS" if not os.path.exists(output_dir): os.makedirs(output_dir) # 写入CSV文件 csv_filename = os.path.join(output_dir, 'specyfikacja_plyty_glownej.csv') with open(csv_filename, mode='w', newline='', encoding='utf-8') as file: writer = csv.DictWriter(file, fieldnames=headers) writer.writeheader() # 写入表头 writer.writerow(data_dict) # 写入数据 print(f'Utworzono plik CSV: {csv_filename} z pełnymi danymi specyfikacji.')
关键改进点
- 动态生成表头:不再依赖预先定义的表头,而是直接从网页里抓取所有规格标题作为CSV表头,确保没有遗漏
- 更严谨的元素定位:确保每个规格标题都能对应到正确的内容,避免模糊匹配的误差
- 文件夹创建处理:自动创建
ASUS输出文件夹,避免因文件夹不存在导致的报错 - 编码优化:显式设置响应编码为UTF-8,解决可能出现的中文/波兰文乱码问题
注意事项
如果后续网页更新了CSS类名(比如ProductSpecSingle__productSpecItemRow__3sjMJ这类动态生成的类名),你需要重新检查网页的HTML结构,更新代码里的类名参数,否则爬取会失效。
备注:内容来源于stack exchange,提问作者Michał Gąsiorski




