利用python爬取贝壳找房的数据并做数据分析

# --*--coding:utf-8--*--  


import pandas as pd  

import numpy as np  

from bs4 import BeautifulSoup  

from urllib.request import urlopen, Request  

import re  



mc, lj, xq, hx, td, fb, jg, wz = [], [], [], [], [], [], [], []  

city = input('请输入城市全称的小写首拼:')  

header = {  

'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 '  

'Safari/605.1.15',  

}  


ip = [{"https": "103.103.3.6:8080"},{"https": "61.37.223.152:8080"},{"https": "211.24.95.49:47615"}]  



for q in range(1, 10):  

url ='https://%s.ke.com/ershoufang/pg%s/' % (city, q)  

print(url)  

    r = Request(url=url, headers=header, )  

    html = urlopen(r)  

bs = BeautifulSoup(html,'lxml')  

# print(bs)  

div = bs.find_all('div', {'class': 'info clear'})  

for i in div:  

n = i.find('div', class_='title').a.text  

print(n)  

u = i.find('div', class_='title').a.get('href')  

a = i.find('div', class_='address').a.text  

h = i.find('div', class_='houseInfo').text  

d = i.find('div', class_='followInfo').text  

y = i.find('div', class_='tag').text  

p = i.find('div', class_='priceInfo').text  

        mc.append(n)  

        lj.append(u)  

        xq.append(a)  

        hx.append(h)  

        td.append(d)  

        fb.append(y)  

        jg.append(p)  

        u1 = urlopen(u)  

bs1 = BeautifulSoup(u1,'lxml')  

d1 = bs1.find_all('div', class_='areaName')  

for j in d1:  

a2 = j.find('span', class_='info').text  

            wz.append(a2)  


df = pd.DataFrame({'名称': mc, '区': wz, '小区': xq, '户型': hx, '特点': fb, '发布时间': td, '价格': jg, '链接': lj})  

df['区'] = df['区'].apply(lambda x: re.sub('\s+', ' ', x).strip())  

df['户型'] = df['户型'].apply(lambda x: re.sub('\s+', '', x).strip())  

df['特点'] = df['特点'].apply(lambda x: re.sub('\s+', ' ', x).strip())  

df['价格'] = df['价格'].apply(lambda x: re.sub('\s+', ' ', x).strip())  

df['发布时间'] = df['发布时间'].apply(lambda x: re.sub('\s+', '', x).strip())  

df['位置1'] = df['区'].apply(lambda x: x.split(' ')[0])  

df['位置2'] = df['区'].apply(lambda x: x.split(' ')[1])  

df['楼层'] = df['户型'].apply(lambda x: x.split('|')[0])  

df['建设时间'] = df['户型'].apply(lambda x: x.split('|')[1])  

df['户型1'] = df['户型'].apply(lambda x: x.split('|')[2])  

df['面积'] = df['户型'].apply(lambda x: x.split('|')[-2])  

df['朝向'] = df['户型'].apply(lambda x: x.split('|')[-1])  

df['发布日期'] = df['发布时间'].apply(lambda x: x.split('/')[1])  

df['关注度'] = df['发布时间'].apply(lambda x: x.split('/')[0])  

df['总价'] = df['价格'].apply(lambda x: x.split(' ')[0]+'万')  

df['单价'] = df['价格'].apply(lambda x: x.split(' ')[2].replace('单价', ''))  


data = df[['名称', '位置1', '位置2', '小区', '楼层', '建设时间', '户型1', '面积', '朝向', '特点', '发布日期',  

'关注度', '单价', '总价', '链接']]  


data.columns = ['名称', '区', '详细区域', '小区名称', '楼层', '建设时间', '户型', '面积', '朝向', '特点', '发布日期',  

'关注度', '单价', '总价', '链接']  


data.to_excel(r'C:\Users\admin\Desktop\%s_lj_data.xlsx' % city, index=False)  

以上代码为爬虫爬取数据的代码,下半代码为数据分析代码。

import re  

import pandas as pd  

import numpy as np  

import matplotlib.pyplot as plt  

from pyecharts.charts import Bar,Line,Grid,Page  

from pyecharts import options as opts  



df = pd.read_excel(r'C:\Users\admin\Desktop\20210813_bkdata.xlsx', sheet_name='Sheet1')  

df['面积'] = df['面积'].apply(lambda x : float(re.sub('平米','',x)))  

df['总价'] = df['总价'].apply(lambda x : float(re.sub('万','',x)))  

df['户型'] = df['户型'].apply(lambda x : re.sub('东','',x))  

df['户型'] = df['户型'].apply(lambda x : re.sub('南','',x))  

df['户型'] = df['户型'].apply(lambda x : re.sub('西','',x))  

df['户型'] = df['户型'].apply(lambda x : re.sub('北','',x))  

df['户型'] = df['户型'].apply(lambda x : re.sub('0厅','',x))  

df['户型'] = df['户型'].apply(lambda x : re.sub('1厅','',x))  

df['户型'] = df['户型'].apply(lambda x : re.sub('2厅','',x))  

df['户型'] = df['户型'].apply(lambda x : re.sub('3厅','',x))  


# 计算各区的平均单价和累计上市房屋数  

qy_data = pd.pivot_table(data=df, values=['单价'], index=['区'],aggfunc=[np.mean, np.count_nonzero])  

qy_data.columns = ['平均单价','套数']  

qy_data = qy_data.round()  


fig = plt.figure(num=1, figsize=(25,16),dpi=100)  

ax1 = fig.add_subplot(1,2,1)  

ax2 = fig.add_subplot(1,2,2)  

plt.sca(ax1)  

plt.bar(qy_data.index.values,qy_data['平均单价'].values,)  

plt.sca(ax2)  

plt.plot(qy_data.index.values,qy_data['套数'].values)  

plt.show()  


# 根据面积对面积进行分段,并计算不同面积的套数和平均单价  

# 计数函数  



mf =[0,40,60,70,80,90,100,120,150,1000]  

mjf= ['40以下','40-60','61-70','71-80','81-90','91-100','101-120','121-150','150以上',]  

df['面积分段'] = pd.cut(df['面积'],mf,labels=mjf,right=False)  

mc_data = pd.pivot_table(df,values=['单价'],index=['面积分段'],aggfunc=[np.mean, np.count_nonzero])  

mc_data = mc_data.round()  

mc_data.columns = ['均价','套数']  


fig2 = plt.figure(num=1, figsize=(25,16),dpi=100)  

ax1 = fig2.add_subplot(1,2,1)  

ax2 = fig2.add_subplot(1,2,2)  

plt.sca(ax1)  

plt.bar(mc_data.index.values,mc_data['均价'].values,)  

plt.sca(ax2)  

plt.plot(mc_data.index.values,mc_data['套数'].values)  

plt.show()  


# 按照户型计算各户型均价和套数  

hx_data = pd.pivot_table(data=df, values=['单价'], index=['户型'],aggfunc=[np.mean, np.count_nonzero])  

hx_data.columns = ['均价','套数']  

hx_data = hx_data.round()  


fig3 = plt.figure(num=1, figsize=(25,16),dpi=100)  

ax1 = fig3.add_subplot(1,2,1)  

ax2 = fig3.add_subplot(1,2,2)  

plt.sca(ax1)  

plt.bar(hx_data.index.values,hx_data['均价'].values,)  

plt.sca(ax2)  

plt.plot(hx_data.index.values,hx_data['套数'].values)  

plt.show()  


page = Page()  

line1 = (  

    Line()  

    .add_xaxis(qy_data.index.values.tolist())  

.add_yaxis('各区均价',qy_data['平均单价'].values.tolist())  

.set_global_opts(title_opts=opts.TitleOpts(title='各区平均单价',pos_left='20%'),  

legend_opts=opts.LegendOpts(pos_left='40%'))  

)  


bar1 = (  

    Bar()  

    .add_xaxis(qy_data.index.values.tolist())  

.add_yaxis('各区总套数',qy_data['套数'].values.tolist())  

.set_global_opts(title_opts=opts.TitleOpts(title='各区交易总套数',pos_right='15%'),  

legend_opts=opts.LegendOpts(pos_right='5%'))  


)  


grid1 = Grid()  

grid1.add(line1,opts.global_options.GridOpts(pos_right='51%'))  

grid1.add(bar1,opts.global_options.GridOpts(pos_left='57%'))  


line2 = (  

    Line()  

    .add_xaxis(mc_data.index.values.tolist())  

.add_yaxis('各面积段均价',mc_data['均价'].values.tolist(),color='red')  

.set_global_opts(title_opts=opts.TitleOpts(title='各面积段均价', pos_left='20%'),  

legend_opts=opts.LegendOpts(pos_left='40%'))  

)  


bar2 = (  

    Bar()  

        .add_xaxis(mc_data.index.values.tolist())  

.add_yaxis('各面积段套数',mc_data['套数'].values.tolist(),color='green')  

.set_global_opts(title_opts=opts.TitleOpts(title='各面积段交易总套数', pos_right='15%'),  

legend_opts=opts.LegendOpts(pos_right='5%'))  

)  


grid2 = Grid()  

grid2.add(line2,opts.global_options.GridOpts(pos_right='51%'))  

grid2.add(bar2,opts.global_options.GridOpts(pos_left='57%'))  


line3 = (  

    Line()  

    .add_xaxis(hx_data.index.values.tolist())  

.add_yaxis('各户型均价',hx_data['均价'].values.tolist(),color='red')  

.set_global_opts(title_opts=opts.TitleOpts(title='各户型均价', pos_left='20%'),  

legend_opts=opts.LegendOpts(pos_left='40%'))  

)  


bar3 = (  

    Bar()  

        .add_xaxis(hx_data.index.values.tolist())  

.add_yaxis('各户型套数',hx_data['套数'].values.tolist(),color='green')  

.set_global_opts(title_opts=opts.TitleOpts(title='各户型交易总套数', pos_right='15%'),  

legend_opts=opts.LegendOpts(pos_right='5%'))  

)  


grid3 = Grid()  

grid3.add(line3,opts.global_options.GridOpts(pos_right='51%'))  

grid3.add(bar3,opts.global_options.GridOpts(pos_left='57%'))  


page.add(grid1)  

page.add(grid2) 

数据分析效果展示图。

感兴趣的话可以在微信公众号中搜索“数据处理和工作效率:Big_Data-",查看其他文章。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容