原标题:Python爬虫一步步抓取房产信息

前言

嗯,这一篇文章更多是想分享一下我的网页分析方法。玩爬虫也快有一年了,基本代码熟悉之后,我感觉写一个爬虫最有意思的莫过于研究其网页背后的加载过程了,也就是分析过程,对性能没有特殊要求的情况下,编程一般是小事。

以深圳地区的X房网为例吧。XX房网的主页非常简洁,输入相应的地区就可以找到对应的二手房或者一手房。这一篇文章主要就给大家介绍我在做XX房网爬虫的分析过程。

注意:本文采用 Chrome作为分析加载工作,如果使用其他浏览器,请参考具体的规则。

首先想到的

嗯,你首先要跳出编程,从使用者甚至是产品经理的角度去思考:在浏览这个页面的时候,如何就能看到全市的二手房的情况。通过主页的一个区一个区的输入,搜索,然后将页面的单元下载,嗯这是一个方法。

如上图所示,只要更改keyword后面的参数,就可以获得不同区的二手房数据。编程的时候只需要手动写入一个含有各个区的list,然后通过循环去更改 keyword 后面的参数,从而开始一个区域,再爬取其中的链接。这个方法确实是可行的,深圳一共也没有多少个区。这个方法我试过是可行的。

我实际想说的

上面的这个方法固然可行,但并不是我想推荐的方法,大家看回首页,搜索栏旁边有一个地图找房。点进去你就能看到深圳全区域的房子,要是能在这里弄个爬虫,不就简单多了。

可以看到截图的右侧有所有二手房的链接,我们的任务就是下载右边的所有二手房的数据。首先第一步就先查看页面的源代码(Ctrl+U),可以从右边链表那里复制一些关键字,在源代码里面找找看,在源代码里面 Ctrl+F 搜索观澜湖试试,结果是没有,再尝试几个关键词好像都没有,但通过检查元素(Ctrl+Shift+I),是可以定位到这些关键词的位置。这样可以初步判断右边的链表是通过 Js 来加载,需要证实。

尝试对观澜湖上方的元素在源代码里面定位,例如 no-data-wrap bounce-inup dn,就可以在源代码里面找到。仔细对比一下两边的上下文,可以看到在节点下面的内容有非常大的差异。通过这个 roomList 作为关键词继续查找。

在检查元素里面可以发现 roomList 下面的加载的内容就是我们所需要的房屋列表,并且这部分内容再源代码里面没有。而在源代码页通过搜索 roomList,却发现出现在 里面,证实 roomList 里面的内容是通过 Js 来加载的:

下面就变成是找这个 roomList 了,由于是通过 js 加载的,打开控制台的 network,并重新刷新页面,查看页面里面各个元素的加载过程,在过滤器里面输入 roomList,可以找到一条信息:

点开看 response 里面下载的内容,发现那不就是我们要找的东西吗!里面有给出详细的页面数量(roomPageSize),那一个个的八位数字显然就是每一个房子的id嘛,然后每一页的加载数量是一定的,下面有对应 id 里面有房子的经纬度、户型、面积以及朝向等等信息(在这里做一个提醒,需要做 heatmap 的同学注意了,这里的经纬度用的是百度坐标,如果你后续可视化用的是 google 地图、高德或者 GPS,是需要转换坐标的)。

找到内容之后,接着就是看他的 Headers,看看是如何加载的。

Request Url 表明其访问的链接,Request Method表明他的请求方法是Post;

Request的头定义(Headers)里面包括 Host、Origin、Referer、User-Agent 等;

请求的参数(parameters)里面有三个参数,这三个参数是直接放映在其Url链接上面,里面包括当前页的页码(currentPage)、页面大小(pageSize)以及s(这个s一开始也不同清楚是什么,但是发现每一次请求都有变化,后面才知道这个是时间戳,表示1970纪元后经过的浮点秒数);

此外 Post 函数还可以发送数据到服务器做请求,这里所发送的数据包括始末经纬度、gardenId(这个到后期发现是对应的小区编号)和 zoom(代表地图上面放大以及缩小的倍数,数字越大,放大倍数越高)

基本扒到这里,对整个页面就比较清晰了,也知道我们的爬虫要怎么去写了。

开始写代码了

逻辑整理出来后,整个代码就写的非常轻松了。首先通过 post方式访问http://shenzhen.XXfang.com/map/sale/roomList,通过正则表达式提取 Reponse 里面的 roomPageSize,或者最大页数。然后对每一页的内容进行爬取,并将信息输出。

第一部分,加载库,需要用到 requests, bs4, re, time(time 是用来生成时间戳):

1. from bs4 import BeautifulSoup

2. import requests, re, time

第二部分,通过设定合理的 post 数据以及 headers,通过 post 下载数据。其中 payload 里面包括地图所展示的经纬度信息(这个信息怎么获得,在X房网页面上通过鼠标拖拉,找到合适的位置之后,到控制台 Header 内查看此时的经纬度就好了),headers 则包含了访问的基本信息(加上有一定的反爬作用):

页面下载后,对于第一次下载首先需要用正则表达式获得最大页面数,我们真正需要的内容结合 Beautiful 的 get 和 find 以及 re 来抓取就可以了:

给一个在控制台里面输出的效果:

最后,这篇文章给出了我在写 X 房网爬虫的整个分析的思路。

Garfield_Liang,Python中文社区专栏作者。

原文:http://www.jianshu.com/u/cac1d39abfa9返回搜狐,查看更多

责任编辑:

python爬虫代码房-Python爬虫一步步抓取房产信息相关推荐

  1. python爬虫抓取房产_Python爬虫一步步抓取房产信息!

    嗯,这一篇文章更多是想分享一下我的网页分析方法.玩爬虫也快有一年了,基本代码熟悉之后,我感觉写一个爬虫最有意思的莫过于研究其网页背后的加载过程了,也就是分析过程,对性能没有特殊要求的情况下,编程一般是 ...

  2. python爬虫抓取房产_Python爬虫一步步抓取房产信息

    嗯,这一篇文章更多是想分享一下我的网页分析方法.玩爬虫也快有一年了,基本代码熟悉之后,我感觉写一个爬虫最有意思的莫过于研究其网页背后的加载过程了,也就是分析过程,对性能没有特殊要求的情况下,编程一般是 ...

  3. python爬虫代码房-Python爬虫实战(3):安居客房产经纪人信息采集

    1, 引言 Python开源网络爬虫项目启动之初,我们就把网络爬虫分成两类:即时爬虫和收割式网络爬虫.为了使用各种应用场景,该项目的整个网络爬虫产品线包含了四类产品,如下图所示: 本实战是上图中的&q ...

  4. python爬虫代码房-python爬虫爬取链家二手房信息

    #coding=utf-8 import requests from fake_useragent import UserAgent from bs4 import BeautifulSoup imp ...

  5. python爬虫怎么爬同一个网站的多页数据-如何用Python爬数据?(一)网页抓取

    如何用Python爬数据?(一)网页抓取 你期待已久的Python网络数据爬虫教程来了.本文为你演示如何从网页里找到感兴趣的链接和说明文字,抓取并存储到Excel. 需求 我在公众号后台,经常可以收到 ...

  6. python爬取新浪微博数据中心_Python爬虫框架Scrapy实战之批量抓取招聘信息

    网络爬虫抓取特定网站网页的html数据,但是一个网站有上千上万条数据,我们不可能知道网站网页的url地址,所以,要有个技巧去抓取网站的所有html页面.Scrapy是纯Python实现的爬虫框架,用户 ...

  7. python初学者爬虫教程(二)动态网页抓取

    python爬虫教程(二)动态网页抓取 解析真实地址抓取 通过selenium 模拟浏览器抓取 selenium 安装与测试 selenium爬取一条评论 selenium获取文章的所有评论 sele ...

  8. Python爬虫入门实战之猫眼电影数据抓取(理论篇)

    前言 本文可能篇幅较长,但是绝对干货满满,提供了大量的学习资源和途径.达到让读者独立自主的编写基础网络爬虫的目标,这也是本文的主旨,输出有价值能够真正帮助到读者的知识,即授人以鱼不如授人以渔,让我们直 ...

  9. python编程理论篇_Python爬虫入门实战之猫眼电影数据抓取(理论篇)

    前言 本文可能篇幅较长,但是绝对干货满满,提供了大量的学习资源和途径.达到让读者独立自主的编写基础网络爬虫的目标,这也是本文的主旨,输出有价值能够真正帮助到读者的知识,即授人以鱼不如授人以渔,让我们直 ...

最新文章

  1. swift语言 数组定义_Swift3中数组创建方法
  2. Mysql服务器线上配置主从同步
  3. oracle 中 start tran,The value (30) of MAXTRANS parameter ignored
  4. Fedora安装Mariadb数据库
  5. C语言1013山东理工大学试题,山东理工大学史上最全C语言PPTC程序设计(2基本数据与运算).ppt...
  6. 入门Vue.js要学习哪些知识?
  7. ASP.NET获取IP地址与MAC地址方法
  8. 一文总结More Effective c++
  9. 设计模式07_建造者
  10. java窗口添加标签页_在新标签页中打开新窗口
  11. php ezsql,ezSQL PHP数据库操作类库
  12. 短视频追剧的末日来了?
  13. 引用Interop.SQLDMO.dll后的注意事项。
  14. 最新VmWare14激活序列号
  15. Linux必会100个命令(三十八)halt
  16. 头条搜索官网认证说明
  17. 生态对对碰|云和恩墨数据库云管平台 zCloud 最新支持 TiDB
  18. 【前端面试课程重点总结】
  19. Mysql磁盘空洞的成因以及重建表的几种方式
  20. 响应式织梦模板旅游公司类网站

热门文章

  1. python写if_用python编写if-else的更优雅的方法
  2. spark context stop use with as
  3. Python中的sort() key含义
  4. Elasticsearch: Five Things I was Doing Wrong
  5. cassandra mongodb选择——cassandra:分布式扩展好,写性能强,以及可以预料的查询;mongodb:非事务,支持复杂查询,但是不适合报表...
  6. 洛谷P3168 [CQOI2015]任务查询系统 [主席树,差分]
  7. JavaScript中Object.prototype.toString方法的原理
  8. db2表结构导出导入,数据库备份
  9. 2017秋-软件工程第十二次作业(三)-版本控制报告(个人)
  10. postman设置测试环境