在外工作,难免需要租房子,而链家是现在比较火的一个租房网站,本文主要是爬取链家在广州的租房信息,并且进行简单的数据分析:
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 timeheaders = {'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:passitem[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:passitem[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:passreturn result, last_pagedef get_quyu_data(area, x):url = "https://gz.lianjia.com/zufang/%s" % areapage = 1last_page = get_url(url, page)[1]df = pd.DataFrame()while True:try:result = get_url(url, page)[0]except:print("failed")breakdf = df.append(pd.DataFrame(result))page += 1if page > int(''.join(last_page)):breakdf['区域'] = '%s' % xreturn dfdef 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、词云
最后来个彩蛋,用房屋描述弄个词云

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

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

    在外工作,难免需要租房子,而链家是现在比较火的一个租房网站,本文章主要是爬取链家在广州的租房信息,并且进行简单的数据分析. 数据采集 如图所示,我们需要的信息主要是存放在这个标签里面,我们把信息采集下 ...

  2. 爬取南京链家租房信息

    爬取南京链家租房信息 代码如下 代码片. import requests from lxml import etree if name == "main": #设置一个通用URL模 ...

  3. 爬取‘广州链家新房’数据并以csv形式保存。

    --本次的目标是爬取'广州链家新房'前十页的信息,具体需要爬取的信息为'楼房名字.地址.价格以及是否在售的情况',具体的代码如下. import requests,time import pandas ...

  4. 爬取广州链家二手房并写入csv

    知识点:多线程,读取csv,xpath import json import csv import requests import threading import lxml import lxml. ...

  5. python爬虫--爬取链家租房信息

    python 爬虫-链家租房信息 爬虫,其实就是爬取web页面上的信息. 链家租房信息页面如下: https://gz.lianjia.com/zufang/ ## python库 Python库 1 ...

  6. Python爬虫框架Scrapy入门(三)爬虫实战:爬取长沙链家二手房

    Item Pipeline介绍 Item对象是一个简单的容器,用于收集抓取到的数据,其提供了类似于字典(dictionary-like)的API,并具有用于声明可用字段的简单语法. Scrapy的It ...

  7. 用Python爬取2020链家杭州二手房数据

    起源于数据挖掘课程设计的需求,参考着17年这位老兄写的代码:https://blog.csdn.net/sinat_36772813/article/details/73497956?utm_medi ...

  8. Python爬虫入门 | 5 爬取小猪短租租房信息

    小猪短租是一个租房网站,上面有很多优质的民宿出租信息,下面我们以成都地区的租房信息为例,来尝试爬取这些数据. 小猪短租(成都)页面:http://cd.xiaozhu.com/   1.爬取租房标题 ...

  9. Python疫起学习·万丈高楼平地起Day09(精简版|浓缩就是精华)爬虫知识附上案例爬取北京地区短租房信息、爬取酷狗TOP500的数据以及爬取网易云音乐热歌榜单

    爬虫知识 Requests库 部分运行结果如下: 有时爬虫需要加入请求头来伪装成浏览器,以便更好地抓取数据.在Chrome浏览器中按F12键打开Chrome开发者工具,刷新网页后找到User-Agen ...

  10. Python:爬了下链家的小区数据,为数据分析弄素材~

    前言:最近在学数据分析,包括主成分分析.因子分析.聚类...等等,没有数据可不行啊,所以就把链家的小区数据给爬了一下,为后续的分析实战弄素材~ 2019年7月18日修正: 因为高德和百度对于GPS的加 ...

最新文章

  1. 操作系统安全加固原理
  2. 只需一行代码,你的纯文本秒变Markdown
  3. Elasticsearch中如何进行排序(中文+父子文档+嵌套文档)
  4. Protege A DOT error has occurred错误
  5. 防止网络请求(或其他回调)引用,从而造成内存泄漏
  6. nodejs sqlite3_NodeJS 使用 better-sqlite3 操作sqlite 数据库
  7. Spring Boot整合Apollo完整示例
  8. signature=d60f979e909db97dbaa034ebe539f2fd,Experimental signatures of fermiophobic Higgs bosons
  9. 解决@vue/cli 创建项目是安装chromedriver时失败的问题
  10. 这些年微软相关的技术总结, Javascript在客户端的使用
  11. javascript --- 数组实用小技巧
  12. css 字体字体图标_CSS基础知识:了解字体
  13. Spring Boot-使用JDBC连接并检索数据库(Mysql在Docker中)
  14. Unknown symbol platform_driver_unregister (err 0)
  15. HDFS最基本的操作命令 和基本配置
  16. 破解电信光猫RG2010-CA超级管理员账号
  17. 【MySQL】mysql中any,in,some,all的区别
  18. Vue — jTopo
  19. 数字三角形- Java(超简单写法)
  20. 用AI让逝去的亲人照片动起来后,数百万网友泪目:原来思念这么重

热门文章

  1. 用Dezender解密zend加密后的php代码
  2. scintilla 中的代码折叠功能的使用
  3. 完整的连接器设计手册_特斯拉的高压连接器
  4. 软考软件设计师下午真题-面向对象的程序设计与实现-享元设计模式(2021年下半年试题六))Java代码讲解
  5. 一些音视频相关概念学习笔记
  6. 16Aspx.com源码2014年7月详细
  7. netstate 命令归纳
  8. 数据库学习--数据库基本概念
  9. java毕业设计投标文件在线制作系统mybatis+源码+调试部署+系统+数据库+lw
  10. conky - linux desktop 漂亮的桌面系统资源使用监控软件