pyhton爬取广州链家租房信息,并用tableau进行数据分析

在外工作,难免需要租房子,而链家是现在比较火的一个租房网站,本文主要是爬取链家在广州的租房信息,并且进行简单的数据分析:
1数据采集
这是通过网页查看到的HTML源码:
网站中某套出租房属性源码
我们通过爬虫爬取HTML标签中的租房信息,然后存储到mysql数据库中:
(注:一般网站框架结构在某段时间过后会发生改变,到时代码可能需要重新修改!!)
编辑和调试脚本环境的IDE为Pycharm:
在这里插入图片描述

# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
import pandas as pd
from sqlalchemy import create_engine
import re
import bs4
import time

headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5',
    'Accept-Encoding': 'gzip, deflate',
    'Connection': 'keep-alive'
}


xingzhengqu = ['tianhe', 'yuexiu', 'liwan', 'haizhu', 'panyu', 'baiyun', 'huangpugz', 'zengcheng', 'huadou', 'nansha']
xingzhengqu_cn = ['天河', '越秀', '荔湾', '海珠', '番禺', '白云', '黄埔', '增城', '花都', '南沙']


# url为区域名,page为页码
def get_url(url, page):
    # 获取网站所有源码
    html = requests.get(url + '/pg%s' % str(page), headers=headers).text
    # requests.get(url, headers={'Connection': 'close'});
    # 获取每一条租房信息
    table = BeautifulSoup(html, 'lxml').find_all('div', {'class': 'content__list--item'})
    # 再定义一个变量,用以查找每个行政区最大的页码数
    table_2 = BeautifulSoup(html, 'lxml')
    # 使用正则找到最大页码数
    pattern = re.compile('totalpage="(\\d+)"\\s')
    last_page = re.findall(pattern, str(table_2))
    # 租房面积正则表达式
    pattern_1 = '</i>.*?(\\d+)㎡.*?<i>'
    # 下面三个信息直接用bs4不方便,故使用正则来查找
    # string = BeautifulSoup(html, 'lxml').find_all(attrs={'class': 'content__list--item--des'})
    # string_1 = BeautifulSoup(html, 'lxml').find_all(attrs={'class': 'content__list--item--time oneline'})
    # 租房面积
    # pattern_mianji = re.findall(pattern_1, str(string), re.S)
    # 租房发布时间点
    pattern_2 = '<p.*?>.*?(.*?)</p>'
    # pattern_updatetime = re.findall('<p.*?>.*?(.*?)</p>', str(string_1))
    # 租房地区
    pattern_quyu2 = re.compile('<a.*?>.*?</a>.*?>(.*?)</a>.*?title.*?</a>')
    pattern_quyu3 = re.compile('<a.*?>.*?</a>.*?>.*?</a>.*?title.*?>(.*?)</a>')
    pattern_fx = re.compile('\\s+(.*?)\\s+<span class="hide">')
    pattern_lc = re.compile('.*?<span class="hide">\\n<i>/</i>\\n\\s+(.*?)\\n\\s+</span>')
    pattern_cx = re.compile('\\s+<i>/</i>(.*?)\\s+<i>/</i>')
    pattern_jg = re.compile('.*?<em>(.*?)</em>.*?')
    result = []

    for li in table:
        try:
            item = dict()
            item[u'房屋描述'] = li.find('img').get('alt')
            item[u'地区'] = re.findall(pattern_quyu2, str(li.find_all(attrs={'class': 'content__list--item--des'})))[0]
            item[u'小区'] = re.findall(pattern_quyu3, str(li.find_all(attrs={'class': 'content__list--item--des'})))[0]
            try:
                item[u'近地铁否'] = li.find('i', {'class': 'content__item__tag--is_subway_house'}).get_text()
            except AttributeError:
                pass
            item[u'房型'] = re.findall(pattern_fx, str(li.find_all(attrs={'class': 'content__list--item--des'})))[0]
            item[u'面积'] = re.findall(pattern_1, str(li.find_all(attrs={'class': 'content__list--item--des'})), re.S)[0]
            item[u'楼层'] = re.findall(pattern_lc, str(li.find_all(attrs={'class': 'content__list--item--des'})))[0]
            item[u'朝向'] = re.findall(pattern_cx, str(li.find_all(attrs={'class': 'content__list--item--des'})))[0]
            item[u'价格'] = re.findall(pattern_jg, str(li.find_all(attrs={'class': 'content__list--item-price'})))[0]
            try:
                item['押金'] = li.find('i', {'class': 'content__item__tag--deposit_1_pay_1'}).get_text()
                item['公寓否'] = li.find('i', {'class': 'content__item__tag--authorization_apartment'}).get_text()
                item['装修程度'] = li.find('i', {'class': 'content__item__tag--decoration'}).get_text()
                item['看房时间'] = li.find('i', {'class': 'content__item__tag--is_key'}).get_text()
                time.sleep(1)
            except AttributeError:
                pass
            item[u'更新时间'] = re.findall(pattern_2, str(li.find_all(attrs={'class': 'content__list--item--time oneline'})))[0]
            item[u'网站'] = li.find('a').get('href')
            result.append(item)
        except IndexError:
            pass
    return result, last_page


def get_quyu_data(area, x):
    url = "https://gz.lianjia.com/zufang/%s" % area
    page = 1
    last_page = get_url(url, page)[1]
    df = pd.DataFrame()
    while True:
        try:
            result = get_url(url, page)[0]
        except:
            print("failed")
            break
        df = df.append(pd.DataFrame(result))
        page += 1
        if page > int(''.join(last_page)):
            break
    df['区域'] = '%s' % x
    return df


def main():
    column = ['房屋描述', '区域', '地区', '小区', '近地铁否', '房型', '面积', '楼层', '朝向', '价格', '押金', '公寓否', '装修程度', '看房时间', '更新时间', '网站']
    engine = create_engine('mysql+mysqlconnector://root:123456@127.0.0.1/mysql?charset=utf8')
    frame = pd.DataFrame()
    for i in range(len(xingzhengqu)):
        quyu = get_quyu_data(xingzhengqu[i], xingzhengqu_cn[i])
        frame = frame.append(quyu)
    frame = frame.reindex(columns=column)
    frame.index = range(len(frame))
    frame.to_sql('lianjia_zufang1', engine, if_exists='replace')
    #设置延时,防止爬取过快被封IP和反爬
    time.sleep(1)


if __name__ == '__main__':
    main()

一共爬取到24334条租房数据:

在这里插入图片描述
在这里插入图片描述
一共搜集24334条记录,其中有些垃圾数据需要修正或者清除,可以通过数据库、或者pandas都可以清洗文本数据,接着进行数据分析

2、数据分析
2.1各区域租房量分布
在这里插入图片描述
柱形图可以看出房屋出租量排名前四分别为增城、天河、黄埔、越秀,都有超过2500套在出租。

2.2、各区域租房平均价格
在这里插入图片描述
从图可以看出租房价格前三依次是天河、越秀、海珠,最高为天河,每平方101.98元

2.3 房屋朝向对价格的影响
在这里插入图片描述
朝向为东南、西南、东的出租房价排名前三

2.4、楼层对出租房价的影响
在这里插入图片描述
从图中可以看出大多数情况下一般高楼层的房价还是较高,楼层超过30层基本租房单价达到71.27元/平方 平均水平,大多数房子分布在5-34楼

2.5、时间对租房价格的影响
在这里插入图片描述
从图中可以看到一般7月份房价开始上涨,8-9月份房价变化不大,10月份的涨幅最大,房价达119.99元/平方,进入11月份后房价开始下跌

2.6、房子面积对租房价格的影响
在这里插入图片描述
整体来看,面积越大,房价越高。

2.7、临近地铁对租房价格的影响
在这里插入图片描述

从图中可以看出租房临近地铁平均租房价格高出将近一倍

2.8 各区域下地区楼盘数分布
在这里插入图片描述
天河区的租房大都集中在棠下、东圃、天河公园

在这里插入图片描述
越秀区的租房大都集中在建设路、淘金、东山口、小北

在这里插入图片描述
番禺区的租房大都集中在市桥、桥南、大石、祈福新村

在这里插入图片描述
白云区租房大都集中在机场路、新市、嘉禾望岗、同德路、景泰、金沙洲

在这里插入图片描述
海珠区租房大都集中在滨江东、赤岗、工业大道中、金碧、万胜围、新港西

在这里插入图片描述
荔湾区租房大都集中在窖口、芳村、广钢新城、龙津

在这里插入图片描述
黄浦区租房主要集中在科学城、文冲、香雪、夏园

在这里插入图片描述
南沙区租房主要集中在金州、南沙区府、进港大道、南沙港

在这里插入图片描述
增城租房主要集中在凤凰城、朱村、新塘北、百江

3、词云
最后来个彩蛋,用房屋描述弄个词云

在这里插入图片描述

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python网页数据的过程可以分为以下几个步骤: 1. 定义起始URL和页数:在编写虫程序时,可以通过设置起始URL和的页数来指定需要的网页范围。例如,在编写spiders.py文件时,可以设置start_urls列表,其中包含需要的网页URL,如['https://www.lagou.com/zhaopin/Python/' + str(x) for x in range(1, 22)]。这样可以通过循环指定页数的网页。 2. 发起HTTP请求并获网页源代码:利用Python的requests库,可以发起HTTP请求,获网页的源代码。在获源代码时,可以使用requests库的get()方法,并设置verify参数为False以忽略https的安全警告。获到的网页源代码可以保存为文件或者使用后续的解析工具进行处理。 3. 解析网页源代码:如果需要获网页中的特定数据,可以使用解析工具如BeautifulSoup来解析网页源代码。通过解析工具,可以提出需要的数据,如岗位名称、薪资水平、招聘单位、工作地点、工作经验、学历要求等。例如,在items.py文件中,可以使用Scrapy框架提供的字段定义,定义需要保存的数据字段。 4. 数据清洗和分析:在获到数据后,可以对数据进行清洗和处理。根据具体需求,可以使用Python中的各种数据处理和分析库对数据进行清洗、筛选、聚合等操作。例如,可以使用pandas库进行数据清洗和处理,使用matplotlib或者seaborn库进行数据可视化。 5. 存储数据:最后,可以将数据存储到适当的存储介质中,如MongoDB数据库。可以使用Python的MongoDB库来连接数据库,并将清洗和处理后的数据存储到指定的集合中。 综上所述,通过编写Python虫程序,可以从指定的招聘网站上数据,并将数据存入MongoDB数据库中,然后进行数据清洗、分析和可视化等操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [pyhton拉勾网数据保存到MongoDB](https://blog.csdn.net/xiangminghan/article/details/107331314)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [Pyhton数据的方法总结](https://blog.csdn.net/new_buff_007/article/details/107347026)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值