摘要:負載均衡設置負載均衡的目的就是為了多個服務器分擔壓力。修改的配置文件,添加如下內容服務器集群名為代表最少鏈接負載均衡,去掉此行將使用默認的輪詢策略實現負載均衡若使用,此方法確保同一服務器響應請求,此方法適合有狀態的服務。
輸入下面命令運行splash:
docker run -p 8050:8050 scrapinghub/splash
一個splash的基本實例:
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.com
點擊Render me!返回 http://www.baidu.com 的title
我們在這里定義的方法名稱為main(),這個名稱是固定的,Splash會根據這個名字執行。
入口及返回值
該方法的返回值既可以是字典形式,也可以是字符串形式,最后都會轉化為Splash HTTP Response。
異步處理
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()。其參數為等待的秒數。
“..”為拼接字符串。
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}
其參數說明如下:
url:請求的URL。
baseurl:可選參數,默認為空,表示資源加載相對路徑。
headers:可選參數,默認為空,表示請求頭。
http_method:可選參數,默認為GET,同時支持POST。
body:可選參數,默認為空,發POST請求時的表單數據,使用的Content-type為application/json。
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)
參數說明如下:
time:等待的秒數。
cancel_on_redirect:可選參數默認為false,表示如果發生重定向就停止等待,并返回重定向的結果。
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}
參數說明如下:
source_or_url:JavaScript代碼或者JavaScript庫鏈接。
source:JavaScript代碼
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}
參數說明如下:
url:請求URL
headers:可選參數,默認為空,請求頭。
follow_redirects:可選參數,表示是啟動自動重定向,默認為true。
http_post()
此方法用來模擬發送POST請求,使用方法如下:
response = splash:http_post{url, headers=nil, follow_redirects=true, body=nil}
參數說明如下:
url:請求URL。
headers:可選參數,默認為空,請求頭。
follow_redrects:可選參數,表示是否啟動自動重定向,默認為true
body:可選參數,即表單數據,默認為空
set_content()
此方法用來設置頁面的內容,示例如下:
function main(splash, args) assert(splash:set_content("hello
")) 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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45060.html
摘要:上一篇文章網絡爬蟲實戰動態渲染頁面抓取下一篇文章是一個渲染服務,是一個帶有的輕量級瀏覽器,同時它對接了中的和庫,利用它我們同樣可以實現動態渲染頁面的抓取。 上一篇文章:Python3網絡爬蟲實戰---37、動態渲染頁面抓取:Selenium下一篇文章: Splash 是一個 JavaScript 渲染服務,是一個帶有 HTTP API 的輕量級瀏覽器,同時它對接了 Python 中的 ...
摘要:上一篇文章網絡爬蟲實戰爬蟲框架的安裝下一篇文章網絡爬蟲實戰部署相關庫的安裝的安裝是一個中支持渲染的工具,本節來介紹一下它的安裝方式。另外一個是的庫的安裝,安裝之后即可在中使用服務。 上一篇文章:Python3網絡爬蟲實戰---10、爬蟲框架的安裝:PySpider、Scrapy下一篇文章:Python3網絡爬蟲實戰---12、部署相關庫的安裝:Docker、Scrapyd Scrap...
閱讀 2878·2021-09-22 15:54
閱讀 1887·2019-08-30 15:53
閱讀 2240·2019-08-29 16:33
閱讀 1418·2019-08-29 12:29
閱讀 1387·2019-08-26 11:41
閱讀 2367·2019-08-26 11:34
閱讀 2947·2019-08-23 16:12
閱讀 1421·2019-08-23 15:56