爬取懂车帝所有品牌车型信息


 概要

本文将对懂车帝的所有品牌车辆车型数据进行爬取,包括:车型,价格,车辆配置等信息。

一、使用模块

import re
from typing import Dict, Optional

import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient

二、反爬技术

1.js压缩和混淆

对代码进行压缩(去除空格,换行符)和混淆(无意义变量)降低可读性,格式化使得无法定位到数据的真实位置。

2.动态网页

动态网站通过JavaScript异步加载数据,需要查找数据接口,并且请求参数通常被加密参数保护。

三、分析过程

1.在选车页面,点击车型的参数,发现所有车型的数据,空白处右键,打开检查面板,选择网络选项卡,重新刷新网页,选取车名作为关键字进行搜索,发现数据嵌套在html,为静态网页。

观察请求的url,发现url中类似id的信息,以此作为思路,返回上一级查找。

2.返回上一级页面,通过昨天的内容,发现id确实是该车型的id,这样这个车型的信息就搞定了。但是后面发现,这样不利于信息的存储。于是我换了一个思路。先点开该车型的详细页面,再点击其中一个版本的参数详细。

经过以上步骤,我们成功获得了特定车型的数据页面,其中URL后面的数字猜测同样表示该车型的ID。结合第一天的内容,发现数据中存在一个名为car_ids的信息,经过验证,确认其与当前URL的ID对应。接下来,按照步骤1的分析过程进行数据提取,通过品牌ID、车型ID、版本ID以及参数信息组成一条数据,这样在后面进行SQL查询时更加方便和高效。

四、完整代码

import re
from typing import Dict, Optional

import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient

# MongoDB 配置
MONGO_URI = "mongodb://localhost:27017/"
DB_NAME = "car_database"
COLLECTION_NAME = "car_info"

# 初始化 MongoDB 客户端
client = MongoClient(MONGO_URI)
db = client[DB_NAME]
collection = db[COLLECTION_NAME]

URL = 'https://www.dongchedi.com/motor/pc/car/brand/select_series_v2'
PARAMS = {
    'aid': 1839,
    'app_name': 'auto_web_pc'
}


def fetch_car_data(page: int) -> Optional[Dict]:
    """获取汽车数据"""
    data = {
        'sort_new': 'hot_desc',
        'city_name': '梅州',
        'limit': 30,
        'page': page
    }
    try:
        response = requests.post(URL, params=PARAMS, data=data, timeout=10)
        response.raise_for_status()
        return response.json()
    except requests.RequestException as e:
        print(f"请求第{page}页失败: {e}")
        return None


def extract_info(body_div):
    body_info = {}

    if body_div:
        config_block_name = body_div.find('h3', class_='cell_title__1COfA').text.strip()
        rows = body_div.find_all('div', class_='table_row__yVX1h')
        for row in rows:
            label = row.find('label', class_='cell_label__ZtXlw')
            value = row.find('div', class_='cell_normal__37nRi')
            if label and value:
                body_info[label.text.strip()] = value.text.strip()
        return {config_block_name: body_info}


def save_to_mongodb(car_data):
    """保存提取的数据到 MongoDB"""
    try:
        result = collection.insert_one(car_data)
        print(f"数据已保存,ID: {result.inserted_id}")
    except Exception as e:
        print(f"保存到 MongoDB 失败: {e}")


def main():
    car_data = fetch_car_data(1)
    if not car_data:
        return

    for car in car_data['data']['series']:
        car_info = {
            'brand_id': car['id'],
            "brand_name": car['brand_name'],
            "outter_name": car['outter_name'],
            "models": []
        }

        for car_id in car['car_ids']:
            response = requests.get(f'https://www.dongchedi.com/auto/params-carIds-{car_id}')
            if response.status_code != 200:
                print(f"请求失败: {response.status_code}")
                continue

            soup = BeautifulSoup(response.text, 'html.parser')
            car_name = soup.find('a', class_='cell_car__28WzZ').text.strip()
            car_price = soup.find('span', class_='cell_price__1jlTy').text.strip()

            # 提取配置信息
            config_info = []
            for item in soup.find_all('div', attrs={'name': re.compile(r'config-body-\d+')}):
                config = extract_info(item)
                if config:
                    config_info.append(config)

            # 构建汽车模型数据
            model_info = {
                "car_id": car_id,
                "car_name": car_name,
                "car_price": car_price,
                "configurations": config_info
            }
            car_info["models"].append(model_info)

        # 保存每个品牌的汽车信息到 MongoDB
        save_to_mongodb(car_info)


if __name__ == "__main__":
    main()

小结

有任何问题,欢迎评论。

<think>好的,我现在需要帮助用户解决在Python中安装SciPy库的问题。用户已经尝试过使用pip install scipy,但可能遇到了问题,所以需要详细的步骤和解决方法。 首先,我应该回忆一下安装SciPy的常见方法。通常,最直接的方式是使用pip,但有时候会因为依赖项或系统环境的问题导致安装失败。用户提供的引用里提到几种方法,比如使用清华镜像源加速下载,或者通过Anaconda安装。另外,还有用户可能遇到的错误,比如需要安装whl文件。 接下来,我需要整理一个清晰的步骤指南。第一步是推荐使用pip安装,并加上镜像源,这可以解决下载速度慢的问题。用户引用[1]和[2]提到使用清华镜像和验证安装的方法,应该纳入这个步骤。 然后,如果pip安装失败,可能需要检查依赖项是否正确安装,比如NumPy。用户引用[4]提到安装whl文件,这可能适用于某些系统环境不兼容的情况,尤其是Windows用户。这时候建议用户手动下载合适的whl文件安装。 第三种方法是使用Anaconda,用户引用[3]提到通过Anaconda Prompt安装会更方便,因为Anaconda会自动处理依赖关系。这对于不熟悉环境配置的用户来说是个好选择。 此外,常见问题部分需要考虑不同操作系统可能遇到的问题。比如,Linux用户可能需要安装gcc和Fortran编译器,而Windows用户可能需要Microsoft Build Tools。用户引用[4]中的例子是在Windows下安装whl,这可能涉及到32位和64位的问题,需要提醒用户注意版本匹配。 最后,验证安装的步骤很重要,用户引用[2]说明了如何通过导入库并输出版本号来确认安装成功。 在生成相关问题的时候,要围绕SciPy的安装、依赖库、镜像使用、Anaconda的优势以及常见错误处理来提问,这样可以帮助用户扩展相关知识,解决可能遇到的其它问题。</think>### Python中安装SciPy库的详细步骤 #### 方法1:使用pip安装(推荐) 1. **通过镜像加速安装**: 运行以下命令,使用清华镜像源加速下载: ```bash pip install scipy -i https://pypi.tuna.tsinghua.edu.cn/simple ``` Pip会自动安装SciPy及其依赖项(如NumPy)[^1][^2]。 2. **验证安装**: 安装完成后,打开Python终端并输入: ```python import scipy print(scipy.__version__) ``` 若输出版本号(如`1.10.1`),则安装成功[^2]。 --- #### 方法2:手动安装依赖(适用于安装失败情况) 1. **先安装NumPy**: SciPy依赖NumPy,建议先确保NumPy已安装: ```bash pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple ``` 2. **通过whl文件安装**: 若直接安装失败,可访问[Python扩展包仓库](https://www.lfd.uci.edu/~gohlke/pythonlibs/#scipy)下载对应版本的`.whl`文件(如`scipy‑1.10.1‑cp310‑win_amd64.whl`),然后运行: ```bash pip install 文件路径/scipy‑1.10.1‑cp310‑win_amd64.whl ``` 此方法适用于Windows环境依赖问题[^4]。 --- #### 方法3:通过Anaconda安装 1. **安装Anaconda**: 下载并安装[Anaconda](https://www.anaconda.com/products/distribution),配置好环境变量[^3]。 2. **使用conda命令安装**: 打开Anaconda Prompt,运行: ```bash conda install scipy ``` Conda会自动解决依赖问题,适合复杂环境。 --- #### 常见问题解决 - **编译环境缺失**(Linux/Mac): 安装`gcc`和`fortran`编译器: ```bash sudo apt-get install gcc gfortran # Debian/Ubuntu brew install gcc # macOS ``` - **Windows环境错误**: 安装[Microsoft Build Tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/),确保C++编译支持。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值