前言
嗨喽,大家好呀!这里是魔王呐~
环境使用:
- Python 3.8
- Pycharm
模块使用:
- 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的选项 点击确定, 重启即可生效
思路分析
这有自己的一套模板 <通用>
一. 数据来源分析
- 确定自己采集数据是什么, 并且这些数据可以从那里获取到
链家网站数据, 静态网页.... <你所看到的数据, 都来于网页源代码>
二. 代码实现步骤过程
- 发送请求, 对于url地址发送请求 https://cs.lianjia.com/ershoufang/104108672997.html
- 获取数据, 获取网页源代码数据
- 解析数据, 提取我们想要的数据内容
- 保存数据, 把数据保存到表格里面
代码
一、采集数据
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
二、可视化代码
在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 效果图
来源:https://www.cnblogs.com/Qqun261823976/p/16417832.html
本站部分图文来源于网络,如有侵权请联系删除。