【Python爬虫】获取汽车之家车型配置附代码(2024.10)

参考大哥,感谢大哥:https://blog.csdn.net/weixin_43498642/article/details/136896338

【任务目标】

工作需要想更方便地下载汽车之家某车系配置清单;(垃圾汽车之家不给下载导出表格,配置页叉掉了车系要出来还要重新刷新,懂不懂用户体验)
每一个车系保存为一个Excel表格,表格命名为“品牌名+车系”。
同品牌的配置表保存到以品牌命名的文件夹中。

【实现效果】

在这里插入图片描述

在这里插入图片描述

【难点痛点】

1、(跳过这条发疯)真的好难找参考代码!可恶!找到的这个大哥文章还给锁了,痛失两百多,下头csdn你欠我的用什么还!你有本事后面别把我的锁成vip!
2、第一次爬不知道干啥,源代码找不到表内数据,不知道在哪找,参考大哥代码一步步做,发现数据似乎没有被加密,后面在响应里找到JSON格式的api文档,直接获取数据。
3、多数据在表内换行格式的调整,用’\n’链接多行数据,openpyxl 设置表内换行。

【逻辑整理】

1、在产品库中利用左侧品牌列表接口获取所有品牌车系名称和id值
2、解析各个车系的名称和id值,用于构建请求车系配置的url
3、通过响应页找到配置url,根据要找的车系id值构建url,从而得到配置数据
4、调整格式,导出文件

【代码实现】

根据需要安装第三方库,pip install xxx

from random import random
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
from datetime import time
from colorama import Fore
from openpyxl import load_workbook
from openpyxl.styles import Alignment

import re
import requests
import json
import os
import pandas as pd
import openpyxl

观察最左列车型列表
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

– 步骤1

输入品牌名称,得到该品牌下的所有车系。

def get_band_response(brand_id="0"):
    num = 1  # 用于统计请求次数
    while True:
        headers = {
   
            "user-agent": UserAgent().random  # 随机获取ua
        }
        url = "https://car.autohome.com.cn/AsLeftMenu/As_LeftListNew.ashx"
        params = {
   
            "typeId": "1 ",
            "brandId": brand_id,
            "fctId": "0 ",
            "seriesId": "0"
        }
        response = requests.get(url, headers=headers, params=params)
        if response.status_code == 200:
            return response
        else:
            if num >= 5:
                print("请求超过5次,退出程序")
                break
            else:
                print("请求失败,正在重新请求...")
                num += 1
                time.sleep(1)
 
 
def main():
    while True:
        band = input("请输入汽车品牌:").strip()
        response = get_band_response()
        band_pattern = f"<a href=([^>]*?)><i[^>]*?></i>{
     band}<em>"
        band_info = re.search(band_pattern,
### 编写Python爬虫抓取汽车之家网站上的汽车信息 为了有效地从汽车之家网站上抓取汽车信息,可以采用多种方法和技术。以下是基于静态页面和动态加载内容的不同策略。 #### 静态网页抓取 对于那些可以直接访问HTML源码并从中提取所需数据的情况,通常会使用`requests`库发送HTTP请求,并利用`BeautifulSoup`解析返回的内容[^1]: ```python import requests from bs4 import BeautifulSoup url = 'https://www.autohome.com.cn' response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") # 假设我们要找的是所有的车型链接 car_links = soup.find_all('a', class_='link') for link in car_links: href = link['href'] title = link.string.strip() print(f"{title}: {href}") ``` 这段简单的脚本展示了如何获取主页中的所有车型链接及其名称。当然,在实际应用中还需要进一步细化定位规则以及处理异常情况。 #### 动态网页抓取 当目标页面的数据是由JavaScript异步加载时,则可能需要用到像Selenium这样的工具模拟浏览器行为来完成操作: ```python from selenium import webdriver from selenium.webdriver.common.by import By from time import sleep driver_path = '/path/to/chromedriver' # 替换成自己的chromedriver路径 options = webdriver.ChromeOptions() with webdriver.Chrome(executable_path=driver_path, options=options) as driver: url = 'https://www.autohome.com.cn' try: driver.get(url) elements = WebDriverWait(driver, timeout=5).until( EC.presence_of_element_located((By.CLASS_NAME, 'your_class_name')) ) data_list = [] for element in elements: item_data = { 'name': element.find_element(By.TAG_NAME, 'h3').text, 'price': element.find_element(By.CSS_SELECTOR, '.price span').text } data_list.append(item_data) except Exception as e: print(e) finally: driver.quit() ``` 此部分代码片段说明了怎样启动ChromeDriver实例打开指定URL地址,并等待特定条件满足后再执行后续动作。这里需要注意调整XPath表达式或其他选择器以适应具体的DOM结构变化。 #### 处理反爬虫机制 为了避免被封禁IP或触发其他安全措施,建议采取如下手段: - 设置合理的请求频率; - 更换User-Agent头伪装成正常用户的浏览器环境; - 使用代理服务器分散流量来源; - 对于某些复杂的验证逻辑(如验证码),考虑引入第三方服务辅助解决。 #### 数据存储与分析 收集到的信息可以根据需求存入数据库、CSV文件或是Excel文档等形式便于后期查阅统计。例如,如果希望按照品牌分类整理各款车型的具体参数,可参照下面的方式创建相应的目录结构并将结果保存至对应的子文件夹下[^3]: ```python import os import pandas as pd brand_folder = f"./{brand}/" os.makedirs(brand_folder, exist_ok=True) df = pd.DataFrame(data=data_dict.values()) file_name = f'{brand}_{series}.xlsx' full_file_path = os.path.join(brand_folder, file_name) df.to_excel(full_file_path, index=False) print(f'Saved to {full_file_path}') ``` 上述过程实现了将每款车系的配置详情转换为DataFrame对象再导出为Excel表格的功能。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值