一年一度的秋招大战已经吹响号角,想必大多数毕业生正在为找到一份心仪的工作而努力准备,笔者先在此祝各位offer多多!然而,找到工作并不意味着就可以马上“躺平”,不是每家公司都有“包住宿”的福利,因此,找房也就成了许多毕业生进入社会之后的头等大事。
“年轻人的第一次崩溃从租房开始”不是说说而已,租房需要考虑的因素可不少,租金、基础设施、通勤时长、小区环境、房东人品等都会影响租房的体验感,如何找到合适的房源是一项不小的课题,借助Python可以大大减轻我们的工作量。本文将以链家网为例,爬取武汉地区的租房信息,并使用pandas_bokeh库在地图上标注,方便大家定位房源。话不多说,马上开始!
一、爬取租房信息
首先,进入武汉链家网(https://wh.lianjia.com/),选择右上角菜单中的“租房”,进入我们需要爬取数据的具体页面。
在租房页面中,通过切换页码,可以发现网页链接的规律,第n页对应的页面编码为pg{n},由此构建url。
url = 'https://wh.lianjia.com/zufang/' + 'pg' + str(i) + '/' + '#contentList'
其次,查看页面中需要爬取的内容,使用右键检查功能定位到具体的标签。以标题信息为例,其对应的class为’twoline’,因此,使用BeautifulSoup找到所有class为’twoline’的元素,并提取它们的文本内容。
然后将提取的文本内容进行去除首尾空格的处理,并将结果存储在一个名为rent_title的列表中。其余的页面信息爬取思路与之类似。在此我们分别爬取了房源信息标题rent_title、房源描述rent_des和房租rent_price,本次只爬取前10页的内容作为例子,代码及结果如下:
import pandas as pd
import json
import requests
from bs4 import BeautifulSoup
import re,sys
from fake_useragent import UserAgent
import importlib
importlib.reload(sys)
BASE_URL = 'https://wh.lianjia.com/zufang/'
# 页面数
PAGE_SIZE = 10
# 定义函数构造每一页内容url
def creat_conttentList_html(i):
url = BASE_URL + 'pg' + str(i) + '/' + '#contentList'
return url
# 访问url 发送请求
def get_html(url):
# 请求头 用来伪装浏览器请求
headers = {
'Cookie': '用户自己的cookie',
'Referer': 'https://wh.lianjia.com/zufang/',
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203"
}
# 发送请求
response = requests.get(url=url,headers=headers)
if response.status_code ==200:
# 返回响应内容
html = response.text
print(html)
return html
else:
print("网页出现错误")
data = []
# 定义函数用bs4解析提取数据
def extract_info(html):
# bs4解析网页
soup = BeautifulSoup(html, 'html.parser')
# 提取标题
rent_title = [item.get_text().strip() for item in soup.find_all(class_='twoline')]
# print(rent_title)
# print(len(rent_title))
# 提取描述信息
rent_des = [item.get_text().strip().replace("/", "").replace(" ", "") for item in
soup.find_all('p', class_='content__list--item--des')]
# print(rent_des)
# print(len(rent_des))
# 租金价格
rent_price = [item.get_text().strip() for item in
soup.find_all('span', class_="content__list--item-price")]
# print(rent_price)
# print(len(rent_price))
for i in range(len(rent_price)):
data.append([rent_title[i],rent_des[i],rent_price[i]])
return data
# 保存数据
def save_data(data):
columns = ['rent_title','rent_des','rent_price']
df = pd.DataFrame(data,columns=columns)
# 将数据保存到excel中
df.to_excel('武汉租房.xlsx',encoding='utf-8')
# 运行主程序
if __name__=='__main__':
# 循环遍历 获取10页数据
for i in range(1,PAGE_SIZE+1):
url = creat_conttentList_html(i)
html = get_html(url)
extract_info(html)
save_data(data)
print("正在抓取第{}页".format(i))
二、获取房源经纬度
在初步爬取获得的数据中,rent_des一列中的信息包含了地址、房屋面积、朝向、户型和楼层数等信息,通过数据清洗(具体步骤可在后台留言索取),将数据分列,得到地址rent_address、面积rent_area、朝向rent_orien、户型rent_room、层级rent_level、层数rent_floor几列信息,结果如下:
接着,我们调用高德API,使用其中的地理编码功能,根据房屋地址rent_address获取经纬度,代码和结果如下:
import pandas as pd
import requests
import time
import csv
import json
def gaode(addr):
para = {
'key':'用户自己的key', #高德地图开放平台申请的key
'address':addr #传入地址参数
}
url = 'https://restapi.amap.com/v3/geocode/geo?' #高德地图API接口
req = requests.get(url,para)
req = req.json()
print('-' * 30)
m = req['geocodes'][0]['location']
print(m)
return m
#gaode(addr="武汉")
df2 = pd.read_excel('武汉租房.xlsx') #读取地址数据
time_start = time.time()
df2['经纬度'] = df2['rent_address'].apply(gaode) #调用函数
time_end = time.time()
t = time_end-time_start
print('共用时%s秒'%t)
# 将数据保存到excel中
df2.to_excel('武汉租房经纬度.xlsx',encoding='utf-8')
三、数据可视化
获得了经纬度,我们就可以开始绘制地图了。本次数据可视化使用到的库为pandas_bokeh。首先我们简单了解一下Bokeh库,这是一个交互式可视化库,与之前介绍的Altair库《Python交互式数据可视化——酷炫的Altair库》功能类似,但是Altair库在处理超过5000个以上样本的数据集时,需要先对数据进行汇总,并且缺乏一些可选的样式,具有一定的局限性。相比之下,Bokeh库拥有更加灵活的制图选项,能够创建功能更丰富、效果更美观的图片。pandas_bokeh则是在Bokeh库的基础上,增添了直接与pandas库的连接,使得从数据集到图表的代码更加简洁流畅,库的安装、调用与基本语法如下:
pip install pandas-bokeh
import pandas as pd
import pandas_bokeh
df.plot_bokeh(kind="图形类型")
df.plot_bokeh.图形类型(...) #另一种绘图语法
#图形类型可选line、point、step、scatter、bar、hist、area、pie、map
目前pandas_bokeh库支持绘制线型图、直方图、散点图、饼图和地图等八种类型的图形,感兴趣的朋友可以进入官方文档查看详细的介绍(GitHub - PatrikHlobil/Pandas-Bokeh: Bokeh Plotting Backend for Pandas and GeoPandas)。
接下来,我们以绘制地图为例,展示pandas_bokeh强大的交互式可视化功能。我们希望得到的效果是在地图上标注出各个房源的地点,具体地,使用经纬度与地图上的位置进行匹配,并用散点标记,点的大小表示房屋的面积rent_area,颜色表示楼层高度等级rent_level,房屋的户型、租金和楼层数在点的标签里进行展示。
# 导入工具包
import pandas_bokeh
import pandas as pd
import numpy as np
import math
# 读取数据
data = pd.read_excel('C:/Users/wenhe/Desktop/Bokeh数据可视化/武汉租房经纬度.xlsx',index_col=0)
# 创建新变量
data["size"] = data["rent_area"] / 10
# 作图
#在notebook中显示可视化结果
pandas_bokeh.output_notebook()
data.plot_bokeh.map(x="lon",
y="lat",
hovertool_string="""<h2> @{rent_title} </h2>
<h3> 价格: @{rent_price} </h3>
<h4> 楼层: @{rent_floor} </h4>
""",
tile_provider="STAMEN_TERRAIN_RETINA",
size="size",
category="rent_level1",
colormap="Viridis",
figsize=(1000, 600),
title="武汉租房房源分布")
此外,我们也可以将交互式图像导出为html格式,方便随时调取查看,注意,以下代码需要在画图命令之前执行。
#导出交互式图片
pandas_bokeh.output_file("武汉租房信息.html")
在jupyter notebook中的展示结果如下,我们可以滑动鼠标进行区域的放缩,也可以将鼠标移动至感兴趣的位置,查看对应的房源信息,这样房屋的地理位置、周围环境等信息就一览无余,对于重点考虑通勤和居住环境的求租者而言,相比点开网页中的房屋地址一条条比对,无疑方便了不少~
以上就是本次Python实战的全部内容,正在找房的你可以开始动手试试啦~最后祝各位租房人都能顺利找到“梦中情房”!
感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python必备开发工具
工具都帮大家整理好了,安装就可直接上手!
三、最新Python学习笔记
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、Python视频合集
观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
五、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
六、面试宝典
简历模板
若有侵权,请联系删除