如何了解一个城市的房价的区域分布,或者不同的城市房价的区域差异。如何获取一个城市不同板块的房价数据?本文讲述了如何爬取链家各城市板块的房价数据,以及如何如利用地理可视化引擎可视化这些数据。
数据获取
链家网站提供了地图找房功能,我们可以在地图上浏览任意区域的二手房价格信息,通过地图找房我们可以获取每个房源的价格信息和位置信息,同时链家也提供了区县维度,城市板块维度的房价统计信息。
我们还可以获取各个区县的,板块的范围数据。
绿色的边界即为板块的边界数据
链家房价 在准确性,权威性上都很好的数据源,而且有完整地理信息数据。链家房价数据在科学研究,房价区域趋势研究也有很大的作用。
爬取方法
如何爬取,链家肯定不会让你轻易将他的数据爬走,肯定做了一些反爬取机制,理论上讲只要网页可以看到的数据都是可以爬取的。那我们研究下如何爬取链接各板块的房价数据。
通过对浏览器的网络的监测我们找到地图数据请求接口
接口参数我们可以看出请求参数城市Id,和经纬度范围获取地图区域内的房价数据。
返回的的数据数据
正常来讲我只需要把一个城市划分成不同的网格就可以获取一个城市的所有的房价数据,但是事情往往没有那么简单。
我们可以数据有一个authorization 参数,这是参数就是链家的反爬机制。仔细研究发现这是对请求参数做了MD5编码,后端会进行校验只有校验正确才会返回数据。
下面的问题就是找到参数md5编码的方法。
代码跟踪测试我们找到了 参数MD5化的方法
const md5 = function() {
function e(e, t) {
var n = (65535 & e) + (65535 & t);
return (e >> 16) + (t >> 16) + (n >> 16) << 16 | 65535 & n
}
function t(e, t) {
return e << t | e >>> 32 - t
}
function n(n, i, a, r, o, s) {
return e(t(e(e(i, n), e(r, s)), o), a)
}
function i(e, t, i, a, r, o, s) {
return n(t & i | ~t & a, e, t, r, o, s)
}
function a(e, t, i, a, r, o, s) {
return n(t & a | i & ~a, e, t, r, o, s)
}
function r(e, t, i, a, r, o, s) {
return n(t ^ i ^ a, e, t, r, o, s)
}
function o(e, t, i, a, r, o, s) {
return n(i ^ (t | ~a), e, t, r, o, s)
}
function s(t, n) {
t[n >> 5] |= 128 << n % 32,
t[14 + (n + 64 >>> 9 << 4)] = n;
var s, l, c, d, u, g = 1732584193, f = -271733879, m = -1732584194, p = 271733878;
for (s = 0; s < t.length; s += 16)
l = g,
c = f,
d = m,
u = p,
g = i(g, f, m, p, t[s], 7, -680876936),
p = i(p, g, f, m, t[s + 1], 12, -389564586),
m = i(m, p, g, f, t[s + 2], 17, 606105819),
f = i(f, m, p, g, t[s + 3], 22, -1044525330),
g = i(g, f, m, p, t[s + 4], 7, -176418897),
p = i(p, g, f, m, t[s + 5], 12, 1200080426),
m = i(m, p, g, f, t[s + 6], 17, -1473231341),
f = i(f, m, p, g, t[s + 7], 22, -45705983),
g = i(g, f, m, p, t[s + 8], 7, 1770035416),
p = i(p, g, f, m, t[s + 9], 12, -1958414417),
m = i(m, p, g, f, t[s + 10], 17, -42063