房屋千千万,如何找到便宜实惠的呢,python采集数据并做数据可视化~

前言

嗨喽,大家好呀!这里是魔王呐~

环境使用:

  • Python 3.8
  • Pycharm

模块使用:

  • requests >>> pip install requests 数据请求模块
  • parsel >>> pip install parsel 数据解析模块
  • csv 内置模块

如果安装python第三方模块:

  1. win + R 输入 cmd 点击确定, 输入安装命令 pip install 模块名 (pip install requests) 回车
  2. 在pycharm中点击Terminal(终端) 输入安装命令

如何配置pycharm里面的python解释器?

  1. 选择file(文件) >>> setting(设置) >>> Project(项目) >>> python interpreter(python解释器)
  2. 点击齿轮, 选择add
  3. 添加python安装路径

pycharm如何安装插件?

  1. 选择file(文件) >>> setting(设置) >>> Plugins(插件)
  2. 点击 Marketplace 输入想要安装的插件名字 比如:翻译插件 输入 translation / 汉化插件 输入 Chinese
  3. 选择相应的插件点击 install(安装) 即可
  4. 安装成功之后 是会弹出 重启pycharm的选项 点击确定, 重启即可生效

思路分析

这有自己的一套模板 <通用>

一. 数据来源分析

  1. 确定自己采集数据是什么, 并且这些数据可以从那里获取到

链家网站数据, 静态网页.... <你所看到的数据, 都来于网页源代码>

二. 代码实现步骤过程

  1. 发送请求, 对于url地址发送请求 https://cs.lianjia.com/ershoufang/104108672997.html
  2. 获取数据, 获取网页源代码数据
  3. 解析数据, 提取我们想要的数据内容
  4. 保存数据, 把数据保存到表格里面

代码

一、采集数据

1.1 导入模块

# 导入数据请求模块
import requests
# 导入数据解析模块
import parsel
import re
import csv
f = open('二手房多页.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
    '标题',
    '卖点',
    '总价',
    '单价',
    '户型',
    '楼层',
    '共有楼层数',
    '装修',
    '朝向',
    '建造时间',
    '面积',
    '小区',
    '区域',
    '所属区',
    '梯户比例',
    '是否有电梯',
    '房屋属性',
    '详情页',
])
csv_writer.writeheader()

1.2 发送请求

  • 确定请求网址是什么
  • 请求方式
  • 伪装模拟浏览器

headers >>> 请求头加什么数据, 怎么找呢?

User-Agent: 用户代理 表示浏览器基本身份标识... <相当于你进超市, 要看健康码或者戴口罩>

如果你不加headers对于某些网站, 你可能被识别出来是你爬虫程序, 被反爬 >>> 得不到数据headers 字典数据类型

for page in range(1, 11):
    url = f'https://cs.lianjia.com/ershoufang/pg{page}/'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36'
    }
    response = requests.get(url=url, headers=headers)
    # print(response.text)
    selector = parsel.Selector(response.text)
    # 真正的掌握css选择器解析方法 在系统课程都是需要学习2.5个小时左右
    href = selector.css('.sellListContent li.clear .title a::attr(href)').getall()
    for link in href:
        # url = 'https://cs.lianjia.com/ershoufang/104108664407.html'
        # 发送请求
        response = requests.get(url=link, headers=headers)
        # print(response)  # <Response [200]> 响应对象 200 状态码表示请求成功
        # 获取数据
        # print(response.text)

1.3 解析数据

css选择器 >>> 根据标签属性内容提取数据

        selector_1 = parsel.Selector(response.text)  # 需要把获取html字符串数据转成selector对象
        # print(selector)
        # 复制下来仅仅只是定位到标签, 我获取标签里面title属性
        try:
            # body > div.sellDetailHeader > div > div > div.title > h1
            title = selector_1.css('.main::text').get()  # 标题
            selling_point = selector_1.css('.sub::text').get()  # 卖点
            price = selector_1.css('.price .total::text').get()  # 总价
            unitPrice = selector_1.css('.unitPrice .unitPriceValue::text').get()  # 单价
            house_type = selector_1.css('.room .mainInfo::text').get()  # 户型
            subInfo = selector_1.css('.room .subInfo::text').get().split('/')  # 楼层
            floor = subInfo[0]  # 楼层
            num = re.findall('\d+', subInfo[1])[0]  # 共有楼层数
            furnish = selector_1.css('.type .subInfo::text').get().split('/')[-1]  # 装修
            face = selector_1.css('.type .mainInfo::text').get()  # 朝向
            date = re.findall('\d+', selector_1.css('.area .subInfo::text').get())  # 建造时间
            if len(date) == 0:
                date = '0'
            更多源码、解答、教程资料加群:832157862免费领取哦~
            else:
                date = date[0]
            area = selector_1.css('.area .mainInfo::text').get().replace('平米', '')  # 面积
            community = selector_1.css('.communityName .info::text').get()  # 小区
            areaName_info = selector_1.css('.areaName .info a::text').getall()  # 区域
            areaName = areaName_info[0]  # 所属区
            region = areaName_info[1]  # 区域
            scale = selector_1.css('div.content ul li:nth-child(10)::text').get()  # 梯户比例
            elevator = selector_1.css('div.content ul li:nth-child(11)::text').get()  # 是否有电梯
            houseProperty = selector_1.css('div.content  li:nth-child(2) span:nth-child(2)::text').get()  # 房屋属性
            dit = {
                '标题': title,
                '卖点': selling_point,
                '总价': price,
                '单价': unitPrice,
                '户型': house_type,
                '楼层': floor,
                '共有楼层数': num,
                '装修': furnish,
                '朝向': face,
                '建造时间': date,
                '面积': area,
                '小区': community,
                '区域': region,
                '所属区': areaName,
                '梯户比例': scale,
                '是否有电梯': elevator,
                '房屋属性': houseProperty,
                '详情页': link,
            }
            csv_writer.writerow(dit)
            print(
                title, selling_point, price, unitPrice, house_type, subInfo, furnish, face,
                date, area, community, region, scale, elevator, houseProperty, link
            )
        except:
            pass

二、可视化代码

在pycharm里面打开的,效果图大家随便看看就可以啦啊,没有在ipynb里面打开的好看~

2.1 折线图

# 绘制各区二手房总价折线图,是否有电梯作为评定标准
plt.figure(figsize=(12,6))
# Add title
plt.title("各区二手房总价排名")
sns.lineplot(x="所属区", y="总价", data=data,hue=data['是否有电梯'])
# 一般有电梯的房子价格会高于无电梯的房子,但是下图中青羊区、金牛区是例外。
# 此图也可解释后面的热力图中显示“共有楼层数”与“单价”有一定的关系,因为有电梯就表示共有楼层数较高。

2.1.1 效果图

2.2 各区的户型数量对比

# 各区的户型数量对比
plt.figure(figsize=(16,6))
huxing_num = data.groupby([data['所属区'],data['户型']])['小区'].count().reset_index().rename(columns={'所属区':'所属区','户型':'户型','小区':'数量'})
# print(huxing_num)
sns.barplot(x="户型", y="数量", data=huxing_num,order=sort,hue=huxing_num['所属区'])
# 下图中天府新区和高新区的“3室2厅”房源数量明显多于其他区,可以参考各区不同房型数量,针对性地筛选房源。

2.2.1 效果图

image.png

2.3 房屋属性与单价之间的条形图

# 绘制房屋属性与单价之间的条形图
plt.figure(figsize=(12,6))
shuxing  = data.groupby(data['房屋属性'])['单价'].mean().reset_index()
sns.barplot(x='房屋属性',y='单价',data=shuxing)

2.4 绘制热力图

# 绘制热力图,观测其他数值型变量与单价之间的关系
import numpy as np
cols = data.corr().nlargest(10,'单价')['单价'].index#局部运行,一步一步索引
cm = np.corrcoef(data[cols].values.T)
plt.subplots(figsize=(12,6))
sns.heatmap(cm, vmax=0.9,annot=True,square=True,annot_kws={'size':10},xticklabels=cols.values,yticklabels=cols.values)
# 热力图展示出单价与总价、共有楼层数、建造时间、面积有关系,在以上的分析中也证实了这些关系

2.4.1 效果图

image.png

2.5 制作词云图

# 绘制“房屋卖点”词云图
import jieba
from PIL import Image
import wordcloud

text = ("".join(i for i in data['卖点'])) #将列数据组合到一起形成一个字符串
# print(text)
cut = jieba.cut(text)
img = Image.open('1.png')     #打开遮罩照片
img_array = np.array(img)   #将图片转换为数组
#对词云进行设置
wc = wordcloud.WordCloud(         
    background_color = 'white',
    height = 800,
    width = 400,#设置不同的像素,词云图各词的位置也在发生变化
    mask = img_array,
    font_path = 'msyh.ttc'       #字体所在位置:C:\Windows\Fonts
)
wc.generate_from_text(text)

plt.figure(figsize=(20,6))  #参数的设置会改变图片词语的排列
plt.imshow(wc)    #将词云放在遮罩图片上
plt.axis('off') #是否显示坐标轴

plt.show()   #显示生成的词云图片
# 词云图展示出能吸引购房者的房屋特点包括“户型方正”、“采光好”、“中间楼层”、“精装修”、“视野开阔”等

2.5.1 效果图

image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容