链家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格式数据

房源地区分布图

python爬虫requests源码链家_链家房源爬虫(含源码)相关推荐

  1. PHP单页面加密视频教程附源码,thinkphp3.2最新版本项目实战视频教程(含源码)

    php教程 当前位置:主页 > php教程 > thinkphp3.2最新版本项目实战视频教程(含源码) thinkphp3.2最新版本项目实战视频教程(含源码) 教程大小:2.1GB   ...

  2. python3 爬虫 requests安装_BOSS直聘招聘信息获取之爬虫工具分析

    点击蓝色"不太灵光的程序员"关注我哟 加个"星标",每天上午 09:30,干货推送! 文中使用的组件库仅限于Python语言,由于最近收到一些同学的留言说,按照 ...

  3. qq视频转码失败怎么办_腾讯云点播视频转码需要注意的问题

    上传视频是否可以选择不转码? 老版腾讯云点播在控制台上传是必须选择转码模版的,但使用api上传的时候可以选择不转码,在申请媒资的时候, 指定mode参数为 no_transcoding就不会进行转码, ...

  4. outlook qr码在哪里_爱奇艺极速版邀请码是多少在哪里填写 邀请码怎么输入方法...

    爱奇艺极速版填写邀请码领爱奇艺会员卡,邀好友得人气值可兑爱奇艺VIP天卡/周卡/月卡/季卡/年卡.那么爱奇艺极速版邀请码是多少?爱奇艺极速版邀请码在哪里填怎么输入呢?下面小编给大家介绍一下. 爱奇艺极 ...

  5. 快递取件码生成软件_一种分布式的取件码生成方法技术

    [技术实现步骤摘要] 本专利技术涉及样品柜取件码生成 ,特别涉及一种分布式的取件码生成方法. 技术介绍 在快递柜的领域中,快递员进行快件派送的时候,通常会遇到收件人无法立刻来取件的情况,这样就需要快递 ...

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

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

  7. python scrapy框架基如何实现多线程_【转】爬虫的一般方法、异步、并发与框架scrapy的效率比较...

    问题的由来 我们的需求为爬取红色框框内的名人(有500条记录,图片只展示了一部分)的 名字以及其介绍,关于其介绍,点击该名人的名字即可,如下图: 这就意味着我们需要爬取500个这样的页面,即500个H ...

  8. tensorflow源码编译教程_极简入门TensorFlow C++源码

    前一段时间,一直在忙框架方面的工作,偶尔也会帮业务同学去优化优化使用TensorFlow的代码,也加上之前看了dmlc/relay,nnvm的代码,觉得蛮有意思,也想分别看下TensorFlow的Gr ...

  9. java源码影视源码搭建教程_新版千月影视app源码+搭建教程

    使用notepad++批量替换URL[http://]为你的域名(被替换的域名访问有成品不能发布 需要修改的到前台confing里面查询),替换名称[鲸鹰影视]为你的应用名称: 服务端: 1.将替换好 ...

最新文章

  1. AI一分钟 | ​被大家吐槽的网红机器人索菲亚开微博了;阿里人工智能团队iDST获得道路场景分割三项第一
  2. java 数组group by_java Group by分组算法
  3. 知其所以然~redis的原子性
  4. LeetCode 652. 寻找重复的子树(DFS)
  5. GCP发布Kaniko:在非特权容器和Kubernetes中构建容器镜像的工具
  6. 新手学java还是python知乎_编程初学者应该先学C++、Java还是Python?
  7. 我做的第二个正则转换工具
  8. Redis的应用场景汇总
  9. Java实训项目4:GUI学生信息管理系统 - 项目结构图
  10. paip.性能跟踪profile原理与架构与本质-- python扫带java php
  11. 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(昆明),签到题HIL
  12. matlab两张图片显示,matlab怎么同时显示imshow 两幅图片
  13. 面向对象系统分析与设计
  14. Python中的Bunch模式
  15. android+清除循环动画,android自定义View之(4)-一键清除动画
  16. 使用Lambda表达式对中文拼音排序(按中文字典排序)
  17. 神州信息“六合上甲”一体化数据开发平台全面数智升级!
  18. Invalid Component definition:header
  19. 前端开发:Vue组件中的冒号用法
  20. 怎样才能保证单元测试效果

热门文章

  1. 助力高速智能化管理,交通视联网一体机识破逃费“诡计”
  2. Matlab:Matlab软件界面的简介(上边菜单栏、中间工作区、右栏、底部栏、运行图像结果栏)、使用方法之详细攻略
  3. 联想V480关闭UEFI安装Win7
  4. android摄像头监控打电话卡死,Android应用开发Android8.0平台Camera monkey拷机卡死异常解决方案...
  5. open-falcon 搭建
  6. 《当程序员的那些狗日日子》(五十七)迟来的爱恋
  7. 制作efi启动u盘linux,手动制作BIOS和EFI多启动U盘
  8. python pexpect linux安装_Python 安装pexpect模块
  9. [厂长首作]MIPCMS自适应新闻资讯模板
  10. 趁表弟上厕所,我复习一下用CSS设置文字文本样式