在线编程在线课堂在线测评Anycodes在线编程

编程论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

How to use bs4??
本帖最后由 carry0987 于
Double Queue 问题描述 : The new founded Balkan Investment Group Bank (
John 问题描述 : Little John is playing very funny game
linux-command Linux命令大全搜索工具,内容包含Linux命令
Coati 是一款跨平台的代码查看工具,适用于 C/C++ 和 Java。商业软件。特性:1. 索引
系统可承载海量并发,消息收发确认机制 保障消息必达 系统采用动态智
全平台视频监控,支持安卓苹果以及pcweb,支持海康大华等主流dvr,全部源码以及文档 单聊、群聊、商
如何访问类的私有属性? 下面以 TPathData 为例,
问题:从 XE4 以来,Firemonkey 曲线绘图在移动平台不平滑的问题一直令人诟病,提交到官方的 QC 也是族繁不及备载,官方似乎有意的
操作数据库(RODBC)   odbcConnect(dsn, uid="", p
数据模式:mode函数显示任何对象的模式。常见的单个的
系统可承载海量并发,消息收发确认机制 保障消息必达 系统采用动态智
RabbitMQ与PHP(一) 项
Iease团队扩编预备中,盼望能有Ruby或者java工程师加盟。全职兼职都可以。有爱好的伴侣请与我接洽。 邮件:i
ruby 怎么设置装备摆设GTK2,求教指导下!
#include #include #include #include using namespace std; int main() {
标题如图所示: 有n盏灯,编号1~n。一开端灯都是关着的
成熟的消息收发确认机制,支持万人大群 支持开发自定义的消息sdk接口,扩展性超强 支持单/
成熟的消息收发确认机制,支持万人大群 支持开发自定义的消息sdk接口,扩展性超强 支持单/
1. 注意列表和集合的区别 set 列表表现形式: list_1
Ajax   Ajax即“Asynchronous Javascript And
大师好,我比来在做布谷鸟优
分辨提取A和B图像Harris角点,接下来须要对

[精彩分享] (Node.js爬虫爬取58同城)

[复制链接]
发表于 2017-11-11 23:20:17 | 显示全部楼层 |阅读模式

先上一个源代码吧。
https://github.com/answershuto/Rental
欢迎指导交流。

效果图






搭建Node.js环境及启动服务
安装node以及npm,用express模块启动服务,加入自己所需要的中间件即可,这个不是本文所要讨论的重点,可以参考网上的一些教程搭建环境。

获取导航页URL以及数据
打开58同城主页,我主要针对巧家的二手房进行了爬取分析,所以进入巧家租房。
[(http://hz.58.com/chuzu/pn1/?key=杭州租房子&cmcskey=租房子&final=1&PGTID=0d3090a7-0004-f43c-ee04-95c2ea3d031f&ClickID=6)]http://hz.58.com/chuzu/pn1/?key=杭州租房子&cmcskey=租房子&final=1&PGTID=0d3090a7-0004-f43c-ee04-95c2ea3d031f&ClickID=6](http://hz.58.com/chuzu/pn1/?key=杭州租房子&cmcskey=租房子&final=1&PGTID=0d3090a7-0004-f43c-ee04-95c2ea3d031f&ClickID=6)
可以得到这一串URL,上下页查看后就不难发现,pn后面的数字就是页面的页码,?后面的是一些get请求带带参数。用一个函数即可通过页码得到正确的URL。

function getUrl(page = 1){    return '[url=http://hz.58.com/chuzu/pn'+page+'/?key=杭州租房子&cmcskey=租房子&final=1&PGTID=0d3090a7-0004-f43c-ee04-95c2ea3d031f&ClickID=6';}]http://hz.58.com/chuzu/pn'+page+'/?key=杭州租房子&cmcskey=租房子&final=1&PGTID=0d3090a7-0004-f43c-ee04-95c2ea3d031f&ClickID=6';}[/url]





根据上面的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标签的class为t,用$('a.t')即可得到所有的a标签的对象,得到的是一个数组,遍历取出href属性即可。

for(let i = 0; i < $('a.t').length; i++){rentalObj.add($('a.t').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地址去访问网站,即可绕过反爬虫机制。
具体做法可以参照相关反爬虫策略的文章。


来自安卓客户端来自安卓客户端
哎...今天够累的,来自客户端的签到
回复

使用道具 举报

发布主题 上个主题 下个主题 快速回复 返回列表 官方QQ群
在线客服
客 服 中 心
群 机 器 人
网站二维码
收 起 客 服

QQ|Archiver|手机版|小黑屋|Anycodes ( ICP14002806Anycodes在线编程

GMT+8, 2018-11-22 01:13 , Processed in 2.176493 second(s), 63 queries .

Powered by Anycodes

© 2001-2013 吉林市群龙科技有限公司 Inc.

快速回复 返回顶部 返回列表