乐趣区

关于python:还是比Selenium好用Python使用Splash访问谷歌获取相应内容

上次讲了一下 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 的配置文件,配置认证就能够应用了。

退出移动版