当前位置:   article > 正文

某房地产网站数据分析-数据采集_卖房数据的采集与存储系统实例

卖房数据的采集与存储系统实例

某房地产网站数据分析纲要

  • 某房地产网站数据分析-数据采集
  • 某房地产网站数据分析-可视化
  • 某房地产网站数据分析-数据分析

一、背景

市场背景

2020年年初开端就因为疫情大部分产业都被迫停工休息,虽说对于房价而言,这几乎并不会影响很大,但具体情况需要通过数据来说话,这里最为重要的就是数据的获取上,如何才能在大数据时代,信息时代中走在前面,对于个人来说,房价水涨船高,怎么样去洞察地区的房价行情,减少买房时候的坑;对于房地产来说,如何才能合理分析市场的变化趋势,进一步的对房地产市场的把控,这都需要所用到的数据,并且对数据进行科学的分析,通过数据真实的反应客观的市场,客户的喜好。

个人背景

开始爬取该项目其实是面试的时候的笔试考核,但很不幸算是不通过,因为中途其他时间耽搁,也没有足够时间去做,毕竟是远程,但也是为了自己以后可以在缩短时间去完成这类题目,项目基于Python编程,仅供学习。

二、反爬技术

项目中爬取的网站为房天下,这里需要了解到的一个名称就是重定向,学过对应的编程语法的应该都了解,在这里可以简单理解为页面跳转,在进入分类筛选前,对页面的请求是可以正常请求,但进入分类筛选后,通过get获取到的数据并不能得到我们所需要的信息,通过抓包可以看到。

<div class="redirect" style="padding-top: 40px;">
    <p class="info" style="font-size: 18pt; margin-bottom: 8px;">自动跳转中<span class="second"></span>s...</p>
    <a class="btn-redir" style="font-size: 14pt;" href="https://sz.esf.fang.com/housing/85__1_0_0_0_1_0_0_0/?rfss=1-9e9436b2bcaf98402e-7a">点击跳转</a>
</div>
  • 1
  • 2
  • 3
  • 4

所以这里需要进行解析处理一下,原本的URL,可以通过xpath或者find等获取重定向URL。

def get_url(old_url):
    '''获得正确的url'''
    r = requests.get(url=old_url, headers=headers)
    if r'<title>跳转...</title>' in r.text:
        soup = BeautifulSoup(r.text, 'lxml')
        new_url = soup.find(name='a', class_=
'btn-redir'}).attrs['href']
        return new_url
    return old_url
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

三、项目代码介绍

项目中使用的几乎大部分为BeautifulSoup和request两个库,所以语法中普遍使用为find、select这些bs4的查询进行html查找,甚至有用到正则匹配进行查找,数据为了后续使用pandas,采用了列表嵌套字典的保存方式。简单的讲一下find中的使用结合房天下html,以深圳福田住宅区二手房为例子。
全部小区的信息都包含在class="houseList"中,每一个id="houselist_B09_01"代表一个小区的信息,在其中的a标签中href属性就是该小区的链接,需要字符串拼接添加“https:”来得到完整的链接,
在这里插入图片描述

try:
    r = requests.get(url=true_url, headers=headers)
except:
    time.sleep(3)
    r = requests.get(url=true_url, headers=headers)
soup = BeautifulSoup(r.text, 'lxml')
house_num = len(soup.find_all('div',dataflag='bgcomare'))
for i in range(1, house_num): 
    if i < 10:
        i = "0" + str(i)
    reg_url.append('https:'+soup.find('div', id='houselist_B09_' + str(i)).find('a')['href'])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

house_num其实是获取在当前页数中存在的小区数量,并且进行获取对应的小区URL进行拼接得到需要的完整URL,可以观察到对应的每一个都有个前缀是’houselist_B09_’,根据筛选不同可能会不一样,需要自己查看一下。
同理,进入小区详细页面后可以看到对应的信息大部分都存在“小区详情”中,而且页面也是重定向,还是熟悉的配方熟悉的方法,但这里有个小坑,绝大部分小区详情的URL和原来URL是多了个字符串’/xiangqing/’,但多看几个以及后面页数的时候你会发现,其实有写穿插了其他的字符串进去比如’/2/’或者’/ef/’,方法还是一样的。
在这里插入图片描述

def get_house_deep_url(old_url):
    '''获得小区的详请URL'''
    # old_url ='https://doushihuayuan.fang.com/'
    true_url = get_true_url(old_url)
    r = requests.get(url=true_url, headers=headers,proxies=proxies)
    r.encoding = 'gb2312'
    soup = BeautifulSoup(r.text, 'lxml')
    deep_url = 'https:' + soup.find('li',id='kesfxqxq_A01_03_01').a['href']
    #print(deep_url)
    #print(type(deep_url))
    return deep_url
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

最后关于对应信息的获取,因为做法都一样,所以只说一个其他都依葫芦画瓢即可:
在这里插入图片描述在这里插入图片描述

r = requests.get(url=true_url, headers=headers,proxies=proxies)
time.sleep(3)
r.encoding = 'gb2312'
soup = BeautifulSoup(r.text, 'lxml')
House_info = soup.find('div', class_='inforwrap clearfix').find_all('dd')
for item in House_info:
    if item.find('strong').get_text() == '小区地址:':
        address = item.get('title')
        House_dict['小区地址']=address
        House_list.append(address)
        #print(address)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

最后附上代码模块的说明

#!/urs/bin/env python
# -*- conding: utf-8 -*-
# @Author : Senci
# @Time   : 2020/3/6 14:45
# @File   : house-data.py

代码功能模块说明:
    main--------------主要入口函数
     | ---------------return--------运行完成结束程序
    ip_proxy----------检查代理get_ip返回ip是否正常
         | ---------------return----proxies,代理ip字典{'http': proxy_ip}
                              | ----ip_num,ip更换个数
                              | ----Error004_status,是否为044异常代码,决定是否提前关闭程序
    get_num-----------获取页数
         | ---------------return-----pag_num,页数,int格式
    getUrls-----------获取小区详细URL
         | ---------------return-----reg_url_list,所有小区的URL,list格式
    get_house_info----获取小区的详细信息
         | ---------------return-----House_All,返回一个小区的所有信息,字典格式,详细格式见下方
    get_deep_url------获得小区的详请URL
         | ---------------return-----deep_url, 小区的详请的URL
    dic2pd------------数据转换为pandas
         | ---------------return-----House_DF,所有数据的dataframe数据格式
    pd2csv------------存储csv文件
         | ---------------return-----没有返回参数或变量,生成CSV文件
    run_log-----------日志生成
         | ---------------return-----没有返回参数或变量,生成txt文件
    get_true_url------url重定向解析
         | ---------------return-----获得解析后的新url
    get_map_info------地图地理位置获取
         | ---------------return-----map_info,列表,包含x,y两个维度

====================================================================================
main.file_name      交互部分,保存测CSV文件名称,保存到当前路径
get_num.true_url    为需要爬取网站的原始url,例如:https://sz.esf.fang.com/housing/85__1_0_0_0_1_0_0_0/
getUrls.url         为规则匹配的url格式,可以根据需要修改,这里为福田区,住宅选项
main.pag_num        为爬取页数,可以认为赋值,也可以不修改
====================================================================================
House_All = {
                   'url':'空',
                   '小区名称': '空',
                   '别名':'空',
                   '本月均价':'空',
                   '小区地址':'空',
                   '行政区': '空',
                   '片区': '空',
                   '邮编': '空',
                   '产权描述': '空',
                   '物业类别': '空',
                   '建筑年代': '空',
                   '开发商': '空',
                   '建筑类型': '空',
                   '建筑面积': '空',
                   '占地面积': '空',
                   '房屋总数': '空',
                   '楼栋总数': '空',
                   '绿化率': '空',
                   '容积率': '空',
                   '物业费': '空',
                   '停车位': '空',
                   '交通状况': '空',
                   '周边信息': '空',
                   '地理位置': '空',
                   '更新时间': '空'
}
====================================================================================

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/192435
推荐阅读
相关标签
  

闽ICP备14008679号