python二手房数据分析_Python 爬取北京二手房数据,分析北漂族买得起房吗? | 附完整源码...
作者 徐麟
本文经授权转自公众号数据森麟(ID: shujusenlin)
房价高是北漂们一直关心的话题,本文就对北京的二手房数据进行了分析。
本文主要分为两部分:Python爬取赶集网北京二手房数据,R对爬取的二手房房价做线性回归分析,适合刚刚接触Python&R的同学们学习参考。
01
Python爬取赶集网北京二手房数据
入门爬虫一个月,所以对每一个网站都使用了Xpath、Beautiful Soup、正则三种方法分别爬取,用于练习巩固。数据来源如下:
Xpath爬取:
这里主要解决运用Xpath如何判断某些元素是否存在的问题,比如如果房屋没有装修信息,不加上判断,某些元素不存在就会导致爬取中断。
import requestsfrom lxml import etreefrom requests.exceptions import RequestExceptionimport multiprocessingimport timeheaders = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}def get_one_page(url): try: response = requests.get(url, headers=headers) if response.status_code == 200: return response.text return None except RequestException: return Nonedef parse_one_page(content): try: selector = etree.HTML(content) ALL = selector.xpath('//*[@id="f_mew_list"]/div[6]/div[1]/div[3]/div[1]/div') for div in ALL: yield { 'Name': div.xpath('dl/dd[1]/a/text()')[0], 'Type': div.xpath('dl/dd[2]/span[1]/text()')[0], 'Area': div.xpath('dl/dd[2]/span[3]/text()')[0], 'Towards': div.xpath('dl/dd[2]/span[5]/text()')[0], 'Floor': div.xpath('dl/dd[2]/span[7]/text()')[0].strip().replace('\n', ""), 'Decorate': div.xpath('dl/dd[2]/span[9]/text()')[0], #地址需要特殊处理一下 'Address': div.xpath('dl/dd[3]//text()')[1]+div.xpath('dl/dd[3]//text()')[3].replace('\n','')+div.xpath('dl/dd[3]//text()')[4].strip(), 'TotalPrice': div.xpath('dl/dd[5]/div[1]/span[1]/text()')[0] + div.xpath('dl/dd[5]/div[1]/span[2]/text()')[0], 'Price': div.xpath('dl/dd[5]/div[2]/text()')[0] } if div['Name','Type','Area','Towards','Floor','Decorate','Address','TotalPrice','Price'] == None:##这里加上判断,如果其中一个元素为空,则输出None return None except Exception: return Nonedef main(): for i in range(1, 500):#这里设置爬取500页数据,在数据范围内,大家可以自设置爬取的量 url = 'http://bj.ganji.com/fang5/o{}/'.format(i) content = get_one_page(url) print('第{}页抓取完毕'.format(i)) for div in parse_one_page(content): print(div)if __name__ == '__main__': main()
Beautiful Soup爬取:
import requestsimport refrom requests.exceptions import RequestExceptionfrom bs4 import BeautifulSoupimport csvimport timeheaders = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}def get_one_page(url): try: response = requests.get(url,headers = headers) if response.status_code == 200: return response.text return None except RequestException: return Nonedef parse_one_page(content): try: soup = BeautifulSoup(content,'html.parser') items = soup.find('div',class_=re.compile('js-tips-list')) for div in items.find_all('div',class_=re.compile('ershoufang-list')): yield { 'Name':div.find('a',class_=re.compile('js-title')).text, 'Type': div.find('dd', class_=re.compile('size')).contents[1].text,#tag的 .contents 属性可以将tag的子节点以列表的方式输出 'Area':div.find('dd',class_=re.compile('size')).contents[5].text, 'Towards':div.find('dd',class_=re.compile('size')).contents[9].text, 'Floor':div.find('dd',class_=re.compile('size')).contents[13].text.replace('\n',''), 'Decorate':div.find('dd',class_=re.compile('size')).contents[17].text, 'Address':div.find('span',class_=re.compile('area')).text.strip().replace(' ','').replace('\n',''), 'TotalPrice':div.find('span',class_=re.compile('js-price')).text+div.find('span',class_=re.compile('yue')).text, 'Price':div.find('div',class_=re.compile('time')).text } #有一些二手房信息缺少部分信息,如:缺少装修信息,或者缺少楼层信息,这时候需要加个判断,不然爬取就会中断。 if div['Name', 'Type', 'Area', 'Towards', 'Floor', 'Decorate', 'Address', 'TotalPrice', 'Price'] == None: return None except Exception: return Nonedef main(): for i in range(1,50): url = 'http://bj.ganji.com/fang5/o{}/'.format(i) content = get_one_page(url) print('第{}页抓取完毕'.format(i)) for div in parse_one_page(content): print(div) with open('Data.csv', 'a', newline='') as f: # Data.csv 文件存储的路径,如果默认路径就直接写文件名即可。 fieldnames = ['Name', 'Type', 'Area', 'Towards', 'Floor', 'Decorate', 'Address', 'TotalPrice', 'Price'] writer = csv.DictWriter(f, fieldnames=fieldnames) writer.writeheader() for item in parse_one_page(content): writer.writerow(item) time.sleep(3)#设置爬取频率,一开始我就是爬取的太猛,导致网页需要验证。if __name__=='__main__': main()
正则爬取:我研究了好久,还是没有解决。
这一过程中容易遇见的问题有:
有一些房屋缺少部分信息,如缺少装修信息,这个时候需要加一个判断,如果不加判断,爬取就会自动终止(我在这里跌了很大的坑)。
Data.csv知识点存储文件路径默认是工作目录,关于Python中如何查看工作目录:
import os #查看pyhton 的默认工作目录print(os.getcwd())#修改时工作目录os.chdir('e:\\workpython')print(os.getcwd())#输出工作目录e:\workpython
爬虫打印的是字典形式,每个房屋信息都是一个字典,由于Python中excel相关库是知识盲点,所以爬虫的时候将字典循环直接写入了CSV。
Pycharm中打印如下:
将字典循环直接写入CSV效果如下:
很多初学者对于Address不知如何处理,这里强调一下Beautiful Soup 中.contents的用法,亲身体会,我在这里花了好多时间才找到答案。
02
R对爬取的二手房房价做一般线性回归分析
下面我们用R对抓取的赶集网北京二手房数据做一些简单的分析。
数据的说明
Name:主要是商家的醒目标题,不具备分析参考意义
Type:卧室数、客厅数、卫生间数
Area:面积(平方米)
Towards:朝向
Floor:楼层
Decorate:装修情况,如精装修、简单装修、毛坯房
Address:二手房的地址
TotalPrice:总价
Price:均价(元/平方米)
数据清洗
data
#在爬取的时候加入了判断,所以不知道爬取的数据中是否存在缺失值,这里检查一下colSums(is.na(DATA))
#这里将Type的卧室客厅和卫生间分为三个不同的列##这里需要注意,有一些房屋没有客厅如:1室1卫这时候需要单独处理,还有一些没有厕所信息。library(tidyr)library(stringr)DATA=separate(data=DATA,col=Type,into = c("Bedrooms","Halls"),sep="室")DATA=separate(data=DATA,col=Halls,into = c("Halls","Toilet"),sep="厅")##将卫生间后面的汉字去掉DATA$Toilet
##这里将Area后的㎡去掉DATA$Area
##将数据转换格式DATA$Bedrooms
以上数据清洗完毕。
03
描述性分析
这部分的主要思路是探究单个自变量对因变量的影响,对房价的影响因素进行模拟探究之前,首先对各变量进行描述性分析,以初步判断房价的影响因素。这里探究各个因素对总价影响。
探究Bedrooms与TotalPrice的关系
table(DATA$Bedrooms) 1 2 3 4 5 6 7 9 541 1225 779 193 102 20 5 1 ##由于拥有6、7、9个卧室数的数量较少,这里我们排出这些数据。DATA
DATA$Bedrooms
不同卧室数,TotalPrice不同。且随着卧室数的增多,总价越高,符合大众的认知。
探究Halls与TotalPrice的关系
table(DATA$Halls) 0 1 2 3 4 5 9 20 1674 1050 77 18 1 0 ##5个客厅只有一个个体,我们这里将其排出DATA
客厅数为3时候总价最高,客厅数为0、1和2的时候总价低于客厅数3和客厅数4。
探究Toilet与TotalPrice的关系
#探究卫生间与总价的关系table(DATA$Toilet) 0 1 2 3 4 5 6 7 9 2 2142 470 116 74 26 7 2 0 #这里将卫生间数为0、6和7的去掉DATA
一般卧室数越多,卫生间数也越多,即卫生间数越多,总价越高。
探究Area与TotalPrice的关系
ggplot(DATA, aes(x=Area, y=TotalPrice)) + geom_point(col='red')
这个完全符合住房面积越大,总价越高。
探究Towards与TotalPrice的关系
ggplot(DATA,aes(x=Towards,y=TotalPrice))+geom_boxplot(col="red")
探究Floor与TotalPrice的关系
ggplot(DATA,aes(x=Floor,y=TotalPrice))+geom_boxplot(col="red")
图中信息显示楼层一共只有1、2、3、地下的总价较高。
探究Decorate与TotalPrice的关系
ggplot(DATA,aes(x=Decorate,y=TotalPrice))+geom_boxplot(col="red")
不同装修信息对总价影响较小。
04
模型建立
fit |t|) (Intercept) -112.7633 88.3010 -1.277 0.201697 Bedrooms2 -43.5934 16.2533 -2.682 0.007359 ** Bedrooms3 -82.6565 20.7641 -3.981 7.04e-05 ***Bedrooms4 -63.3096 34.9521 -1.811 0.070198 . Bedrooms5 79.0618 54.0763 1.462 0.143842 Halls1 -5.0663 64.2764 -0.079 0.937182 Halls2 -53.8905 65.4427 -0.823 0.410307 Halls3 -303.9750 79.2280 -3.837 0.000127 ***Halls4 -528.5427 104.0849 -5.078 4.07e-07 ***Toilet2 112.9566 19.1171 5.909 3.87e-09 ***Toilet3 543.7304 38.8056 14.012
模型的F检验拒绝原假设,说明建立的模型是显著的;Ajusted R-squared为0.6815,模型的拟合程度尚可接受。
作者:徐麟,知乎同名专栏作者,目前就职于上海唯品会产品技术中心,哥大统计数据狗,从事数据挖掘&分析工作,喜欢用R&Python玩一些不一样的数据。
更多精彩文章
细数数据科学团队中的十大关键角色
数据解读丨哪些人对种草神器「小红书」爱不释手
在谷歌、Facebook等顶级科技公司工作需要哪些技能
9 大实际用例,让你重新认识区块链
数据分析师的自我修养丨如何进阶为数据科学家
求职丨我是如何成为了谷歌的软件工程师
避免五大误区丨新手数据科学家进阶之路
数据科学入门丨选Python还是R
Python能用来做什么?以下是Python的三大主要用途
如何理性看待智能合约
python二手房数据分析_Python 爬取北京二手房数据,分析北漂族买得起房吗? | 附完整源码...相关推荐
- Python 爬取北京二手房数据,分析北漂族买得起房吗?(附完整源码)
来源:CSDN 本文约3500字,建议阅读9分钟. 本文根据Python爬取了赶集网北京二手房数据,R对爬取的二手房房价做线性回归分析,适合刚刚接触Python&R的同学们学习参考. 房价高是 ...
- python新浪微博数据分析_Python 爬取新浪微博数据分析90后单身原因
一.需求背景 今天逛微博的时候发现一个有趣的话题#90后单身原因TOP3# 七夕之际,一份针对全国90后青年婚恋观进行抽样调查公布了结果.结果显示,一线城市单身占比持续领先.90后单身原因TOP3:圈 ...
- 爬取北京二手房数据信息(python)
数据爬取 爬取北京二手房数据信息python代码: # coding : utf-8from requests import get from bs4 import BeautifulSoup as ...
- python爬取微博数据存入数据库_Python爬取新浪微博评论数据,写入csv文件中
因为新浪微博网页版爬虫比较困难,故采取用手机网页端爬取的方式 操作步骤如下: 1. 网页版登陆新浪微博 2.打开m.weibo.cn 3.查找自己感兴趣的话题,获取对应的数据接口链接 4.获取cook ...
- python简单网站爬虫-爬取北京7天最高、最低气温
python简单网站爬虫-爬取北京7天最高.最低气温 前置操作: 1.待爬取网站: 北京天气的网址: http://www.weather.com.cn/weather1d/101010100.sht ...
- Python实现恩尼格玛加密算法——附完整源码
Python实现恩尼格玛加密算法--附完整源码 恩尼格玛是第二次世界大战中德国所使用的复杂电机械式密码机.它被认为是世界上最复杂的加密设备之一.在这个项目中,我们将使用Python模拟实现恩尼格玛加密 ...
- Python语言打造智能语音助手——附完整源码
Python语言打造智能语音助手--附完整源码 随着智能家居.智能办公等领域的逐渐兴起,实现语音控制与交互已成为了一种趋势.而Python语言是一门极具魅力的编程语言,其强大的库.简洁的语法以及易于学 ...
- 使用Python获取数字货币价格(附完整源码)
使用Python获取数字货币价格(附完整源码) 如果你想要及时了解到加密货币的价格变化,你可以使用Python获取数字货币的实时价格.本文将介绍如何使用Python和CoinGecko API获取数字 ...
- python xpath循环_Python爬虫 爬取北京二手房数据
点击蓝字"python教程"关注我们哟! 前言 Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以小的给各位看官们准备了高价值Python学习视频教程及 ...
最新文章
- 尺度不变特征变换匹配算法详解
- Java 链接MySQL数据库时报的connect和denied错解决方法
- VC 中字符串比较和查找
- jsonp获取服务器数据的方式
- 【数据结构与算法】之深入解析“修剪二叉搜索树”的求解思路与算法示例
- 404错误,500错误页面的代表意思
- 面向对象思想精华总结
- ParserError: Error tokenizing data. C error: Expected 1 fields in line 122, saw 2
- power designer数据流图_鲲云公开课 | 三分钟带你了解数据流架构
- Git与GitHub学习笔记(六)使用 Github Pages 管理项目文档
- android+动态地图+效果图,Android百度地图绘制圆形,圆形半径可动态变化
- 如果不当程序员,我可以生活的更好么?
- python中nums.append_Python程序中的append()和extend()
- 【步兵 经验篇】one step
- 【HTML】input多行文本
- java集合——Map
- Python毕业设计开题报告职业推荐系统
- 风险模型为什么是量化投资成功的关键?
- 【玩转嵌入式屏幕显示】(四)TFT-LCD屏幕显示英文字符(ASCII)和字符串
- 第六章 数据库安全与保护