上次讲了一下playwright获取网站的数据。然而吧这个playwright,他究竟是一个自动化调试工具,多多少少会占一点本地的资源。
这次的Splash可不一样了,他是部署在服务器上的,能够把负载的资源放在一个甚至多个服务器上,实现在服务器上将想要申请的网站,申请加渲染,把最初的HTML返回给你,让你解析数据。
一、Splash和Splash配置
Splash是一个JavaScript的渲染服务,这是一款带有HTTP API的轻量级web浏览器,同时啊他还接入了python3的Twisted and QT5库。
Spalsh配置这里介绍下Liunx+Docker的配置,以下几步:
装置Docker,保障Docker装置的版本>=17
应用Docker拉取镜像
启动容器,开启Splash服务
1.Pull the image: 2. $ sudo docker pull scrapinghub/splash 3.Start the container: $ sudo docker run -it -p 8050:8050 --rm scrapinghub/splash
配置实现后,在你的浏览器输出服务器地址加端口号8050验证是否胜利:
像这样你就胜利了
二、Splash+requests的应用
Splash是用Lua语言写的脚本,用Lua语言模仿了浏览器加载的过程,从而返回各种后果,如网页源码,截图等。
那怎么配合python应用呢?
Splash有一个弱小的接口:execute。此接口能够实现与Lua脚本的对接。当然Splash还有render接口,在此先按下不表,想要理解的话还是请自行查看文档。
1.import requests 2.import json 3. 4.splashUrl = "我的splash地址:8050/execute" 5.def get_splash(): 6. param = { 7. "timeout": 10, 8. "url": 'https://www.google.com/', 9. "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36", 10. "lua_source": """ 11. function main(splash, args) 12. splash:go(args.url) 13. splash:wait(5) 14. splash.images_enabled = false 15. return splash:html() 16. end 17. """ 18. } 19. response = requests.post(url=splashUrl, data=json.dumps(param),headers={"content-type": "application/json"}) 20. print(response.text)
这里是通过requests传参数通过post申请Splash接口,而传递的param参数中不仅有splash的配置,还有lua_source中的Lua脚本。
其中这部分就是方才浏览器中关上外面的脚本:splash go申请args传入的url连贯,期待10秒不获取图片,最初返回申请后的html内容:
1.function main(splash, args) 2. splash:go(args.url) 3. splash:wait(5) 4. splash.images_enabled = false 5. return splash:html() 6.end
其中,在申请execute是的param传参,还能够加上其余的参数,就像外面的timeout就是设置5秒超时,什么get/post申请啦,启动或禁用图片加载啦,禁止或启用js啦都能够加上,详情请自行查问文档哦:
三、Splash+requests的代理配置
哎,Python获取内容怎么能少得了代理呢。
Splash的代理配置十分的简略,在传参的param加上proxy参数就能够了:
1.param = { 2. "timeout": 10, 3. "url": 'https://api.myip.la/en?json', 4. "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36", 5. "proxy":getApiIp(), 6. "lua_source": """ 7. function main(splash, args) 8. splash:go(args.url) 9. splash:wait(5) 10. splash.images_enabled = false 11. return splash:html() 12. end 13. """ 14.}
看到这里的IP地址曾经挂上了。
说到代理,我这里应用的是ipidea的代理。稳固高效的代理就像是你获取数据路线上的明灯,如光明里的一束光。即便再被封禁,被拦截,也会带你获取到你想要的数据。:)
新用户能够白嫖流量哦。
地址:http://www.ipidea.net/
我以往应用Splash个别是解决前后端拆散的网页用的,有时候后盾接口获取的json数据并不是咱们想要的内容。在写这篇文章之前,我甚至还感觉Splash只能获取get申请,没想到这个货色还是挺好用的。写了文章之后我也学习了不少货色。
最初提一嘴啊,Splash能够多服务器配置负载平衡的,曾经有多个Splash的服务器的状况下,在用一台用公网IP的Nginx的服务器,批改下nginx的配置文件,配置认证就能够应用了。