养只爬虫当宠物(Node.js爬虫爬取58同城租房信息)

 

先上一个源代码吧。javascript

https://github.com/answershuto/Rentalphp

欢迎指导交流。html

 

效果图java

 

搭建Node.js环境及启动服务node

安装node以及npm,用express模块启动服务,加入本身所须要的中间件便可,这个不是本文所要讨论的重点,能够参考网上的一些教程搭建环境。jquery

 

获取导航页URL以及数据git

打开58同城主页,我主要针对杭州的二手房进行了爬取分析,因此进入杭州租房。github

[http://hz.58.com/chuzu/pn1/?key=%E6%9D%AD%E5%B7%9E%E7%A7%9F%E6%88%BF%E5%AD%90&cmcskey=%E7%A7%9F%E6%88%BF%E5%AD%90&final=1&PGTID=0d3090a7-0004-f43c-ee04-95c2ea3d031f&ClickID=6](http://hz.58.com/chuzu/pn1/?key=%E6%9D%AD%E5%B7%9E%E7%A7%9F%E6%88%BF%E5%AD%90&cmcskey=%E7%A7%9F%E6%88%BF%E5%AD%90&final=1&PGTID=0d3090a7-0004-f43c-ee04-95c2ea3d031f&ClickID=6)chrome

能够获得这一串URL,上下页查看后就不难发现,pn后面的数字就是页面的页码,?后面的是一些get请求带带参数。用一个函数便可经过页码获得正确的URL。express

 

function getUrl(page = 1){ return 'http://hz.58.com/chuzu/pn'+page+'/?key=%E6%9D%AD%E5%B7%9E%E7%A7%9F%E6%88%BF%E5%AD%90&cmcskey=%E7%A7%9F%E6%88%BF%E5%AD%90&final=1&PGTID=0d3090a7-0004-f43c-ee04-95c2ea3d031f&ClickID=6'; }

 



根据上面的URL咱们就能够访问到每一页的全部租房信息

 

用cheerio模块解析dom

安装cheerio模块,使用cheerio模块解析dom,而后就能够相似jquery同样访问dom了。

var cheerio = require('cheerio'); let $ = cheerio.load(html);

 

 

获取每一个租房信息的URL

打开开发者模式,osX(option + command + I),windows( F12 ),而后就能够在elements中看到文档结构了。(这里以chrome为例)

能够看到对应的a标签,咱们只须要提取出该url便可,及对应的href,就是它点击跳转的URL。

<a href="http://jump.jinpai.58.com/service?target=INKicKZPP1UEhIHuBQyP3HVk6MOpffA1WNsEqTYuc2Gxa8zCQdEBOnSPwy7LRseGN-7sgB3XvvZTQ9JsSXvXBXOVP5s7-iWzO-jZ_WBRroCl_ZiBHb5v6-MxytthrUmoPF7B-ffISZByBLAX8fznJUcUsuV6KVKc9zyglbYlX_Ws57NkdXRy7vg4euiIN6TsyENc8bJRhqs&amp;local=79&amp;pubid=4204776&amp;version=A&amp;psid=179352405193657452887456131&amp;entinfo=27800613387971_0&amp;apptype=0 " target="_blank" class="t" onclick="clickLog('from=fcpc_zflist_gzcount');">[单间]支持月付 文一路梧桐公寓 耀江文萃苑 中豪晴元</a>

 

该a标签的class为t,用$('a.t')便可获得全部的a标签的对象,获得的是一个数组,遍历取出href属性便可。

for(let i = 0; i < $('a.t').length; i++){ rentalObj.add($('a.t')[i].attribs.href) }

 

获得了这些URL,接下来就能够用这些URL访问具体的租房信息了,每一个URL对应一个租房页面。

根据租房信息的URL访问相应页面,爬取数据

仍是先进入页面打开开发者模式。

此次咱们须要解析房屋所在地信息,用来可视化显示。

 

```javascript
$('td.house-xqxq-content a.ablue')
```


加上父标签能够过滤出更有针对性的dom,此时过滤出的是小区名称、本月均价、所在商圈等信息的dom,咱们如今只须要第一个dom里面的数据,因此访问数组的[0]便可。

 

除此以外为还须要页面里面的一张展现房屋信息的一张图片,找到对应dom能够发现id为smainPic。

$('#smainPic')['0'].attribs.src


这样访问便可获得图片的URL。

 

其余咱们还能够用一样的方法获取不少相关数据,好比$('.house-price').text()获得价格数据,$('span.tel-num.tel-font').text()能够获得房东的联系方式。

 

经过百度地图进行可视化展现

这里使用百度地图api
http://lbsyun.baidu.com/index.php?title=jspopular

var map = new BMap.Map("container"); // 建立地图实例 
map.centerAndZoom("杭州", 12); var localSearch = new BMap.LocalSearch(map); localSearch.setSearchCompleteCallback(function(searchResult){ var poi = searchResult.getPoi(0);/*地理位置信息*/ }) ocalSearch.search(params[url].location);

 

获取经纬度之后再掉用相应的api在地图上显示便可,显示后再作什么效果,可自行发挥想象了。

 

关于反爬虫

在爬取过程当中发现58同城的反爬虫策略,快速访问会让你输入验证码来验证是人在操做而不是代码访问。只要是人能够正常访问并不影响用户正常体验的网站都有办法绕过反爬虫策略。

先采用较慢的方式发送http请求访问,此外每隔一段时间最好停一下,而后再继续访问。除此以外用User-Agent字段假装成浏览器。最保险的方法就是购买代理,让代理用不一样的ip地址去访问网站,便可绕过反爬虫机制。

具体作法能够参照相关反爬虫策略的文章。

相关文章
相关标签/搜索