在外工作,难免需要租房子,而链家是现在比较火的一个租房网站,本文章主要是爬取链家在广州的租房信息,并且进行简单的数据分析。
数据采集
如图所示,我们需要的信息主要是存放在这个标签里面,我们把信息采集下来,并且放到mysql的数据库中。
相关代码:
# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
import pandas as pd
from sqlalchemy import create_engine
import re
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en-US,en;q=0.5',
'Accept-Encoding': 'gzip, deflate',
'Connection': 'keep-alive'
}
xingzhengqu = ['tianhe', 'yuexiu', 'liwan', 'haizhu', 'panyu', 'baiyun', 'huangpugz', 'zengcheng', 'huadou', 'nansha']
xingzhengqu_cn = ['天河', '越秀', '荔湾', '海珠', '番禺', '白云', '黄埔', '增城', '花都', '南沙']
def get_url(url, page):
html = requests.get(url + '/pg%s' % str(page), headers=headers).text
table = BeautifulSoup(html, 'lxml').find('div', {'class': 'con-box'}).find_all('li', {'data-el': 'zufang'})
table_2 = BeautifulSoup(html, 'lxml')
pattern = re.compile('"totalPage":(.*?),".*?')
last_page = re.findall(pattern, str(table_2))
pattern_mianji = re.compile("(.*?)平米.*?")
pattern_updatetime = re.compile("(.*?)\s更新")
pattern_quyu = re.compile("(.*?)租房")
result = []
for li in table:
item = dict()
item[u'网站'] = li.find('a').get('href')
item[u'房屋描述'] = li.find('img').get('alt')
item[u'小区'] = li.find('div', {'class': 'where'}).find('a').get_text().replace('\xa0', '')
item[u'房型'] = li.find('div', {'class': 'where'}).find_all('span')[1].get_text().replace('\xa0', '')
item[u'面积'] = re.findall(pattern_mianji, li.find('div', {'class': 'where'}).find_all('span')[3].get_text())[0]
item[u'朝向'] = li.find('div', {'class': 'where'}).find_all('span')[4].get_text()
item[u'地区'] = re.findall(pattern_quyu, li.find('div', {'class': 'other'}).find('a').get_text())[0]
item[u'楼层'] = li.find('div', {'class': 'con'}).get_text().split('/')[1]
item[u'年限'] = li.find('div', {'class': 'con'}).get_text().split('/')[2]
item[u'价格'] = li.find('div', {'class': 'price'}).find('span', {'class': 'num'}).get_text()
item[u'更新时间'] = re.findall(pattern_updatetime, li.find('div', {'class': 'price-pre'}).get_text())[0]
item[u'看房人数'] = li.find('div', {'class': 'square'}).find('span', {'class': 'num'}).get_text()
result.append(item)
return result, last_page
def get_quyu_data(area, x):
url = "https://gz.lianjia.com/zufang/%s" % area
page = 1
last_page = get_url(url, page)[1]
df = pd.DataFrame()
while True:
try:
result = get_url(url, page)[0]
except:
print("failed")
break
df = df.append(pd.DataFrame(result))
page += 1
if page > int(''.join(last_page)):
break
df['区域'] = '%s' % x
return df
def main():
column = ['房屋描述', '区域', '地区', '小区', '房型', '面积', '楼层', '朝向', '价格', '年限', '更新时间', '看房人数', '网站']
engine = create_engine('mysql+mysqldb://root:123456@127.0.0.1/data?charset=utf8')
frame = pd.DataFrame()
for i in range(len(xingzhengqu)):
quyu = get_quyu_data(xingzhengqu[i], xingzhengqu_cn[i])
frame = frame.append(quyu)
frame = frame.reindex(columns=column)
frame.index = range(len(frame))
frame.to_sql('lianjia_zufang', engine, if_exists='replace')
if __name__ == '__main__':
main()
一共搜集了1W2+条数据,接着便是开始数据分析了。
数据分析
这次的数据分析主要是用到tableau这个软件。
房屋数量分布
线看看各区有多少房子在出租
可以看出出租房子最多的是天河区,一共有2489套,白云、番禺和海珠也各有2000套以上,而花都、增城则数量比较少了。
房租
房租自然是我们最关心的点了
1.先看看平均房租
因为链家出租的大多数都是小区房,所以平均房租要比城中村的房租要高出好多。
2.再看看各区的平均房价
不出所料,房价最高的是天河区,其次是海珠区、荔湾区,而价格最低的则是南沙区。
影响房价的因数:
1.朝向:
一般来说朝向是影响房价的一个因数,我们来看看不同朝向,房价会有怎么样的变化。
我们可以看到南 北朝向的房子平均楼价最高。
2.面积:
整体来看,面积越大,房价越高。
3.楼龄:
我们可以看到,平均房价最高的是2016年建的板楼,接着是2010年建的房子。而价格较低的则是1984年、1965年建的房子。