作者 徐麟

本文经授权转自公众号数据森麟(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 爬取北京二手房数据,分析北漂族买得起房吗? | 附完整源码...相关推荐

  1. Python 爬取北京二手房数据,分析北漂族买得起房吗?(附完整源码)

    来源:CSDN 本文约3500字,建议阅读9分钟. 本文根据Python爬取了赶集网北京二手房数据,R对爬取的二手房房价做线性回归分析,适合刚刚接触Python&R的同学们学习参考. 房价高是 ...

  2. python新浪微博数据分析_Python 爬取新浪微博数据分析90后单身原因

    一.需求背景 今天逛微博的时候发现一个有趣的话题#90后单身原因TOP3# 七夕之际,一份针对全国90后青年婚恋观进行抽样调查公布了结果.结果显示,一线城市单身占比持续领先.90后单身原因TOP3:圈 ...

  3. 爬取北京二手房数据信息(python)

    数据爬取 爬取北京二手房数据信息python代码: # coding : utf-8from requests import get from bs4 import BeautifulSoup as ...

  4. python爬取微博数据存入数据库_Python爬取新浪微博评论数据,写入csv文件中

    因为新浪微博网页版爬虫比较困难,故采取用手机网页端爬取的方式 操作步骤如下: 1. 网页版登陆新浪微博 2.打开m.weibo.cn 3.查找自己感兴趣的话题,获取对应的数据接口链接 4.获取cook ...

  5. python简单网站爬虫-爬取北京7天最高、最低气温

    python简单网站爬虫-爬取北京7天最高.最低气温 前置操作: 1.待爬取网站: 北京天气的网址: http://www.weather.com.cn/weather1d/101010100.sht ...

  6. Python实现恩尼格玛加密算法——附完整源码

    Python实现恩尼格玛加密算法--附完整源码 恩尼格玛是第二次世界大战中德国所使用的复杂电机械式密码机.它被认为是世界上最复杂的加密设备之一.在这个项目中,我们将使用Python模拟实现恩尼格玛加密 ...

  7. Python语言打造智能语音助手——附完整源码

    Python语言打造智能语音助手--附完整源码 随着智能家居.智能办公等领域的逐渐兴起,实现语音控制与交互已成为了一种趋势.而Python语言是一门极具魅力的编程语言,其强大的库.简洁的语法以及易于学 ...

  8. 使用Python获取数字货币价格(附完整源码)

    使用Python获取数字货币价格(附完整源码) 如果你想要及时了解到加密货币的价格变化,你可以使用Python获取数字货币的实时价格.本文将介绍如何使用Python和CoinGecko API获取数字 ...

  9. python xpath循环_Python爬虫 爬取北京二手房数据

    点击蓝字"python教程"关注我们哟! 前言 Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以小的给各位看官们准备了高价值Python学习视频教程及 ...

最新文章

  1. 尺度不变特征变换匹配算法详解
  2. Java 链接MySQL数据库时报的connect和denied错解决方法
  3. VC 中字符串比较和查找
  4. jsonp获取服务器数据的方式
  5. 【数据结构与算法】之深入解析“修剪二叉搜索树”的求解思路与算法示例
  6. 404错误,500错误页面的代表意思
  7. 面向对象思想精华总结
  8. ParserError: Error tokenizing data. C error: Expected 1 fields in line 122, saw 2
  9. power designer数据流图_鲲云公开课 | 三分钟带你了解数据流架构
  10. Git与GitHub学习笔记(六)使用 Github Pages 管理项目文档
  11. android+动态地图+效果图,Android百度地图绘制圆形,圆形半径可动态变化
  12. 如果不当程序员,我可以生活的更好么?
  13. python中nums.append_Python程序中的append()和extend()
  14. 【步兵 经验篇】one step
  15. 【HTML】input多行文本
  16. java集合——Map
  17. Python毕业设计开题报告职业推荐系统
  18. 风险模型为什么是量化投资成功的关键?
  19. 【玩转嵌入式屏幕显示】(四)TFT-LCD屏幕显示英文字符(ASCII)和字符串
  20. 第六章 数据库安全与保护

热门文章

  1. Linux系统编程手册-源码的使用
  2. 用OpenCV的SVM实现简单的手势识别(切水果)[附源码]
  3. 手机剪辑快手短视频如何批量去掉片头和片尾
  4. 蒲公英 Ghost Win 10(x86/x64)装机版/纯净版
  5. ESP32驱动3.2寸ILI9341显示屏+XPT2046触摸,GUIslice用户图形库
  6. CODE【VS】1384 黑色星期五(计算某一天是星期几的公式)
  7. 正则匹配多个键值对英文逗号连接
  8. 数学、物理学、信息科学术语中英对照
  9. python预测运势_程序员来看看自己星座本月运势吧
  10. Flash 与数学 星形线