背景
1. 每到毕业季就是租房季,一房难求,加价不加量;
2. 租房信息中充斥着大量中介、二房东;
3. 当拿到所有数据后,想怎么玩就怎么玩,比如数据可视化
- 注意:
- 爬数据,可能会涉及敏感信息啥的,在此,不会提及具体哪一家租房平台
- 这篇文章主要讲述爬虫过程
- 请见谅
动手实施
- step1 搭建一个request server
- step2 找到租房平台对应接口&爬取数据
- step3 存储数据
step1 搭建一个request server
使用nodejs 搭建一个 request server服务是很简单的吧,直接上代码
/**
* ./index.js
*/
const https = require('https') // 选用https:请求的api是https协议
var stateNum = 0 // 用于记数,请求了多少次
const options = {
hostname: '???', //你要请求api的域名,并非网址域名
port: 443,
path: '???',
method: 'GET',
headers: {
},
params: {
}
}
function getData(options,stateNum) {
const req = https.request(options, res => {
console.log(`状态码: ${res.statusCode}`)
res.setEncoding('utf8');
res.on('data', d => {
console.log(d.length,1234567);
// TODO
})
})
req.on('error', error => {
console.error(error)
})
req.end()
}
这里并没有启一个本地的服务,只使用 https.request()
step2 请求接口获取数据
node index.js
显然会报错
请求头里有个 Authorization 字段,在不停刷接口的同时,发现了一些规律——基于每次时间戳的变化,加之加密手段,作为每次的请求头中新的 Authorization,经过多次的尝试论证,最后解出了该平台的auth加密算法。
- 关于auth算法,这里不过多展开
- 直接跳到存储数据
step3 存储数据
这篇文章中不涉及数据库,一开始把技术铺的太开,或许就劝退了,依旧选择简单粗暴的方式存储为txt文件
// ./index.js
// 这段写入上面提到的 TODO 区域中
fs.writeFileSync(`${__dirname}/txtdata/data${stateNum}.txt`,d,{ flag: 'a+' },err => {
console.log('写入错误'+err);
})
抓到数据的部分截图
小结
- 这篇文章主要分享爬虫过程,当写到 auth 算法时,感到左右为难;
- 关于auth这块,特意去请教了专门做爬虫的小伙伴;
- 他给出的答案是——反解密很难,auth中还会加入一些偏移量加以混淆;
- 然后继续去琢磨这个auth;运气比较好,翻到了网站源码;
- md5加密,其中偏移量是一个字符串常量、时间戳;
- 这才爬下了数据;
- 在找到源码之前,秉持着大胆假设、小心求证,当翻到源代码的时候,已经隔了一天;
- 后来在自信心的驱使下,去爬了某招聘网站的信息,只可惜,固定限制了10组数据,遂放弃
- 欢迎留言/私信交流
技术总结
-
这篇文章中主要用到了三个模块 nodejs自带模块
httpsfs和md5(需要自行下载md5.js) -
本篇中引用的md5是 github.com/blueimp/Jav…