Python有一个大作业,老师说想不到的可以试试爬武汉房价,反正想不到,那就爬一下喽。
我爬了网上武汉的房价信息,有帮助的可以看看下。
有一些小Bug,但是大体还是不打紧的,可以用。
#Time : 2022-11-11
#Actor: WeiLihong
#Contents: The main solution is web crawler and visual display
import requests
import bs4
import pandas as pd
import numpy as np
import time
import matplotlib.pyplot as plt
import xlwt
#解决乱码问题,显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
#获取价格函数
def get_price(html):
price_buf = []
soup = bs4.BeautifulSoup(html.content, 'html.parser')
for div in soup.find_all(attrs={'class':'nhouse_price'}):
price = div.span.string
#将待定的元素改为0
if price == '价格待定':
price = int(0)
price = int(price)
price_buf.append(price)
return price_buf
#获取地点函数
def get_addr(html):
addr_buf = []
soup = bs4.BeautifulSoup(html.content, 'html.parser')
for div in soup.find_all(attrs={'class':'nlc_details'}):
addr_f = div.a.string
#去除‘\n’'\t',获取地址
addr_a = list(addr_f)
addr_b = addr_a[12:-7]
#print (addr_b)
#合并列表中的各元素组成地名
addr = ''.join(addr_b)
addr_buf.append(addr)
return addr_buf
#保存数据到EXCEL函数
def save_excel(all_price, all_addr):
# 创建工作workbook
workbook = xlwt.Workbook()
# 创建工作表worksheet,填入表名
worksheet = workbook.add_sheet('Wuhan_House_Price_Table')
# 在表中写入相应的数据
worksheet.write(0, 0, '地点')
worksheet.write(0, 1, '价格')
for i in range(len(all_price)):
worksheet.write(1+i, 0, all_addr[i])
worksheet.write(1+i, 1, all_price[i])
# 保存表
workbook.save('F:\course\python\science\Wuhan_housing_price_Trend.xls')
print('数据存入EXCEL成功!')
def picture1(all_price, all_addr):
# 创建数据
df = pd.DataFrame({'x_axis': all_addr, 'y_axis': all_price})
#设置标题
plt.title("Wuhan housing price Trend", fontsize=24)
#X轴Y轴添加标签
plt.xlabel("Address(Wuhan)", fontsize=14)
plt.ylabel("Price(元/m3)", fontsize=14)
#设置每个坐标轴的取值范围(min,max)
plt.ylim(0,60000)
#横坐标标签竖着显示
plt.xticks(rotation = -90,size = 5)
#设置刻度标记的大小,设置刻度的样式
plt.tick_params(axis='both', labelsize=10)
#plt.tick_params(labelsize=13) #刻度字体大小13
#设置位置,方便看的
plt.subplots_adjust(left=0.095, bottom=0.3, right=0.96, top=0.93)
# 绘制显示
plt.plot('x_axis', 'y_axis', data=df, linestyle='-', marker='o',color='b')
plt.show()
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()
#主函数开始
url = ("https://wuhan.newhouse.fang.com/house/s/b9")
all_price = []
all_addr = []
for i in range(1,5):
html = requests.get(url + str(i) + '/')
html.raise_for_status()
html.encoding = 'utf-8'
page_price = get_price(html)
all_price.extend(page_price)
page_addr = get_addr(html)
all_addr.extend(page_addr)
#time.sleep(1)
print("第{}页处理完成".format(i))
print("网页采集完成,开始写入文件,生成可视化图表")
#保存数据
save_excel(all_price, all_addr)
#显示图1
picture1(all_price, all_addr)
#显示图2
picture2(all_price, all_addr)
都有备注,看不懂的问就可。