链家APP上有很多在售房源信息以及成交房源信息,如果可以把这些信息爬下来,可以得到很多有价值的信息。因此本文将讲一讲如何爬取这些数据,并保存下来供以后分析。

本文将介绍以下几个方面:

程序介绍该程序支持爬取链家在线二手房数据,历史成交数据,在线租房数据和指定城市所有小区数据。

数据存储目前支持三种数据库格式(mysql,postgreSql, Sqlite3)。

由于链家网采取对IP限流设置,所以该程序没有采取多线程爬取,并且限制了爬取速度来防止被封。

提供mysql数据转到ES的解决方案,方便进行数据可视化分析。

使用教程

1. git clone https://github.com/XuefengHuang/lianjia-scrawler.git

2. cd lianjia-scrawler

# If you'd like not to use [virtualenv](https://virtualenv.pypa.io/en/stable/), please skip step 3 and 4.

3. virtualenv lianjia

4. source lianjia/bin/activate

5. pip install -r requirements.txt设置数据库信息以及爬取城市行政区信息(支持三种数据库格式)

DBENGINE = 'mysql' #ENGINE OPTIONS: mysql, sqlite3, postgresql

DBNAME = 'test'

DBUSER = 'root'

DBPASSWORD = ''

DBHOST = '127.0.0.1'

DBPORT = 3306

CITY = 'bj' # only one, shanghai=sh shenzhen=sh......

REGIONLIST = [u'chaoyang', u'xicheng'] # 只支持拼音运行 python scrawl.py! (请注释14行如果已爬取完所想要的小区信息)

可以修改scrawl.py来只爬取在售房源信息或者成交房源信息或者租售房源信息

实现思路开始抓取前先观察下目标页面或网站的结构,其中比较重要的是URL的结构。链家网的二手房列表页面共有100个,URL结构为http://bj.lianjia.com/ershoufang/pg9/,其中bj表示城市,/ershoufang/是频道名称,pg9是页面码。我们要抓取的是北京的二手房频道,所以前面的部分不会变,属于固定部分,后面的页面码需要在1-100间变化,属于可变部分。将URL分为两部分,前面的固定部分赋值给url,后面的可变部分使用for循环。我们以根据小区名字搜索二手房出售情况为例:

BASE_URL = u"http://bj.lianjia.com/"

url = BASE_URL + u"ershoufang/rs" + urllib2.quote(communityname.encode('utf8')) + "/"

total_pages = misc.get_total_pages(url) //获取总页数信息

for page in range(total_pages):

if page > 0:

url_page = BASE_URL + u"ershoufang/pg%drs%s/" % (page+1, urllib2.quote(communityname.encode('utf8')))

//获取总页数信息代码

def get_total_pages(url):

source_code = get_source_code(url)

soup = BeautifulSoup(source_code, 'lxml')

total_pages = 0

try:

page_info = soup.find('div',{'class':'page-box house-lst-page-box'})

except AttributeError as e:

page_info = None

if page_info == None:

return None

page_info_str = page_info.get('page-data').split(',')[0] #'{"totalPage":5,"curPage":1}'

total_pages = int(page_info_str.split(':')[1])

return total_pages页面抓取完成后无法直接阅读和进行数据提取,还需要进行页面解析。我们使用BeautifulSoup对页面进行解析。

soup = BeautifulSoup(source_code, 'lxml')

nameList = soup.findAll("li", {"class":"clear"})完成页面解析后就可以对页面中的关键信息进行提取了。下面我们分别对房源各个信息进行提取。

for name in nameList: # per house loop

i = i + 1

info_dict = {}

try:

housetitle = name.find("div", {"class":"title"})

info_dict.update({u'title':housetitle.get_text().strip()})

info_dict.update({u'link':housetitle.a.get('href')})

houseaddr = name.find("div", {"class":"address"})

info = houseaddr.div.get_text().split('|')

info_dict.update({u'community':info[0].strip()})

info_dict.update({u'housetype':info[1].strip()})

info_dict.update({u'square':info[2].strip()})

info_dict.update({u'direction':info[3].strip()})

housefloor = name.find("div", {"class":"flood"})

floor_all = housefloor.div.get_text().split('-')[0].strip().split(' ')

info_dict.update({u'floor':floor_all[0].strip()})

info_dict.update({u'years':floor_all[-1].strip()})

followInfo = name.find("div", {"class":"followInfo"})

info_dict.update({u'followInfo':followInfo.get_text()})

tax = name.find("div", {"class":"tag"})

info_dict.update({u'taxtype':tax.get_text().strip()})

totalPrice = name.find("div", {"class":"totalPrice"})

info_dict.update({u'totalPrice':int(totalPrice.span.get_text())})

unitPrice = name.find("div", {"class":"unitPrice"})

info_dict.update({u'unitPrice':int(unitPrice.get('data-price'))})

info_dict.update({u'houseID':unitPrice.get('data-hid')})

except:

continue提取完后,为了之后数据分析,要存进之前配置的数据库中。

model.Houseinfo.insert(**info_dict).upsert().execute()

model.Hisprice.insert(houseID=info_dict['houseID'], totalPrice=info_dict['totalPrice']).upsert().execute()

数据存储可支持数据库:mysql,postgreSql, Sqlite3

数据库信息:

Community小区信息(id, title, link, district, bizcurcle, taglist)

Houseinfo在售房源信息(houseID, title, link, community, years, housetype, square, direction, floor, taxtype, totalPrice, unitPrice, followInfo, validdate)

Hisprice历史成交信息(houseID,totalPrice,date)

Sellinfo成交房源信息(houseID, title, link, community, years, housetype, square, direction, floor, status, source,, totalPrice, unitPrice, dealdate, updatedate)

Rentinfo租售房源信息 (houseID, title, link, region, zone, meters, other, subway, decoration, heating, price, pricepre, updatedate)

可视化分析首先需要同步mysql数据到ES里,然后利用kibana进行数据分析。同步的部分可以利用该工具

截图示例:

房源信息

房源信息json格式数据

房源地区分布图

链家网页爬虫_链家房源爬虫(含源码)相关推荐

  1. python 生成exe 图片资源_爱豆图片下载(含源码及打包exe可执行文件)

    import requests from lxml import etree import os # etree解析网页并返回 def parse(url): headers = { 'User-Ag ...

  2. 了解途家-途家简介-让不动产增值,与家一起旅行!_途家网

    了解途家-途家简介-让不动产增值,与家一起旅行!_途家网 了解途家-途家简介-让不动产增值,与家一起旅行!_途家网 途家在线信息技术(北京)有限公司(简称途家网)是一家高品质度假公寓预订平台,提供旅游 ...

  3. HTML5七夕情人节表白网页_(唯美满天星)多功能展示(网状球状)3D相册_HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 抖音3D旋转相册

    HTML5七夕情人节表白网页_(唯美满天星)多功能展示(网状球状)3D相册_HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 抖音3D旋转相册 js烟花 ...

  4. 区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-熊丽兵-专题视频课程...

    区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-103人已学习 课程介绍         区块链开发技术进阶-深入详解以太坊智能合约语言 solidity视频培训教程:本课程是 ...

  5. Qt之语言家的简单使用(一)(Qt翻译UI,Qt Linguist的使用,含源码+注释)

    文章目录 一.翻译程序示例图 二.流程须知(个人理解) 三.关于对话框中QDialogButtonBox翻译的操作 四.源码 CLinguistTest.h CLinguistTest.cpp CLi ...

  6. php构建一个区块链(含源码)

    php构建一个区块链(含源码) 我们要用PHP编程语言构建区块链,区块链本身就是一个非常简单的概念,它是一个非常简单的数据结构,数字货币是很复杂,但区块链不是,它们复杂的原因是共识算法,挖矿机制和运行 ...

  7. python代码弄成网站_原创:用python把链接指向的网页直接生成图片的http服务及网站(含源码及思想)...

    原创:用python把链接指向的网页直接生成图片的http服务及网站(含源码及思想) 总体思想: 希望让调用方通过 http调用传入一个需要生成图片的网页链接生成一个网页的图片并返回图片链接 最终调用 ...

  8. HTML5七夕情人节表白网页_生日快乐粒子烟花(自定义文字)_ HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 抖音3D旋转相册 js烟花代码

    HTML5七夕情人节表白网页❤生日快乐粒子烟花(自定义文字)❤ HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 抖音3D旋转相册 js烟花代码 css ...

  9. HTML5七夕情人节表白网页_圣诞节3d相册(含音乐)_HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 抖音3D旋转相册 js烟花代码

    HTML5七夕情人节表白网页❤圣诞节3d相册(不含音乐开关)❤ HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 抖音3D旋转相册 js烟花代码 css ...

  10. HTML5七夕情人节表白网页_圣诞节3d相册(含音乐开关)_ HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 抖音3D旋转相册 js烟花代码

    HTML5七夕情人节表白网页❤圣诞节3d相册(含音乐开关)❤ HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 抖音3D旋转相册 js烟花代码 css爱 ...

最新文章

  1. 机器学习基础专题:高斯判别分析
  2. 代币转账_手把手教你从源代码开始搭建多节点以太坊私链(五)部署智能合约及代币发行...
  3. 网站如何获得优质链接
  4. 无人值守网络安装Linux系统
  5. [html] 说说你对属性data-的理解
  6. 更换计算机桌面背景的教案,桂科版三年级下册任务一 美化桌面背景免费教学设计...
  7. 转:ObjectInputStream类和ObjectInputStream类的使用
  8. java面试知识记录
  9. 无法创建ssis数据流任务_SSIS中的数据分析任务概述
  10. PHP导出数据库数据字典脚本
  11. Android进阶学习视频
  12. WiFi连接过程简要分析
  13. 单片机(MCU)复位电路
  14. Java基础笔试练习(八)
  15. centos 7.5 安装桌面环境及报错
  16. 在线解答计算机问题,计算机问题及解答.doc
  17. php视频提取音频,怎么提取视频中音频文件?视频文件如何分离提取出音频文件?视频转换成音频的方法...
  18. 计算机应用类专业综合知识模拟卷(七),计算机应用专业综合知识模拟试卷5
  19. 网站设计:600个经典网站... (转)
  20. ai怎么平均排列,AI怎么等距离排列直线? ai等比排列直线的教程

热门文章

  1. android半透明图层颜色叠加,Android 图层混合模式PorterDuff.Mode
  2. python打开xls_python读取XLS文件或CSV文件
  3. 计算机的经历和灵感,从电脑编程灵感中得到的启发
  4. 分享一个微信扫码连wifi项目
  5. Android技巧之相对高度使用
  6. PySpark 之 连接变换 union、intersection、subtract、cartesian
  7. 大家的人工智能——学习路线总览
  8. 小程序学习日记-微信5-蓝牙方式发现共享单车蓝牙设备
  9. java pem 读取_PEM_密钥对生成与读取方法
  10. OpenGL中相关函数的意义及用法