溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JS自動(dòng)渲染之Scrapy_splash組件怎么用

發(fā)布時(shí)間:2021-09-01 14:48:57 來源:億速云 閱讀:136 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下JS自動(dòng)渲染之Scrapy_splash組件怎么用,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

    1. 什么是scrapy_splash?

    scrapy_splashscrapy的一個(gè)組件

    • scrapy-splash加載js數(shù)據(jù)是基于Splash來實(shí)現(xiàn)的。

    • Splash是一個(gè)Javascript渲染服務(wù)。它是一個(gè)實(shí)現(xiàn)了HTTP API的輕量級瀏覽器,Splash是用Python和Lua語言實(shí)現(xiàn)的,基于Twisted和QT等模塊構(gòu)建。

    • 使用scrapy-splash最終拿到的response相當(dāng)于是在瀏覽器全部渲染完成以后的網(wǎng)頁源代碼。

    splash官方文檔 https://splash.readthedocs.io/en/stable/

    2. scrapy_splash的作用

    scrapy-splash能夠模擬瀏覽器加載js,并返回js運(yùn)行后的數(shù)據(jù)

    3. scrapy_splash的環(huán)境安裝

    3.1 使用splash的docker鏡像

    splash的dockerfile https://github.com/scrapinghub/splash/blob/master/Dockerfile

    觀察發(fā)現(xiàn)splash依賴環(huán)境略微復(fù)雜,所以我們可以直接使用splash的docker鏡像

    如果不使用docker鏡像請參考splash官方文檔 安裝相應(yīng)的依賴環(huán)境

    3.1.1 安裝并啟動(dòng)docker服務(wù)

    安裝參考 http://kemok4.com/article/213611.htm

    3.1.2 獲取splash的鏡像

    在正確安裝docker的基礎(chǔ)上pull取splash的鏡像

    sudo docker pull scrapinghub/splash

    3.1.3 驗(yàn)證是否安裝成功

    運(yùn)行splash的docker服務(wù),并通過瀏覽器訪問8050端口驗(yàn)證安裝是否成功

    • 前臺運(yùn)行 sudo docker run -p 8050:8050 scrapinghub/splash

    • 后臺運(yùn)行 sudo docker run -d -p 8050:8050 scrapinghub/splash

    訪問http://127.0.0.1:8050 看到如下截圖內(nèi)容則表示成功

    JS自動(dòng)渲染之Scrapy_splash組件怎么用

    3.1.4 解決獲取鏡像超時(shí):修改docker的鏡像源

    以ubuntu18.04為例

    1.創(chuàng)建并編輯docker的配置文件

    sudo vi /etc/docker/daemon.json

    2.寫入國內(nèi)docker-cn.com的鏡像地址配置后保存退出

    { 
    "registry-mirrors": ["https://registry.docker-cn.com"] 
    }

    3.重啟電腦或docker服務(wù)后重新獲取splash鏡像

    4.這時(shí)如果還慢,請使用手機(jī)熱點(diǎn)(流量orz)

    3.1.5 關(guān)閉splash服務(wù)

    需要先關(guān)閉容器后,再刪除容器

    sudo docker ps -a
    sudo docker stop CONTAINER_ID
    sudo docker rm CONTAINER_ID

    3.2 在python虛擬環(huán)境中安裝scrapy-splash包

    pip install scrapy-splash

    4. 在scrapy中使用splash

    以baidu為例

    4.1 創(chuàng)建項(xiàng)目創(chuàng)建爬蟲

    scrapy startproject test_splash
    cd test_splash
    scrapy genspider no_splash baidu.com
    scrapy genspider with_splash baidu.com

    4.2 完善settings.py配置文件

    settings.py文件中添加splash的配置以及修改robots協(xié)議

    # 渲染服務(wù)的url
    SPLASH_URL = 'http://127.0.0.1:8050'
    # 下載器中間件
    DOWNLOADER_MIDDLEWARES = {
        'scrapy_splash.SplashCookiesMiddleware': 723,
        'scrapy_splash.SplashMiddleware': 725,
        'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
    }
    # 去重過濾器
    DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
    # 使用Splash的Http緩存
    HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
    
    # Obey robots.txt rules
    ROBOTSTXT_OBEY = False

    4.3 不使用splash

    spiders/no_splash.py中完善

    import scrapy
    
    class NoSplashSpider(scrapy.Spider):
        name = 'no_splash'
        allowed_domains = ['baidu.com']
        start_urls = ['https://www.baidu.com/s?wd=13161933309']
    
        def parse(self, response):
            with open('no_splash.html', 'w') as f:
                f.write(response.body.decode())

    4.4 使用splash

    import scrapy
    from scrapy_splash import SplashRequest # 使用scrapy_splash包提供的request對象
    
    class WithSplashSpider(scrapy.Spider):
        name = 'with_splash'
        allowed_domains = ['baidu.com']
        start_urls = ['https://www.baidu.com/s?wd=13161933309']
    
        def start_requests(self):
            yield SplashRequest(self.start_urls[0],
                                callback=self.parse_splash,
                                args={'wait': 10}, # 最大超時(shí)時(shí)間,單位:秒
                                endpoint='render.html') # 使用splash服務(wù)的固定參數(shù)
    
        def parse_splash(self, response):
            with open('with_splash.html', 'w') as f:
                f.write(response.body.decode())

    4.5 分別運(yùn)行倆個(gè)爬蟲,并觀察現(xiàn)象

    4.5.1 分別運(yùn)行倆個(gè)爬蟲

    scrapy crawl no_splash
    scrapy crawl with_splash

    4.5.2 觀察獲取的倆個(gè)html文件

    不使用splash

    JS自動(dòng)渲染之Scrapy_splash組件怎么用

    使用splash

    JS自動(dòng)渲染之Scrapy_splash組件怎么用

    4.6 結(jié)論

    • splash類似selenium,能夠像瀏覽器一樣訪問請求對象中的url地址

    • 能夠按照該url對應(yīng)的響應(yīng)內(nèi)容依次發(fā)送請求

    • 并將多次請求對應(yīng)的多次響應(yīng)內(nèi)容進(jìn)行渲染

    • 最終返回渲染后的response響應(yīng)對象

    5. 了解更多

    關(guān)于splash http://kemok4.com/article/219166.htm

    關(guān)于scrapy_splash(截屏,get_cookies等) https://www.e-learn.cn/content/qita/800748

    6. 小結(jié)

    1.scrapy_splash組件的作用

    • splash類似selenium,能夠像瀏覽器一樣訪問請求對象中的url地址

    • 能夠按照該url對應(yīng)的響應(yīng)內(nèi)容依次發(fā)送請求

    • 并將多次請求對應(yīng)的多次響應(yīng)內(nèi)容進(jìn)行渲染

    • 最終返回渲染后的response響應(yīng)對象

    2.scrapy_splash組件的使用

    • 需要splash服務(wù)作為支撐

    • 構(gòu)造的request對象變?yōu)閟plash.SplashRequest

    • 以下載中間件的形式使用

    • 需要scrapy_splash特定配置

    3.scrapy_splash的特定配置

    SPLASH_URL = 'http://127.0.0.1:8050'
    DOWNLOADER_MIDDLEWARES = {
        'scrapy_splash.SplashCookiesMiddleware': 723,
        'scrapy_splash.SplashMiddleware': 725,
        'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
    }
    DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
    HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

    看完了這篇文章,相信你對“JS自動(dòng)渲染之Scrapy_splash組件怎么用”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    js
    AI