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)} 条口碑数据")

核心要点:

  1. 请求头设置:必须添加User-Agent模拟浏览器
  2. 编码处理:汽车之家使用gbk编码,需要正确设置
  3. 页面解析:使用BeautifulSoup根据CSS选择器提取数据
  4. 反爬处理:添加随机延迟避免被封IP
  5. 数据保存:使用pandas保存为CSV格式

注意事项:

  • 实际使用时需要先分析网站结构,确定车型ID的获取方式
  • 可能需要处理登录验证或验证码
  • 建议使用代理IP应对频繁请求

一句话建议: 先分析页面结构再写爬虫,注意控制请求频率。

自定义 字体?

github 已经都翻过了,但是上面提交的代码都过于老旧,不知道什么时候汽车之家的反爬已经更新了,不适用。

因为是初入爬虫坑,对于跳转重定向、获取 cookie 再请求一类的都不是很清楚

还需要配合代理 ip 才行吧

这个我不清楚,因为没研究透,所以想请问各位大神求一点思路

回到顶部