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

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

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

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

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

解密加密信息

在加密信息的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 += ireturn 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:# 如果这个页面不为空则进行trytry:# 找到汽车信息所在的位置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").textcar_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").textcar_price_total = re.match('(.+?)万',car_price_total).group(1)try: # 如果有首付价格则进行trycar_price_pyment = li.find_element(By.XPATH, "a//div[@class='down-payment']/div").textexcept Exception as e: # 没有首付价格 则首付价格等于车价car_price_pyment = car_price_totalprint(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加密文件的urlwoff_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.contentwith 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 += ireturn new_string

保存到数据库

def store_data(car_info,car_year,car_mile,car_price_total,car_price_pyment,conn,cur):number = 0insert_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.mzph.cn/news/207742.shtml

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

相关文章

C 语言 变量

变量初始值 全局变量:初始值是 0 局部变量:初始值是 随机的 类型限定符 通常不需要显式使用 register 关键字来优化变量的存储和访问。 关键字 _Complex和_Imaginary分别用于表示复数和虚数(二者皆是数学概念) 变量的声明和定义 c…

苹果 macOS 14.1.2 正式发布 更新了哪些内容?

苹果今日向 Mac 电脑用户推送了 macOS 14.1.2 更新(内部版本号:23B92 | 23B2091),本次更新距离上次发布隔了 28 天。 需要注意的是,因苹果各区域节点服务器配置缓存问题,可能有些地方探测到升级更新的时间略…

webWorker解决单线程中的一些小问题和性能优化

背景 js是单线程这是大家都知道,为了防止多个线程同时操作DOM,这个导致一个复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应…

全局平均池化的示例

1.对一个3通道,5*5的矩阵,进行全局平均池化 每个矩阵的大小都是 5x5,假设这些矩阵代表一幅图像的三个不同通道。为简单起见,我们将这三个矩阵分别称为 A、B 和 C。合成图像将是一个三通道图像,每个通道由其中一个矩阵…

计算机方向的一些重要缩写和简介

参考: 深度学习四大类网络模型 干货|机器学习超全综述! 机器学习ML、卷积神经网络CNN、循环神经网络RNN、马尔可夫蒙特卡罗MCMC、生成对抗网络GAN、图神经网络GNN——人工智能经典算法 MLP(Multi Layer Perseption)用在神经网络中…

这是最后的战役了

不变因子 初等因子 行列式因子 smith标准型 酉矩阵 H-阵等等 A H A A^H A AHA 就是 H-阵 正定H阵的性质 若 A A A 为正定的H-阵. 存在可逆矩阵 Q Q Q, 使得 A Q H Q AQ^H Q AQHQ.存在 P P P, 使得 P H A P I P^HAPI PHAPI.A的特征值大于0. Q − 1 A Q Q^{…

驾驭苹果的人工智慧模式:克服反击与应对挑战

苹果一年一度的秋季「春晚」时间越来越近,但在大模型浪潮下,苹果何时推出自己的「苹果GPT」成了另一个关注的话题。 毕竟,前有华为,后有小米,在中国手机厂商争相将大模型装进移动终端的同时,苹果却依旧对A…

微服务学习:Ribbon实现客户端负载均衡,将请求分发到多个服务提供者

Ribbon是Netflix开源的一个基于HTTP和TCP客户端负载均衡器。它主要用于在微服务架构中实现客户端负载均衡,将请求分发到多个服务提供者上,从而实现高可用性和扩展性。 Ribbon的主要特点包括: 客户端负载均衡:Ribbon是一个客户端负…

【算法题】找出符合要求的字符串子串(js)

题解: function solution(str1, str2) {const set1 new Set([...str1]);const set2 new Set([...str2]);return [...set1].filter((item) > set2.has(item)).sort();}console.log(solution("fach", "bbaaccedfg"));//输入:fach// bbaacced…

手机上写工作总结用什么软件好?借助工作笔记轻松写出优秀年终总结

随着年底的临近,撰写个人年终工作总结成为了许多职场人士的重要任务。因为手机是每个上班族都要随身携带的电子设备,所以想要抽时间来写年终工作总结,使用手机是比较便捷的。那么,在手机上写工作总结应该使用什么软件呢&#xff1…

Linux 环境下的性能测试——top与stress

对于Linux 环境,top命令是使用频繁且信息较全的命令, 它对于所有正在运行的进行和系统负荷提供实时更新的概览信息。stress是个简单且全面的性能测试工具。通过它可以模拟各种高负载情况。 通过top与stress这两个命令的结合使用,基本可以达到…

软件测试——单元测试

单元测试是软件开发中的一种测试方法,用于验证软件中的各个独立单元(通常是函数、方法或类)是否按照设计规范正常工作。以下是进行单元测试的一般步骤和最佳实践: 1. 选择测试框架 选择适合项目的测试框架,例如&…

SHAP:Python的可解释机器学习库

SHAP:Python的可解释机器学习库 一、概念二、步骤三、代码-以波士顿房价为例summary_plotFeature Importanceshap_interaction_valuesdependence_plot完整代码一、概念 SHAP(Shapley Additive Explanations)模型是一种用于解释机器学习模型预测结果的方法。它基于合作博弈论…

【C++】类和对象——explicit关键字,友元和内部类

这篇博客已经到了类和对象的最后一部分了&#xff0c;下面我们先看一下explicit关键字 我们还是先来引入一个例子&#xff0c;我们的代码是可以这么写的 class A { public:A(int aa 0) {_a aa;cout << "A(int aa 0)" << endl;} private:int _a; }; i…

红队攻防实战之Redis-RCE集锦

心若有所向往&#xff0c;何惧道阻且长 Redis写入SSH公钥实现RCE 之前进行端口扫描时发现该机器开着6379&#xff0c;尝试Redis弱口令或未授权访问 尝试进行连接Redis&#xff0c;连接成功&#xff0c;存在未授权访问 尝试写入SSH公钥 设置redis的备份路径 设置保存文件名 …

[GXYCTF2019]禁止套娃1

提示 git泄露无参数rce &#xff01;&#xff01;注意需要python3环境 github里dirsearch工具下载位置 ###可能需要开节点才能打开 百度网盘dirsearch下载地址 ###如果github里下载不了可以在网盘下载 提取码sx5d 只给了flag在哪里呢&#xff0c;那么应该就是要让…

Java参数校验详解:使用@Valid注解和自定义注解进行参数验证

很多时候我们需要使用不少if、else等等逻辑判断及验证&#xff0c;这样在进行一些重复的参数校验会很麻烦&#xff0c;且以后要维护也会吃力。 而这样就可以使用javax.validation。验证&#xff08;Validation&#xff09;常见的验证操作包括验证数据的类型、格式、长度、范围、…

我想涨工资,请问测试开发该怎么入门?

我是测试开发工程师!欢迎和我交流测试领域相关问题&#xff08;测试入门、技术、python交流都可以&#xff09; 我几乎是靠这套方法&#xff0c;从一个只会功能测试的小白&#xff0c;到成为测试开发工程师的。 别急&#xff0c;先慢慢看&#xff0c;只要按照下面的流程走一遍…

postcss-pxtorem实现页面自适应的原理

先声明一点这玩意本身不能实现哈&#xff0c;他只是一个工具&#xff0c;更是一个postcss的插件 帮助我们从px转化成为rem比如我们的代码 div {height: 100px;width: 100px; }经过这个插件转化之后变成 假设变成下面这样哈 div {height: 1rem;width: 1rem; }其他没啥子太大作…

P1046 [NOIP2005 普及组] 陶陶摘苹果题解

题目 陶陶家的院子里有一棵苹果树&#xff0c;每到秋天树上就会结出 1010 个苹果。苹果成熟的时候&#xff0c;陶陶就会跑去摘苹果。陶陶有个 3030 厘米高的板凳&#xff0c;当她不能直接用手摘到苹果的时候&#xff0c;就会踩到板凳上再试试。 现在已知 1010 个苹果到地面的…