Python 爬虫实战:爬取汽车之家,剖析热门车型参数与用户口碑

一、引言

汽车之家作为国内知名的汽车资讯平台,汇聚了丰富的汽车信息,涵盖热门车型的详细参数以及用户的真实口碑评价。这些数据对于汽车爱好者了解车型特点、潜在购车者做出决策以及汽车厂商分析市场反馈都极具价值。通过编写 Python 爬虫程序,我们能够自动化地获取这些数据,并进行深入剖析。本文将详细阐述如何运用 Python 实现从汽车之家爬取相关数据,并展开初步分析。

二、准备工作

(一)环境搭建

确保系统中安装了 Python 环境,建议使用 Python 3 以上版本。接着,安装项目所需的库:

  • requests:用于发送 HTTP 请求,与汽车之家服务器进行通信以获取网页内容。

  • BeautifulSoup:强大的网页解析库,协助从 HTML 或 XML 文档中精准提取数据。

  • pandas:负责数据处理与存储,方便将抓取的数据整理成结构化表格并保存。

  • 使用以下命令通过 pip 进行安装:

    pip install requests beautifulsoup4 pandas
    

    (二)目标网页分析

    打开汽车之家网站,比如搜索热门车型 “丰田卡罗拉”。借助浏览器的开发者工具(如 Chrome 浏览器按 F12 键),对网页结构展开分析。我们留意到车型参数和用户口碑信息分别处于不同的页面板块,且各信息都嵌套在特定的 HTML 标签与类中。明确这些标签和类的结构,是编写代码准确提取数据的关键。

    三、编写爬虫代码

    (一)发送请求获取网页内容

    import requests
    
    
    def get_page(url):
        headers = {
            "User - Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
        }
        try:
            response = requests.get(url, headers=headers)
            if response.status_code == 200:
                return response.text
            else:
                print(f"请求失败,状态码:{response.status_code}")
                return None
        except requests.RequestException as e:
            print(f"请求过程中出现异常:{e}")
            return None
    

    代码注释

    1. 定义函数 get_page,此函数接收一个参数 url,即目标网页的 URL。

    2. 设置 headers,模拟浏览器的用户代理信息,以此规避网站的反爬虫机制,使请求看似来自普通浏览器。

    3. 运用 requests.get 方法向指定的 url 发送 GET 请求,并传递 headers

    4. 若响应状态码为 200,表明请求成功,返回网页的文本内容;否则,打印错误状态码并返回 None

    5. 倘若请求过程中出现异常,打印异常信息并返回 None

    (二)解析网页内容提取车型参数

    from bs4 import BeautifulSoup
    
    
    def parse_model_parameters(html):
        parameters = {}
        if html:
            soup = BeautifulSoup(html, 'lxml')
            # 假设车型参数在 class 为 model - parameter - wrapper 的 div 中
            parameter_wrapper = soup.find('div', class_='model - parameter - wrapper')
            if parameter_wrapper:
                # 提取发动机参数
                engine_params = parameter_wrapper.find('dl', class_='engine - parameter')
                if engine_params:
                    engine_type = engine_params.find('dd', class_='parameter - value').text.strip()
                    parameters['发动机类型'] = engine_type
    
                # 提取变速箱参数
                transmission_params = parameter_wrapper.find('dl', class_='transmission - parameter')
                if transmission_params:
                    transmission_type = transmission_params.find('dd', class_='parameter - value').text.strip()
                    parameters['变速箱类型'] = transmission_type
    
                # 提取车身尺寸参数
                dimension_params = parameter_wrapper.find('dl', class_='dimension - parameter')
                if dimension_params:
                    length = dimension_params.find('dd', class_='parameter - value').find_all('span').text.strip()
                    width = dimension_params.find('dd', class_='parameter - value').find_all('span').text.strip()
                    height = dimension_params.find('dd', class_='parameter - value').find_all('span').text.strip()
                    parameters['车身长度'] = length
                    parameters['车身宽度'] = width
                    parameters['车身高度'] = height
    
        return parameters
    

    代码注释

    1. 定义函数 parse_model_parameters,该函数接收一个参数 html,即获取到的网页文本内容。

    2. 初始化一个空字典 parameters,用于存储解析出的车型参数。

    3. 使用 BeautifulSoup 解析 html 内容,指定 lxml 解析器,创建 soup 对象。

    4. 查找包含车型参数的 div 元素(假设其 classmodel - parameter - wrapper)。

    5. 若找到该元素,进一步分别查找发动机参数、变速箱参数和车身尺寸参数对应的 dl 元素。

    6. 针对每个参数,提取相应的文本内容并整理到 parameters 字典中。

    7. 最后返回 parameters 字典。

    (三)解析网页内容提取用户口碑

    def parse_user_reviews(html):
        reviews = []
        if html:
            soup = BeautifulSoup(html, 'lxml')
            # 假设用户口碑列表在 class 为 user - review - list 的 div 中
            review_list = soup.find('div', class_='user - review - list')
            if review_list:
                review_items = review_list.find_all('div', class_='review - item')
                for item in review_items:
                    user_nickname = item.find('span', class_='user - nickname').text.strip()
                    review_score = item.find('span', class_='review - score').text.strip()
                    review_content = item.find('div', class_='review - content').text.strip()
    
                    review_info = {
                        "用户昵称": user_nickname,
                        "评分": review_score,
                        "评论内容": review_content
                    }
                    reviews.append(review_info)
    
        return reviews
    

    代码注释

    1. 定义函数 parse_user_reviews,接收参数 html

    2. 初始化空列表 reviews,用于存储解析出的用户口碑信息。

    3. 使用 BeautifulSoup 解析 html,创建 soup 对象。

    4. 查找包含用户口碑列表的 div 元素(假设 classuser - review - list)。

    5. 若找到该元素,获取所有的评论项(classreview - item)。

    6. 对于每个评论项,提取用户昵称、评分和评论内容。

    7. 将评论信息整理成字典形式,添加到 reviews 列表中。

    8. 最后返回 reviews 列表。

    (四)整合爬虫流程

    def crawl_car_info(car_url):
        page_html = get_page(car_url)
        if page_html:
            model_params = parse_model_parameters(page_html)
            review_html = get_page(car_url + '/koubei/')  # 假设口碑页面 URL 是车型 URL 加上 /koubei/
            if review_html:
                user_reviews = parse_user_reviews(review_html)
                return model_params, user_reviews
        return None, None
    

    代码注释

    1. 定义函数 crawl_car_info,接收参数 car_url,即车型详情页的 URL。

    2. 调用 get_page 函数获取车型详情页的 HTML 内容。

    3. 若获取成功,调用 parse_model_parameters 函数解析车型参数。

    4. 构造用户口碑页面的 URL,调用 get_page 函数获取口碑页面的 HTML 内容。

    5. 若口碑页面 HTML 获取成功,调用 parse_user_reviews 函数解析用户口碑信息。

    6. 将车型参数和用户口碑信息作为元组返回;若任何一步获取失败,返回两个 None

    四、数据存储

    获取到车型参数和用户口碑数据后,将其存储以便后续分析。使用 pandas 库将数据保存为 CSV 文件。

    import pandas as pd
    
    
    def save_data(model_params, user_reviews, file_path):
        if model_params:
            model_df = pd.DataFrame([model_params])
            model_df.to_csv(file_path.replace('.csv', '_parameters.csv'), index=False, encoding='utf - 8 - sig')
    
        if user_reviews:
            review_df = pd.DataFrame(user_reviews)
            review_df.to_csv(file_path.replace('.csv', '_reviews.csv'), index=False, encoding='utf - 8 - sig')
    

    代码注释

    1. 定义函数 save_data,接收车型参数 model_params、用户口碑 user_reviews 和文件路径 file_path 三个参数。

    2. 若车型参数存在,将其转换为 DataFrame 格式,并保存为以 _parameters.csv 结尾的文件,设置不保存行索引,采用合适编码防止中文乱码。

    3. 若用户口碑存在,同样转换为 DataFrame 格式,保存为以 _reviews.csv 结尾的文件,设置不保存行索引和正确编码。

    五、注意事项

    1. 遵守法律法规和平台规定:未经授权的爬虫行为可能违反法律法规以及汽车之家的使用条款。务必确保爬虫活动合法合规,避免过度抓取数据影响平台正常运营。

    2. 反爬虫机制:汽车之家设有反爬虫措施,如限制 IP 访问频率、验证码验证等。为防止被封禁,可设置合理的请求间隔时间,或使用代理服务器隐藏真实 IP 地址。

    3. 数据准确性和完整性:网页结构可能变动,导致爬虫无法准确提取数据。需定期检查维护代码,适应网页变化。同时,因网络问题等,抓取的数据可能不完整或不准确,要进行数据清洗和验证。

    六、简单数据分析示例

    获取数据后,进行简单数据分析。例如,统计用户口碑评分的平均值,分析车身长度与评分的关系等。

    import pandas as pd
    import matplotlib.pyplot as plt
    
    
    def analyze_data(parameters_file, reviews_file):
        params_df = pd.read_csv(parameters_file)
        reviews_df = pd.read_csv(reviews_file)
    
        # 统计平均评分
        average_score = reviews_df['评分'].astype(float).mean()
        print(f"平均评分:{average_score}")
    
        # 尝试分析车身长度与评分的关系(假设车身长度数据可用)
        if '车身长度' in params_df.columns:
            merged_df = pd.merge(params_df, reviews_df, left_index=True, right_index=True)
            plt.scatter(merged_df['车身长度'], merged_df['评分'])
            plt.xlabel('车身长度')
            plt.ylabel('评分')
            plt.title('车身长度与评分的关系')
            plt.show()
    
    
    if __name__ == "__main__":
        parameters_file = "car_data_parameters.csv"
        reviews_file = "car_data_reviews.csv"
        analyze_data(parameters_file, reviews_file)
    

    代码注释

    1. 定义函数 analyze_data,接收车型参数文件路径和用户口碑文件路径两个参数。

    2. 读取两个 CSV 文件到 DataFrame 中。

    3. 计算用户口碑的平均评分并打印。

    4. 若车型参数中有 “车身长度” 列,合并两个 DataFrame,绘制车身长度与评分的散点图,展示两者关系。

    通过上述分析,能初步了解车型的用户评价情况以及部分参数与评价的潜在联系。当然,可依据具体需求开展更深入的数据分析。

    python爬虫实战案例

    七、总结

    通过本文的实战,我们学会用 Python 爬取汽车之家的热门车型参数与用户口碑数据,涵盖发送请求、解析网页、数据存储及简单分析等环节。这些技能助于我们深入了解汽车市场,但要遵循法律法规和平台规则。希望读者在此基础上继续探索,挖掘更多有价值信息,为汽车相关决策提供有力支撑 。

    作者:西攻城狮北

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python 爬虫实战:爬取汽车之家,剖析热门车型参数与用户口碑

    发表回复