我的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 params


def 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 resp


data_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 = None
    car_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
})

df

df[df['first_id'] == None]

df2 = df.dropna()
df.shape
df2.shape

df2.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_id

def get_price(car_id):
    import json
    import os
    wk_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 Selector

def get_detail_page(id):
    url = "https://www.dongchedi.com/auto/params-carIds-" + id
    headers = {
。。。
}

    with requests.get(url=url, headers=headers, verify=False) as resp:
        resp.raise_for_status()
        # print(resp.text)
    return resp.text

html = get_detail_page(id)

html

selector = 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] = value
    dct_list.append(dct_item)

dct_list

first_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] = value
        dct_list.append(dct_item)

    dct_detail = {
        "id":id,
        "detail":dct_list
    }
    return dct_detail

dct_detail = parse_detail(id)
dct_detail


first_id_list

def 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文件。后期做了一些数据整理。做成了数据表是这样的。

 结果还不错。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM—>内存调优(发现问题)

一、什么是内存泄露? 内存溢出和内存泄露 内存泄漏(memoryleak):在Java中如果不再使用一个对象,但是该对象依然在GC ROOT的引用链上,这个对象就不会被垃圾回收器回收,这种情况就称之为内存泄漏。内存泄漏绝大多数情况都是由堆内…

机器学习笔记 KAN网络架构简述(Kolmogorov-Arnold Networks)

一、简述 在最近的研究中,出现了号称传统多层感知器 (MLP) 的突破性替代方案,重塑了人工神经网络 (ANN) 的格局。这种创新架构被称为柯尔莫哥洛夫-阿诺德网络 (KAN),它提出了一种受柯尔莫哥洛夫-阿诺德表示定理启发的函数逼近的方法。 与 MLP 不同,MLP 依赖于各个节…

【计算机毕业设计】springboot二手图书交易系统

随着世界经济信息化、全球化的到来和互联网的飞速发展,推动了各行业的改革。若想达到安全,快捷的目的,就需要拥有信息化的组织和管理模式,建立一套合理、动态的、交互友好的、 高效的二手图书交易系统。当前的信息管理存在工作效率…

Jmeter+Grafana+Prometheus搭建压测监控平台

本文不介绍压测的规范与技术指标,本文是演示针对Jmeter如何将压测过程中的数据指标,通过Prometheus采集存储,并在Granfan平台进行仪表盘展示; 介绍 系统压测属于日常项目开发中的一个测试环节,使用测试工具模拟真实用户行为&…

Facebook企业户/在Facebook上做推广有什么好处?

想到出海,必会想到Facebook作为世界上最大的社交网络,Facebook拥有难以想象的用户数量,流量大到没朋友。近年来也是独立站卖家获取流量的有力工具之一。独立站卖家在Facebook上做广告的好处? Facebook,Google 开企业广…

使用RN的kitten框架的日历组件的修改

官方网页地址 下面就是我参考官方封装的时间日期组件(主要是功能和使用方法,页面粗略做了下,不好看勿怪) import React, {useState} from react; import {StyleSheet, View, TouchableOpacity, SafeAreaView} from react-native; …

Go微服务: 日志系统ELK核心架构设计

微服务日志系统建设 1 )为什么需要日志系统 业务发展越来越庞大,服务器越来越多各种访问日志,应用日志,错误日志量越来越多,无法管理开发人员排查问题,需要到服务器上查日志 2 )Elastic Stack…

文件系统和软硬连接

一、磁盘 磁盘可以存储大量的二进制数据,并且断电后也能保持数据不丢失。因此磁盘是一种永久性存储介质,在计算机中,磁盘是一个外设,也是唯一的机械设备。既然磁盘是一个外设,那么就意味着,磁盘和内存&…

Linux无root配置Node,安装nvm

1. 安装NVM: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash # 或者,如果你使用wget wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash 对于bash用户,可以运行&…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.6讲 GPIO中断实验-GPIO驱动添加中断处理函数

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

Weblogic 管理控制台未授权远程命令执行漏洞(CVE-2020-14882,CVE-2020-14883)

1 漏洞概述 Weblogic Pre-Auth Remote Command Execution 漏洞(CVE-2020-14882, CVE-2020-14883)是针对 Oracle WebLogic Server 的两个安全漏洞。CVE-2020-14882 允许远程用户绕过管理员控制台组件中的身份验证,而 CVE-2020-14883 则允许经…

基于springboot+vue+Mysql的大学生社团活动平台

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

Web应用开发中查找慢SQL的方法

每条SQL语句在执行时都需要消耗一定的I/O资源,SQL语句执行的快慢直接决定了硬件资源被占用时长的长短,慢SQL一般指查询很慢的SQL语句。在MySQL数据库中,可以通过慢查询来查看所有执行超时的SQL语句。在默认情况下,一般慢SQL是关闭…

基于NIOS-II软核流水灯和串口通信实现

文章目录 一、创建工程二、系统设计1. 在 “component library” 标签栏中找到 “Nios II Processor” 后点击 Add2. 在 ”Component Library” 标签栏中的查找窗口输入 jtag 找到 ”JTAG UART ”,然后点击 Add3. 添加片上存储器 On-Chip Memory(RAM)核4. 查找窗口输…

Keil手动安装编译器V5版本

V5编译器下载:免积分下载 新版的keil不会自动帮你安装V5版本的编译器,但是很多教程很多比赛所用单片机都是V5的编译器,所以用来开以前的或者开源的很多东西编译直接一大堆报错。 吐槽说完了接下来教你怎么解决 打开installer(在…

springboot+vue+mybatis物业管理系统+PPT+论文+讲解+售后

快速发展的社会中,人们的生活水平都在提高,生活节奏也在逐渐加快。为了节省时间和提高工作效率,越来越多的人选择利用互联网进行线上打理各种事务,通过线上物业管理系统也就相继涌现。与此同时,人们开始接受方便的生活…

软件压力测试怎么做

随着信息技术的迅猛发展,软件在各行各业的应用越来越广泛,其稳定性、可靠性和性能表现也受到了越来越多的关注。在这样的背景下,软件压力测试显得尤为重要。本文将详细介绍软件压力测试的概念、目的、方法以及实施步骤,帮助读者更…

「JavaEE」多线程案例1:单例模式阻塞队列

🎇个人主页:Ice_Sugar_7 🎇所属专栏:JavaEE 🎇欢迎点赞收藏加关注哦! 多线程案例分析 🍉单例模式🍌饿汉模式🍌懒汉模式🍌指令重排序 🍉阻塞队列&a…

eMMC和SD模式速率介绍

概述 在实际项目开发中我们常见的问题是有人会问,“当前项目eMMC、SD所使用模式是什么? 速率是多少?”。这些和eMMC、SD的协议中要求的,要符合协议。接下来整理几张图来介绍。 eMMC 模式介绍 一般情况下我们项目中都是会支持到HS400 8bit 1.8V,最大时钟频率为200MHZ,通…

Idea入门:一分钟创建一个Java工程

一,新建一个Java工程 1,启动Idea后,选择 [New Project] 2,完善工程信息 填写工程名称,根据实际用途取有意义的英文名称选择Java语言,可以看到还支持Kotlin、Javascript等语言选择包管理和项目构建工具Mav…