python-13(案例讲解)

目录

抓取链家前十页的数据

计算均价和总价

计算的类型(整租,合租)

计算的房型

抓取boss直聘前十页的数据

抓取boss直聘前十页的数据

将获取数据本地序列化

计算每个区的需求个数与均价


抓取链家前十页的数据

链家网址:长沙房产网_长沙房地产_长沙房产门户(长沙链家网)

计算均价和总价

import time
​
from selenium import webdriver
from selenium.webdriver.common.by import By
​
driver = webdriver.Chrome()
driver.get("https://cs.lianjia.com/zufang/rs岳麓区/")
​
# 总价
total = 0
# 记录房间个数
size = 0
​
for i in range(2):elements = driver.find_elements(By.CSS_SELECTOR, '.content__list--item--main')print(f"第{i+1}页的数据:")for el in elements:# 获取租房标题name = el.find_element(By.CSS_SELECTOR, '.content__list--item--title a').text# 判断是否包含独栋信息if name.__contains__("独栋"):continue# 获取租房的价格price = el.find_element(By.CSS_SELECTOR, '.content__list--item-price em').textprint(f"name={name},price={price}")total += float(price)# 记录房间的个数size += len(elements)# 点击下一页driver.find_element(By.CSS_SELECTOR,'a.next').click()# 模拟睡眠6秒time.sleep(2)
​
print(f"总价:{total},岳麓区的租房均价为:{total/size}")

计算的类型(整租,合租)

str = """
name=整租·万科里金域国际 4室2厅 南,price=4500
name=独栋·魔方公寓 长沙航天溪湖店 连锁公寓直租无中介费 1室1厅,price=1800
name=整租·潇湘奥林匹克花园 1室1厅 南,price=2200
name=合租·达美美立方 5居室 复式 南卧,price=999
name=整租·万科里金域国际 3室2厅 南,price=3400
"""
# 计算的类型(整租,合租)
print("整租:", str.count("整租"))
print("合租:", str.count("合租"))

计算的房型

由于在爬取的数据中存在“居室”“室”的区别,所以请将所有的“居室”数据替换成“室”

str = """
name=整租·万科里金域国际 4室2厅 南,price=4500
name=独栋·魔方公寓 长沙航天溪湖店 连锁公寓直租无中介费 1室1厅,price=1800
name=整租·潇湘奥林匹克花园 1室1厅 南,price=2200
name=合租·达美美立方 5居室 复式 南卧,price=999
name=整租·万科里金域国际 3室2厅 南,price=3400
"""
import re
import collections
st = str.replace('居室','室')
rs = re.findall(r'\d室',st)
print(rs)
print(collections.Counter(rs))

完整可执行且标注代码

import timefrom selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get("https://cs.lianjia.com/zufang/rs岳麓区/")# 总价
total = 0
# 记录房间个数
size = 0for i in range(2):elements = driver.find_elements(By.CSS_SELECTOR, '.content__list--item--main')print(f"第{i+1}页的数据:")for el in elements:# 获取租房标题name = el.find_element(By.CSS_SELECTOR, '.content__list--item--title a').text# 判断是否包含独栋信息if name.__contains__("独栋"):continue# 获取租房的价格price = el.find_element(By.CSS_SELECTOR, '.content__list--item-price em').textprint(f"name={name},price={price}")total += float(price)# 顶部滚到底部driver.execute_script('window.scrollTo(0,document.body.scrollHeight);')# 记录房间的个数size += len(elements)# 点击下一页driver.find_element(By.CSS_SELECTOR,'a.next').click()# 模拟睡眠6秒time.sleep(2)print(f"总价:{total},岳麓区的租房均价为:{total/size}")

抓取boss直聘前十页的数据

boss直聘网址:BOSS直聘-找工作上BOSS直聘直接谈!招聘求职找工作!

抓取boss直聘前十页的数据

其中参数city=101020100是中国天气网全城市代码weather_cityId

from selenium import webdriver
from selenium.webdriver.common.by import By
import time 
​
driver = webdriver.Chrome()
driver.get("https://www.zhipin.com/web/geek/job?query=java&city=101020100")
​
jobs = []
​
for i in range(3):time.sleep(6)elements = driver.find_elements(By.CSS_SELECTOR, ".job-card-wrapper")for el in elements:# 获取地区area = el.find_element(By.CSS_SELECTOR,"span.job-area").text# 获取薪酬salary = el.find_element(By.CSS_SELECTOR,"span.salary").textprint(f"area={area},salary={salary}")jobs.append({'area':area,'salary':salary})driver.find_element(By.CSS_SELECTOR,".selected+a").click()
​
print(jobs)

将获取数据本地序列化

Python的pickle模块是一种用于序列化(将对象转换为字节流)和反序列化(将字节流转换回对象)Python对象的工具。它可以将Python对象保存到文件中或从文件中加载对象。

pickle模块还有其他一些有用的函数和特性。以下是一些常见的功能:

  • pickle.dumps(obj):将对象序列化为字节流,但不保存到文件中。

  • pickle.loads(bytes_obj):从字节流中加载对象,而不是从文件中加载。

  • pickle.dump(obj, file):将对象序列化并保存到文件中。

  • pickle.load(file):从文件中加载序列化的对象。

# 将获取到的结果保存到本地
p = Path("jobs.txt")
p.touch()
# 通过pickle.dump实现数据序列化
pickle.dump(jobs,p.open(mode="wb"))

计算每个区的需求个数与均价

# 计算每个区的需求个数与均价
jobs = pickle.load(open('jobs.txt',mode="rb"))
print(jobs)
areas=list(map(lambda a: "".join(re.findall(r'.*?·(.*?)·.*?',a['area'])),jobs))
print(areas)
import collections
rs = collections.Counter(areas)
​
for k,v in rs.items():print(f"【{k}】的工作岗位需求数:{v}")# 获取该区的工作集合ps = list(filter(lambda e: e['area'].count(k) > 0, jobs))# 获取该区的薪酬总价total = functools.reduce(lambda a,b:a+int(b['salary'].split('-')[0]),ps,0)print(f"该区的工作入门平均薪酬:{total/len(ps)}")

完整可执行且标注代码

序列化

import json  # 导入json模块,用于处理JSON数据
import time  # 导入time模块,用于延时操作from selenium import webdriver  # 导入selenium的webdriver模块,用于自动化浏览器操作
from selenium.webdriver.common.by import By  # 导入selenium的By模块,用于定位元素driver = webdriver.Edge()  # 初始化Edge浏览器的WebDriver实例
driver.get("")  # 访问BOSS直聘网站的URL,这里需要替换为实际的URLjobs = []  # 初始化一个空列表,用于存储抓取的职位信息# try:
for i in range(2):  # 循环两次,假设只抓取两页的数据print(f'正在获取第{i+1}页数据')  # 打印当前正在抓取的页码time.sleep(20)  # 等待20秒,让页面加载完成items = driver.find_elements(By.CLASS_NAME,'job-card-wrapper')  # 查找所有具有'job-card-wrapper'类名的元素for item in items:  # 遍历这些元素addr = item.find_element(By.CLASS_NAME,'job-area')  # 在每个元素中查找具有'job-area'类名的元素price = item.find_element(By.CLASS_NAME,'salary')  # 在每个元素中查找具有'salary'类名的元素print(addr.text, price.text)  # 打印地址和薪资信息jobs.append({  # 将地址和薪资信息添加到jobs列表中'area': addr.text,'salary': price.text})# 它表示选取所有紧接在类为"selected"的元素后面的同级元素中的标签为"a"的元素driver.find_element(By.CSS_SELECTOR,'.selected+a').click()  # 点击下一页的链接print(jobs)  # 打印所有抓取到的职位信息# 序列化
with open("jobs.json","w",encoding='utf-8') as fp:  # 打开或创建一个名为"jobs.json"的文件,准备写入# ensure_ascii=False (关闭默认阿斯玛写入方式)json.dump(jobs, fp, ensure_ascii=False, indent=2)  # 将jobs列表中的数据序列化为JSON格式,并写入文件,格式化输出# except Exception as ex:
#     print(ex)  # 这行代码被注释掉了,它用于捕获并打印异常信息

反序列化

import json  # 导入json模块,用于处理JSON数据
import re  # 导入re模块,用于正则表达式操作
from collections import Counter  # 导入Counter类,用于计数jbos = []  # 初始化一个空列表,用于存储从JSON文件中加载的职位信息# 反序列化
with open('jbos.json', 'r', encoding='utf-8') as fp:  # 打开名为'jbos.json'的文件,准备读取jbos = json.load(fp)  # 从文件中加载JSON数据到jbos列表中
print(jbos)  # 打印加载的职位信息列表# 提取区名
def extract_district(job: dict):  # 定义一个函数,用于从职位信息中提取区域名称match = re.search(r'·([^·]+区)·', job['area'])  # 使用正则表达式匹配职位区域名称if match:  # 如果匹配成功return match.group(1)  # 返回匹配到的区域名称return ""  # 如果没有匹配到,返回空字符串arears = list(map(extract_district, jbos))  # 使用map函数和extract_district函数,将jbos列表中的每个职位映射到其区域名称,生成一个新的列表arears
print(arears)  # 打印提取的区域名称列表# 统计每个区出现的次数
dict = Counter(arears)  # 使用Counter类统计arears列表中每个区域出现的次数
print(dict)  # 打印区域出现次数的统计结果for k, v in dict.items():  # 遍历统计结果中的每个区域及其出现次数print(f'{k}有{v}条招聘信息')  # 打印每个区域的招聘信息数量total = 0  # 初始化总薪水变量count = 0  # 初始化计数器for job in jbos:  # 遍历所有职位信息if job['area'].__contains__(k):  # 如果职位区域包含当前区域total = total + int(re.search(r'(\d+?)-', job['salary']).group(1))  # 将薪水转换为整数并累加到总薪水count += 1  # 增加计数器print(f'平均薪水{total}')  # 打印当前区域的平均薪水

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

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

相关文章

海思SD3403,SS928/926,hi3519dv500,hi3516dv500移植yolov7,yolov8(18)-Yolov8改进

yolov8进行二次改进后进行了量化和速度测试 ,没有明显速度增加。对比一下模型的性能。 分别用原始模型和改后的模型进行了100 epochs训练。 以下是原始模型的结果。 class P R map0.5 map.95 1 0.79 0.49 0.571 0.316 2 0.851 0.738 0.801 0.538 …

勇于创新,勤于探索 —— 我的创作纪念日

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

【Java】全局统一异常处理类封装

文章目录 全局异常处理类自定义异常如何使用(手动抛出异常) 我是一名立志把细节说清楚的博主,欢迎【关注】🎉 ~ 原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~ 如有错误、疑惑,欢…

纯CSS丝滑边框线条动画

在这个网站(minimal-portfolio-swart.vercel.app)发现一个不错的交互效果,用户体验效果很不错。如封面图所示,这个卡片上有一根白色的线条围绕着卡片移动,且在线条的卡片内部跟随这一块模糊阴影,特别是在线…

关于Nginx热部署的细节分析

文章目录 前言一、环境准备二、热部署步骤总结 前言 Nginx由于其高并发、高性能、可扩展性好、高可靠性、热部署、BSD许可证等优势被广泛使用,本人主要针对热部署的部分展开说明热部署的具体步骤以及步骤背后发生的具体事情。 本次热部署采用的Nginx版本号为&…

在CentOS 7上配置Elasticsearch开启自启动需要通过systemd服务管理器来实现

在CentOS 7上配置Elasticsearch开启自启动需要通过systemd服务管理器来实现。 1. 安装Elasticsearch 首先,确保你已经安装了Elasticsearch。如果还没有安装,可以按照以下步骤进行安装: # Import the Elasticsearch PGP key sudo rpm --import https://artifacts.elastic.…

常见设计模式之Java实现

引言 设计模式是软件工程中的一套被反复使用的、大家公认的、经过分类编目的代码设计经验的总结。它们是解决特定问题的模板,可以提高代码的可重用性、可读性和可维护性。本文将介绍Java中常见的20种设计模式,并提供具体的使用场景、设计模式的解释以及…

高通 Android 12/13冻结屏幕

冻结屏幕很多第一次听到以为是Android一种异常现象,实则不然,就是防止用户在做一些非法操作导致问题防止安全漏洞问题。 1、主要通过用户行为比如禁止下拉状态栏和按键以及onTouch事件拦截等,不知道请看这篇文章(Touch事件传递流…

GitHub打不开的解决方案

1、打开https://sites.ipaddress.com/github.com/找到DNS Resource Records,复制github的ip地址,先保存起来: 140.82.112.32、打开https://sites.ipaddress.com/fastly.net/找到DNS Resource Records,复制其中一个ip地址&#xf…

基于Nacos实现Sentinel规则持久化

基于Nacos实现Sentinel规则持久化 一、Sentinel使用痛点二、解决方案2.1 保存本地文件2.2 保存数据库2.3 保存到Nacos 三、规则持久化到Nacos3.1 Nacos服务端修改配置3.2 Sentinel控制台修改配置3.3 Nacos数据源整合到Sentinel中 一、Sentinel使用痛点 SpringCloudAlibaba帮我…

迷你手持小风扇哪个牌子质量好点?这五款迷你手持小风扇不要错过

随着空调的普及,我们对夏日热浪的抵抗力逐渐减弱。当从凉爽的空调屋步入闷热的户外、拥挤的交通工具或公共场所时,如何抵御热浪的侵袭成为大众关注的焦点。在这样的背景下,迷你手持小风扇凭借其便携性和即时降温功能,成为众多人的…

341_C++_使用C++中的std::map容器查找键的时候,注意给个默认值,防止成员函数value()未查找到键,确保即使键不存在,你也能安全地获取一个值

在C++中,std::map是一个关联容器,它存储的元素都是键值对(key-value pairs),并且按键(key)自动排序。 std::map有一个成员函数value(),它用于返回与给定键相关联的值。如果该键在map中不存在,则value()函数返回提供的默认值。 map<int, int> mKeyMaps; int ke…

降价!免费!AI大模型开启价格战,企业如何“薅”出绿色财富?

近期&#xff0c;国内大模型技术供应商之间的价格战&#xff0c;使得这项原本成本较高的技术变得更加亲民&#xff0c;极大降低了企业的技术采用门槛。这不仅为企业提供了经济实惠的技术解决方案&#xff0c;更为他们的绿色低碳转型之路带来了新的机遇。 随着全球气候变化问题…

MySQL -- 相关知识点

1.数据库相关介绍 数据库的选择通常取决于具体的应用需求&#xff0c;如性能、扩展性、数据一致性和易用性等因素。 1. 关系型数据库&#xff08;RDBMS&#xff09; MySQL&#xff1a; 广泛使用的开源数据库&#xff0c;支持大多数操作系统。强调易用性、灵活性和广泛的社区支…

基于Java+MySQL+Swing的学生管理系统

1.系统简介和开发背景 该同学工作积极主动、高效&#xff0c;学习认真&#xff0c;待人诚恳&#xff0c;能够做到服从指挥、认真听取老同志的指导&#xff0c;不怕苦、不怕累&#xff0c;表现有较强的求知欲&#xff0c;积极观察、体验、思考&#xff0c;并能够灵活运用自己的知…

自养号测评是什么?亚马逊、沃尔玛、Target卖家如何建立自己的护城河?

近期有跨境卖家咨询我自养买家账号测评的事情&#xff0c;他们还是有不了解自养号测评的&#xff0c;所以珑哥觉得有必要再讲一下卖家测评的一些事情&#xff0c;之前文章也说过。这可能是跨境卖家运营的一个趋势。今天珑哥着重来介绍一下自养号测评 一、什么叫做自养号测评&a…

OrangePi AIpro初体验之图片视频检测案例真实测评

OrangePi AIpro简介 OrangePi AIpro官网 Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能AI 开发板&#xff0c;其搭载了昇腾AI 处理器&#xff0c;可提供8TOPS INT8 的计算能力&#xff0c;内存提供了8GB 和16GB两种版本。可以实现图像、视频等多种数据分析与推理…

简述v-for中的key的理解

在 Vue 中&#xff0c;v-for 是用来基于一个数组来渲染一个列表的指令。而 key 是一个特殊的属性&#xff0c;在 v-for 中经常被用到&#xff0c;它主要帮助 Vue 跟踪每个节点的身份&#xff0c;从而重用和重新排序现有元素。 key 的作用 性能优化&#xff1a;当 Vue 检测到列…

2024-python字典-报错compounds.iloc[0].molecule_structures.keys()

2024-python字典-报错compounds.iloc[0].molecule_structures.keys() .keys()拿不到 需要如何解决呢 import ast# 假设 "molecular_structures "是一个看起来像 Python 字典的字符串 molecule_structures df_VEGFR2_compounds.iloc[0].molecule_structures # 安全…

全球点赞最高的人颜廷利:真正的人生目标是什么

在那个充满生机的2024年春天&#xff0c;记者有幸对中国第一起名大师的老师颜廷利教授进行了深入的访谈。带着对其人生哲学的强烈好奇&#xff0c;记者紧张而期待地提出了问题&#xff1a;“颜教授&#xff0c;您在漫长的人生旅途中最追求的是什么&#xff1f;” 宁夏银川、山东…