一个爬虫租房软件。
先上一个源代码吧。
https://github.com/answershuto/Rental
迎接指点交换。
结果图
搭建Node.js环境及启动效劳
装置node以及npm,用express模块启动效劳,到场本身所须要的中间件即可,这个不是本文所要议论的重点,能够参考网上的一些教程搭建环境。
猎取导航页URL以及数据
翻开58同城主页,我重要针对杭州的二手房举行了爬取剖析,所以进入杭州租房。
能够获得这一串URL,上下页查看后就不难发明,pn背面的数字就是页面的页码,?背面的是一些get要求带带参数。用一个函数即可经由过程页码获得准确的URL。
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&local=79&pubid=4204776&version=A&psid=179352405193657452887456131&entinfo=27800613387971_0&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接见响应页面,爬取数据
照样先进入页面翻开开发者形式。
此次我们须要剖析衡宇地点地信息,用来可视化显现。
$('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地点去接见网站,即可绕过反爬虫机制。
详细做法能够参照相干反爬虫战略的文章。
关于
作者:染陌
Email:answershuto@gmail.com or answershuto@126.com
Github: https://github.com/answershuto
Blog:http://answershuto.github.io/
知乎专栏:https://zhuanlan.zhihu.com/ranmo
掘金: https://juejin.im/user/58f87ae844d9040069ca7507
osChina:https://my.oschina.net/u/3161824/blog
转载请说明出处,感谢。
迎接关注我的民众号