1. 程式人生 > >利用scrapy-splash爬取JS生成的動態頁面

利用scrapy-splash爬取JS生成的動態頁面

目前,為了加速頁面的載入速度,頁面的很多部分都是用JS生成的,而對於用scrapy爬蟲來說就是一個很大的問題,因為scrapy沒有JS engine,所以爬取的都是靜態頁面,對於JS生成的動態頁面都無法獲得。

解決方案:

  • 利用第三方中介軟體來提供JS渲染服務: scrapy-splash 等。
  • 利用webkit或者基於webkit庫

Splash是一個Javascript渲染服務。它是一個實現了HTTP API的輕量級瀏覽器,Splash是用Python實現的,同時使用Twisted和QT。Twisted(QT)用來讓服務具有非同步處理能力,以發揮webkit的併發能力。

下面就來講一下如何使用scrapy-splash:

  1. 利用pip安裝scrapy-splash庫:
    $ pip install scrapy-splash
  2. scrapy-splash使用的是Splash HTTP API, 所以需要一個splash instance,一般採用docker執行splash,所以需要安裝docker
  3. 安裝docker, 安裝好後執行docker。
  4. 拉取映象(pull the image):
    $ docker pull scrapinghub/splash
  5. 用docker執行scrapinghub/splash:
    $ docker run -p 8050:8050 scrapinghub/splash
  6. 配置splash服務(以下操作全部在settings.py):

    1)新增splash伺服器地址:

    SPLASH_URL = 'http://localhost:8050'  

    2)將splash middleware新增到DOWNLOADER_MIDDLEWARE中:

    DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
    }

    3)Enable SplashDeduplicateArgsMiddleware:

    SPIDER_MIDDLEWARES = {
    'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
    }

    4)Set a custom DUPEFILTER_CLASS:

    DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'

    5)a custom cache storage backend:

    HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
  7. 例子
    獲取HTML內容:

import scrapy
from scrapy_splash import SplashRequest

class MySpider(scrapy.Spider):
    start_urls = ["http://example.com", "http://example.com/foo"]

    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(url, self.parse, args={'wait': 0.5})

    def parse(self, response):
        # response.body is a result of render.html call; it
        # contains HTML processed by a browser.
        # ...        

相關推薦

利用scrapy-splashJS生成動態頁面

目前,為了加速頁面的載入速度,頁面的很多部分都是用JS生成的,而對於用scrapy爬蟲來說就是一個很大的問題,因為scrapy沒有JS engine,所以爬取的都是靜態頁面,對於JS生成的動態頁面都無法獲得。 解決方案: 利用第三方中介軟體來提供JS渲染服務: scrapy-splash 等。 利用webk

scrapy利用scrapy-splashJS動態生成的標籤

1 引言 scrapy處理爬取靜態頁面,可以說是很好的工具,但是隨著技術的發展,現在很多頁面都不再是靜態頁面了,都是通過AJAX非同步載入資料動態生成的,我們如何去解決問題呢?今天給大家介紹一種方法:scrapy-splash 2 準備工作 首先需要安裝一下幾個工具 (1)

利用htmlunit和jsoup來實現js動態網頁實踐(執行js)

更新,這就尷尬了,這篇文章部落格閱讀文章最多,但是被踩得也最多。 爬取思路: 所謂動態,就是通過請求後臺,可以動態的改變相應的html頁面,頁面並不是一開始就全部展現出來的。 大部分操作都是通過請求完成的,一次請求,一次返回。而在大多數網頁中請求往往都被開發者隱藏在了js程

利用scrapy框架百度閱讀書籍資訊

專案需求:爬取百度閱讀的榜單圖書的資訊,如:書名、評分、作者、出版方、標籤、價格,生成一個csv檔案。 專案的大致流程:建立spider工程專案,建立spider爬蟲,定義相關欄位,分析頁面資訊...... 由於scpapy框架,之間存在相互聯絡,針對此專案不同的檔案

Scrapy+Splash京東python書本資訊(遇到的問題記錄)

今天用splash進行京東的圖書的爬蟲。有了以下幾點的錯誤總結: (1)按照參考書上的方式,寫好lua_script檔案。但是自己在lua_script檔案後面加了幾個中文註釋,結果執行時一直出錯,後來意識到了問題,將這些中文註釋給刪除了,這時候才沒有提示剛剛出現的錯誤。

利用scrapy輕鬆招聘網站資訊並存入MySQL

前言 Scrapy版本:1.4; Python版本:3.6; OS:win10; 本文完整專案程式碼:完整示例; 本文目標: 通過爬取騰訊招聘網站招聘崗位,熟悉scrapy,並掌握資料庫儲存操作; 一、準備工作 ♣   基礎工作 首先你要安裝S

Scrapy-Splash淘寶排行榜(三)

五 寫spider 1.知道了要爬取的內容,所以,我們首先在start_urls中設定如下: start_urls=['https://top.taobao.com/index.php?topId=TR_FS&leafId=50010850'

(python解析jsscrapy結合ghost抓js生成頁面,以及js變數的解析

現在頁面用ajax的越來越多, 好多程式碼是通過js執行結果顯示在頁面的(比如:http://news.sohu.com/scroll/,搜狐滾動新聞的列表是在頁面請求時由後臺一次性將資料渲染到前臺js變數newsJason和arrNews裡面的,然後再由js生

利用scrapy框架網易新聞排行榜

wyxw.py中程式碼 # -*- coding: utf-8 -*- import scrapy from ..items import WyxwItem class WyxwSpider(scrapy.Spider): name = 'wyxw' al

(python解析js)selenium結合phantomjs抓js生成頁面

,有些網頁是在載入時動態建立HTML內容,只要在js程式碼完全執行完後才會顯示最終結果。如果用傳統的方法抓取頁面,就只能獲得js程式碼執行之前頁面上的內容。 要解決這個問題有兩種方法: 1.直接從js程式碼中抓取資料(執行js程式碼,解析js變數)。

JS動態生成的URL

愛卡汽車論壇搜尋結果頁面: 想要python爬取搜尋結果連結:a標籤中的href,但是這個url是動態生成的。 網頁原始碼: 用普通方式解析: import urllib.request url = "http://search.xcar.com.cn/metasea

scrapy-splash動態數據例子八

ear .config war rep ont code port 動態數據 shm 一、介紹     本例子用scrapy-splash抓取界面網站給定關鍵字抓取咨詢信息。     給定關鍵字:個性化;融合;電視     抓取信息內如下:       1、資訊標題

scrapy-splash動態數據例子十一

tel ems 網站 tput findall spi 來源 標題 end   一、介紹     本例子用scrapy-splash抓取活動樹網站給定關鍵字抓取活動信息。     給定關鍵字:數字;融合;電視     抓取信息內如下:       1、資訊標題  

scrapy實戰:scrapy-splash動態資料

scrapy實戰:scrapy-splash抓取動態資料 docker安裝 拉取scrapinghub/splash映象 啟動Splash 安裝 scrapy-splash 新建taobao spider專案 settings.py

selenium+chromedrive js載入的動態網頁(下拉才能顯示內容)

from selenium import webdriver from selenium.webdriver.common.keys import Keys #呼叫鍵盤操作 from selenium.webdriver.chrome.options import Opt

scrapy爬蟲動態網站

爬取360圖片上的美女圖片 360圖片網站上的圖片是動態載入的,動態載入 就是通過ajax請求介面拿到資料喧染在網頁上。我們就可以通過遊覽器的開發者工具分析,在我們向下拉動視窗時就會出現這麼個請求,如圖所示: 所以就判定這個url就是ajax請求的介面:

Python爬蟲:Selenium+ BeautifulSoup JS渲染的動態內容(雪球網新聞)

爬取目標:下圖中紅色方框部分的文章內容。(需要點選每篇文章的連結才能獲得文章內容) 注:該文章僅介紹爬蟲爬取新聞這一部分,爬蟲語言為Python。  乍一看,爬蟲的實現思路很簡單: (2)通過第一步所獲得的各篇文章的URL,抓取文章內容。 但是發現簡單使用urlli

scrapy-splash動態資料例子一

  目前,為了加速頁面的載入速度,頁面的很多部分都是用JS生成的,而對於用scrapy爬蟲來說就是一個很大的問題,因為scrapy沒有JS engine,所以爬取的都是靜態頁面,對於JS生成的動態頁面都無法獲得   解決方案:   1、利用第三方中介軟體來提供JS渲染服務: scrapy-splash 等

Python爬蟲scrapy框架動態網站——scrapy與selenium結合資料

 scrapy框架只能爬取靜態網站。如需爬取動態網站,需要結合著selenium進行js的渲染,才能獲取到動態載入的資料。如何通過selenium請求url,而不再通過下載器Downloader去請求這個url?方法:在request物件通過中介軟體的時候,在中介軟體內部開始

pythonJS動態網頁完整指南(selenium+chrome headless)

11.23:更新,每次還要開啟瀏覽器多影響執行效率,看到蟲師講了chrome headless,非常好用 引用新增: from selenium.webdriver.chrome.options import Options 程式碼新增: chrome_options =