最近毕设需要爬取一些数据,使用了 Scrapy-Splash。
需要爬取的数据是表格,表内容由 JS 函数填充。
使用 Splash 渲染网页并将结果返回给 Scrapy,但是使用 Splash 之后似乎并没有任何作用!
网页: https://www.aqistudy.cn/historydata/daydata.php?city=%E6%AD%A6%E6%B1%89&month=201312
Splash 版本:3.3.1
OS 版本:Windows 10 专业版
表格代码如下:
<table width="100%" class="table table-condensed table-bordered table-striped table-hover table-responsive" style="margin-bottom:5px">
<tr height=38px>
<th align="center" style="background:#d9edf7">日期</th>
<th align="center" style="background:#d9edf7">AQI</th>
<th align="center" style="background:#d9edf7" width="80px" >质量等级</th>
<th align="center" style="background:#d9edf7">PM2.5</th>
<th align="center" style="background:#d9edf7">PM10</th>
<th align="center" style="background:#d9edf7" class="hidden-xs">SO2</th>
<th align="center" style="background:#d9edf7" class="hidden-xs">CO</th>
<th align="center" style="background:#d9edf7" class="hidden-xs">NO2</th>
<th align="center" style="background:#d9edf7" class="hidden-xs">O3_8h</th>
</tr>
</table>
填充表格的函数如下:
function showTable(items) {
items.forEach(function(item) {
$('.table tbody').append('\
<tr>\
<td align="center">' + item.time_point + '</td>\
<td align="center">' + item.aqi + '</td>\
<td align="center"><span style="display:block;width:60px;text-align:center;' + getAQIStyle(item.aqi) + '">' + item.quality + '</span></td>\
<td align="center">' + item.pm2_5 + '</td>\
<td align="center">' + item.pm10 + '</td>\
<td align="center" class="hidden-xs">' + item.so2 + '</td>\
<td align="center" class="hidden-xs">' + item.co + '</td>\
<td align="center" class="hidden-xs">' + item.no2 + '</td>\
<td align="center" class="hidden-xs">' + item.o3 + '</td>\
</tr>'
);
});
}
不管是在爬虫里使用还是 localhost:8050 调试,得到的表格内容都和上述表格代码里内容一样,表格内容并没有得到。
1
wenbinwu 2019-02-25 21:48:59 +08:00
试试调节一下 timeout ?
|
4
SpiderXiantang 2019-02-26 00:51:43 +08:00
scrapy+selenium 试试?
|
5
SpiderXiantang 2019-02-26 01:18:12 +08:00
找到了 翻译一下这段代码就可以解决了 method = "GETDAYDATA", object = {city: "武汉", month: "201312"} , callback = ƒ (obj), period = 6
只是对接口的数据进行了加密 ``` function getServerData(method, object, callback, period) { const key = hex_md5(method + JSON.stringify(object)); const data = getDataFromLocalStorage(key, period); if (!data) { var param = getParam(method, object); $.ajax({ url: 'api/historyapi.php', data: { hd: param }, type: "post", success: function(data) { data = decodeData(data); obj = JSON.parse(data); if (obj.success) { if (period > 0) { obj.result.time = new Date().getTime(); localStorageUtil.save(key, obj.result) } callback(obj.result) } else { console.log(obj.errcode, obj.errmsg) } } }) } else { callback(data) } } ``` |
6
Martzki OP @SpiderXiantang 多谢,用 splash 是因为了解到比 selenium 效率高。另外我对 web 实在是没有什么基础,能不能请您提示一下下一步应该怎么处理
|
7
Martzki OP 后面换用 selenium+PhantomJS 可以了,splash 还是没能成功
|