Python中如何爬取汽车之家口碑数据?
rt,能请教一下思路么?
Python中如何爬取汽车之家口碑数据?
7 回复
1 打开 github 搜索, 汽车之家
2 打开 google 搜索 爬取 汽车之家
3. 以上都没找到, 自己分析页面(或者 app)接口, 写代码,开始爬
import requests
import pandas as pd
from bs4 import BeautifulSoup
import time
import random
class AutohomeSpider:
def __init__(self):
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
self.base_url = "https://k.autohome.com.cn"
def get_car_models(self):
"""获取车型列表(示例)"""
# 这里需要实际分析汽车之家口碑页面的车型选择逻辑
# 以下为示例URL结构
models = [
{'id': '1', 'name': '奥迪A4L'},
{'id': '2', 'name': '宝马3系'},
{'id': '3', 'name': '奔驰C级'}
]
return models
def parse_reviews(self, car_id, page=1):
"""解析单页口碑数据"""
url = f"{self.base_url}/spec/{car_id}/index_{page}.html"
try:
response = requests.get(url, headers=self.headers, timeout=10)
response.encoding = 'gbk' # 汽车之家使用gbk编码
soup = BeautifulSoup(response.text, 'html.parser')
reviews = []
review_items = soup.select('.mouthcon')
for item in review_items:
review = {
'车型': soup.select_one('.subnav-title-name a').text.strip() if soup.select_one('.subnav-title-name a') else '',
'购买车型': item.select_one('.name-text a').text.strip() if item.select_one('.name-text a') else '',
'购买时间': item.select_one('.mouth-item .time').text.strip() if item.select_one('.mouth-item .time') else '',
'购买地点': item.select_one('.address span').text.strip() if item.select_one('.address span') else '',
'裸车购买价': item.select_one('.cost .value').text.strip() if item.select_one('.cost .value') else '',
'油耗': item.select_one('.cost .value').find_next_sibling().text.strip() if item.select_one('.cost .value') else '',
'评分': len(item.select('.grade-star .star-on')),
'优点': item.select_one('.text-con .text-title:contains("优点") + div').text.strip() if item.select_one('.text-con .text-title:contains("优点") + div') else '',
'缺点': item.select_one('.text-con .text-title:contains("缺点") + div').text.strip() if item.select_one('.text-con .text-title:contains("缺点") + div') else '',
'总结': item.select_one('.text-con .text-title:contains("总结") + div').text.strip() if item.select_one('.text-con .text-title:contains("总结") + div') else ''
}
reviews.append(review)
return reviews
except Exception as e:
print(f"解析失败: {e}")
return []
def crawl_all_reviews(self, car_id, max_pages=5):
"""爬取多页口碑数据"""
all_reviews = []
for page in range(1, max_pages + 1):
print(f"正在爬取第{page}页...")
reviews = self.parse_reviews(car_id, page)
if not reviews:
break
all_reviews.extend(reviews)
time.sleep(random.uniform(1, 3)) # 礼貌性延迟
return all_reviews
def save_to_csv(self, data, filename='autohome_reviews.csv'):
"""保存数据到CSV"""
if data:
df = pd.DataFrame(data)
df.to_csv(filename, index=False, encoding='utf-8-sig')
print(f"数据已保存到 {filename}")
return True
return False
# 使用示例
if __name__ == "__main__":
spider = AutohomeSpider()
# 1. 获取车型(这里需要你实际分析页面获取车型ID)
models = spider.get_car_models()
print("可选车型:", models)
# 2. 爬取指定车型的口碑数据(示例使用第一个车型)
if models:
car_id = models[0]['id']
reviews = spider.crawl_all_reviews(car_id, max_pages=2)
# 3. 保存数据
if reviews:
spider.save_to_csv(reviews)
print(f"共爬取 {len(reviews)} 条口碑数据")
核心要点:
- 请求头设置:必须添加User-Agent模拟浏览器
- 编码处理:汽车之家使用gbk编码,需要正确设置
- 页面解析:使用BeautifulSoup根据CSS选择器提取数据
- 反爬处理:添加随机延迟避免被封IP
- 数据保存:使用pandas保存为CSV格式
注意事项:
- 实际使用时需要先分析网站结构,确定车型ID的获取方式
- 可能需要处理登录验证或验证码
- 建议使用代理IP应对频繁请求
一句话建议: 先分析页面结构再写爬虫,注意控制请求频率。
自定义 字体?
github 已经都翻过了,但是上面提交的代码都过于老旧,不知道什么时候汽车之家的反爬已经更新了,不适用。
因为是初入爬虫坑,对于跳转重定向、获取 cookie 再请求一类的都不是很清楚
还需要配合代理 ip 才行吧
这个我不清楚,因为没研究透,所以想请问各位大神求一点思路

