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

news/2024/11/6 10:53:17/文章来源:https://www.cnblogs.com/onecuger/p/18529502

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

点击查看代码
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 pddef 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 responseelse:if num >= 5:print("请求超过5次,退出程序")breakelse:print("请求失败,正在重新请求...")num += 1time.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_nameprint(f"序号:{still_index}\t车型:{series_name}\t车型id:{series_id}")return series_dictdef 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 responseelse:if num >= 5:print("请求超过5次,退出程序")breakelse:print("请求失败,正在重新请求...")num += 1time.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 allconfigdef 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.activefor 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 = 20workbook.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("该品牌不存在,请重新输入")continueelse: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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/827539.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

刚毕业,去做边缘业务,还有救吗?

有一些同时拿到了多个 Offer 的同学,会纠结于如何选择。其中有一些比较共性的问题,比如 “刚毕业,去做边缘业务,会不会影响后面的人生呢?”大家好,我是程序员鱼皮。今年的秋招已经接近尾声,我陆续收到了很多小伙伴们的 Offer 报喜。有一些同时拿到了多个 Offer 的同学,…

符合ISO26262的零部件级的软件测试解决方案

引言在功能安全的开发、测试过程中概念阶段的活动一般都是由主机厂负责,而从系统开发到单元实现则是由供应商负责,对于供应商所做的一系列测试通常称为零部件级测试。根据ISO 26262功能安全标准的划分,功能安全在零部件阶段的测试包括:软件单元测试、软件集成测试、硬件集成…

惊呆:where 1=1 可能严重影响性能,差了10多倍,快去排查你的 sql

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,…

鸿蒙项目实战(二):实现动态栅格布局

需求: 动态设置栅格布局子元素实现如下: 一、定义一个类,定义所有的子元素数据// 首页业务按钮可选项集合 export class HomeBussinessConfig{// 供选择的所有tab集合// 只读 静态static readonly buttons = [{title:功能一,icon:$r(app.media.icon_home_sale),},{title:功能…

Dynaseal-面向未来端侧llm agent的llm api key分发机制

为什么要有这个项目 试想一下,在未来 llm agent 在端侧全面铺开,但是目前调用大模型的方式通过了是一个拿到了就可以随便使用的 api-key?那用户岂不是从端侧的模型拿到了 api-key 就可以刷爆你的账单?!!!如果每个人的手机都跑着几个 agent,你还有一堆用户,那你服务器岂…

使用SeaTunnel从InfluxDB同步数据到Doris

本文介绍了如何使用SeaTunnel将数据从InfluxDB同步到Doris。通过SeaTunnel强大的数据集成功能,用户可以高效地将存储于InfluxDB中的时间序列数据传输至Doris,便于数据的访问与分析。版本信息: SeaTunnel 2.3.3 InfluxDB 2.7.6 Doris 2.1.3 rc09准备事项 SeaTunnel2.3.3的安装…

CMU_15445_P2_Extendible_Hash_Table

到Project2, 我们依然在处理数据库存储相关的部分, 从 Project1 中我们应该Get到两个概念:数据库底层数据操作的基本单元是 Page. buffer_pool_manager 是管理以及组织数据单元Page的工具, 在Project2的第一部分, 我们还新增了页面守护(PageGuard)的机制更加优雅的获取以及释放…

关于pacman更新时出现error: GPGME error: No data 解决方法

问题复现 基本上我隔一段时间就会出现这个问题,每一次都是在网络上寻找相关命令来解决,但是却不明白为什么会出现这个问题。 问题大概是这样的但是有一位博主详细的帮忙解答了问题,大概的意思是指:pacman 在更新数据库文件时会尝试下载每个仓库的 .db.sig 文件,这是数据库…

Zabbix7.0教程:新增Browser监控项

1 前言 Zabbix 7.0.0版本之后,增加了“Browser”监控项类型,即浏览器监控,能够使用浏览器监控复杂的网站和web应用。 浏览器监控项允许执行用户定义的JavaScript代码来模拟与浏览器相关的操作,例如点击、输入文本、网页导航等。该监控项通过HTTP/HTTPS收集数据,并部分…

ABB机器人维修示教器线缆常见的故障现象

在工业自动化领域,ABB机械手是一款广泛应用的设备,其示教器线缆的正常运行对于机械手的稳定工作至关重要。然而,在实际使用过程中,示教器线缆可能会出现各种故障,影响机械手的正常操作。本文将介绍ABB机器人示教器线缆常见的故障现象及相应的ABB机器人维修解决方案。 一、…

[GXYCTF2019]Ping Ping Ping 1 - Xxiaoma解题

打开后,发现显示一个 /?ip= 我们直接在url里添加/?ip=127.0.0.1,发现有回显,这时候就可以用分号;来进行命令链接执行了。 输入url/?ip=127.0.0.1;ls 回显出来两个php文件!直接构造payload:/?ip=127.0.0.1;cat /flag.php才发现没那么简单,回显过滤了空格,可以使用$IFS…

manim边学边做--三维的点和线

Manim 提供了一系列专为三维空间设计的对象,让创建三维数学动画变得更加轻松。 本篇开始介绍其中最简单的点和线相关对象,也就是Dot3D(三维的点),Line3D(三维的线)和Arrow3D(三维的箭头)。Dot3D用于表示三维空间中的点,是构建其他复杂三维图形的基础,它适用于标记关…