第一次的爬取老师说可能不够好,这的那的,那就再来一次呗。
她推荐我们爬取武汉二手房的房价,因为里面的信息比较全。
红色圈出来的都需要爬,这老师,有点坑。
局限比较大,只能存放一页的数据,因为这个网站反扒有点恶心,不想搞了,而且获取一页的数据也够了,多了反而数据不好展示。

代码在最后面,直接展示可视化界面和保存的Excel数据了。

  • 标题:就是黑色的大标题
  • 价格:这个是总的价格,单位万元
  • 地点:这个是主要作为可视化图像界面的x轴的,因为字比较短,标题太长了
  • 布局:几室几厅的
  • 具体位置:字面意思,具体位置
  • 面积:这个直接获取的int类型的数字,因为要界面处理,只能获取数字
  • 楼层:就是楼层
  • 楼层数:就是楼层数
  • 年份:有的就获取,没有的就是null

提前说一下,如果获取的内容都是空的,那就直接去网站上刷新一下,因为有个机制,但时候就知道了。

#Time : 2022-11-26
#Actor: WangDengtao
#Contents: Wuhan second-hand house information crawlimport requests
import bs4
import pandas as pd
import numpy as np
import time
import matplotlib.pyplot as plt
import xlwt
import re
import squarify#解决乱码问题,显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False#获取地点函数
#------------------------------------------------------------
def get_title(html):title_buf = []soup = bs4.BeautifulSoup(html.content, 'html.parser')for dl in soup.find_all('dl',{'class':'clearfix'}):title_f = dl.span.string#去除‘\n’'\t',获取地址title_a = list(title_f)title_b = title_a[13:]#合并列表中的各元素组成地名title = ''.join(title_b)title_buf.append(title)return title_buf#获取价格函数
#------------------------------------------------------------
def get_price(html):price_buf = []soup = bs4.BeautifulSoup(html.content, 'html.parser')for dd in soup.find_all('dd',{'class':'price_right'}):price_f = dd.b.stringprice_f = int(price_f)price_buf.append(price_f)return price_buf#获取地点函数
#------------------------------------------------------------
def get_addr(html):addr_buf = []soup = bs4.BeautifulSoup(html.content, 'html.parser')for p in soup.find_all('p',{'class':'add_shop'}):addr_f = p.a.string#去除‘\n’'\t',获取地址addr_a = list(addr_f)addr_b = addr_a[12:-11]#合并列表中的各元素组成地名addr = ''.join(addr_b)addr_buf.append(addr)return addr_buf#获取具体地址函数
#------------------------------------------------------------
def get_location(html):location_buf = []soup = bs4.BeautifulSoup(html.content, 'html.parser')for p in soup.find_all('p',{'class':'add_shop'}):location_f = p.span.stringlocation_buf.append(location_f)return location_buf#获取X室X厅
#------------------------------------------------------------
def get_all_a(a):all_a_buf = []a1 = list(a)#print(a1[0])a2 = list(a1[0])a3 = a2[11:-23]a4 = ''.join(a3)#print(a4)all_a_buf.append(a4)return all_a_buf#获取房屋面积
#------------------------------------------------------------
def get_all_b(a):all_b_buf = []a1 = list(a)a2 = list(a1[2])a2 = [item for item in a2 if item not in ['\n', '\t']]a3 = a2[0:-1]#print(a2)a4 = ''.join(a3)#print(a3)a4 = float(a4)all_b_buf.append(a4)return all_b_buf#获取房屋楼层
#------------------------------------------------------------
def get_all_c(a):all_c_buf = []a1 = list(a)#print(a1)a2 = list(a1[5])#print(a2)a3 = ''.join(a2)if a3 not in ['中层', '高层','低层','顶层']:a2 = list(a1[4])#print(a2)a4 = a2[25:-63]#print(a4)a3 = ''.join(a4)#print(a3)all_c_buf.append(a3)return all_c_buf#获取房屋楼层数
#------------------------------------------------------------
def get_all_d(a):all_d_buf = []a1 = list(a)#print(a1)a2 = list(a1[6])a3 = [item for item in a2 if item not in ['\n', '\t']]a5 = ''.join(a3)if a5 in['南向','北向','西向','东向','东南向','东北向','西南向','西北向','南北向','东西向']:a2 = list(a1[4])#print(a2)a3 = a2[51:-34]#print(a6)#print(a2)a4 = ''.join(a3)a7 = list(a4)a8 = a7[2:-2]a4 = ''.join(a8)a4 = int(a4)all_d_buf.append(a4)return all_d_buf#获取房屋建造年份
#------------------------------------------------------------
def get_all_e(a):all_e_buf = []a1 = list(a)#print(a1)a2 = list(a1[-1])a3 = [item for item in a2 if item not in ['\n', '\t']]#print(a2)a4 = ''.join(a3)if a4 in ['南向','北向','西向','东向','东南向','东北向','西南向','西北向','南北向','东西向']:a4 = 'null'all_e_buf.append(a4)return all_e_buf#画柱状图(地址+房价(单位万))
#------------------------------------------------------------
def picture2(all_price, all_addr):x_data = all_addr;y_data = all_price;# 画图,plt.bar()可以画柱状图for i in range(len(x_data)):plt.bar(x_data[i], y_data[i])# 设置x轴标签名plt.xlabel("地点")#设置刻度标记的大小,设置刻度的样式plt.xticks(rotation = -90,size = 10)#设置位置,方便看的plt.subplots_adjust(left=0.05, bottom=0.297, right=0.962, top=0.95)# 设置y轴标签名plt.ylabel("价格(万)")# 显示plt.show()#面积分布图(地址+面积)
#------------------------------------------------------------
def picture3(size, all_addr,indoor_planning):plt.rcParams['font.sans-serif'] = 'Microsoft YaHei'plt.rcParams['axes.unicode_minus'] = False自定义颜色 = ['r', 'y', 'b', 'g', 'yellow', 'cyan', 'coral']图 = squarify.plot(sizes = size,label=all_addr,# 指定标签color=自定义颜色,  # 自定义颜色alpha=0.6,value=indoor_planning, # 添加数据标签edgecolor='white',  # 设置边界框颜色为白色linewidth=3,  # 设置边框宽度text_kwargs={'fontsize': 9})  # 设置字体大小图.set_title("房屋面积及房屋规划", fontdict={'fontsize': 20})plt.axis('off')  # 去掉坐标轴plt.tick_params(top='off', right='off')  # 去掉刻度plt.show()#分组柱状图(价格+面积+地点)
#------------------------------------------------------------
def picture4(size, all_price, all_addr):# 设置标题plt.title('价格面积分组柱状图')#数据准备x = all_addry1= all_pricey2= size#设置图形宽度bar_width = 0.3X_A = np.arange(len(x))  # A班条形图的横坐标X_B = X_A + bar_width  # B班条形图的横坐标#绘制图形plt.bar(X_A,y1,bar_width,align='center',color='r')#并列柱状图:x轴加上宽度plt.bar(X_B,y2,width=bar_width,color='y')plt.xticks(X_A + bar_width/2, x)# 让横坐标显示运动#加图例plt.legend(['价格(万)','面积(m3)'])plt.ylabel('价格(万)面积(m3)')  # 纵坐标轴标题fig=plt.gcf()#设置刻度标记的大小,设置刻度的样式plt.xticks(rotation = -90,size = 10)#设置位置,方便看的plt.subplots_adjust(left=0.05, bottom=0.215, right=0.962, top=0.95)#显示plt.show()#楼层分布图(楼层+层数+建造年份)
#------------------------------------------------------------
def picture5(floor, floors,year):plt.rcParams['font.sans-serif'] = 'Microsoft YaHei'plt.rcParams['axes.unicode_minus'] = False自定义颜色 = ['r', 'y', 'b', 'g', 'yellow', 'cyan', 'coral']图 = squarify.plot(sizes = floors,label=floor,# 指定标签color=自定义颜色,  # 自定义颜色alpha=0.6,value=year, # 添加数据标签edgecolor='white',  # 设置边界框颜色为白色linewidth=3,  # 设置边框宽度text_kwargs={'fontsize': 9})  # 设置字体大小图.set_title("楼层及其建造年份", fontdict={'fontsize': 20})plt.axis('off')  # 去掉坐标轴plt.tick_params(top='off', right='off')  # 去掉刻度plt.show()#保存数据到EXCEL函数
#------------------------------------------------------------
def save_excel(all_price, all_addr,all_title,indoor_planning,all_location,size,floor,floors,year):# 创建工作workbookworkbook = xlwt.Workbook()# 创建工作表worksheet,填入表名worksheet = workbook.add_sheet('Wuhan_House_Price_Table')# 在表中写入相应的数据worksheet.write(0, 0, '标题')worksheet.write(0, 1, '价格(万)')worksheet.write(0, 2, '地点')worksheet.write(0, 3, '布局')worksheet.write(0, 4, '具体位置')worksheet.write(0, 5, '面积(m2)')worksheet.write(0, 6, '楼层')worksheet.write(0, 7, '楼层数')worksheet.write(0, 8, '建造年份')for i in range(len(all_price)):worksheet.write(1+i, 0, all_title[i])       worksheet.write(1+i, 1, all_price[i])worksheet.write(1+i, 2, all_addr[i])worksheet.write(1+i, 3, indoor_planning[i])worksheet.write(1+i, 4, all_location[i])worksheet.write(1+i, 5, size[i])worksheet.write(1+i, 6, floor[i])worksheet.write(1+i, 7, floors[i])worksheet.write(1+i, 8, year[i])# 保存表workbook.save('F:\course\python\science\Wuhan_housing_price_Trend.xls')print('数据存入EXCEL成功!')#主函数开始
#------------------------------------------------------------url = ("https://wuhan.esf.fang.com/house/a21-i33/?rfss=1-3c99878a26acceb41e-6c")
#存放全部价格
all_price = []
#存放全部地点
all_addr = []
#存放全部标题
all_title = []
#存放全部地址
all_location = []
#存放小标签的地方
all_a = []
#存放x室X厅
indoor_planning = []
#存放房屋大小
size = []
#存放楼层
floor = []
#楼层数
floors = []
#房屋建造年份
year = []for i in range(1,2):try:html = requests.get(url)html.raise_for_status()html.encoding = 'utf-8'#将获取的网页代码生成TXT文件path = 'E:\\评论第{}页.txt'.format(i)with open(path, 'w', encoding = 'utf-8') as file:file.write(html.text)#获取标题page_title = get_title(html)all_title.extend(page_title)#print(all_title)#获取价格page_price = get_price(html)all_price.extend(page_price)#print(all_price)#获取地点page_addr = get_addr(html)all_addr.extend(page_addr)#print(all_addr)#获取具体地址page_location = get_location(html)all_location.extend(page_location)#print(all_location)#获取X室X厅、X平方米、楼层、楼层数、朝向、X年建soup = bs4.BeautifulSoup(html.content, 'html.parser')for dl in soup.find_all('dl',{'class':'clearfix'}):a = dl.find('p',{'class':'tel_shop'})#调用get_all_a()获取X室X厅存放在indoor_planning中page_indoor_planning = get_all_a(a)indoor_planning.extend(page_indoor_planning)#调用get_all_b()获取房屋面积存放在size中page_size = get_all_b(a)size.extend(page_size)#调用get_all_c()获取房屋面积存放在floor中page_floor = get_all_c(a)floor.extend(page_floor)#调用get_all_d()获取房屋面积存放在floors中page_floors = get_all_d(a)floors.extend(page_floors)#调用get_all_d()获取房屋面积存放在floors中page_year = get_all_e(a)year.extend(page_year)#print(indoor_planning)#print(size)#print(floor)#print(floors)#保存到Excel中save_excel(all_price, all_addr,all_title,indoor_planning,all_location,size,floor,floors,year)#展示可视化图片picture2(all_price, all_addr)picture3(size, all_addr,indoor_planning)picture4(size, all_price, all_addr)picture5(floor, floors,year)print("完成第{}页".format(i))time.sleep(3)except Exception as ex:print("第{}页采集出错,出错原因:{}".format(i, ex))

想想后面用PowerBI又将数据整理了一下,感觉房价的确实难分析,因为地点太多了。

都有注释,具体字符串怎么处理的就不说了,直接用吧。


python爬取武汉二手房房价相关推荐

  1. python二手房价格预测_Python爬取赶集网北京二手房数据R对爬取的二手房房价做线性回归分析...

    前言:本文主要分为两部分:Python爬取赶集网北京二手房数据&R对爬取的二手房房价做线性回归分析.文章思路清晰,代码详细,特别适合刚刚接触Python&R的同学学习参考. Part1 ...

  2. Python 爬取北京二手房数据,分析北漂族买得起房吗?(附完整源码)

    来源:CSDN 本文约3500字,建议阅读9分钟. 本文根据Python爬取了赶集网北京二手房数据,R对爬取的二手房房价做线性回归分析,适合刚刚接触Python&R的同学们学习参考. 房价高是 ...

  3. Python爬取武汉店铺出租转让信息

    Python爬取武汉店铺出租转让信息 摘要:由于有亲戚想到武汉发展,开个店面做点小生意,实地考察的效率不算太高,于是乎就在网上收集相关的转让信息,做第一步筛选,希望能够起到一些作用~ 技术组合:req ...

  4. python爬取链家房价消息_Python的scrapy之爬取链家网房价信息并保存到本地

    因为有在北京租房的打算,于是上网浏览了一下链家网站的房价,想将他们爬取下来,并保存到本地. 先看链家网的源码..房价信息 都保存在 ul 下的li 里面 ​ 爬虫结构: ​ 其中封装了一个数据库处理模 ...

  5. python xpath循环_Python爬虫 爬取北京二手房数据

    点击蓝字"python教程"关注我们哟! 前言 Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以小的给各位看官们准备了高价值Python学习视频教程及 ...

  6. python爬取二手房信息_刚刚接触PythonR?教你爬取分析赶集网北京二手房数据(附详细代码)...

    原标题:刚刚接触Python&R?教你爬取分析赶集网北京二手房数据(附详细代码) 源 /数据森麟文 /徐涛 前言: 本文主要分为两部分:Python爬取赶集网北京二手房数据&R对爬取的 ...

  7. python二手房数据分析_Python 爬取北京二手房数据,分析北漂族买得起房吗? | 附完整源码...

    作者 徐麟 本文经授权转自公众号数据森麟(ID: shujusenlin) 房价高是北漂们一直关心的话题,本文就对北京的二手房数据进行了分析. 本文主要分为两部分:Python爬取赶集网北京二手房数据 ...

  8. python爬取分析深圳二手房房价

    刚入门学习Python爬虫,因为后边将会去深圳发展,所以练习了一个用python爬取深圳房价进行可视分析的项目,希望有所帮助. 好!进入正题! 我选择爬取的是链家网的深圳二手房网页,截图如下: 查看链 ...

  9. python爬房源信息_用python爬取链家网的二手房信息

    题外话:这几天用python做题,算是有头有尾地完成了.这两天会抽空把我的思路和方法,还有代码贴出来,供python的初学者参考.我python的实战经历不多,所以代码也是简单易懂的那种.当然过程中还 ...

最新文章

  1. js设置div透明度
  2. 这所双一流高校“研究生取消寒假”?!学校回应:系个别实验室和导师的要求...
  3. Python学习笔记之类型判断,异常处理,终止程序操作小结
  4. VS2017 调用Tesseract
  5. Vector3 *2 ,ToString()自动四舍五入
  6. ripro子主题eeesucai-child集成后台美化包(适用于设计素材站+资源下载站等)
  7. (转)Linux下的输入/输出重定向
  8. python布尔运算可以比较浮点数吗_Python3 基础之:令人困惑的浮点数运算
  9. 关于strcpy的安全函数的选择
  10. ML 工程师需了解的 10 大算法
  11. 虚拟化与瑞友天翼应用
  12. KODI(XBMC)-基于树莓派的媒体中心使用-Libreelec
  13. JT/T-1078流媒体服务优化升级
  14. 专家思维模型之马太效应
  15. IDEA改变背景颜色(护眼色)
  16. DVWA-XSS (Stored)
  17. excel2016 for mac 二维表转一维表
  18. Ubuntu18.04安装TPLINK WDN5200H USB无线网卡驱动
  19. 自己对PID控制算法的一点见解
  20. 安装Apache服务

热门文章

  1. Python--递归初步
  2. html圣诞快乐英文,圣诞快乐英语,圣诞快乐英语简写?
  3. 加多芬科技讲解目前趋势“不带钱包出门”已成趋势 无现金支付你准备好了吗?
  4. 论文浅尝 | ERNIE-ViL:从场景图中获取结构化知识来学习视觉语言联合表示
  5. 提取节点最大应力应变方法(APDL)
  6. 百钱百鸡php穷举法,PHP经典题:百钱百鸡问题(穷举算法)
  7. HTTP API接口规范
  8. 微信小程序——搭建自己的服务器
  9. modelsim之inout类型tb文件编写及仿真
  10. ExecutorCompletionService