一、概述
在上一篇文章中,链接如下:https://www.cnblogs.com/xiao987334176/p/13656055.html
已经介绍了如何使用Splash抓取javaScript动态渲染页面
这里做一下项目实战,以爬取京东商城商品冰淇淋为例吧
环境说明
操作系统:centos 7.6
docker版本:19.03.12
ip地址:192.168.0.10
说明:使用docker安装Splash服务
操作系统:windows 10
python版本:3.7.9
ip地址:192.168.0.9
说明:使用Pycharm开发工具,用于本地开发。
关于Splash的使用,参考上一篇文章,这里就不做说明了。
二、分析页面
打开京东商城,输入关键字:冰淇淋,滑动滚动条,我们发现随着滚动条向下滑动,越来越多的商品信息被刷新了,这说明该页面部分是ajax加载

注意:每一条商品信息,都是在<div class="gl-i-wrap"></div>里面的。
我们打开scrapy shell 爬取该页面,如下图:
scrapy shell "https://search.jd.com/Search?keyword=%E5%86%B0%E6%B7%87%E6%B7%8B&enc=utf-8"
输出:
... [s] view(response) View response in a browser >>>
注意:url不要用单引号,否则会报错。
接下来,输入以下命令,使用css选择器
>>> response.css('div.gl-i-wrap')
[<Selector xpath="descendant-or-self::div[@class and contains(concat(' ', normalize-space(@class), ' '
), ' gl-i-wrap ')]"
...
返回了很多Selector 对象。
统计商品信息个数
>>> len(response.css('div.gl-i-wrap'))
30
得到返回结果发现只有30个冰淇凌的信息,而我们再页面中明明看见了60个冰淇凌信息,这是为什么呢?
答:这也说明了刚开始页面只用30个冰淇淋信息,而我们滑动滑块时,执行了js代码,并向后台发送了ajax请求,浏览器拿到数据后再进一步渲染出另外了30个信息
我们可以点击network选项卡再次确认:

鉴于此,我们就想出了一种解决方案:即用js代码模拟用户滑动滑块到底的行为再结合execute端点提供的js代码执行服务即可(小伙伴们让我们开始实践吧)

注意:<div id="footer-2017"></div>就是页面底部了,因此,只需要滑动到底部即可。
首先:模拟用户行为
在console,输入以下命令:
e = document.getElementById("footer-2017")
e.scrollIntoView(true)
效果如下,就直接滑动到底部了。

参数解释:
scrollIntoView是一个与页面(容器)滚动相关的API(官方解释),该API只有boolean类型的参数能得到良好的支持(firefox 36+都支持)
参数为true时调用该函数,页面(或容器)发生滚动,使element的顶部与视图(容器)顶部对齐;
使用scrapy.Request
上面我们使用Request发送请求,观察结果只有30条。为什么呢?因为页面时动态加载的所有我们只收到了30个冰淇淋的信息。
所以这里,使用scr

最低0.47元/天 解锁文章
1336

被折叠的 条评论
为什么被折叠?



