輸入下面命令運行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
該屬性能夠獲取加載時配置的參數,好比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
這個屬性是Splash的JavaScript執行開關,能夠將其配置爲true或false來控制是否執行JavaScript代碼,默認爲true.
通常不用設置此屬性,默認開啓。
顧名思義,此屬性設置加載的超時時間,單位爲秒。若是設置爲0或者nil(相似python中的None),表明不檢測超時。
此屬性用於加載速度較慢的狀況,避免給一直等待,超過期間無響應,直接拋出異常忽略便可。
顧名思義,設置圖片是否加載,默認狀況加載。禁用以後能夠節省網絡流量並提升加載速度。
注意,禁用圖片加載可能會影響JavaScript渲染。由於禁用圖片加載後,它的外層DOM節點的高度會發生變化,進而影響
DOM節點的位置。若JavaScript對圖片節點有操做的話,其執行就會有影響。
初次以外Splash使用了緩存,一開始緩存了圖片,而後禁用了圖片加載。再進行加載圖片還會出現,此時重啓Splash便可
。
此屬性控制瀏覽器插件(如Flash插件)是否開啓。默認false,不開啓。
經過設置此屬性來控制頁面上下或左右滾動。
示例以下:
function main(splash, args) assert(splash:go("https://www.taobao.com")) splash.scroll_position = {y=400} return {png = splash:png()} end
這樣咱們能夠控制頁面向下滾動400像素。
該方法用來請求某個連接,也能夠模擬GET和POST請求,同時支持傳入請求頭、表單等數據,其用法以下:
ok, reason = splash:go{url, baseurl=nil, http_method="GET", body=nil, formdata=nil}
其參數說明以下:
該方法的返回結果是結果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
此方法能夠控制頁面等待時間使用方法以下:
ok, reason = splash:wait(time, cancel_on_redirect=false, cancel_on_error=true)
參數說明以下:
返回結果也是ok和reason的組合。
此方法能夠直接調用JavaScript定義的方法,可是所調用的方法須要用雙中括號包圍,這至關於實現了JavaScript方法到Lua腳本的轉換。
此方法能夠執行JavaScript代碼並返回最後一條JavaScript語句的返回結果,使用方法以下:
result = splash:evaljs(js)
此方法能夠執行JavaScript代碼,它與evaljs()的功能相似,可是更偏向於執行某些動做或聲明某些方法。
此方法能夠設置每一個頁面訪問時自動加載的對象,使用發放以下:
ok, reason = splash:autoload{source_or_url, source=nil, url=nil}
參數說明以下:
此方法只負責加載JavaScript代碼或庫,不執行任何操做。執行操做的話,須要調用evaljs()或runjs()方法。
此方法能夠經過設置定時任務和延遲時間來實現任務延時執行,而且能夠在執行前經過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請求,使用方法以下:
response = splash:http_get{url, headers=nil, follow_redirects=true}
參數說明以下:
此方法用來模擬發送POST請求,使用方法以下:
response = splash:http_post{url, headers=nil, follow_redirects=true, body=nil}
參數說明以下:
此方法用來設置頁面的內容,示例以下:
function main(splash, args) assert(splash:set_content("<html><body><h1>hello</h1></body></html>")) return splash:png() end
此方法用來得到網頁的源代碼
此方法用來獲取PNG格式的網頁截圖。
此方法用來獲取JPEG格式的網頁截圖。
此方法用來得到頁面加載過程描述
此方法能夠獲取當前正在訪問的URL
此方法能夠獲取當前頁面的Cookies。
此方法能夠爲當前頁面添加Cookies。
此方法能夠清除全部的Cookies。
此方法能夠獲取當前瀏覽器頁面的大小。
此方法能夠設置當前瀏覽器頁面的大小
此方法能夠設置瀏覽器全屏顯示
此方法能夠設置瀏覽器的User-Agent。
此方法能夠設置請求頭
該方法能夠選中符合條件的第一個節點,若是有多個節點符合條件,則只會返回一個,其參數時CSS選擇器。
此方法能夠選中全部符合條件的節點,其參數是CSS選擇器。
此方法能夠模擬鼠標點擊操做,傳入的參數爲座標值的x 和y。此外,也能夠直接選中某個節點,而後調用此方法。
與python結合調用。
此接口用於獲取JavaScript渲染的頁面的HTML代碼,接口地址就是Splash的運行地址加此接口名稱,
例如 :
http://localhost:8050/render.html?url=https://www.baidu.com
咱們給此接口傳遞了一個url參數來指定渲染的URL,返回結果即頁面渲染後的源代碼。
此接口能夠獲取網頁截圖,經過width和heigh來控制寬高,返回PNG格式的圖片二進制數據。示例以下:
curl http://localhost:8050/rnder.png?url=https://www.taobao.com&wait=5&width=1000&height=700
此接口接口返回jpeg格式的網頁截圖。參數quality用來設置圖片質量。
此接口用於獲取頁面加載的HAR數據,示例以下:
curl http://localhost:8050/render.har?url=https://www.jd.com&wait=5
此接口包含了前面接口的全部功能,返回結果是JSON格式。
此接口是最爲強大的接口,實現了與Lua腳本的對接。
負載均衡的目的就是爲了多個服務器分擔壓力。
假設四臺服務器哦IP地址爲:
四臺服務器的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