这么多房子,哪一间是我的小窝?python采集数据并做数据可视化~
前言
嗨喽,大家好呀!这里是小熊猫
环境使用: (https://jq.qq.com/?_wv=1027&k=ONMKhFSZ)
- Python 3.8
- Pycharm
模块使用: (https://jq.qq.com/?_wv=1027&k=ONMKhFSZ)
- requests >>> pip install requests 数据请求模块
- parsel >>> pip install parsel 数据解析模块
- csv 内置模块
如果安装python第三方模块:
- win + R 输入 cmd 点击确定, 输入安装命令 pip install 模块名 (pip install requests) 回车
- 在pycharm中点击Terminal(终端) 输入安装命令
如何配置pycharm里面的python解释器?
- 选择file(文件) >>> setting(设置) >>> Project(项目) >>> python interpreter(python解释器)
- 点击齿轮, 选择add
- 添加python安装路径
pycharm如何安装插件?
- 选择file(文件) >>> setting(设置) >>> Plugins(插件)
- 点击 Marketplace 输入想要安装的插件名字 比如:翻译插件 输入 translation / 汉化插件 输入 Chinese
- 选择相应的插件点击 install(安装) 即可
- 安装成功之后 是会弹出 重启pycharm的选项 点击确定, 重启即可生效
思路分析(https://jq.qq.com/?_wv=1027&k=ONMKhFSZ)
这有自己的一套模板 <通用>
一. 数据来源分析
- 确定自己采集数据是什么, 并且这些数据可以从那里获取到 链家网站数据, 静态网页… <你所看到的数据, 都来于网页源代码>
二. 代码实现步骤过程
- 发送请求, 对于url地址发送请求
- 获取数据, 获取网页源代码数据
- 解析数据, 提取我们想要的数据内容
- 保存数据, 把数据保存到表格里面
代码
一、采集数据 (https://jq.qq.com/?_wv=1027&k=ONMKhFSZ)
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'
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
二、可视化代码 (https://jq.qq.com/?_wv=1027&k=ONMKhFSZ)
在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 效果图
我是小熊猫,咱下篇文章见啦(✿◡‿◡)
这么多房子,哪一间是我的小窝?python采集数据并做数据可视化~的更多相关文章
- java线程间通信:一个小Demo完全搞懂
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...
- vue3.x组件间通信,实用小技巧都在这里
本想简单写写,没想到说清楚已经变成了一篇很长的帖子,欢迎当笔记搜藏起来. props / emits 父子组件通信 props一般负责向子组件传递数据 下面是一个简单的例子,父组件向子组件传递了一个t ...
- 简易版本vue的实现
用了Vue也有两年时间了,一直以来都是只知其然,不知其所以然,为了能更好的使用Vue不被Vue所奴役,学习一下Vue底层的基本原理. Vue官网有一段这样的介绍:当你把一个普通的JavaScript对 ...
- 用WPF实现大数据展示,超炫的效果
开头语 经过一段时间研究,终于实现CS和BS相同效果的大数据展示平台了.首先来看看实现的效果,超炫的效果,客户特别喜欢,个人也非常满意,分享给各位,同大家一起交流学习. 从上图可以看出,分为左中右三栏 ...
- 用WPF实现大数据分析,超炫的效果,还带地图
开头语 经过一段时间研究,终于实现CS和BS相同效果的大数据展示平台了.首先来看看实现的效果,超炫的效果,客户特别喜欢,个人也非常满意,分享给各位,同大家一起交流学习. 大数据展示平台 从上图可以看出 ...
- 带你快速了解 MongoDB 分布式集群
在分布式应用系统中,mongodb 已经成为 NoSQL 经典数据库.要想很好的使用 mongodb,仅仅知道如何使用它是不够的.只有对其架构原理等有了充分认识,才能在实际运用中使其更好地服务于应用, ...
- Ucos系统任务间的通信详解
物联网开发中,ucos系统任务间的通信是指,两个任务之间有数据的交互,具体的一起来看看吧. 1)消息邮箱 我们还是提供两个任务Task1和Task2,假设我们还是解决刚刚的问题,Task1进行按键扫描 ...
- ASP.NET多种不同页面间数据传递的方法
1. Get(即使用QueryString显式传递) 方式:在url后面跟参数. 特点:简单.方便. 缺点:字符串长度最长为255个字符:数据泄漏在url中. 适用数据 ...
- .net使用mvc模式开发web应用 模型与视图间的数据处理
http://www.cnblogs.com/JeffreyZhao/archive/2009/02/27/mvc-use-strong-type-everywhere.html#3427764 本文 ...
随机推荐
- OpenHarmony 3.1 Release版本发布
OpenHarmony 3.1 Release 版本概述 当前版本在OpenHarmony 3.1 Beta的基础上,更新支持以下能力: 标准系统基础能力增强 本地基础音视频播放能力.视频硬编解码.相 ...
- Codeforces Round #716 (Div. 2), problem: (B) AND 0, Sum Big位运算思维
& -- 位运算之一,有0则0 原题链接 Problem - 1514B - Codeforces 题目 Example input 2 2 2 100000 20 output 4 2267 ...
- Caused by: com.sonatype.nexus.staging.client.StagingRuleFailuresException: Staging rules failure! 已解决!
问题分析 由于项目中修改了一些代码,然后没有修改版本号,直接deploy代码到仓库,最终导致错误! 根据 https://central.sonatype.org/faq/can-i-change-a ...
- partOne测试收获总结
测试收获总结 执行类中构造多个方法,将各个功能分解出来,将大的,复杂的问题转化成小的,简单的问题,来进行处理,正所谓复杂问题简单化,简单问题流程化.大道至简编程精益.现总结编程中的一些问题,①在J ...
- TF-IDF笔记(直接调用函数、手写)
首先TF-IDF 全称:term frequency–inverse document frequency,是一种用于信息检索与数据挖掘的常用加权技术. TF是词频(Term Frequency),I ...
- git冲突解决、线上分支合并、luffy项目后台登陆注册页面分析引入
今日内容概要 git冲突解决 线上分支合并 登陆注册页面(引入) 手机号是否存在接口 腾讯云短信申请 内容详细 1.git冲突解决 1.1 多人在同一分支开发,出现冲突 # 先将前端项目也做上传到 g ...
- WPFApplication类
Application类 应用程序类Application,以下代码自动生成且在程序中不可见,定义程序入口点方法以及程序启动程序,整个程序生命周期为执行完Main()方法里的程序.对于自定义的应用程序 ...
- pytorch入门--土堆深度学习快速入门教程
工具函数 dir函数,让我们直到工具箱,以及工具箱中的分隔区有什么东西 help函数,让我们直到每个工具是如何使用的,工具的使用方法 示例:在pycharm的console环境,输入 import t ...
- 基于DEM的坡度坡向分析
坡度坡向分析方法 坡度(slope)是地面特定区域高度变化比率的量度.坡度的表示方法有百分比法.度数法.密位法和分数法四种,其中以百分比法和度数法较为常用.本文计算的为坡度百分比数据.如当角度为45度 ...
- 【算法】堆排序(Heap Sort)(七)
堆排序(Heap Sort) 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法.堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父 ...