使用BeautifulSoup优化网页抓取:生成含多车型评论信息的字典
优化后的汽车评论抓取代码
需求调整说明
原代码仅将2017-2018款Audi A4的评论内容存入列表,现需修改为生成包含以下字段的字典条目,支持批量抓取指定年份车型:
reviewer_name:评论作者名称car_model:完整车型标识(如Audi A4 2017)review_content:拼接后的完整评论内容
优化后的代码
from bs4 import BeautifulSoup import requests import pandas as pd import time from fake_useragent import UserAgent import random # 存储结果的字典列表 review_entries = [] ua = UserAgent() # 指定要抓取的年份范围 target_years = range(2017, 2019) for year in target_years: # 构造目标URL url = f'https://www.caranddriver.com/audi/a4-{year}' # 随机生成User-Agent headers = {'User-Agent': str(ua.random)} try: # 发送请求,加入随机延迟避免被拦截 time.sleep(random.uniform(1, 3)) response = requests.get(url, headers=headers) response.raise_for_status() # 检查请求是否成功 html_soup = BeautifulSoup(response.text, 'lxml') # 抓取评论作者名称(带异常处理) reviewer_name = "Unknown" byline_element = html_soup.find('div', class_='review-byline') if byline_element and byline_element.find('a'): reviewer_name = byline_element.find('a').text.strip() # 抓取并拼接评论内容 review_content = "" review_body = html_soup.find('div', class_='review-body-content') if review_body: paragraphs = review_body.find_all('p') review_content = '\n'.join([p.get_text(strip=True) for p in paragraphs]) # 构造字典条目并加入列表 review_entry = { 'reviewer_name': reviewer_name, 'car_model': f'Audi A4 {year}', 'review_content': review_content } review_entries.append(review_entry) print(f"成功抓取Audi A4 {year}的评论") except Exception as e: print(f"抓取Audi A4 {year}时出错: {str(e)}") # 可选:将结果转为DataFrame保存 df = pd.DataFrame(review_entries) df.to_csv('audi_a4_reviews.csv', index=False)
代码关键优化点
- 数据结构调整:用字典列表替代原有的字符串列表,结构化存储每条评论的完整信息
- 作者抓取逻辑:新增评论作者提取,同时加入异常处理,避免因页面结构变化导致程序崩溃
- 请求优化:使用随机
User-Agent和请求延迟,降低被目标网站拦截的概率 - 异常处理:覆盖请求失败、元素缺失等常见异常,提升代码稳定性
- 车型标识明确:直接构造带年份的完整车型名称,无需后续额外处理
内容的提问来源于stack exchange,提问作者Axton
相关产品推荐
相关产品推荐

