首页 > 其他分享 >博客园记录:汽车参数爬虫

博客园记录:汽车参数爬虫

时间:2024-11-06 10:41:05浏览次数:3  
标签:name get series 博客园 爬虫 id band 参数 response

可以输入汽车品牌名,从而爬取对应汽车参数

点击查看代码
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
from openpyxl.utils import get_column_letter
import re
import requests
import json
import os
import pandas as pd

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 parse_series(band, response, series_dict):
    html = re.findall(r'document.writeln\("(.*)"\)', response.text)
    html = "".join(html)
    soup = BeautifulSoup(html, "html.parser")
    data_list = soup.select(".current > dl > dd > a")
    still_sell = [i for i in data_list if "停售" not in i.get_text(strip=True)]
    
    print(f"该品牌共找到{len(data_list)}个车型,其中,在售车型共{len(still_sell)}个。")
    print("----------------------------------------------\n在售车型列表如下:\n----------------------------------------------")
    
    for still_index, still_data in enumerate(still_sell, start=1):
        series_name = still_data.contents[0].text.strip()
        href = still_data.get("href")
        series_id = re.findall(r'/price/series-(\d+).html', href)[0]
        series_dict[series_id] = series_name
        print(f"序号:{still_index}\t车型:{series_name}\t车型id:{series_id}")
 
    return series_dict
 




def get_response(series_id="0"):
    num = 1  # 用于统计请求次数
    while True:
        headers = {
            "user-agent": UserAgent().random  # 随机获取ua
        }
        url = "https://car-web-api.autohome.com.cn/car/param/getParamConf"
        params = {
            "mode": "1",
            "site": "1",
            "seriesid": series_id
        }
        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 get_car_config(config_dic):
    allconfig = []
    configname_list = []
    for title in config_dic['result']['titlelist']:
        for item in title['items']:
            configname_list.append(item['itemname'])
    allconfig.append(configname_list)

    for data in config_dic['result']['datalist']:
        configvalue_list = []
        for valueitem in data['paramconflist']:
            if valueitem.get('itemname') != '':
                configvalue_list.append(valueitem['itemname'])
            elif not valueitem.get('sublist'):
                configvalue_list.append('-')
            else:
                stri = []
                for multivalue in valueitem['sublist']:
                    stri.append(multivalue['value'] + multivalue['name'])
                stro = '\n'.join(stri)
                configvalue_list.append(stro)
        allconfig.append(configvalue_list)
    return allconfig



def save_to_excel(data, folder, filename):
    if not os.path.exists(folder):
        os.mkdir(folder)
    df = pd.DataFrame(data)
    excel_path = f"{folder}/{filename}"
    df.T.to_excel(excel_path, index=False, header=False)

    workbook = load_workbook(excel_path)
    sheet = workbook.active
    for row in sheet.iter_rows():
        for cell in row:
            cell.alignment = Alignment(wrap_text=True, vertical='center')
    
    num_columns = df.shape[0]
    for col in range(1, num_columns + 1):
        column_letter = get_column_letter(col)  # 使用 get_column_letter 获取列名
        sheet.column_dimensions[column_letter].width = 20

    workbook.save(excel_path)
    print(Fore.GREEN + "配置下载完成,保存到文件------> ", f"{folder}/{filename}")


 
def main():
    series_dict = {}
    while True:
        band = input("请输入汽车品牌:").strip()
        response = get_band_response()
        band_pattern = f"<a href=([^>]*?)><i[^>]*?></i>{band}<em>"
        band_info = re.search(band_pattern, response.text)
        if not band_info:
            print("该品牌不存在,请重新输入")
            continue
        else:
            band_href = band_info.group(1)
            band_id = re.findall(r'/price/brand-(\d+).html', band_href)[0]
            print(F"{band} 品牌id为:", band_id)
            resp_brand = get_band_response(brand_id=band_id)
            series_dict = parse_series(band, resp_brand, series_dict)  # 修改此行
 
            choice = input(Fore.RED + "\n请输入需要下载的车型id,输入0则下载该品牌全部车型配置:").strip()
            if choice == '0':
                for series_id in series_dict.keys():
                    series_name = series_dict[series_id]
                    print(Fore.CYAN + f"---正在下载{band}-{series_name},车型id为:{series_id}...")
                    response = get_response(series_id)
                    if "抱歉" in response.text and "暂无相关数据" in response.text:
                        print(Fore.RED + f"该系列车 {series_name} 暂无配置信息")
                    else:
                        resp_dict = json.loads(response.text)
                        all_info = get_car_config(resp_dict)
                        excel_name = f"{band}_{series_name}.xlsx"
                        save_to_excel(all_info, folder=band, filename=excel_name)
            elif choice in series_dict.keys():
                series_name = series_dict[choice]
                series_url = f"https://car.autohome.com.cn/config/series/{choice}.html"
                print(Fore.CYAN + f"---正在下载{band}-{series_name},车型id为:{choice},配置链接为:{series_url}...")
                response = get_response(choice)
                if "抱歉" in response.text and "暂无相关数据" in response.text:
                    print(Fore.RED + "该系列车暂无配置信息")
                else:
                    resp_dict = json.loads(response.text)
                    all_info = get_car_config(resp_dict)
                    excel_name = f"{band}_{series_name}.xlsx"
                    save_to_excel(all_info, folder=band, filename=excel_name)
            else:
                print("输入的车型id不存在,请重新输入。")
    
        input("请按任意键关闭程序...")
        exit()  # 确保程序退出,而不是重新进入循环





if __name__ == '__main__':
    main()

标签:name,get,series,博客园,爬虫,id,band,参数,response
From: https://www.cnblogs.com/onecuger/p/18529502

相关文章

  • 同事推荐的几个高级爬虫工具,抓取网页非常快~
    在当今数据驱动的时代,自动化爬虫工具和软件成为了许多企业和个人获取数据的重要手段,特别是跨境电商、外贸等业务,对数据的需求非常大,比如对amazon、tiktok、shopee等网站数据的监测和获取。这里会介绍6款功能强大、操作简便的自动化爬虫工具,用好了可以更高效地进行数据采集,非常......
  • ATC:多快好省,无参数token reduction方法 | ECCV'24
    来源:晓飞的算法工程笔记公众号,转载请注明出处论文:AgglomerativeTokenClustering论文地址:https://arxiv.org/abs/2409.11923论文代码:https://github.com/JoakimHaurum/ATC创新点提出了层次token聚类(AgglomerativeTokenClustering,ATC),这是一种新型的无参数层次合......
  • Nginx 常用参数详解和举例说明实操指南
    Nginx常用参数详解和举例说明实操指南一、引言1.参数详解的目的和意义Nginx的配置参数是优化性能和提升安全性的关键。通过合理配置这些参数,可以显著提高Nginx的性能,减少资源消耗,增强系统的稳定性和安全性。2.适用人群和场景运维工程师:负责Nginx的日常管理和维护,需......
  • 入驻博客园第一天
    今天先随便写点东西,缓解一下焦虑的心情.最早接触博客园的时间记不清了,现在都快大学毕业了才开始用博客园写博客,以前没有写博客的习惯,常说好记性不如烂笔头,确实有道理,以前解决过的问题现在遇到还是会找好久的资料,特别浪费我的精力,所以今天开始坚持写博客了.同时也是缓解......
  • Hunyuan-Large:腾讯发布业界参数规模最大的开源 MoE 模型,支持超长文本输入,超越主流开源
    ❤️如果你也关注大模型与AI的发展现状,且对大模型应用开发非常感兴趣,我会快速跟你分享最新的感兴趣的AI应用和热点信息,也会不定期分享自己的想法和开源实例,欢迎关注我哦!......
  • 计算机毕业设计Python+大模型新能源汽车销量预测 汽车销量分析可视化 汽车爬虫 深度学
    温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO......
  • 2.路径操作装饰器方法参数简介
    1.get请求2.post请求3.put请求4.delete请求5.@app.pos()中参数的功能应用 ......
  • 基于django框架开发在线书店推荐系统 python实现个性化网上书店/图书购物商城推荐网站
    基于django框架开发在线书店推荐系统python实现个性化网上书店/图书购物商城推荐网站爬虫、兴趣标签、排行榜标签推荐、热点推荐、协同过滤算法推荐大数据深度学习机器学习人工智能WebBookShopRecPy一、项目简介1、开发工具和使用技术Pycharm、Python3及以上版本,D......
  • 基于django框架开发在线美食推荐系统 python实现个性化美食食谱推荐系统 爬虫、排行榜
    基于django框架开发在线美食推荐系统python实现个性化美食食谱推荐系统爬虫、排行榜、可视化数据分析基于流行度热点推荐、基于用户/物品协同过滤算法推荐、平均加权混合推荐大数据深度学习机器学习OnlineFoodRecommendPy一、项目简介1、开发工具和使用技术Pycharm......
  • 规范:项目、目录、文件、样式、事件、变量、方法、url参数、注释、git提交 命名规范及
    一、规范命名的重要性易懂、通用、规范、标准、专业性、是经验积累的体现1.1、常见命名方法序号命名方法解释1全小写2全大写3驼峰:小驼峰命名法4驼峰:大驼峰命名法5烤串命名法/脊柱命名法6下划线分隔法二、项目名采用小写字母和中划线(-)连接的方式命名,如my-project序号规......