splash3.2學習筆記——HTTP API(1)
Splash是一個javascript渲染工具。是一款支援HTTP API的輕量級web瀏覽器,通過Python3的twisted和QT5實現。QT(twisted)反應器通過QT主迴圈充分利用webkit的併發優勢,使渲染服務完全非同步。SPlash的一些主要特性:
- 並行處理多個網頁;
- 獲取HTML結果、截圖;
- 通過關閉圖片或使用Adblock Plus規則實現更快渲染;
- 在頁面上下文中執行自定義JavaScript;
- 書寫Lua瀏覽指令碼;
- 在Splash-Jupyter筆記本中開發Splash Lua指令碼;
- 獲得HAR格式的詳細渲染資訊。
Splash HTTP API
Splash通過HTTP API控制。對於所有的Splash端點,以下引數通過GET引數方式或在編碼成JSON並使用Content-Type: application/json
頭部資訊POST的方式傳送。
大多數Splash多功能端點提供exexcute和run的Splash特性;允許執行任意Lua渲染指令碼。
其餘端點用在特定場合更為容易-例如,render.png返回一個可以被img src使用的PNG格式截圖,不做其他處理,render.json在不進行頁面互動場合使用很方便。
render.html
返回javascript渲染後的HTML頁面。
引數:
url:字串,必需
要渲染的url
baseurl:字串,可選
要渲染頁面的基準url。
timeout:浮點數,可選
渲染超時引數(單位為秒,預設為30)
預設情況下,最大允許超時為90s。使用--max-timeout命令列選項執行Splash可以覆蓋該值。例如,以下命令用於配置最大超時時間為5分鐘:
$ docker run -it -p 8050:8050 scrapinghub/splash --max-timeout 300
resource_timeout:浮點數,可選
個人網路請求延時引數。
wait:浮點數,可選
頁面載入後等待更新時間(單位為秒,預設值為0);如果希望頁面包含setInterval/setTimeout的javascript方法可以被執行,需要增大該引數,因為當該引數為0時,setInterval/setTimeout的回撥函式不能被執行;當進行頁面完全渲染時,PNG和JPEG的渲染也需要wait值非零。
wait值必需小於timeout值。
proxy:字串,可選
代理URL的格式為:
[protocol://][user:[email protected]]proxyhost[:port])
其中,protocol為http或socks5。如果埠未指定,則使用預設的1080埠。
js:字串,可選
javascript檔名字
js_source:字串,可選
在頁面上下文中執行的javascript程式碼。
filters:字串,可選
採用逗號分割的請求過濾器名字列表
allowed_domains:字串,可選
允許域名逗號分隔列表。如果該列表存在,Splash將不載入任何不在該列表中域或子域下的內容。
allowed_content_types:字串,可選
允許Content-type的逗號分割列表。如果該值存在,Splash將丟棄響應中Content-type不在列表中請求。
forbidden_content_types:字串,可選
禁止Content-type的逗號分隔列表。功能與上一引數相反。
viewport:字串,可選
瀏覽器渲染頁面可視區域寬高,單位為畫素,格式為“寬X高”,例如800x600。預設值為1024x768。
viewport引數對於PNG和JPEG渲染更為重要;所有渲染端點均支援該引數,因為javascript程式碼執行依賴可視區域大小。
考慮到向後相容的問題,該引數也接受'full'作為引數值。
images:整型,可選
是否下載圖片。值為1(下載圖片)或0(不下載圖片),預設值為1。
注意,即使該引數值為0,快取圖片也可能顯示。
headers:JSON陣列或物件,可選
第一個傳出請求的HTTP頭。
該選項只支援application/json
的POST請求。值可以是形如(header_name, header_value)
的JSON陣列對或者頭部名字為鍵,頭部值為值的JSON物件。
與其他頭部不同,"User-Agent"頭為特例:用於所有傳出請求。
body:字串,可選
如果方法為POST,被髮送的HTTP POST請求主體。POST方法的預設content-type頭是application/x-www-form-urlencoded
。
http_method:字串,可選
傳出Splash請求的HTTP方法。預設為GET,Splash也支援POST。
save-args:JSON陣列或一個逗號分隔字串,可選
存入快取的引數名列表。Splash將每個引數存入內部快取並返回包含每個引數SHA1雜湊列表(一個使用分號分隔的形如name=hash鍵值對列表)的 X-Splash-Saved-Arguments
HTTP頭。
客戶端可以使用load_args引數用這些hashes代替引數值傳遞,這一特點對於引數值很大且不經常改變的情形非常有用(js_source或lua_source通常是很好的候選方案)
load_args:JSON物件或字串,可選
從快取中載入的引數值。load_args必須是{"name": "<SHA1 hash>", ...}
JSON物件或者X-Splash-Saved-Arguments
頭原碼(一個使用分號分隔的形如name=hash鍵值對列表)
對於load_args中的每個引數,Splash使用一個給定的SHA1雜湊值作為鍵,從內部快取中獲取值。如果值在快取中,Splash將其作為引數值使用然後正常處理請求。如果不能找到引數,Splash返回HTTP 498狀態碼。這種情況下,客戶端會重複請求,但是使用save_args併發送所有引數值。
load_args和save_args允許不傳送每個請求的大引數來儲存網路流量(js_source和lua_source也是常用的候選方案)
Splash使用LRU快取儲存值;入口數量有限,Splash每次重啟,快取都會清空。換句話說,儲存是非持久的;客戶端必需準備重發這些引數。
html5_media:整型,可選
HTML5媒體是否可用(例如<video>標籤回放)。可能值為1(可用)和0(不可用),預設為0。
HTML5 媒體預設不可用,是由於可能導致不穩定。未來Splash會預設它可用,所以想設定為不可用時,需要顯式指定html5_media=0。
例項:
Curl例項:
curl 'http://localhost:8050/render.html?url=http://domain.com/page-with-javascript.html&timeout=10&wait=0.5'
結果總是使用utf-8編碼,通常使用render.html返回的HTML資料使用utf-8解碼,即使結果中有以下標籤:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
render.png
返回javascript渲染頁面的PNG格式圖片。
引數:
與render.html一樣引數外加以下引數:
width:整型,可選
保持寬高比不變,調整渲染影象寬度至給定(單位:畫素)。
height:整型,可選
裁剪渲染影象至給定高度值。常常用於使用寬度引數連線以生成固定大小的縮圖。
render_all:整型,可選
# render with default quality
curl 'http://localhost:8050/render.jpeg?url=http://domain.com/'
# render with low quality
curl 'http://localhost:8050/render.jpeg?url=http://domain.com/&quality=30'
可能值為1和0.當值為1時,在渲染前,擴充套件可視區域至包含整個頁面(可能會非常長)。預設值為0.
引數值為1時,要求wait引數非零。這是一個很不幸的約束,但是貌似是當值為1時,令渲染能夠實現的唯一辦法。
scale_methos:字串,可選
可能值為raster(預設)和vector。如果該引數值為raster,通過width引數進行的重新縮放操作是畫素級別。如果引數值為vector,渲染過程中的縮放操作為元素級。
例項:
Curl例項:
# render with timeout
curl 'http://localhost:8050/render.png?url=http://domain.com/page-with-javascript.html&timeout=10'
# 320x240 thumbnail
curl 'http://localhost:8050/render.png?url=http://domain.com/page-with-javascript.html&width=320&height=240'
render.jpeg
返回javascript渲染頁面的JPEG格式影象
引數:
和render.png相同,外加以下引數:
quality:整型,可選
JPEG質量引數,範圍為0到100,預設為75.
注意,95以上的質量值應當避免;質量值為100是JPEG的部分壓縮演算法將被禁用,導致檔案尺寸大,圖片質量提高很少。
Curl例項:
# render with default quality
curl 'http://localhost:8050/render.jpeg?url=http://domain.com/'
# render with low quality
curl 'http://localhost:8050/render.jpeg?url=http://domain.com/&quality=30'