我的dcd爬虫-Python

我自己写的dcd爬虫,这个网站比较简单。看了看别人的程序,觉得用起来挺别扭,就自己捣鼓了一天。弄出来了。

这个网站没有反爬,有一些是动态网页,有一些是静态。

首先,获取销量排行榜前300的车型。

import os
import json
import requests
from parsel import Selector# ---------------------------------------------------------#
# ----           * 获得车辆销售排行榜前300、100的车         *        ----#
# ---------------------------------------------------------#url = "https://www.dongchedi.com/motor/pc/car/rank_data"
headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36",}def get_param(page):params = {"aid": "1839","app_name": "auto_web_pc","city_name": "烟台","count": "10","offset": page,"month": "","new_energy_type": "","rank_data_type": "11","brand_id": "","price": "","manufacturer": "","outter_detail_type": "","nation": "0"}return paramsdef get_response(pageNum):params = get_param(str(pageNum * 10))with requests.get(url=url, headers=headers, params=params, verify=False) as resp:resp.raise_for_status()print(resp.status_code)return respdata_list = []
for i in range(30):print(f"销量前{i * 10} 的车")response = get_response(i)data_list.append(response.json())

获取之后,就能访问该车型,一般一个车型有好多款式,我的目的是向比较一些车型的尺寸,所以一个车型就选第一种款式,访问进入该车型第一种款式的参数配置,这样把参数下载下来,放到一个文件里,就可以比较现在卖的车的尺寸情况。

第二部分,我尝试了一下动态请求车型的价格。不过这一部分后面数据分析没有用到。


len(data_list)
import jsonpath
data_list[0]['data']['list'][0]['series_name']name_list = jsonpath.jsonpath(data_list, "$..series_name")
id_list = jsonpath.jsonpath(data_list, "$..series_id")
id_list
first_list = jsonpath.jsonpath(data_list, "$..online_car_ids")first_list[0][0]car_id_list = []
for ls in first_list:if ls:first_id = ls[0]else:first_id = Nonecar_id_list.append(first_id)
len(car_id_list)import pandas as pd
df = pd.DataFrame({"name": name_list,"series": id_list,"first_id":car_id_list
})dfdf[df['first_id'] == None]df2 = df.dropna()
df.shape
df2.shapedf2.to_csv("Pythn-Anlys-138/dcd/top300cars.csv")
df = pd.read_csv("Pythn-Anlys-138/dcd/top300cars.csv")
df.keys()
df.columns
df.columns = ['rank', 'name', 'series', 'first_id']
df.to_csv("Pythn-Anlys-138/dcd/top300cars.csv")# ---------------------------------------------------------#
# ----           * 价格         *        ----#
# ---------------------------------------------------------#first_iddef get_price(car_id):import jsonimport oswk_dir = "Pythn-Anlys-138/dcd"# fpath = wk_dir + "/" + car_id + ".csv"fname = car_id + ".json"url = "https://www.dongchedi.com/motor/pc/car/series/car_dealer_price"headers = {。。。}params = {"aid": "1839","app_name": "auto_web_pc","car_ids": car_id,"city_name": "烟台"}with requests.get(url=url, headers=headers, params=params, verify=False) as resp:resp.raise_for_status()# print(resp.json())rj = resp.json()with open(os.path.join(wk_dir, fname), 'w',  encoding="utf-8") as f:f.write(json.dumps(rj, ensure_ascii=False))print(f"保存文件成功 {car_id} !!!")first_id = str(first_id)get_price(first_id)

这一部分呢后期没什么用,代码也很乱。

第三部分,获取某一车型的第一种款式的参数。


# ---------------------------------------------------------#
# ----           * 参数配置        *        ----#
# ---------------------------------------------------------#from parsel import Selectordef get_detail_page(id):url = "https://www.dongchedi.com/auto/params-carIds-" + idheaders = {
。。。
}with requests.get(url=url, headers=headers, verify=False) as resp:resp.raise_for_status()# print(resp.text)return resp.texthtml = get_detail_page(id)htmlselector = Selector(html)selector.css('div[data-row-anchor]')
len(selector.css('div[data-row-anchor]'))all_rows = selector.css('div[data-row-anchor]')dct_list = []
for row in all_rows:dct_item = {}label = row.css('div:nth-child(1) label::text').get()value = row.css('div:nth-child(2) div::text').get()dct_item[label] = valuedct_list.append(dct_item)dct_listfirst_row = all_rows[0]def parse_detail(id):html = get_detail_page(id)selector = Selector(html)all_rows = selector.css('div[data-row-anchor]')dct_list = []for row in all_rows:dct_item = {}label = row.css('div:nth-child(1) label::text').get()value = row.css('div:nth-child(2) div::text').get()dct_item[label] = valuedct_list.append(dct_item)dct_detail = {"id":id,"detail":dct_list}return dct_detaildct_detail = parse_detail(id)
dct_detailfirst_id_listdef save_detail(id, dct_detail):fname = id + "_dcd_detail.json"with open(os.path.join("Pythn-Anlys-138/dcd", fname), 'w', encoding='utf8') as f:f.write(json.dumps(dct_detail, ensure_ascii=False))print(f"Detail file {id}  saved!!!")for fid in first_id_list:dct_detail = parse_detail(fid)save_detail(fid, dct_detail)

最后,下载了一些json文件。后期做了一些数据整理。做成了数据表是这样的。

 结果还不错。

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

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

相关文章

快速上手并行执行——《OceanBase 并行执行》 系列 7

并行执确实是一个涵盖多个层面的复杂主题,它需要投入一定的时间和精力来深入理解,才能充分掌握其功能。为了帮助初学者更快地掌握并行执行的技巧,我们提供了这份Quick Start,它适用于 OceanBase 3.1版本及以上的版本。虽然这里所…

浅谈内存泄漏

内存泄漏 概念 在JavaScript中,内存泄漏是指应用程序在不再需要使用某块内存时仍然保持对其的引用,导致内存不能被垃圾回收机制释放,最终导致内存占用过高,性能下降。 内存泄漏通常发生在以下情况: 全局变量&#…

【C++风云录】重塑旅游业:C++和可持续旅行的交汇点

跃升旅游行业:C库的革命性作用 前言 在21世纪,技术的发展已经渗透到每个角落,包括旅游行业。特别是在生态旅游和可持续旅行领域,新技术的引入正在改变着行业的未来。本文将重点介绍C如何被应用于这一领域。 欢迎订阅专栏&#x…

macos安装mysql一直卡在安装成功那个页面选项的解决办法

问题描述: 我安装的是比较新的版本8.0.37,安装过程中一直卡在安装那个选项上,且页面提示安装成功了,但就是死活不往下面的配置选项那一步走。 解决办法: 1.首先清理掉之前的mysql sudo rm -rf /usr/local/mysql2.然…

星期一的小小积累

3种方法教你将ArcGIS属性表转换为Excel表格 (baidu.com) ARCMAP属性表转换为Excel表格 主成分分析:spss分析方法-主成分分析_主成分分析法spss-CSDN博客

pthread_setname_np 线程设置名字 c++

pthread_setname_np_setpthreadname-CSDN博客 #define _GNU_SOURCE #include <pthread.h> int pthread_setname_np(pthread_t thread, const char *name); int pthread_getname_np(pthread_t thread, char *name, size_t len); pthread_setname_np(thread, name_s.c_s…

win11快速安装mysql数据库系统

win11快速安装mysql数据库系统 1、下载 1.1 打开官网 1.2 向下滚动页面 1.3 进入下载选项 1.4 下载8.0.4 LTS 1.5 开始下载 1.6 下载中 2、解压 大家注意&#xff0c;此时解压后目录是没有data目录的。 3、数据库初始化 3.1 管理员身份打开CMD 开始菜单上&#xff0c;输入…

代码随想录算法训练营第三十一天|455.分发饼干,376. 摆动序列,53. 最大子序和

455.分发饼干 优先把小饼干分给胃口值小的&#xff0c;或者是把大饼干分给胃口大的。 376. 摆动序列 class Solution { public:int wiggleMaxLength(vector<int>& nums) {if (nums.size() < 1) return nums.size();int curDiff 0; // 当前一对差值int preDiff …

Redis:功能特性和应用场景

文章目录 认识RedisRedis和MySQLRedis的场景Redis的设计 Redis的特性和优点Redis的应用场景Redis作为数据库Redis作为缓存Redis作为会话存储对象Redis作为消息队列 总结 本篇开始对于Redis进行正式介绍和学习 认识Redis 在开始Redis学习前&#xff0c;要先认识一下Redis Red…

详解绝对路径和相对路径的区别

绝对路径和相对路径是用于描述文件或目录在文件系统中位置的两种不同方式。 绝对路径&#xff08;Absolute Path&#xff09;是从文件系统的根目录开始的完整路径&#xff0c;可以唯一地确定一个文件或目录的位置。在不同的操作系统中&#xff0c;根目录的表示方式可能略有不同…

SpringSecurity安全过滤器工作原理

前面通过三篇文章&#xff0c;从底层代码的角度分析了SpringSecurity的初始化过程。 接下来我们就要具体看一下&#xff0c;Spring Security的安全过滤器初始化、装配好之后&#xff0c;到底是怎么工作的。 还是按图索骥 下面我们简单从底层源码分析一下&#xff0c;请求是怎…

【机器学习300问】90、怎么理解测试集、验证集必须和训练集来自于同一分布?

我写这篇文章是因为我自己在做一个手势识别项目的时候&#xff0c;所用的训练集是网上爬取的以及公开的数据集。但当我训练完成后使用我自己通过摄像头捕捉的实地拍摄的手势图片&#xff0c;得出的识别准确率非常的低&#xff01;这些图片可能在光照、背景、手势姿势等方面与通…

基于SpringBoot设计模式之创建型设计模式·工厂方法模式

文章目录 介绍开始架构图样例一定义工厂定义具体工厂&#xff08;上衣、下装&#xff09;定义产品定义具体生产产品&#xff08;上衣、下装&#xff09; 测试样例 总结优点缺点与抽象工厂不同点 介绍 在 Factory Method模式中&#xff0c;父类决定实例的生成方式&#xff0c;但…

图像/视频恢复和增强CodeFormer

github&#xff1a;https://github.com/sczhou/CodeFormer 尝试增强旧照片/修复人工智能艺术 面部修复 面部色彩增强和恢复 脸部修复

Python 机器学习 基础 之 监督学习 [ 核支持向量机 SVM ] 算法 的简单说明

Python 机器学习 基础 之 监督学习 [ 核支持向量机 SVM ] 算法 的简单说明 目录 Python 机器学习 基础 之 监督学习 [ 核支持向量机 SVM ] 算法 的简单说明 一、简单介绍 二、监督学习 算法 说明前的 数据集 说明 三、监督学习 之 核支持向量机 1、线性模型与非线性特征 …

汇编语言入门:探索 x86 架构

目录 前言 1. x86 语言 x86 架构简介 x86 架构的特点 x86 架构的演变 x86 架构的应用 2. 常用汇编指令集 3. 寻址方式 结语 前言 汇编语言是一种低级编程语言&#xff0c;直接面向计算机的硬件架构。在计算机科学中&#xff0c;了解汇编语言是非常重要的&#xff0c;因…

探索Java中的利器:ThreadLocal

在日常的Java开发中&#xff0c;我们经常会遇到多线程并发访问共享资源的情况&#xff0c;而这时候线程安全就成了我们需要重点考虑的问题之一。幸运的是&#xff0c;Java提供了一种非常巧妙的机制来解决这个问题&#xff0c;那就是 ThreadLocal。 什么是ThreadLocal&#xff…

基于网络爬虫技术的网络新闻分析(二)

目录 2 系统需求分析 2.1 系统需求概述 2.2 系统需求分析 2.2.1 系统功能要求 2.2.2 系统IPO图 2.2 系统非功能性需求分析 3 系统概要设计 3.1 设计约束 3.1.1 需求约束 3.1.2 设计策略 3.1.3 技术实现 3.3 模块结构 3.3.1 模块结构图 3.3.2 系统层次图 3.3.3…

JumpServer堡垒机应用(v3.10.8) 下

目录 JumpServer堡垒机简单式部署与管理(v3.10.8) 上-CSDN博客 一. 资产管理 1.1创建资产 1.2 给资产主机创建用户 1.2.1 普通账户&#xff1a; 1.2.2 特权账户&#xff1a; 1.2.3 创建用户 二. 命令过滤 2.1 创建命令组 2.2 创建命令过滤 ​编辑 三. 创建资产授权 …

在另外一个页面,让另外一个页面弹框显示操作(调佣公共的弹框)vue

大概意思是&#xff0c;登录弹框在另外一个页面中&#xff0c;而当前页面不存在&#xff0c;在当前页面中判断如果token不存在&#xff0c;就弹框出登录的弹框 最后一行 window.location.href … 如果当前用户已登录&#xff0c;则执行后续操作(注意此处&#xff0c;可不要)