爬蟲之splash_scrapy抓取js動態頁面

爬取京東商品信息

一、前期準備:

整個項目在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',
                }
            })

五、項目源碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章