Splash渲染服务使用「建议收藏」

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

大家好,欢迎来到IT知识分享网。

最近在调研各种渲染服务的使用,正在使用的是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。这两个问题也是可以解决的,同过重启和重新请求,不过如果能通过版本更新解决这些问题是最好的

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/24979.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信