您当前的位置: 首页 >  Python

魔王不会哭

暂无认证

  • 4浏览

    0关注

    149博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

魔王不会哭 发布时间:2022-05-23 16:03:15 ,浏览量:4

前言

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

环境使用:
  • 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地址发送请求
  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)  #  响应对象 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'
            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 效果图

在这里插入图片描述

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 效果图

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 效果图

关注
打赏
1665385393
查看更多评论
立即登录/注册

微信扫码登录

0.0481s