beautifulsoup+requests链家(深圳)爬取及可视化分析

链家比起boss和拉勾更好爬

这次使用beautifulsoup+requests爬取链家深圳的租房信息,并进行可视化分析。

一、爬取

代码如下:

import requests
from bs4 import BeautifulSoup
import csv
headers={
    'Accept': 'xxx',
   'User-Agent':'xxx'
}
price_list=[]
detail_list=[]
brand_list=[]
tag_list=[]
title_list=[]
head=['title','detail','price','brand','tag']
for page in range(1,101):

    url='https://sz.lianjia.com/zufang/pg'+str(page)
    res= requests.get(url,headers=headers)
    # res.status_code
    soup=BeautifulSoup(res.text,'html.parser')
    #找到最小父级标签info
    info=soup.find_all('div',class_="content__list--item--main")
    for i in info:
        #价格
        price = i.find('span',class_="content__list--item-price").text
        price_list.append(price)
        #房间大小,朝向,区域的集合
        detail=i.find('p',class_='content__list--item--des').text.strip()
        detail_list.append(detail)
        #品牌
        brand=i.find('span',class_='brand')
        brand_list.append(brand)
        #描述标签
        tag=i.find('p',class_='content__list--item--bottom oneline').text
        tag_list.append(tag)
        #标题,用来提取合租与否
        title=i.find('p',class_='content__list--item--title twoline').text
        title_list.append(title)
#保存下
rows =zip(title_list,detail_list,price_list,brand_list,tag_list)
csv_file=open('lj.csv','w',newline='',encoding='gbk')
writer=csv.writer(csv_file)
writer.writerow(head)
for row in rows:
    writer.writerow(row)
csv_file.close()
print('finished')

爬取完之后是这样的:
在这里插入图片描述

二、处理

import pandas as pd
import warnings
warnings.filterwarnings('ignore')
lj=pd.read_csv('xxx/lj.csv', encoding ='gbk')
#去重
lj=lj.drop_duplicates()
#填充缺失值
lj['brand']=lj['brand'].fillna('N/A')
#detail的处理,分割
lj.detail.str.split('/')

在这里插入图片描述

#先分出第一部分(区域),将其分再拆解
lj['d_part']=lj.detail.str.split('/').str[0].str.strip()
lj['d_part']

在这里插入图片描述

#拆解第一部分为:区 district,位置 area,小区 location
lj['district']=lj.d_part.str.split('-').str[0]
lj['area']=lj.d_part.str.split('-').str[1]
lj['location']=lj.d_part.str.split('-').str[2]
#继续分解detail
lj['square']=lj.detail.str.split('/').str[1].str.strip()
lj['orientation']=lj.detail.str.split('/').str[2].str.strip()
lj['rooms']=lj.detail.str.split('/').str[3].str.strip()
lj.detail.str.split('/').str[4].str.strip()
#去除中间的空格
lj['floor_hight']=lj.detail.str.split('/').str[4].str.strip()
lj['floor_hight']=lj['floor_hight'].str.replace(' ','')
lj['brand']=lj['brand'].str.strip()
#调整顺序,删掉多余列
del lj['detail']
del lj['d_part']
lj['price_']=lj['price']
lj['brand_']=lj['brand']
lj['tag_']=lj['tag']
del lj['price']
del lj['brand']
del lj['tag']
#租房形式:合租还是整租
lj['type']=lj['title'].str.split('·').str[0].str.strip()
#调整顺序,删掉多余列
del lj['title']
lj['tag']=lj['tag_']
del lj['tag_']
#对价格进行统一化,使用价格除以面积,得到每平方米的租房价格
lj['s1']=lj['square'].str.extract(('.*?(\d.*\d)'),expand=False).astype('float32')

#使用正则'.*?(\d.*\d)'只能找到平方面积是2位数以上的,如果是1位数的找不到,所以再次使用正则
lj['s2']=lj['square'].str.extract(('.*?(\d)'),expand=False).astype('float32')
lj['s1']=lj['s1'].fillna(lj['s2'])
lj=lj.drop(lj[lj['price_'].str.contains('-')].index)
lj['p']=lj['price_'].str.extract(('.*?(\d.*\d)'),expand=False).astype('float32')
lj['yuan/m2']=(lj['p']/lj['s1'])

brand这一列说一下
我之前也有贴子说明如何对文本数据进行清洗,感兴趣的朋友可以移步至pandas中文本数据的拆分和提取

lj.brand_.value_counts()

在这里插入图片描述

这样处理

lj['b1']=lj.brand_.str.split('>').str[0]
lj['b2']=lj.brand_.str.split('>').str[1]
lj['b3']=lj.b2.str.split('<').str[0]
lj['b2']=lj['b2'].fillna(lj['b3'])
lj['brand']=lj['b2'].str.split('<').str[0].str.strip()
lj['brand']=lj['brand'].fillna(lj['b1'])
del lj['b1']
del lj['b2']
del lj['b3']
lj['brand'].value_counts()

在这里插入图片描述

搞定!

存一下

lj.to_csv('C:/Users/xxx/lj_afterwash.csv',index=False, encoding='gbk')

在这里插入图片描述

三、数据可视化

工具:power BI

1、不同区的租房数量及价格

链家房源主要集中在福田、南山,龙岗,罗湖四个区域;到宝安区和龙华区房屋数量急剧减少,但也有200-300个左右的房源;其他区发布数量均少于100。
在这里插入图片描述

来看下价格:
在这里插入图片描述
距离深圳中心区域——福田区越远的区,价格越便宜。
值得注意的是,上文提到的房源最多的区域之一——龙岗的价格约为南山福田的一半,似乎是个不错的选择。
不过,龙岗区面积很大,横岗以东到中心区域距离很远,可能存在距离远价格低的房子拉低平均价格的可能性,看下图方差表现:
在这里插入图片描述
可以得出,相较于南山和福田,龙岗区的价格与平均价格离散程度小,确实是个不错的选择。
另外,深圳的朋友也可以用这个图片测算下自己租的房子性价比如何。

2、租房形式

总的来说,整租的房源是多于合租的房源的,除了盐田区55开之外,基本上都是30%-70%的比例。
在这里插入图片描述

那么,合租和整租,选择哪个呢?
对于房源多的南山,福田,罗湖,龙岗,宝安来说,合租比整租便宜;
其他区域整租比合租便宜。
在这里插入图片描述

3、品牌

在这里插入图片描述

链家网仍以自主品牌为主导,除却链家(48.13%)、自如(29.48%)、贝壳(5.94%)之外,其他平台房源占比不到20%。
在这里插入图片描述

4、房子类型(厅室)

单间(1室n厅n卫)的数量最多,其次是4室的户型(数量500+)和2室的小户型(数量300+);
在这里插入图片描述

哪种房型价格最优呢?
从整租的形式来看:
小户型(1-2室)和3室除3室1厅1卫外的房型每平米价格低于110元;
价格最的是4室1厅1卫和4室1厅2卫每平米价格是小户型的2倍左右。
在这里插入图片描述
从合租的形式来看:
2居室小户型价格尤为划算,最低至53元/m2,优于整租;
3-5室的合租每平米价格高于整租,在160-240元/m2的区间;
在这里插入图片描述

四、文本可视化

工具:python 词云
在这里插入图片描述

“随时看房,官方核验,地铁,公寓,精装”字字醒目。这是链家认为用户关注的最核心,即:房子的品牌,质量,管理和交通;
次一级是“阳台,月租,独立卫浴,一付”,这些代表用户次要关注点是房间设施,生活便利,付费方式。
我们也可以反向利用这些标签去评估候选的房子。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
下面是一个简单的示例代码,可以实现从链家网站上爬取二手房信息,并将其存储到本地的 csv 文件,同时使用 pandas 和 matplotlib 库对数据进行可视化并保存为图片。 ```python import requests from bs4 import BeautifulSoup import pandas as pd import matplotlib.pyplot as plt # 爬取链家二手房信息,并将其存储到本地的 csv 文件 url = 'https://bj.lianjia.com/ershoufang/' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} res = requests.get(url, headers=headers) soup = BeautifulSoup(res.text, 'html.parser') house_list = soup.select('.sellListContent li') data = [] for house in house_list: title = house.select('.title a')[0].text.strip() price = house.select('.priceInfo .totalPrice span')[0].text.strip() data.append([title, price]) df = pd.DataFrame(data, columns=['Title', 'Price']) df.to_csv('lianjia.csv', index=False, encoding='utf-8') # 使用 pandas 和 matplotlib 库对数据进行可视化并保存为图片 data = pd.read_csv('lianjia.csv') price = data['Price'].astype(float) plt.hist(price, bins=20, color='skyblue') plt.xlabel('Price') plt.ylabel('Count') plt.title('Distribution of House Prices') plt.savefig('price_distribution.png') ``` 以上示例代码,我们首先使用 requestsBeautifulSoup爬取链家二手房信息,并将其存储到本地的 csv 文件。然后使用 pandas 和 matplotlib 库对数据进行可视化,并将可视化结果保存为图片。如果需要进行更复杂的数据处理和可视化操作,可以参考 pandas 和 matplotlib 官方文档,或者查找相关的教程和示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值