初識Splash

輸入下面命令運行splash:html

docker run -p 8050:8050 scrapinghub/splash

一個splash的基本實例:python

function main(splash, args)
    splash:go("http://www.baidu.com")
    splash:wait(0.5)
    lcoal title = splash:evaljs("document.title")
    return {title=title}
end

將上面實例複製到 localhost:8050 的代碼編輯區域,並將網址設爲 http://www.baidu.comnginx

點擊Render me!返回 http://www.baidu.com 的titledocker

咱們在這裏定義的方法名稱爲main(),這個名稱是固定的,Splash會根據這個名字執行。json

  • 入口及返回值

該方法的返回值既能夠是字典形式,也能夠是字符串形式,最後都會轉化爲Splash HTTP Response。api

  • 異步處理

Splash支持異步處理,可是這裏沒有顯式指明回調方法,其回調實在Splash內部完成的。瀏覽器

示例以下:緩存

function main(splash, args)
    local example_urls = {"www.baidu.com", "www.taobao.com", "www.zhihu.com"}
    local urls = args.urls or example_urls
    local results  = {}
    for index, url in ipairs(urls) do
        local ok, reason = splash:go("http://" .. url)
        if ok then
            splash:wait(2)
            results[url] = splash:png()
        end
    end
    return results
end

上面實例運行結果爲,三個網站的的截圖。
在腳本內調用的wait()方法相似與sleep()。其參數爲等待的秒數。服務器

「..」爲拼接字符串。cookie

Splash對象屬性

  • args

該屬性能夠獲取加載時配置的參數,好比URL,

若是爲GET請求,它還能夠獲取GET請求參數;

若是爲POST請求,它能夠獲取表單提交的數據。

Splash也支持使用第二個參數直接做爲args,例如:

function main(spalsh, args)
    local url = args.url
end

這裏第二個參數args就至關於splash.args屬性,以上代碼等價於:

function main(spalsh)
    local url = splash.args.url
end
  • js_enable

這個屬性是Splash的JavaScript執行開關,能夠將其配置爲true或false來控制是否執行JavaScript代碼,默認爲true.

通常不用設置此屬性,默認開啓。

  • resource_timeout

顧名思義,此屬性設置加載的超時時間,單位爲秒。若是設置爲0或者nil(相似python中的None),表明不檢測超時。

此屬性用於加載速度較慢的狀況,避免給一直等待,超過期間無響應,直接拋出異常忽略便可。

  • image_enable

顧名思義,設置圖片是否加載,默認狀況加載。禁用以後能夠節省網絡流量並提升加載速度。

注意,禁用圖片加載可能會影響JavaScript渲染。由於禁用圖片加載後,它的外層DOM節點的高度會發生變化,進而影響

DOM節點的位置。若JavaScript對圖片節點有操做的話,其執行就會有影響。

初次以外Splash使用了緩存,一開始緩存了圖片,而後禁用了圖片加載。再進行加載圖片還會出現,此時重啓Splash便可

  • plugins_enable

此屬性控制瀏覽器插件(如Flash插件)是否開啓。默認false,不開啓。

  • scroll_position

經過設置此屬性來控制頁面上下或左右滾動。
示例以下:

function main(splash, args)
    assert(splash:go("https://www.taobao.com"))
    splash.scroll_position = {y=400}
    return {png = splash:png()}
end

這樣咱們能夠控制頁面向下滾動400像素。

Splash對象方法

  • go()

該方法用來請求某個連接,也能夠模擬GET和POST請求,同時支持傳入請求頭、表單等數據,其用法以下:

ok, reason = splash:go{url, baseurl=nil, http_method="GET", body=nil, formdata=nil}

其參數說明以下:

  1. url:請求的URL。
  2. baseurl:可選參數,默認爲空,表示資源加載相對路徑。
  3. headers:可選參數,默認爲空,表示請求頭。
  4. http_method:可選參數,默認爲GET,同時支持POST。
  5. body:可選參數,默認爲空,發POST請求時的表單數據,使用的Content-type爲application/json。
  6. formdata:可選參數,默認爲空,POST請求時的表單數據,使用的Content-type爲application/x-www-form-urlencoded

該方法的返回結果是結果ok和緣由reason的組合,若是ok爲空,表明網頁加載出現了錯誤,此時reason變量包含了錯誤的緣由,不然證實頁面加載成功。

示例以下:

function main(splash, args)
    local ok, reason = splash:go{"http://httpbin.org/post", http_method="POST", body="name=Germy"}
    if ok then
        return splash:html()
    end
end
  • wait()

此方法能夠控制頁面等待時間使用方法以下:
ok, reason = splash:wait(time, cancel_on_redirect=false, cancel_on_error=true)

參數說明以下:

  1. time:等待的秒數。
  2. cancel_on_redirect:可選參數默認爲false,表示若是發生重定向就中止等待,並返回重定向的結果。
  3. cancel_on_error:可選參數,默認爲false,表示若是發生了加載錯誤,就中止等待。

返回結果也是ok和reason的組合。

  • jsfunc()

此方法能夠直接調用JavaScript定義的方法,可是所調用的方法須要用雙中括號包圍,這至關於實現了JavaScript方法到Lua腳本的轉換。

  • evaljs()

此方法能夠執行JavaScript代碼並返回最後一條JavaScript語句的返回結果,使用方法以下:

result = splash:evaljs(js)
  • runjs()

此方法能夠執行JavaScript代碼,它與evaljs()的功能相似,可是更偏向於執行某些動做或聲明某些方法。

  • autoload()

此方法能夠設置每一個頁面訪問時自動加載的對象,使用發放以下:

ok, reason = splash:autoload{source_or_url, source=nil, url=nil}

參數說明以下:

  1. source_or_url:JavaScript代碼或者JavaScript庫連接。
  2. source:JavaScript代碼
  3. url:JavaScript庫連接

此方法只負責加載JavaScript代碼或庫,不執行任何操做。執行操做的話,須要調用evaljs()或runjs()方法。

  • call_later()

此方法能夠經過設置定時任務和延遲時間來實現任務延時執行,而且能夠在執行前經過cancel()方法從新執行定時任務。

示例以下:

function main(splash, args)
    local snapshots = {}
    local timer = splash:call_later(function()
        snapshots["a"] = splash:png()
        splash:wait(1.0)
        snapshots["b"] = splash:png()
    end, 0.2)
    splash:go("https://www.taobao.com")
    splash:wait(3.0)
    return snapshots
end
  • http_get()

此方法能夠模擬發送HTTP的GET請求,使用方法以下:

response = splash:http_get{url, headers=nil, follow_redirects=true}

參數說明以下:

  1. url:請求URL
  2. headers:可選參數,默認爲空,請求頭。
  3. follow_redirects:可選參數,表示是啓動自動重定向,默認爲true。
  • http_post()

此方法用來模擬發送POST請求,使用方法以下:

response = splash:http_post{url, headers=nil, follow_redirects=true, body=nil}

參數說明以下:

  1. url:請求URL。
  2. headers:可選參數,默認爲空,請求頭。
  3. follow_redrects:可選參數,表示是否啓動自動重定向,默認爲true
  4. body:可選參數,即表單數據,默認爲空
  • set_content()

此方法用來設置頁面的內容,示例以下:

function main(splash, args)
    assert(splash:set_content("<html><body><h1>hello</h1></body></html>"))
    return splash:png()
end
  • html()

此方法用來得到網頁的源代碼

  • png()

此方法用來獲取PNG格式的網頁截圖。

  • jpeg()

此方法用來獲取JPEG格式的網頁截圖。

  • har()

此方法用來得到頁面加載過程描述

  • url()

此方法能夠獲取當前正在訪問的URL

  • get_cookies()

此方法能夠獲取當前頁面的Cookies。

  • add_cookies()

此方法能夠爲當前頁面添加Cookies。

  • clear_cookies()

此方法能夠清除全部的Cookies。

  • get_viewport_size()

此方法能夠獲取當前瀏覽器頁面的大小。

  • set_viewport_size()

此方法能夠設置當前瀏覽器頁面的大小

  • set_viewport_full()

此方法能夠設置瀏覽器全屏顯示

  • set_uer_agent()

此方法能夠設置瀏覽器的User-Agent。

  • set_custom_headers()

此方法能夠設置請求頭

  • select()

該方法能夠選中符合條件的第一個節點,若是有多個節點符合條件,則只會返回一個,其參數時CSS選擇器。

  • select_all()

此方法能夠選中全部符合條件的節點,其參數是CSS選擇器。

  • mouse_click()

此方法能夠模擬鼠標點擊操做,傳入的參數爲座標值的x 和y。此外,也能夠直接選中某個節點,而後調用此方法。

Splash API調用

與python結合調用。

  • render.html

此接口用於獲取JavaScript渲染的頁面的HTML代碼,接口地址就是Splash的運行地址加此接口名稱,
例如 :

http://localhost:8050/render.html?url=https://www.baidu.com

咱們給此接口傳遞了一個url參數來指定渲染的URL,返回結果即頁面渲染後的源代碼。

  • render.png

此接口能夠獲取網頁截圖,經過width和heigh來控制寬高,返回PNG格式的圖片二進制數據。示例以下:

curl http://localhost:8050/rnder.png?url=https://www.taobao.com&wait=5&width=1000&height=700
  • render.jpeg

此接口接口返回jpeg格式的網頁截圖。參數quality用來設置圖片質量。

  • render.har

此接口用於獲取頁面加載的HAR數據,示例以下:

curl http://localhost:8050/render.har?url=https://www.jd.com&wait=5
  • render.json

此接口包含了前面接口的全部功能,返回結果是JSON格式。

  • execute

此接口是最爲強大的接口,實現了與Lua腳本的對接。

Splash負載均衡設置

負載均衡的目的就是爲了多個服務器分擔壓力。
假設四臺服務器哦IP地址爲:

  • 127.0.0.1
  • 127.0.0.2
  • 127.0.0.3
  • 127.0.0.4

四臺服務器的Splash均經過dockers的splash鏡像在端口:8050開啓服務。
選擇任意一臺帶有公網IP的主機來配置負載均衡。

首先在服務器安裝Nginx。

修改Nginx的配置文件nginx.conf,添加以下內容:

http {
    upstream splash {  # 服務器集羣名爲splash
        least_conn;  
        # 表明最少連接負載均衡,去掉此行將使用默認的輪詢策略實現負載均衡
        # 若使用ip_hash,此方法確保同一服務器響應請求,此方法適合有狀態的服務。
        # Splash不須要應用此設置。
        server 127.0.0.1:8050;
        # 還能夠添加weight參數設置權值,權值越高分配到的請求越多。
        server 127.0.0.2:8050;
        server 127.0.0.3:8050;
        server 127.0.0.4:8050;
    }
    server {
        listen 8050;
        location / {
            proxy_pass http://splash;
            # 設置下面兩行來進行用戶認真。
            auth_basic "Restricted";
            auth_baseic_user_file /etc/nginx/conf.d/.htpasswd;
        }
    }
}

上面用戶認證的用戶名和密碼配置放置在 /etc/nginx/conf.d 目錄下,咱們須要使用htpasswd命令建立。

例如,建立一個用戶名爲admin的文件,相關命令以下:

htpasswd -c .htpasswd admin

以後輸入兩次密碼便可。

配置完成後須要重啓Nginx服務。

測試文件在

./test_load_balance.py
相關文章
相關標籤/搜索