内容简介:此文首发于公众号 brucepk,如需转载,请联系作者。阅读文本大概需要 7 分钟。大家还记得你们刚来上海的时候租房的房租是多少吗?现在相比于那个时候,是不是涨了不少?上个月中介哄抢租赁房源的事件大家应该还没忘记。pk哥在上海,也是见证了房租稳步上涨的过程。很多网友感慨,以前是买不起房,现在是租房都租不起了。
此文首发于公众号 brucepk,如需转载,请联系作者。
阅读文本大概需要 7 分钟。
大家还记得你们刚来上海的时候租房的房租是多少吗?现在相比于那个时候,是不是涨了不少?上个月中介哄抢租赁房源的事件大家应该还没忘记。pk哥在上海,也是见证了房租稳步上涨的过程。很多网友感慨,以前是买不起房,现在是租房都租不起了。
今天,pk哥用 Python 爬虫给大家分析下上海的房租。我们用数据来看看上海的房租究竟有多高。
这次的租房房源数据来源于链家网,用 Python 收集数据后制作成可视化图形。
效果图
本次用 Python 爬取链家网的样本数据我把它做成了柱形图。从图中看到,有些区域的房源是比较少的,像崇明、金山、上海周边这三个区域提供的房源较少。
通过样本数据我提取出上海各区域的房租平均值。图中标出了最高房租和最低房租。
这个房租的平均值参考性不大,因为房租的多少还和房屋面积和户型有关。我们用词云图来看看出租的房源中的主要户型情况,字体越大表示此户型占的比例越大。
从户型词云图看得出来,出租的房源中最多的户型是 3 室 2 厅和 2 室 2 厅。如果和认识的朋友一起,租这种户型的房子也是一个不错的选择,这种户型的房子一般在小区,环境也不错。
所以,为了使数据更具有参考性,我把各区域房源每平米的月租平均值用 Python 计算出来画成了柱形图。图中标出了最高的每平米月租和最低的的每平米月租。最高的平均值是静安区的 160.79 元,最低的平均值是奉贤区的 29.77 元。
项目环境
语言:Python 3
编辑器:Pycharm
主要思路
1、用 Python 爬虫对链家网房源信息收集。
2、把房源信息按照自己需求整理成可视化图形。
出租房信息收集
出租房信息采集的来源是链家网,打开链家网页面,用 F12 打开页面的调试功能。页面信息的抓取用 requests 库就可以轻松获取。
代码分析
先把单个页面租房的信息提取出来以字典的形式保存。我提取的信息有出租房屋的标题、户型、面积、房租、每平米房租。把这些信息以字典的形式返回。部分主要代码如下。(左右滑动查看全部代码)
def RoomInfo(html): soup = BeautifulSoup(html, 'lxml') titles = soup.select('#house-lst div.info-panel h2 a') styles = soup.select('#house-lst div.info-panel div.col-1 div.where span.zone span') squares = soup.select('#house-lst div.info-panel div.col-1 div.where span.meters') prices = soup.select('#house-lst div.info-panel div.col-3 div.price span') data = [] for ti, st, sq, pr, in zip(titles, styles, squares, prices): info = {} title = ti.get_text().strip() # 出租房屋标题 info['标题'] = title style = st.get_text().strip() # 出租房屋户型 info['户型'] = style square = sq.get_text().strip()[0:-2] # 出租房屋面积 info['面积(平方)'] = square price = pr.get_text().strip() # 出租房屋房租 info['房租(元/月)'] = price price_square = round(float(price)/float(square), 3) # 出租房屋每平米房租 info['每平方房租(元)'] = price_square data.append(info) return data 复制代码
接下来把上面提取的信息保存在 csv 文件中,文件名称通过提取 url 中的元素作为获得,因为每个地区的出租房信息链接都是在后面加一个中文拼音,比如浦东。
一行表示一组房屋信息,列信息分别对应是上面函数获取的标题、户型、面积、房租、每平方房租,我把所有信息都保存在 E 盘的 「zufang」目录下,需要事先新建好目录,保存的文件部分截图如下。
实现把房源信息以 csv 文件形式存储功能的代码如下。(左右滑动查看全部代码)
def write2csv(url, data): name = url.split('/')[-3] print('正在把数据写入{}文件'.format(name)) # 以链接中的地区拼音给文件命名 with open('E:\\zufang\\{}.csv'.format(name), 'a', newline='', encoding='utf-8-sig') as f: fieldnames = ['标题', '户型', '面积(平方)', '房租(元/月)', '每平方房租(元)'] # 控制列的顺序 writer = csv.DictWriter(f, fieldnames=fieldnames) writer.writeheader() writer.writerows(data) print("写入成功") 复制代码
对页面分页时我们需要判断页面有多少页,不同地区页面会显示该地区房源的数量,每个页面显示 30 个房源,所以基本情况是页面等于房源总数量除以 30,所有区域房源最大的页面是 100 页,但是有些地区房源数量除以 30 结果大于 100 页,不知道链家的多余的房源去哪里了,这里超过 100 就当 100 处理了,还有一种情况是有些地方房源比较少,不到 30 个,那么就只有一页的数据。
def get_page_num(url): html = get_html(url) soup = BeautifulSoup(html, 'lxml') nums = soup.select('body div.wrapper div.main-box.clear div.con-box div.list-head.clear h2 span') for n in nums: total = int(n.get_text()) if total < 30: num = 1 return num else: num = total / 30 if num > 100: num = 100 return num else: return num 复制代码
接下来获取不同区域的所有房源信息,包括浦东区、闵行区、宝山区、普陀区、杨浦区、长宁区、松江区、嘉定区、黄埔区、静安区、闸北区、虹口区、青浦区、奉贤区、金山区、崇明区、上海周边地区、地铁租房、所有房源。为了不给链家服务器造成太大的压力而导致 IP 被封,每爬取一页时我设置了随机等待时间。(左右滑动查看全部代码)
for area in ['pudong', 'minhang', 'baoshan', 'putuo', 'yangpu', 'changning', 'songjiang', 'jiading', 'huangpu', 'jingan', 'zhabei', 'hongkou', 'qingpu', 'fengxian', 'jinshan', 'chongming', 'shanghaizhoubian', 'ditiezufang', 'all']: base_url = 'https://sh.lianjia.com/zufang/{}/pg1/'.format(area) num = get_page_num(base_url) for page in range(1, int(num) + 1): url = 'https://sh.lianjia.com/zufang/{}/pg{}/'.format(area, page) html = get_html(url) data = RoomInfo(html) write2csv(url, data) time.sleep(int(format(random.randint(0, 5)))) 复制代码
数据可视化处理
接下来对获得的数据进行可视化处理,我拿对户型生成词云图举例,通过从保存的 csv 文件中获取需要列的信息并统计相同元素出现的次数,剔除无关信息后生成文章前面出现的户型词云图。
import csv import os from pyecharts import WordCloud def all_list(arr): result = {} for i in set(arr): result[i] = arr.count(i) return result os.chdir('E:\\zufang') with open('all.csv', 'rt', encoding="utf-8") as csvfile: reader = csv.reader(csvfile) column = [row[1] for row in reader] result = all_list(column) result.pop('户型') # 去掉字典中的无关信息 key = list(result.keys()) value = list(result.values()) wordcloud = WordCloud(width=1500, height=700) wordcloud.add('', key, value, word_size_range=[20, 100]) wordcloud.render('E:\\pye\\style.html') # 在指定目录下生成文件 复制代码
其他的可视化图形也是同样的思路,不清楚可查看我之前公众号发的各种可视化图形制作方法的文章:Python让你的数据生成可视化图形
在公众号后台回复「房租」获取源码。
觉得不错,点赞、赞赏、转发朋友圈都是一种支持。
pk哥公众号还没开通留言功能,不过可以通过点击文末左下角「阅读原文」来留言喔。
以梦为马,不负韶华
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 用Python告诉你深圳房租有多高
- 爬取两万多租房数据,告诉你广州房租现状
- 房东要涨800房租,我用Python抓取帝都几万套房源信息,主动涨了1000。 荐
- 爬虫需谨慎,那些你不知道的爬虫与反爬虫套路!
- 反爬虫之字体反爬虫
- 反爬虫之字体反爬虫
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
流畅的Python
[巴西] Luciano Ramalho / 安道、吴珂 / 人民邮电出版社 / 2017-5-15 / 139元
【技术大咖推荐】 “很荣幸担任这本优秀图书的技术审校。这本书能帮助很多中级Python程序员掌握这门语言,我也从中学到了相当多的知识!”——Alex Martelli,Python软件基金会成员 “对于想要扩充知识的中级和高级Python程序员来说,这本书是充满了实用编程技巧的宝藏。”——Daniel Greenfeld和Audrey Roy Greenfeld,Two Scoops ......一起来看看 《流畅的Python》 这本书的介绍吧!