1. 程式人生 > 實用技巧 >scrapy-splash 爬取網頁

scrapy-splash 爬取網頁

現在大部分網頁內容都是由js動態載入得到,我們如果要使用scrapy靜態爬取是爬取不到內容的,所以需要引入js渲染引擎去載入js,也就是splash。

然後還要使用一個包scrapy-splash,這個包呼叫了splash例項的介面,用來支援scrapy做爬蟲。

Scrapy-Splash usesSplashHTTP API, so you also need a Splash instance.

1、啟動splash例項

文件:https://splash.readthedocs.io/en/stable/

使用docker啟動 docker run -p 8050:8050 scrapinghub/splash

2、安裝scrapy-splash

pip install scrapy-splash

3、在爬蟲中配置

https://pypi.org/project/scrapy-splash/

https://www.jianshu.com/p/9d0c53c97850

4、常見問題

① 瀏覽器可以直接訪問localhost:8050訪問splash例項,裡面可以實施渲染Lua指令碼,非常方便

② splash可以渲染Lua指令碼語言,支援的操作可參照官網文件,這裡舉例一般爬蟲需要的幾個功能:訪問網址、新增和獲取cookie, 輸入框,點選按鈕,新增代理等

lua = """
function main(splash, args)

barcode = args.barcode
splash:on_request( #Register a function to be called before each HTTP request.
function(request)
request:set_proxy{'36.112.xxx.xxx', 25030 , username=nil, password=nil, type='HTTP'}
end)
splash:add_cookie{"ASP.NET_SessionId", "wptayq45fqbkbu55defy3245", path="/", domain="xxx.xx.com",httpOnly=True,secure=False}

assert(splash:go(args.url))
assert(splash:wait(2))

return {
html = splash:html(),
png = splash:png(),
cookies = splash:get_cookies(),
har = splash:har(),
}
end
"""

因為使用scrapy-splash,所以我們不能用scrapy的方法來操作cookies或者使用代理,這些都需要通過Lua指令碼。

③ scrapy中使用yield SplashRequest
yield SplashRequest(url, endpoint='execute', args={'lua_source': lua,'barcode':barcode,'cookie':cookie},
cache_args=['lua_source'], callback=self.parse_data)
args裡帶上需要新增的cookie或者其他引數比如模擬登陸就帶上username和psw