Splash渲染服务使用

最近在调研各种渲染服务的使用,正在使用的是google的puppeteer,但是在线上出现个问题,在多线程并发情况下速度有些问题,所以调研一下splash的服务。出乎意料的是splash服务的并发性很出色,基于异步的twisted框架,成为使用瓶颈的就是服务的稳定性了,这是后话。除了渲染服务的失败率和服务本身的不稳定问题,其他方面都可以说比较优秀,可以尝试使用一下。下面写一下关于splash部署并使用的问题。
splash是一个web服务,可以通过docker部署

sudo docker pull scrapinghub/splash
docker run -it -p 8050:8050 scrapinghub/splash

服务启动之后可以直接用浏览器访问8050端口并测试使用。
splash服务基于webkit内核,支持lua脚本,服务从8050端口启动之后,向服务所在服务器8050端口发送请求即可。这里我用的是python脚本构造了请求的url,url中添加了lua的代码段,提供请求的参数。

from urllib.parse import quote

lua = '''
function main(splash, args)			 
	splash:on_request(function(request)
    request:set_proxy{
        host = "xxx.xxx.xxx.xxx",
        port = xxxx,
	    }
		end)

    splash:set_user_agent("Mozilla/5.0")
    splash:go("http://xxxxxxx.com/")
    return splash:html()
    end
'''
url = 'http://localhost:8050/execute?lua_source=' + quote(lua)

上述lua代码段中设置了代理和端口,lua脚本中除了设置代理外也可以设置请求头参数,具体配置参数可以参考官方文档
splash官方文档
(查官方文档是最好的选择,遇到问题在百度之前最好看一下官方文档)

from concurrent.futures import ThreadPoolExecutor
from queue import Queue
q = Queue()
for i in range(10000):
    q.put(url)
def task(n):
    while True:
        st = time.time()
        if q.empty():
            break
        else:
            url = q.get()
            if q.qsize() % 100 == 0:
                requests.post("http://localhost:8050/_gc")
            try:
                response = requests.get(url)
                if len(response.text)<5000:
                    print("重新请求")
                    time.sleep(1)
                    response = requests.get(url)
                print("%d号线程,time: %.2f  页面大小%d 剩余 %d" % (n, time.time() - st, len(response.text),q.qsize()))
            except Exception as e:
                time.sleep(3)
                response = requests.get(url)
                print("%d号线程,time: %.2f  页面大小%d 剩余 %d" % (n, time.time() - st, len(response.text),q.qsize()))
if __name__ == "__main__":
    p = ThreadPoolExecutor()
    l = []
    start = time.time()
    n = 20
    size = q.qsize()
    for i in range(n):
        obj = p.submit(task, i)
        l.append(obj)
    p.shutdown()
    print("webitem rate : %.1f item/s" % (size / (time.time() - start)))
    print(time.time() - start)

随后我开启了20个线程测试了一下splash的性能,qps大概在3左右,而puppeteer在同样条件下在1.8左右(由于挂了代理,速度会有点慢)。可以看出splash性能还是可以,但是有两个问题:1.线程开到100个以上是,服务处理请求反应变慢,然后可能会出现服务挂掉情况,而puppeteer相比就十分稳定;当出现请求密集的情况,比如刚开始启动所有线程,会出现渲染失败的情况,返回没有内容的html。这两个问题也是可以解决的,同过重启和重新请求,不过如果能通过版本更新解决这些问题是最好的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值