【爬取二手车并将数据保存在数据库中】

news2024/11/28 12:40:35

爬取二手车并将数据保存在数据库中

  • 查看网页结构分析爬取步骤
  • 解密加密信息
    • 将密文解密代码:
  • 进行爬取:
    • 爬取函数
    • 写入解密文件函数和获取城市函数
    • 解密文件,返回正确字符串函数
    • 保存到数据库
  • 运行结果

查看网页结构分析爬取步骤

可以看出网页使用了一定的加密
在这里插入图片描述
找到城市所在的位置,为之后的城市循环提供方便
在这里插入图片描述

解密加密信息

在加密信息的class元素可以看到加密的文件名称
在这里插入图片描述
在source下面可以看到此文件 是一个woff文件
在这里插入图片描述
这个woff文件每天都会变化 我们可以在主页中的head下的style下面找到这个woff文件的url链接,此后我们爬取页面时每次都爬一下这个woff文件并且保存下来就可以避免数据错误
在这里插入图片描述

将密文解密代码:

    # 读取加密文件进行密令转换
    tf = TTFont("./trans.woff")
    # 可以打印看一下tf.getGlyphOrder()是什么东西
    num_list = tf.getGlyphOrder()[1:]
    num_dict = {"zero": 0, "one": 1, "two": 2,
                "three": 3, "four": 4, "five": 5,
                "six": 6, "seven": 7, "eight": 8,
                "nine": 9}
    albnum_list = [num_dict[i] for i in num_list]
    # 密令转换列表
    new_string = ''
    for i in old_str:
        if i.isdigit():
            char = albnum_list.index(int(i))
            new_string += str(char)
        else:
            new_string += i
    return new_string

进行爬取:

爬取函数

def spider_data(url,driver,conn,cur):
    # 访问汽车信息页面
    driver.get(url)
    li_list = driver.find_elements(By.XPATH,'//ul[@class = "row-fluid list-row js-car-list"]/li')
    print(li_list)
    print("开始获取每一个汽车的信息!")
    for li in li_list:
        # 如果这个页面不为空则进行try
        try:
            # 找到汽车信息所在的位置
            car_info = str_tran(li.find_element(By.XPATH,"a/h3").text)
            car_year_mile = li.find_element(By.XPATH, "a/div[@class='mileage']/span").text
            car_year = datetime.strptime(str_tran(car_year_mile).split("/")[0],"%Y年%m月").date()
            car_mile = re.match('(.*?)万',str_tran(car_year_mile).split("/")[1]).group(1)
            car_price_total = li.find_element(By.XPATH, "a/div[@class='tags-box']/div").text
            car_price_total = re.match('(.+?)万',car_price_total).group(1)
            try: # 如果有首付价格则进行try
                car_price_pyment = li.find_element(By.XPATH, "a//div[@class='down-payment']/div").text
            except Exception as e: # 没有首付价格 则首付价格等于车价
                car_price_pyment = car_price_total
            print(car_info,car_year,car_mile,car_price_total,car_price_pyment)
            # 保存到数据库中
            store_data(car_info,car_year,car_mile,car_price_total,car_price_pyment,conn,cur)
        # 页面为空则报告错误 接着下一个汽车信息的爬取
        except Exception as e:
            print('********************error****************')
            print('*********************广告*****************')

写入解密文件函数和获取城市函数

# 获取城市拼音 和 解密的信息列表
def get_city_name(driver):
    password_code = []
    city_code = []
    # 先访问一次页面
    driver.get('https://www.renrenche.com/hf/ershouche/p1')
    # 找到城市的标签所在位置
    div_list = driver.find_elements(By.XPATH,'//div[@class="area-city-letter"]/div')
    # 将城市的拼音全部保存到一个列表中
    for div in div_list:
        a_list = div.find_elements(By.XPATH,'a')
        for a in a_list:
            city_code.append(a.get_attribute('rrc-event-name'))
    # 找到密文所在htm中的位置在style中 获取style标签下的元素内容的方法如下
    url_str = driver.find_element(By.XPATH,'//style[1]').get_attribute('textContent')
    # 匹配获取woff加密文件的url
    woff_url = re.match('[\s\S]+?url\(\'(.*?.woff)\'', url_str).group(1)
    # 使用requests请求 将文件用二进制的方式保存下来
    response = requests.get(woff_url,headers={'user-agent': fake_useragent.UserAgent().random})
    re_cont = response.content
    with open('./trans.woff', 'wb') as fp:
        fp.write(re_cont)
    # 返回城市的拼音
    return city_code

解密文件,返回正确字符串函数

# 读取woff文件 然后进行将错误的字符串转化成为正确的字符串
def str_tran(old_str):
    # 读取加密文件进行密令转换
    tf = TTFont("./trans.woff")
    num_list = tf.getGlyphOrder()[1:]
    num_dict = {"zero": 0, "one": 1, "two": 2,
                "three": 3, "four": 4, "five": 5,
                "six": 6, "seven": 7, "eight": 8,
                "nine": 9}
    albnum_list = [num_dict[i] for i in num_list]
    # 密令转换列表
    new_string = ''
    for i in old_str:
        if i.isdigit():
            char = albnum_list.index(int(i))
            new_string += str(char)
        else:
            new_string += i
    return new_string

保存到数据库

def store_data(car_info,car_year,car_mile,car_price_total,car_price_pyment,conn,cur):
    number = 0
    insert_sql = f"insert into car_info() values({number},'{car_info}','{car_year}','{car_mile}','{car_price_total}','{car_price_pyment}')"
    try:
        cur.execute(insert_sql)
    except Exception as e:
        conn.rollback()
    conn.commit()
    print("插入数据库完成!")

运行结果

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

新版本AndroidStudio删除无用资源

第一步: 第二步: 第三步,等加载完,自己选择要删除的文件。 注意!!! 可能会遇到没有显示无用资源,这时把项目运行在真机上就出来了。

学习pytorch19 pytorch使用GPU训练

pytorch使用GPU进行训练 1. 数据 模型 损失函数调用cuda()2. 使用谷歌免费GPU gogle colab 需要创建谷歌账号登录使用, 网络能访问谷歌3. 执行4. 代码 B站土堆学习视频: https://www.bilibili.com/video/BV1hE411t7RN/?p30&spm_id_frompageDriver&vd_sourc…

Python Authlib库:构建安全可靠的身份验证系统

更多资料获取 📚 个人网站:ipengtao.com 在现代应用程序中,安全性是至关重要的,特别是在处理用户身份验证时。Authlib库为Python开发者提供了一套强大的工具,用于简化和增强身份验证和授权流程。本文将深入探讨Authli…

js/jQuery常见操作 之各种语法例子(包括jQuery中常见的与索引相关的选择器)

js/jQuery常见操作 之各种语法例子(包括jQuery中常见的与索引相关的选择器) 1. 操作table常见的1.1 动态给table添加title(指定td)1.1.1 给td动态添加title(含:获取tr的第几个td)1.1.2 动态加工…

elasticsearch聚合、自动补全、数据同步

目录 一、数据聚合1.1 聚合的种类1.2 DSL实现聚合1.2.1 Bucket聚合语法1.2.2 聚合结果排序1.2.3 限定聚合范围1.2.4 Metric聚合语法 1.3 RestAPI实现聚合 二、自动补全2.1 拼音分词器2.2 自定义分词器2.3 自动补全查询2.4 RestAPI实现自动补全 三、数据同步3.1 思路分析3.1.1 同…

Java来实现二叉树算法,将一个二叉树左右倒置(左右孩子节点互换)

文章目录 二叉树算法二叉树左右变换数据 今天来和大家谈谈常用的二叉树算法 二叉树算法 二叉树左右变换数据 举个例子: Java来实现二叉树算法,将一个二叉树左右倒置(左右孩子节点互换)如下图所示 实现的代码如下:以…

CMake ‘3.10.2‘ was not found in PATH or by cmake.dir property.

在部署Yolov5到安卓端的过程中出现:CMake ‘3.10.2’ was not found in PATH or by cmake.dir property. 原因: cmake版本太高,需要安装低版本的cmake 最开始下载的是默认最高版本的cmake,默认是3.22.1,解决方案是,下载…

AIGC创作系统ChatGPT网站源码,Midjourney绘画,GPT联网提问/即将支持TSS语音对话功能

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

C++初阶 | [七] (上) string类

摘要:标准库中的string类的常用函数 C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP(面向对象)的思想&#…

区块链创新应用场景不断拓展,实现去中心化

小编介绍:10年专注商业模式设计及软件开发,擅长企业生态商业模式,商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地;扶持10余个电商平台做到营收过千万,数百个平台达到百万会员,欢迎咨询。 区块…

网络知识学习(笔记三)(传输层的TCP)

前面已经介绍了传输层的UDP协议的报文以及一下相关的知识点,本次主要是传输层的TCP协议,包括TCP报文的详细介绍;可靠传输、流量控制、拥塞控制等;建立连接、释放连接。 一、TCP基本知识点介绍 1.1、TCP协议的几个重要的知识点 …

联想电脑重装系统Win10步骤和详细教程

联想电脑拥有强大的性能,很多用户办公都喜欢用联想电脑。有使用联想电脑的用户反映系统出现问题了,想重新安装一个正常的系统,但是不知道重新系统的具体步骤。接下来小编详细介绍给联想电脑重新安装Win10系统系统的方法步骤。 推荐下载 系统之…

Elastcsearch:通过 Serverless 提供更多服务

作者:Ken Exner 人们使用 Elasticsearch 解决最大数据挑战的方式一直令我们感到惊讶。 从超过 40 亿次下载、70,000 次提交、1,800 名贡献者以及我们全球社区的反馈中可以清楚地看出这一点。 Elastic 在广泛的用例中发挥的作用促使我们简化复杂性,让搜索…

2023年12月8日:UI登陆界面

作业 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMovie> #include <QPushButton> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpub…

Liunx系统使用超详细(五)~命令符号

目录 一、逻辑符号 1.1&& 1.2|| 二、连接符号 2.1| 2.2> 2.3>> 2.4< 三、分隔符号 3.1 &#xff1b; 在Linux中&#xff0c;逻辑符号和连接符号常用于构建命令行中的逻辑操作和管道操作。下面对这两种符号进行总结描述。 一、逻辑符号 1.1&…

运维知识点-Nginx

Nginx Nginx解析安全实战预备知识实验目的#制作图片木马# web服务器-Nginx服务命令及配置centOS7安装安装所需插件安装gccpcre、pcre-devel安装zlib安装安装openssl Nginx解析安全实战 预备知识 NginxPHP/FastCGI构建的WEB服务器工作原理 Nginx|FastCGI简介 Nginx (“engin…

Spring--10--Spring Bean的生命周期

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.Spring Bean1.1 什么是 Bean简而言之&#xff0c;bean 是由 Spring IoC 容器实例化、组装和管理的对象。 1.2 Spring框架管理Bean对象的优势 2.Bean的生命周期实例…

Linux shell编程学习笔记34:eval 命令

0 前言 在JavaScript语言中&#xff0c;有一个很特别的函数eval&#xff0c;eval函数可以将字符串当做 JavaScript 代码执行&#xff0c;返回表达式或值。 在Linux Shell 中也提供了内建命令eval&#xff0c;它是否具有JavaScript语言中eval函数的功能呢&#xff1f; 1 eval命…

MuJoCo机器人动力学仿真平台安装与教程

MuJoCo是一个机器人动力学仿真平台&#xff0c;它包括一系列的物理引擎、可视化工具和机器人模拟器等工具&#xff0c;用于研究和模拟机器人的运动和动力学特性。以下是MuJoCo的安装教程&#xff1a; 下载和安装MuJoCo Pro。可以从MuJoCo的官方网站上下载最新版本的安装包。根…

QT Creator 保存(Ctrl+S)时,会将Tab制表符转换为空格

今天在写makefile文件时&#xff0c;发现QT Creator 保存(CtrlS)时&#xff0c;会将Tab制表符转换为空格&#xff0c;之前没有发现&#xff0c;略坑&#xff0c;官网上也有说明&#xff0c;点这里 简单来说&#xff0c;解决办法如下 依次点击&#xff1a;Tools ->Options-&g…