爬取京東商品信息
一、前期準備:
整個項目在linux環境中運行的
1、splash 安裝
pip install scrapy-splash
2、docker安裝
scrapy-splash使用的是Splash HTTP API, 所以需要一個splash instance,一般採用docker運行splash,所以需要安裝docker
拉取鏡像:docker pull scrapinghub/splash
運行splash服務:docker run -p 8050:8050 scrapinghub/splash
二、scrapy_splash介紹:
Scrapy的強大之處。但是,Scrapy也有其不足之處,即Scrapy沒有JS engine, 因此它無法爬取JavaScript生成的動態網頁,只能爬取靜態網頁,而在現代的網絡世界中,大部分網頁都會採用JavaScript來豐富網頁的功能。所以,這無疑Scrapy的遺憾之處。scrapy-splash模塊主要使用了Splash. 所謂的Splash, 就是一個Javascript渲染服務。它是一個實現了HTTP API的輕量級瀏覽器,Splash是用Python實現的,同時使用Twisted和QT。Twisted(QT)用來讓服務具有異步處理能力,以發揮webkit的併發能力。
三、配置splash服務
在settings.py文件中設置
#splash服務器地址
SPLASH_URL = 'http://127.0.0.1:8050'
#支持cache_args
SPIDER_MIDDLEWARES = {
'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
#將splash middleware添加到DOWNLOADER_MIDDLEWARE中
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
# 設置去重過濾器
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
#啓用這個scrapy-splash的緩存系統
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
四、splash通過lua腳本實現js操作
Splash是通過Lua腳本來控制了頁面的加載過程的,加載過程完全模擬瀏覽器,最後可返回各種格式的結果,如網頁源碼和截圖等。
def start_requests(self):
# lua 語言寫的腳本
script = '''
function main(splash)
# 設置瀏覽器頁面的大小,及寬高
splash:set_viewport_size(1028, 10000)
# 打開頁面
splash:go(splash.args.url)
# 執行一條javascript語句模擬瀏覽器跳轉到頁面下方位置,從而達到完全加載商品的目的。
local scroll_to = splash:jsfunc("window.scrollTo")
scroll_to(0, 8000)
# 設置等待時間 等待渲染
splash:wait(3)
return {
# 獲取網頁源代碼
html = splash:html()
}
end
'''
for i in range(1, 101):
url = 'https://search.jd.com/Search?keyword=鮮花&enc=utf-8&qrst=1&rt=1&stop=1&spm=2.1.0&vt=2&page=' + str(i * 2 - 1)
yield SplashRequest(url, callback=self.start_parse, meta={
# 請求將不會重定向
'dont_redirect': True,
'splash': {
# 設置渲染參數
'args': {
'lua_source': script, 'images': 0
},
'endpoint': 'execute',
}
})