源码地址:https://github.com/liguobao/58HouseSearch
在线地址:58公寓高德搜房(全国版):http://codelover.link:8080/
周末闲着无事刷知乎发现一个爬虫教程(高德API+Python解决租房问题
),正中最近想要换地方住的痛点。然后大早上懒觉都没睡就屁颠屁颠开始研究这个教程了。这样教程在实验楼网站里面有手把手步骤,有兴趣自取(实验楼:高德API+Python解决租房问题)。
整体项目主要分成两步:
第一步:python爬取数据,生成数据文件;
第二部:导入数据文件,在地图上显示房源,设定上班地点后自动计算出行路线和路程时间。
研究了一下这个教程之后发现这货做得实在有点粗糙,只能当教程用,完全没有通用实际价值。
而且这里面还有个更大的问题:教程是基于北京的数据来做的,而我在上海…
虽然说改改python数据源,改改导航页面JS完事。不过是在难用…
于是,开始自己动手了。先看原有的python代码。
1 |
|
整个代码基本思路就是,爬取http://bj.58.com/pinpaigongyu/pn/{page}/?minprice=2000_4000页面数据,然后扔到创建的csv文件里面作为下一步的数据源。
通过研究http://bj.58.com/pinpaigongyu/pn/{page}/?minprice=2000_4000这个页面的数据,我们可以很容易发现,在页面中,每条数据都是一个li标签。
如下图:
li结构如下:
1 |
<li logr="" class=""> |
照着python的思路,是把所有的li标签的数据提取出来的。
我自己研究的时候又看了下,其实数据都在一个属性为tongji_label=”listclick”的a标签里面。
一般来说,字符匹配用正则表达式完事,奈何正则水平实在不佳。我还是选择直接上HtmlAgilityPack算了。
关于HtmlAgilityPack的介绍还是看官网算了。HtmlAgilityPack
HtmlAgilityPack是.NET一个比较强大的HTML处理类库了,基本可以让你像JS来操作HTML标签。
安装这货很简单,直接在Nuget PM包管理工具里面输入下面命令就完事了。
1 |
Install-Package HtmlAgilityPack |
有需要使用教程可以看这个:Html Agility Pack基础类介绍及运用
下面直接贴control源码算了。
1 |
/// |
下面解释一下核心代码。
片段一:获取总数。
在观察58同城页面的时候,无意发现其实第一个加载的页面中有一个数据总条数,隐藏在页面里面的。
1 |
<span class="listsum"><em>1813em>条结果span> |
这样一来,总页面就很清晰了。页面=总数/每页20条。然后我们根据已知的数据规则去循环请求页面,也就能拿到所有的搜索数据了。
核心代码,获取总条数。
1 |
var countNodes = htmlDoc.DocumentNode. |
在HTMLDoc里面找到一个span的class包含list的节点,获取它子节点(即em)的内容,强制转换成数字,也就是我们要找的总条数了。总条数除以20就得到了页数,下面就是开始循环请求页面了。
在最上面我们分析过公寓数据分布,数据是li里面套a标签,我们需要的地理位置、房间名称、价格都在a标签里面。
这样一来,我们这要获得到页面所有带有属性为tongji_label=”listclick”的a标签数据,也就得到了我们所有需要的数据。
看一下a标签的数据组成:
1 |
|
我们要的房间信息在一个h2的标签里面,公寓租金价钱在class=”money”的div标签里面。
于是有了一下代码:
1 |
|
后端来说,基本就这些内容了。
还有一些前端高德地图接口调用下次再讲吧,要陪女票玩游戏去了…
^-^