房产数据挖掘(一):贝壳二手房源列表

二手房挂牌房源,是我们分析房地产价格分布和走势的重要参考依据。那么,我们应该如何爬取这些房源数据,并用于数据分析和可视化呢?今天我们以贝壳二手房为例,来介绍一下基本的步骤。

一、操作环境

1. 浏览器:Safari浏览器(版本:17.31)

2. Python版本:Python3.12

3. 开发环境:Pycharm 2023.3(Community Edition)

4. 操作系统:MacOS 14.3(Sonoma)

二、网页解析

1. 打开某城市的房源界面(本文以“合肥市”为例)

合肥二手房_合肥二手房出售买卖信息网【合肥贝壳找房】icon-default.png?t=N7T8https://hf.ke.com/ershoufang/rs/

2. 观察网页布局:属于典型的“分页列表式”、“静态网页”。

    这类网页的爬取策略,一般是:获取总页码数➡️爬取第1页的数据➡️循环爬取每页的数据

3. 寻找数据源:

    页面空白处“点击右键”——“检查元素”,进入开发者工具。选择”网络“标签页,然后刷新网页,获取所有网页加载项。对列表中的所有加载项依次进行预览,寻找数据源地址。

    在这里,我们很容易就发现,数据源网址为:https://hf.ke.com/ershoufang/pg100/

    其实这就是该网页的网址。这意味着,房源数据就在网页html代码中。

    这类网页数据的爬取策略,一般是:爬取网页html代码➡️定位并筛选出数据所在模块➡️循环筛选出每一行数据➡️对每行数据进行清洗、分类整理

    

4. 估计可爬取的数据量:

    (1)总数据量:108340条 (“共找到 1083410套合肥二手房” )

    (2)单页数据量:30条

    (3)总页码数:100页

    (4)实际可爬取数据量:3000条

       由此可见,网页端的“贝壳二手房源列表”,最多仅展示3000条数据。虽然这个数量与实际数量差距较大,但如果仅用于学习研究目的,这些样本完全足够。

三、数据爬取

(一)获取各城市二手房源列表的网址、总页码数

1. 进入贝壳二手房“城市选择”的界面

城市房产_二手房|新房|租房|公寓|旅居|海外|装修|房价-真房源平台-贝壳找房贝壳找房网,拥有全面、真实的房源信息,以及VR看房、房屋估价、智能推荐等业界创新技术,以为2亿家庭提供品质居住服务为愿景。业务涉及二手房、新房、租房、旅居、海外、家装、公寓、商铺、写字楼等,为您带来多元专业的服务。海量真房源,省心上贝壳。icon-default.png?t=N7T8https://www.ke.com/city/2. 查看源代码,定位数据源

3. 导入工具包

# coding:utf-8
import pandas as pd
from lxml import etree
import requests
import numpy
import randoms
from bs4 import BeautifulSoup

4. 定义爬虫函数

def patch(url):
    header = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.3.1 Safari/605.1.15'}
    request=requests.get(url=url, headers=header)
    request.encoding='utf8'
    return request

5. 获取各城市二手房列表的网址、总页码数,并导出为表格“xls.xlsx”。

k=0
website='https://www.ke.com/city/'
xls=pd.DataFrame(columns=['city','web','pages'])

soup = BeautifulSoup(patch(website).text, 'lxml')
list = soup.find_all(name='div', attrs={'class': 'city_list'})

for x in range(len(list)):
    ls = list[x].find_all(name='li', attrs={'class': 'CLICKDATA'})
    for y in range(len(ls)):
        city = ls[y].text
        web = ls[y].find('a').get('href').replace('//', 'https://')+'/ershoufang'
        soups = BeautifulSoup(patch(web).text, 'lxml')
        try:
            page = soups.find(name='div', attrs={'class': 'page-box house-lst-page-box'}).get('page-data')
        except AttributeError:
            continue
        pages=eval(page)['totalPage']
        print(city,web,pages)
        xls.loc[k]=[city,web,pages]
        k=k+1
xls.to_excel('xls.xlsx',index=False)

6. 打开表格,查看是否成功爬取数据

(二)获取各城市二手房源数据

1. 导入工具包

# coding:utf-8
import datetime
import pandas as pd
from lxml import etree
import requests
import numpy
import randoms
from bs4 import BeautifulSoup

2. 定义爬虫函数

def patch(url):
    header = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.3.1 Safari/605.1.15'}
    request=requests.get(url=url, headers=header)
    request.encoding='utf8'
    return request

3. 导入各城市房源网址、列表数,爬取数据并分城市保存为Excel文件

k=0
df=pd.read_excel('xls.xlsx',engine='openpyxl')
for x,y,c in zip(df['web'],df['pages'],df['city']):
    xls = pd.DataFrame(columns=['城市', '县区', '区域', '小区', '单价', '面积', '总价', '户型', '楼层', '朝向', '楼型', '年份'])
    print('开始获取:'+c)
    before=datetime.datetime.now()
    for z in range(1,y+1):
        soup=BeautifulSoup(patch(x+'/pg'+str(z)).text,'lxml')
        list=soup.find_all(name='a',attrs={'class':'VIEWDATA CLICKDATA maidian-detail'})
        for a in range(len(list)):
            website=list[a].get('href')
            sop=BeautifulSoup(patch(website).text,'lxml')
            prices=sop.find(name='div', attrs={'class': 'price'}).find(name='span', attrs={'class': 'total'}).text
            unitprices = sop.find(name='div', attrs={'class': 'unitPrice'}).find(name='span', attrs={'class': 'unitPriceValue'}).text
            rooms=sop.find(name='div',attrs={'class':'room'}).find(name='div',attrs={'class':'mainInfo'}).text
            floors=sop.find(name='div',attrs={'class':'room'}).find(name='div',attrs={'class':'subInfo'}).text
            navis=sop.find(name='div',attrs={'class':'type'}).find(name='div',attrs={'class':'mainInfo'}).text
            types=sop.find(name='div',attrs={'class':'type'}).find(name='div',attrs={'class':'subInfo'}).text
            squares=sop.find(name='div',attrs={'class':'area'}).find(name='div',attrs={'class':'mainInfo'}).text
            years=sop.find(name='div',attrs={'class':'area'}).find(name='div',attrs={'class':'subInfo'}).text
            communities=sop.find(name='div',attrs={'class':'communityName'}).find(name='a',attrs={'class':'info'}).text
            county=sop.find(name='div',attrs={'class':'areaName'}).find_all(name='a')
            for b in range(len(county)):
                counties=county[0].text
                areas=county[1].text
            xls.loc[k]=[c,counties,areas,communities,unitprices,squares,prices,rooms,floors,navis,types,years]
            k=k+1
        print(c+':第'+str(z)+'页已完成')
    xls.to_excel(excel_writer=str(c)+'.xlsx',index=False)
    after=datetime.datetime.now()
    print(c+':已完成'+',耗时'+str(after-before))

四、运行结果

1. 运行代码时的效果如下:

(注意:数据爬取时间会比较长,请耐心等待)

2. 爬取的数据效果如图

  • 48
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python贝壳二手房数据爬虫是指使用Python编程语言来实现对贝壳网站上二手房数据的自动化获取和提取的程序。 首先,我们需要了解贝壳网站的二手房数据的结构和呈现方式。贝壳网站上的二手房数据通常以页面的形式展示,并且数据分布在不同的标签或元素中。爬虫程序需要通过网络请求获取网页的HTML源代码,并使用Python的HTML解析库(如BeautifulSoup)对源代码进行解析和提取所需的数据。 针对贝壳二手房数据爬虫,我们可以按照以下步骤进行设计和实现: 1. 导入相关的Python库:需要导入requests库用于发送网络请求,以及BeautifulSoup库用于解析HTML源代码。 2. 构建URL链接:根据贝壳网站的页面结构和所需数据的筛选条件,构建相应的URL链接。 3. 发送网络请求:使用requests库发送网络请求,获取贝壳网站上对应页面的HTML源代码。 4. 解析HTML源代码:使用BeautifulSoup库对获取到的HTML源代码进行解析,提取所需的二手房数据。 5. 数据处理和存储:对提取到的二手房数据进行处理和清洗,可以使用Python的数据处理库(如pandas)进行进一步的数据分析和处理。最后,可以将处理后的数据存储到本地文件或数据库中。 6. 循环遍历:如果需要爬取多页的数据,可以使用循环遍历的方式获取更多的数据。 7. 异常处理:在爬虫程序中添加异常处理机制,例如网络请求失败、页面解析错误等情况的处理。 需要注意的是,在进行任何爬取操作之前,请确保你已经了解并遵守相关网站的爬虫规则和法律法规,同时合理设置爬取速度,避免对网站造成不必要的负担和干扰。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值