1. 程式人生 > 程式設計 >爬蟲進階-JS自動渲染之Scrapy_splash元件的使用

爬蟲進階-JS自動渲染之Scrapy_splash元件的使用

目錄
  • 1. 什麼是scrapy_splash?
  • 2. scrapy_splash的作用
  • 3. scrapy_splash的環境安裝
    • 3.1 使用splash的映象
    • 3.2 在虛擬環境中安裝scrapy-splash包
  • 4. 在scrapy中使用splash
    • 4.1 建立專案建立爬蟲
    • 4.2 完善settings.py配置檔案
    • 4.3 不使用splash
    • 4.4 使用splash
    • 4.5 分別執行倆個爬蟲,並觀察現象
    • 4.6 結論
  • 5. 瞭解更多
    • 6. 小結

      1. 什麼是scrapy_splash?

      scrapy_splashscrapy的一個元件

      • scrapy-splash載入資料是基於Splash來實現的。
      • Splash是一個渲染服務。它是一個實現了HTTP API的輕量級瀏覽器,Splash是用Python和Lua語言實現的,基於Twisted和QT等模組構建。
      • 使用scrapy-splash最終拿到的response相當於是在瀏覽器全部渲染完成以後的原始碼。

      splash官方文件 hthttp://www.cppcns.comtps://splash.readthedocs.io/en/stable/

      2. scrapy_splash的作用

      scrapy-splash能夠模擬瀏覽器載入js,並返回js執行後的資料

      3. scrapy_splash的環境安裝

      3.1 使用splash的docker映象

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

      觀察發現splash依賴環境略微複雜,所以我們可以直接使用splash的docker映象

      如果不使用docker映象請參考splash官方文件 安裝相應的依賴環境

      3.1.1 安裝並啟動docker服務

      安裝參考 https://www.jb51.net/article/213611.htm

      3.1.2 獲取splash的映象

      在正確安裝docker的基礎上pull取splash的映象

      sudo docker pull scrapinghub/splash

      3.1.3 驗證是否安裝成功

      執行splash的docker服務,並通過瀏覽器訪問8050埠驗證安裝是否成功

      • 前臺執行 sudo docker run -p 8050:8050 scrapinghub/splash
      • 後臺執行 sudo docker run -d -p 8050:8050 scrapinghub/splash

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

      在這裡插入圖片描述

      3.1.4 解決獲取映象超時:修改docker的映象源

      以ubuntu18.04為例

      1.建立並編輯docker的配置檔案

      sudo vi /etc/docker/daemon.json

      2.寫入國內docker-cn.com的映象地址配置後儲存退出

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

      3.重啟電腦或docwww.cppcns.comker服務後重新獲取splash映象

      4.這時如果還慢,請使用手機熱點(流量orz)

      3.1.5 關閉splash服務

      需要先關閉容器後,再刪除容器

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

      3.2 在python虛擬環境中安裝scrapy-splash包

      pip install scrapy-splash

      4. 在scrapy中使用splash

      以baidu為例

      4.1 建立專案建立爬蟲

      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協議

      # 渲染服務的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_splas客棧h.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},# 最大超時時間,單位:秒
                                  endpoint='render.html') # 使用splash服務的固定引數
      
          def parse_splash(self,response):
              with open('with_splash.html','w') as f:
                  f.write(response.body.decode())

      4.5 分別執行倆個爬蟲,並觀察現象

      4.5.1 分別執行倆個爬蟲

      scrapy crawl no_splash
      scrapy crawl with_splash

      4.5.2 觀察獲取的倆個html檔案

      不使用splash

      在這裡插入圖片描述

      使用splash

      在這裡插入圖片描述

      4.6 結論

      • splash類似selenium,能夠像瀏覽器一樣訪問請求物件中的url地址
      • 能夠按照該url對應的響應內容依次傳送請求
      • 並將多次請求對應的多次響應內容進行渲染
      • 最終返回渲染後的response響應物件

      5. 瞭解更多

      關於splash https://www.jb51.net/article/219166.htm

      關於scrapy_splash(截圖,get_cookies等) https://www.e-learn.cn/content/qita/800748

      6. 小結

      1.scrapy_splash元件的作用

      • splash類似selenium,能夠像瀏覽器一樣訪問請求物件中的url地址
      • 能夠按照該url對應的響應內容依次傳送請求
      • 並將多次請求對應的多次響應內容進行渲染
      • 最終返回渲染後的response響應物件

      2.scrapy_splash元件的使用

      • 需要splash服務作為支撐
      • 構造的request物件變為splash.SplashRequest
      • 以下載中介軟體的形式使用
      • 需要scrapy_splash特定配置

      3.scrapy_splash的特定配置

      SPLASH_URL = 'http://127.0.0.1:8050'
      DOWNLOADER_MIDDLEWARES = {
          'scrapy_splash.SplashCookiesMiddleware': 723,}
      DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
      HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

      到此這篇關於爬蟲進階-JS自動渲染之Scrapy_splash元件的使用的文章就介紹到這了,更多相關js Scrapy_splash元件使用內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!