1. 程式人生 > >splash3.2學習筆記——HTTP API(1)

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'