一、方案:
之前我们学习的内容都是抓取静态页面,每次请求,它的网页全部信息将会一次呈现出来。 但是,像比如一些购物网站,他们的商品信息都是js加载出来的,并且会有ajax异步加载。像这样的情况,直接使用scrapy的Request请求是拿不到我们想要的信息的,解决的方法就是使用selenium或者scrapy-splash。
差别:
selenium是浏览器测试自动化工具,很容易完成鼠标点击,翻页等动作,缺点是一次只能加载一个页面,无法异步渲染页面,也就限制了selenium爬虫的抓取效率。
splash可以实现异步渲染页面,可以同时渲染几个页面。缺点是在页面点击,,模拟登陆方面没有selenium灵活。
最初选用了splash作为解决方案。
经过一圈折腾,感觉使用splash的成本有点高,又回到了Selenium方案上来。
二、Scrapy-splash环境
1、安装docker
参考本地文章《Docker学习》,Mac下双击运行Docker Quickstart Terminal确认安装完成。
2、安装splash
(1) 拉取镜像:
mac需要双击运行Docker Quickstart Terminal
输入以下内容
docker pull scrapinghub/splash
(2) 启动Splash
docker run -d -p 123.56.71.2:8050:8050 scrapinghub/splash
docker run --name splash -d -p 8050:8050 scrapinghub/splash
docker run -d -p 8050:8050 scrapinghub/splash
docker run -d -p 123.56.71.2:8050:8050 scrapinghub/splash
这个命令就是在计算机的123.56.71.2:8050端口启动Splash渲染服务,转发到容器8050端口,-d表示在后台运行
也可以加—name指定容器名称
Docker操作
systemctl enable/start/restart/stop docker
容器操作
docker ps 查看当前启动的容器
docker stop/kill 容器ID或容器名
docker restart 容器ID或容器名
如果端口或网络访问有问题,可以先重启容器然后再启动Splash
(3)打开浏览器,输入123.56.71.2:8050会看到首界面。可以在输入框输入任意的网址,点击后面的Render me! 来查看渲染之后的样子。
三、集成到Scrapy中
1、安装scrapy-splash
pip install scrapy-splash
2、使用
参考文章
Splash是通过Lua脚本来控制了页面的加载过程, 加载过程完全模拟浏览器,可以执行某些特定js脚本或者方法
Scrapy-splash的设置
scrapy-splash的请求头和代理参数设置
这里发现一个问题,就是SplashRequest只能等待固定的时长,不能根据需要的内容是否已经记载完成来判断。
发现一个解决方案:准备继续深入研究
splash 实现类似selenium的WebDriverWait
最终之所以放弃Splash方案,是因为这种的解析效率太低了,有时候一个网页需要十几秒才能结束等待,所以最终不得不放弃。