scrapy-splash 爬取網頁
阿新 • • 發佈:2020-09-23
現在大部分網頁內容都是由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