Python教你一招,爬取链家二手房并做数据可视化分析

2023-10-29

前言

数据采集的步骤是固定:

  1. 发送请求, 模拟浏览器对于url地址发送请求
  2. 获取数据, 获取网页数据内容 --> 请求那个链接地址, 返回服务器响应数据
  3. 解析数据, 提取我们需要的数据内容
  4. 保存数据, 保存本地文件

所需模块

win + R 输入cmd 输入安装命令 pip install 模块名 (如果你觉得安装速度比较慢, 你可以切换国内镜像源)

# 数据请求模块 第三方模块 需要安装 pip install requests
import requests
# 数据解析模块 第三方模块 需要安装 pip install parsel
import parsel
# 导入csv模块 内置模块 不需要安装
import csv  # 固定模板
# 导入pandas模块
import pandas as pd

二手房源数据获取

请求数据

# 模拟浏览器
headers = {
    # 用户代理 表示浏览器基本身份信息
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'
}
# 请求链接
url = 'https://cs.lianjia.com/ershoufang'
# 发送请求
response = requests.get(url=url, headers=headers)
# 输出内容 <Response [200]> 响应对象 表示请求成功
print(response)

在这里插入图片描述

解析数据

我们这次选用css选择器: 根据标签属性提取数据内容

  • 获取所有房源所在li标签
selector = parsel.Selector(response.text)  # 选择器对象
# 获取所有房源所在li标签
lis = selector.css('.sellListContent li .info')
  • for循环遍历
for li in lis:
    title = li.css('.title a::text').get()  # 标题
    area_info = li.css('.positionInfo a::text').getall()  # 区域信息
    area_1 = area_info[0]  # 小区
    area_2 = area_info[1]  # 区域
    totalPrice = li.css('.totalPrice span::text').get()  # 总价
    unitPrice = li.css('.unitPrice span::text').get().replace('元/平', '')  # 单价
    houseInfo = li.css('.houseInfo::text').get().split(' | ')  # 房源信息
    HouseType = houseInfo[0]  # 户型
    HouseArea = houseInfo[1].replace('平米', '')  # 面积
    HouseFace = houseInfo[2]  # 朝向
    HouseInfo_1 = houseInfo[3]  # 装修
    fool = houseInfo[4]  # 楼层
    HouseInfo_2 = houseInfo[-1]  # 建筑结构
    href = li.css('.title a::attr(href)').get()  # 详情页
    dit = {
        '标题': title,
        '小区': area_1,
        '区域': area_2,
        '总价': totalPrice,
        '单价': unitPrice,
        '户型': HouseType,
        '面积': HouseArea,
        '朝向': HouseFace,
        '装修': HouseInfo_1,
        '楼层': fool,
        '年份': date,
        '建筑结构': HouseInfo_2,
        '详情页': href,
    }
    print(dit)

在这里插入图片描述
保存数据

f = open('二手房.csv', mode='w', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
    '标题',
    '小区',
    '区域',
    '总价',
    '单价',
    '户型',
    '面积',
    '朝向',
    '装修',
    '楼层',
    '年份',
    '建筑结构',
    '详情页',
])
csv_writer.writeheader()

在这里插入图片描述

接下来就是数据可视化

二手房源户型分布

from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker

c = (
    Pie()
    .add(
        "",
        [
            list(z)
            for z in zip(house_type, house_num)
        ],
        center=["40%", "50%"],
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="二手房源户型分布"),
        legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
    )
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
#     .render("pie_scroll_legend.html")
)
c.load_javascript()

在这里插入图片描述
二手房源朝向分布

face_type = df['朝向'].value_counts().index.to_list()
face_num = df['朝向'].value_counts().to_list()
c = (
    Pie()
    .add(
        "",
        [
            list(z)
            for z in zip(face_type, face_num)
        ],
        center=["40%", "50%"],
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="二手房源朝向分布"),
        legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
    )
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
#     .render("pie_scroll_legend.html")
)
c.render_notebook()

在这里插入图片描述
二手房源装修分布

face_type = df['装修'].value_counts().index.to_list()
face_num = df['装修'].value_counts().to_list()
c = (
    Pie()
    .add(
        "",
        [
            list(z)
            for z in zip(face_type, face_num)
        ],
        center=["40%", "50%"],
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="二手房源装修分布"),
        legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
    )
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
#     .render("pie_scroll_legend.html")
)
c.render_notebook()

在这里插入图片描述
二手房源年份分布

face_type = df['年份'].value_counts().index.to_list()
face_num = df['年份'].value_counts().to_list()
c = (
    Pie()
    .add(
        "",
        [
            list(z)
            for z in zip(face_type, face_num)
        ],
        center=["40%", "50%"],
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="二手房源年份分布"),
        legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
    )
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
#     .render("pie_scroll_legend.html")
)
c.render_notebook()

在这里插入图片描述
二手房源建筑结构分布

face_type = df['建筑结构'].value_counts().index.to_list()
face_num = df['建筑结构'].value_counts().to_list()
c = (
    Pie()
    .add(
        "",
        [
            list(z)
            for z in zip(face_type, face_num)
        ],
        center=["40%", "50%"],
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="二手房源建筑结构分布"),
        legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
    )
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
#     .render("pie_scroll_legend.html")
)
c.render_notebook()

在这里插入图片描述
各大区域房价平均价

avg_salary = df.groupby('区域')['总价'].mean()
CityType = avg_salary.index.tolist()
CityNum = [int(a) for a in avg_salary.values.tolist()]
from pyecharts.charts import Bar
# 创建柱状图实例
c = (
    Bar()
    .add_xaxis(CityType)
    .add_yaxis("", CityNum)
    .set_global_opts(
        title_opts=opts.TitleOpts(title="各大区域房价平均价"),
        visualmap_opts=opts.VisualMapOpts(
            dimension=1,
            pos_right="5%",
            max_=30,
            is_inverse=True,
        ),
        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45))  # 设置X轴标签旋转角度为45度
    )
    .set_series_opts(
        label_opts=opts.LabelOpts(is_show=False),
        markline_opts=opts.MarkLineOpts(
            data=[
                opts.MarkLineItem(type_="min", name="最小值"),
                opts.MarkLineItem(type_="max", name="最大值"),
                opts.MarkLineItem(type_="average", name="平均值"),
            ]
        ),
    )
)

c.render_notebook()

在这里插入图片描述
各大区域房价单价平均价格

import pandas as pd
from pyecharts.charts import Bar
import pyecharts.options as opts

# 清理数据并将'单价'列转换为整数类型
df['单价'] = df['单价'].str.replace(',', '').astype(int)

# 计算平均价
avg_salary = df.groupby('区域')['单价'].mean()

# 获取城市类型和城市平均价格
CityType = avg_salary.index.tolist()
CityNum = [int(a) for a in avg_salary.values.tolist()]

# 创建柱状图实例
c = (
    Bar()
    .add_xaxis(CityType)
    .add_yaxis("", CityNum)
    .set_global_opts(
        title_opts=opts.TitleOpts(title="各大区域房价单价平均价格"),
        visualmap_opts=opts.VisualMapOpts(
            dimension=1,
            pos_right="5%",
            max_=30,
            is_inverse=True,
        ),
        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45))  # 设置X轴标签旋转角度为45度
    )
    .set_series_opts(
        label_opts=opts.LabelOpts(is_show=False),
        markline_opts=opts.MarkLineOpts(
            data=[
                opts.MarkLineItem(type_="min", name="最小值"),
                opts.MarkLineItem(type_="max", name="最大值"),
                opts.MarkLineItem(type_="average", name="平均值"),
            ]
        ),
    )
)

# 在Notebook中显示柱状图
c.render_notebook()

在这里插入图片描述

【全网最全400个python实战项目】2023最新版 暑期禁止摆烂!练完开启Python兼职之旅~

400个实战案例已经为大家准备好 确定不看看?
评论或者私信即可获取~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python教你一招,爬取链家二手房并做数据可视化分析 的相关文章

  • 如何查看Databricks中的所有数据库和表

    我想列出 Azure Databricks 中每个数据库中的所有表 所以我希望输出看起来像这样 Database Table name Database1 Table 1 Database1 Table 2 Database1 Table
  • 在 python 程序中合并第三方库的最佳实践是什么?

    下午好 我正在为我的工作编写一个中小型Python程序 该任务需要我使用 Excel 库xlwt and xlrd 以及一个用于查询 Oracle 数据库的库 称为CX Oracle 我正在通过版本控制系统 即CVS 开发该项目 我想知道围
  • Python 的键盘中断不会中止 Rust 函数 (PyO3)

    我有一个使用 PyO3 用 Rust 编写的 Python 库 它涉及一些昂贵的计算 单个函数调用最多需要 10 分钟 从 Python 调用时如何中止执行 Ctrl C 好像只有执行结束后才会处理 所以本质上没什么用 最小可重现示例 Ca
  • SQLAlchemy 通过关联对象声明式多对多自连接

    我有一个用户表和一个朋友表 它将用户映射到其他用户 因为每个用户可以有很多朋友 这个关系显然是对称的 如果用户A是用户B的朋友 那么用户B也是用户A的朋友 我只存储这个关系一次 除了两个用户 ID 之外 Friends 表还有其他字段 因此
  • 通过最小元素比较对 5 个元素进行排序

    我必须在 python 中使用元素之间的最小比较次数来建模对 5 个元素的列表进行排序的执行计划 除此之外 复杂性是无关紧要的 结果是一个对的列表 表示在另一时间对列表进行排序所需的比较 我知道有一种算法可以通过 7 次比较 总是在元素之间
  • Python - StatsModels、OLS 置信区间

    在 Statsmodels 中 我可以使用以下方法拟合我的模型 import statsmodels api as sm X np array 22000 13400 47600 7400 12000 32000 28000 31000 6
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • SQLALchemy .query:类“Car”的未解析属性引用“query”

    我有一个这里已经提到的问题https youtrack jetbrains com issue PY 44557 https youtrack jetbrains com issue PY 44557 但我还没有找到解决方案 我使用 Pyt
  • 测试 python Counter 是否包含在另一个 Counter 中

    如何测试是否是pythonCounter https docs python org 2 library collections html collections Counter is 包含在另一个中使用以下定义 柜台a包含在计数器中b当且
  • OpenCV 无法从 MacBook Pro iSight 捕获

    几天后 我无法再从 opencv 应用程序内部打开我的 iSight 相机 cap cv2 VideoCapture 0 返回 并且cap isOpened 回报true 然而 cap grab 刚刚返回false 有任何想法吗 示例代码
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • 无法在 Python 3 中导入 cProfile

    我试图将 cProfile 模块导入 Python 3 3 0 但出现以下错误 Traceback most recent call last File
  • 如何在seaborn displot中使用hist_kws

    我想在同一图中用不同的颜色绘制直方图和 kde 线 我想为直方图设置绿色 为 kde 线设置蓝色 我设法弄清楚使用 line kws 来更改 kde 线条颜色 但 hist kws 不适用于显示 我尝试过使用 histplot 但我无法为
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • 如何在 Python 中追加到 JSON 文件?

    我有一个 JSON 文件 其中包含 67790 1 kwh 319 4 现在我创建一个字典a dict我需要将其附加到 JSON 文件中 我尝试了这段代码 with open DATA FILENAME a as f json obj js
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • 类型错误:预期单个张量时的张量列表 - 将 const 与 tf.random_normal 一起使用时

    我有以下 TensorFlow 代码 tf constant tf random normal time step batch size 1 1 我正进入 状态TypeError List of Tensors when single Te
  • Rocket UniData/UniVerse:ODBC 无法分配足够的内存

    每当我尝试使用pyodbc连接到 Rocket UniData UniVerse 数据时我不断遇到错误 pyodbc Error 00000 00000 Rocket U2 U2ODBC 0302810 Unable to allocate
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di
  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class

随机推荐

  • three.js 切割模型动画,并且播放

    因为公司没有人会用blender 所以动画都是用max做的 动画师一般都是会把多个动画做在一个模型上 然后程序中需要使用的话 调用指定的帧数 unity可以把动画切割成animationclip 最近公司使用了需要在three js中添加一
  • Python 高级知识点总结

    Python 高级知识点总结 原文地址 Python 高级知识点总结 一 可迭代对象 迭代器对象和生成器 像list tuple等这些序列是可以使用for in 语句进行遍历输出的 这是为什么呢 这就要需要知道可迭代对象 Iterable
  • 多功能批量剪辑软件一天剪辑1000条原创视频

    下面一个视频用了呆头鹅批量剪辑软件播放量竟然能达到100多万 他是怎么做到的呢 下面我给大家详细的说一下 在短视频平台开展业务 需具备批量制作视频的能力 为了超越同行 需大量更新作品 争取更多曝光 素材准备就绪 导入软件 设置好视频生成数量
  • JS日志输出-console完美封装

    最近在开发一款chrome扩展插件 经常会打印一些调试的日志 然后上生产的时候日志打印的地方总是会有一些漏网之鱼 没有被删掉 控制台还会打印出很多的敏感信息 这是很不合理的 也是不被允许的 鉴于此 对console做了封装 废话不多说 直接
  • 从声通科技的发展来看,AI行业如何回答可持续盈利这一命题?

    AI浪潮下 相关企业头顶新兴技术的光环 脚下是亏损的阴影 尽管业内不同企业身处不同的细分赛道 但是在巨大的成本支出面前 步伐还是有些难迈开 当前 也有一些AI企业希望借助风口在更受投资者关注的舞台施展拳脚 据悉 2023年上半年 赴港IPO
  • JQuery入门

    window jQuery jQuery 选择id用 id div 直接标签名 class 类名 通配符 a div class 多项选择器 div a 空格选择后代 parent gt child 只选择下一层的父子 prev next
  • [计算机网络]简易http server程序

    好久没输出了 知识还是要写下总结才能让思路更加清晰 最近在学习计算机网络相关的知识 来聊聊如何编写一个建议的HTTP服务器 这个http server的实现源代码我放在了我的github上 有兴趣的话可以点击查看哦 HTTP 服务器 HTT
  • QDateEdit设置为空

    背景 使用QT的日期控件 QDateTimeEdit QDateEdit QTimeEdit 时 它们都自带一个默认值 但是在某些情况下 我们不想要这个默认值 通过现有接口没法实现我们的需求 必须通过继承重构的方式实现 参考链接 下面这篇博
  • java 实现DBScan聚类算法

    最近有一个需求 在地图上 将客户按照距离进行聚合 比如 a客户到b客户5km b客户到c客户5km 那么abc就可以聚合成一个集合 首先想到的就是找一个根据坐标来聚合的算法 这里找了一些后来选择了较为简单也符合要求的DBScan聚类算法 它
  • vue处理tabs切换时请求数据不对的应对方法

    vuex 需要处理的请求路径 const whiteUrl api url const cancelAxios state cancelAxiosArr 取消请求token数组 mutations pushAxios state paylo
  • build打包后怎么查看源码 vue_Vue-cli打包后怎么本地查看的操作

    Vue cli打包成dist后默认是必须在http服务器环境下才能正常运行 可以在本地启动一个http server服务查看 操作步骤如下 全局安装http server npm install g http server 进入dist根目
  • 数据结构与算法之二叉树: Leetcode 98. 验证二叉搜索树 (Typescript版)

    验证二叉搜索树 https leetcode cn problems validate binary search tree 描述 给你一个二叉树的根节点 root 判断其是否是一个有效的二叉搜索树 有效 二叉搜索树定义如下 节点的左子树只
  • 自定义数组类

    在学习c 的过程中 我们经常使用到数组 那怎么去定义一个类去实现数组的功能呢 我们先列出一些经常对数组进行的一些操作 1 创建一个指定容量的数组 2 用已有的数组初始化另一个数组 3 用已有的数组给另一个数组赋值 4 给数组添加元素 给数组
  • Intellij Idea golang插件开发

    1 安装Intellij idea 的golang插件 2 建立目录 D SystemFile GoWorkspace 在系统里面配置GOPATH D SystemFile GoWorkspace 然后在GOPATH目录下面建立 src b
  • 2019-6-18 车牌识别尝试-图像抗扭处理和SVM学习(opencv)

    抗扭曲函数deskew 利用opencv中svm算法学习图片和识别图片 抽取特征向量函数hot分析 车牌识别中涉及字符的识别 识别方法可以用opencv自带的机器学习算法svm 支持向量机 来实现 参见https docs opencv o
  • pandas的定义以及pandas的Series的初步使用(一)

    一 什么是pandas pandas是一种Python数据分析的利器 是一个开源的数据分析包 最初是应用于金融数据分析工具而开发出来的 因此pandas为时间序列分析提供了很好的支持 pandas是PyData项目的一部分 官网 http
  • 大数据实训kaggle比赛-房价预测(下)

    接着开始表演 下面介绍模型 Sequential 序贯模型 它是函数式模型的简略版 为最简单的线性 从头到尾的结构顺序 不分叉 是多个网络层的线性堆叠 实现方法 模型需要知道它所期待的输入的尺寸 出于这个原因 序贯模型中的第一层需要接收关于
  • 计算机视觉论文-2021-06-29

    本专栏是计算机视觉方向论文收集积累 时间 2021年6月29日 来源 paper digest 欢迎关注原创公众号 计算机视觉联盟 回复 西瓜书手推笔记 可获取我的机器学习纯手推笔记 直达笔记地址 机器学习手推笔记 GitHub地址 1 T
  • Python机器视觉--OpenCV进阶(核心)--图像直方图与掩膜直方图与直方图均衡化

    1 图像直方图 1 1 图像直方图的基本概念 在统计学中 直方图是一种对数据分布情况的图形表示 是一种二维统计图表 图像直方图是用一表示数字图像中亮度分布的直方图 标绘了图像中每个亮度值的像素数 可以借助观察该直方图了解需要如何调整亮度分布
  • Python教你一招,爬取链家二手房并做数据可视化分析

    前言 数据采集的步骤是固定 发送请求 模拟浏览器对于url地址发送请求 获取数据 获取网页数据内容 gt 请求那个链接地址 返回服务器响应数据 解析数据 提取我们需要的数据内容 保存数据 保存本地文件 所需模块 win R 输入cmd 输入