Python爬虫一步步抓取房产信息

简介:

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

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

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

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


南山区首页的情况

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

我实际想说的

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


地图找房位置


深圳全区域的二手房

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


关键词观澜湖的在源代码里面的搜索结果


关键词观澜湖的在页面元素里面的搜索结果

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


no-data-wrap bounce-inup dn 在检查元素内的位置


no-data-wrap bounce-inup dn 在源代码的位置

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


    源代码中roomList出现的位置

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


    roomList的搜索结果

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


    roomList的内容

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

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

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

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

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


Header第一页

Herader第二页

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

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

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


 
 
from bs4 import BeautifulSoup
import requests, re, time

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


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


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


最后的效果

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


原文发布时间为:2017-03-11

本文作者:Garfield_Liang

本文来自云栖社区合作伙伴“Python中文社区”,了解相关信息可以关注“Python中文社区”微信公众号

相关文章
|
2月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
139 6
|
18天前
|
JavaScript API C#
【Azure Developer】Python代码调用Graph API将外部用户添加到组,结果无效,也无错误信息
根据Graph API文档,在单个请求中将多个成员添加到组时,Python代码示例中的`members@odata.bind`被错误写为`members@odata_bind`,导致用户未成功添加。
40 10
|
2月前
|
数据采集 JSON JavaScript
如何通过PHP爬虫模拟表单提交,抓取隐藏数据
本文介绍了如何使用PHP模拟表单提交并结合代理IP技术抓取京东商品的实时名称和价格,特别是在电商大促期间的数据采集需求。通过cURL发送POST请求,设置User-Agent和Cookie,使用代理IP绕过限制,解析返回数据,展示了完整代码示例。
如何通过PHP爬虫模拟表单提交,抓取隐藏数据
|
2月前
|
缓存 监控 Linux
Python 实时获取Linux服务器信息
Python 实时获取Linux服务器信息
|
2月前
|
数据采集 JavaScript 网络安全
为什么PHP爬虫抓取失败?解析cURL常见错误原因
豆瓣电影评分是电影市场的重要参考,通过网络爬虫技术可以高效采集评分数据,帮助电影制作和发行方优化策略。本文介绍使用PHP cURL库和代理IP技术抓取豆瓣电影评分的方法,解决反爬机制、网络设置和数据解析等问题,提供详细代码示例和优化建议。
为什么PHP爬虫抓取失败?解析cURL常见错误原因
|
2月前
|
数据采集 前端开发 JavaScript
除了网页标题,还能用爬虫抓取哪些信息?
爬虫技术可以抓取网页上的各种信息,包括文本、图片、视频、链接、结构化数据、用户信息、价格和库存、导航菜单、CSS和JavaScript、元数据、社交媒体信息、地图和位置信息、广告信息、日历和事件信息、评论和评分、API数据等。通过Python和BeautifulSoup等工具,可以轻松实现数据抓取。但在使用爬虫时,需遵守相关法律法规,尊重网站的版权和隐私政策,合理控制请求频率,确保数据的合法性和有效性。
|
2月前
|
数据采集 Web App开发 JavaScript
爬虫策略规避:Python爬虫的浏览器自动化
爬虫策略规避:Python爬虫的浏览器自动化
|
2月前
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
115 4
|
2月前
|
存储 数据采集 数据库
用 Python 爬取淘宝商品价格信息时需要注意什么?
使用 Python 爬取淘宝商品价格信息时,需注意法律和道德规范,遵守法律法规和平台规定,避免非法用途。技术上,可选择 Selenium 和 Requests 库,处理反爬措施如 IP 限制、验证码识别和请求频率控制。解析页面数据时,确定数据位置并清洗格式。数据存储可选择 CSV、Excel、JSON 或数据库,定期更新并去重。还需进行错误处理和日志记录,确保爬虫稳定运行。
|
2月前
|
数据采集 Web App开发 iOS开发
如何利用 Python 的爬虫技术获取淘宝天猫商品的价格信息?
本文介绍了使用 Python 爬虫技术获取淘宝天猫商品价格信息的两种方法。方法一使用 Selenium 模拟浏览器操作,通过定位页面元素获取价格;方法二使用 Requests 和正则表达式直接请求页面内容并提取价格。每种方法都有详细步骤和代码示例,但需注意反爬措施和法律法规。