爬虫之获取人人车网站中车辆的信息

爬虫之获取人人车网站中车辆的信息

import base64
import timeimport pymysql
from fontTools.ttLib import TTFont
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.edge.options import Options
import recar_id_list = []# 字体解析
def font_analysis(driver):style_text = driver.find_element(By.XPATH, "//style[1]").get_attribute("innerHTML")# 取出base64后的码base64_str = re.match("(.*?)base64,(.*?)'(.*?)", style_text).group(2)# 将其转换为# encode():以指定的编码格式编码字符串,默认编码为 'utf-8'# decodebytes():使用base64.decodebytes(s)方法,我们可以使用此方法获得二进制形式的解码字符串base64_bytes = base64.decodebytes(base64_str.encode())with open("./rrCar.ttf", 'wb') as fp:fp.write(base64_bytes)# TTFont()读取文件ttf = TTFont("./rrCar.ttf")# 输出数字与uni编码之间的关系li = ttf.getGlyphOrder()[1:]# 输出uni编码与数字之间的关系,输出类型为字典dic = ttf.getBestCmap()new_dict = {}for k, v in dic.items():new_dict[chr(k)] = li.index(v)return new_dict# 获取页面内的数据信息
def fetch_data(driver, font_dict):li_list = driver.find_elements(By.XPATH, "//ul[@class='infos infos-card h-clearfix']/li")# 存储car_id, car_brand,car_title, car_year, car_mile, new_car_pricecar_data = []for li in li_list:try:car_id = li.get_attribute("data-entid")#标签查找错误# car_brand = li.find_element(By.XPATH, "div/a/div[2]/h2/span/font").text.strip()# car_title = li.find_element(By.XPATH, "div/a/div[2]/h2/span").text.strip()# car_year_mile = li.find_element(By.XPATH, "div/a/div[2]/h2/div[2]").text.strip()# car_price = li.find_element(By.XPATH, "div/a/div[3]/b").text.strip()car_brand = li.find_element(By.XPATH,"div[@class='info--wrap']//span[@class='info_link']/font").text.strip()brand = li.find_element(By.CLASS_NAME, "info_link").text.strip()car_title = li.find_element(By.XPATH, "div[@class='info--wrap']//span[@class='info_link']").text.strip()car_year_mile = li.find_element(By.XPATH,"div[@class='info--wrap']//div[@class='info_params']").text.strip()car_price = li.find_element(By.XPATH,"div[@class='info--wrap']//b[@class='info_price fontSecret']").text.strip()car_year = re.match("(.*?)年", car_year_mile).group(1)car_mile = re.match("(.*?)·(.*?)万", car_year_mile).group(2)new_car_price = ''for i in car_price:if i == '.':new_car_price += '.'else:new_car_price += str(font_dict.get(i))print(car_id, "#", car_brand, "#", car_title, "#", car_year, "#", car_mile, "#", car_price, "#",new_car_price)if car_id not in car_id_list:car_id_list.append(car_id)car_data.append((car_id, car_brand, car_title, car_year, car_mile, new_car_price))except Exception as e:print(e)continuereturn car_data# 获取全部城市的名称的拼音
def fecth_cities(driver):js = """document.getElementsByClassName('citySelectWrap')[0].style.display='block';"""driver.execute_script(js)time.sleep(5)city_list = []a_list = driver.find_elements(By.XPATH, "//div[@class='citySelectWrap']//a[@class='city-item']")for a in a_list:city_list.append(a.get_attribute("listname"))print(city_list)return city_listpass# 写入数据库
# 建表语句
"""
create table rrCar(car_id bigint PRIMARY KEY, car_brand varchar(255), car_title varchar(255), car_year int, car_mile float, car_price float, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP on UPDATE CURRENT_TIMESTAMP
);
"""# 数据库插入数据
def mysql_insert(conn, cursor, car_data):try:insert_sql = "insert int project.rrCar(car_id, car_brand,car_title, car_year, car_mile, new_car_price) values(%s,%s,%s,%s,%s,%s)"cursor.execute(insert_sql, car_data)except Exception as e:print(e)print("failure")else:conn.commit()print("success")if __name__ == '__main__':# 配置无头模式opt = Options()opt.add_argument("--headless")driver = webdriver.Edge(options=opt)# 连接数据库conn = pymysql.connect(host='master', port=3306, user='root', password='123456')# 创建游标cursor = conn.cursor()# 获取所有城市# 这个地址只是用于获取所有的城市信息url = f'https://www.renrenche.com/hf/ershouche'driver.get(url)time.sleep(5)city_list = fecth_cities(driver)for city in city_list:time.sleep(5)print(city)url = f'https://www.renrenche.com/{city}/ershouche'driver.get(url)# 获取字体解析的信息font_dict = font_analysis(driver)# 将驱动传入函数,在函数内部获取网页的详细详信息car_data = fetch_data(driver, font_dict)# 将数据写入MySQLmysql_insert(conn, cursor, car_data)print(city)driver.close()cursor.close()conn.close()pass

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

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

相关文章

后端项目部署教程

一、打包jar包 lyamanoblog-server-0.0.1.jar ps:运行时可能会提醒不能有大写字母,所以用的都是小写字母 二、编写Dockerfile文件 FROM java:8 VOLUME /tmp ADD lyamanoblog-server-0.0.1.jarblog.jar ENTRYPOINT ["java","-Djava.securit…

Codeforces Round 142 (Div. 2) - B. T-primes (数论)

我们知道,质数是具有两个不同正除数的正整数。同样,我们把正整数 t t t 称为质数。Т-质数,如果 t t t 恰好有三个不同的正除数。 给你一个由 n 个正整数组成的数组。请判断其中每个整数是否为 Т-prime。 输入 第一行包含一个正整数 n …

八次危机笔记

文章目录 前言一、思维导图危机一危机二危机三危机四危机五危机六危机七危机八 前言 重塑三观,致敬温老。一个有良心的学者!!! 一、思维导图 危机一 危机二 危机三 危机四 危机五 危机六 危机七 危机八 ☆

2023年上半年信息系统项目管理师——综合知识真题与答案解释(1)

2023年上半年信息系统项目管理师 ——综合知识真题与答案解释(1) 零、00时光宝盒 1009 Rejections 1009 拒绝 Once, there was an old man, who was broke, living in a tiny house and owned a beat-up car. 有一次,有一个老人,他破产了&#…

【LeetCode刷题笔记】LeetCode 1365.有多少小于当前数字的数字

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…

curaengine编译源码之libarcus编译记录

libArcus的编译&#xff08;成功安装&#xff09; This library contains C code and Python3 bindings for creating a socket in a thread and using this socket to send and receive messages based on the Protocol Buffers library. It is designed to facilitate the c…

从文字到思维:呆马GPT在人工智能领域的创新之旅

引言 生成式预训练变换器&#xff08;Generative Pre-trained Transformer&#xff0c;简称GPT&#xff09;领域是人工智能技术中的一大革新。自OpenAI推出第一代GPT以来&#xff0c;该技术经历了多代发展&#xff0c;不断提升模型的规模、复杂度和智能化程度。GPT模型通过在大…

网工内推 | 网安、AGV测试网络工程师,厂商认证优先,应届可投

01 神州数码 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、负责国内外主流安全产品&#xff08;如防火墙、入侵防御、WAF、安全审计等&#xff09;的上线安装、调试、测试、割接、运维等工作。 2、能够独立进行安全类项目实施、问题排查及处理。 3、在出现网络攻…

Python 推导式介绍

Python推导式是一种简洁而强大的语法&#xff0c;用于在一行代码中创建集合&#xff08;list、set、dictionary&#xff09;的方式。推导式使得代码更加简洁易读&#xff0c;提高了代码的可读性和可维护性。Python中有列表推导式、集合推导式和字典推导式三种类型。 列表推导式…

力扣日记4.10-【动态规划篇】343. 整数拆分

力扣日记&#xff1a;【动态规划篇】343. 整数拆分 日期&#xff1a;2024.4.10 参考&#xff1a;代码随想录、力扣 343. 整数拆分 题目描述 难度&#xff1a;中等 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并…

Ubuntu Desktop Server 快捷键

Ubuntu Desktop Server 快捷键 1. Desktop shortcut key2. Terminal shortcut keyReferences 1. Desktop shortcut key Ctrl Alt T&#xff1a;打开终端 Ctrl Alt F1 ~ F6&#xff1a;终端界面 (terminal or console) tty1 ~ tty6 Ctrl Alt F7&#xff1a;图形界面 Ctrl…

基于springboot实现医院管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现医院管理系统演示 摘要 随着信息互联网信息的飞速发展&#xff0c;医院也在创建着属于自己的管理系统。本文介绍了医院管理系统的开发全过程。通过分析企业对于医院管理系统的需求&#xff0c;创建了一个计算机管理医院管理系统的方案。文章介绍了医院管理系…

JAVA学习-深入研究容器.理解Map

Map是Java集合框架中的一种容器&#xff0c;它用来存储键值对&#xff08;key-value pairs&#xff09;。 一、Map接口的实现类有很多&#xff0c;常用的有HashMap、TreeMap和LinkedHashMap。 1. HashMap: - 特点&#xff1a;基于哈希表实现&#xff0c;无序存储&#xff0c;…

qt自定义窗口在拖动过程中出现抖动且拖动后位置看上去不对

自定义窗口拖动 引言开发环境关键性代码运行结果原因分析改进代码运行结果globalPos()globalPosition()再次修改代码运行结果区别 引言 本文旨在一个问题的记录&#xff1a;自定义窗口拖动的过程中&#xff0c;窗口不能很好的跟随鼠标移动&#xff0c;此外会出现窗口拖动时抖动…

蓝桥杯赛前模拟

A-似巨龙高歌 题意 对考试的名次重新排序&#xff0c;使得进步最大的进步名次最少。 思路 按照名次从小到大进行排序&#xff0c;这样保证了进步的名次最少&#xff0c;从而取进步的最大值。 代码 #include<bits/stdc.h> #define PII pair<int,int> using n…

Kubernetes(k8s)监控与报警(qq邮箱+钉钉):Prometheus + Grafana + Alertmanager(超详细)

Kubernetes&#xff08;k8s&#xff09;监控与报警&#xff08;qq邮箱钉钉&#xff09;&#xff1a;Prometheus Grafana Alertmanager&#xff08;超详细&#xff09; 1、部署环境2、基本概念简介2.1、Prometheus简介2.2、Grafana简介2.3、Alertmanager简介2.4、Prometheus …

绿联 安装火狐浏览器(Firefox),支持访问路由器

绿联 安装火狐浏览器&#xff08;Firefox&#xff09;&#xff0c;支持访问路由器 1、镜像 linuxserver/firefox:latest 前置条件&#xff1a;动态公网IP。 已知问题&#xff1a; 直接输入中文时&#xff0c;不能完整输入&#xff0c;也可能输入法无法切换到中文&#xff0c;可…

【阿里淘天笔试题汇总】2024-04-10-阿里淘天春招笔试题-三语言题解(CPP/Python/Java)

&#x1f36d; 大家好这里是KK爱Coding &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新淘天近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f…

Golang教程四(协程,channel,线程安全,syncMap)

目录 一、Goroutine和channel Goroutine Channel 发送和接收操作 缓冲 Channel 关闭 Channel 使用 Channel 进行同步 Select语句 协程超时处理 方法一&#xff1a;使用context.Context 方法二&#xff1a;使用time.Timer/time.Ticker 二、线程安全与sync.Map 线程安…

Vue3大事件项目1 登录注册验证

创建项目 引入 element-ui 组件库 登录&#xff1a;注册样式准备之后&#xff0c;配置校验规则&#xff08;4个条件&#xff1a;一数据、二规则&#xff09; 1. 校验相关 (1) 给当前表单绑上整个的数据对象&#xff1a;el-form > :model"ruleForm" 绑…