2017-06-08 3 views
2

Ich möchte einen allgemeinen Scraper machen, der alle Daten von jeder Art von Website einschließlich AJAX-Websites crawlen und abschaben kann. Ich habe das Internet ausgiebig durchsucht, konnte aber keinen richtigen Link finden, der mir erklären könnte, wie Scrapy und Splash zusammen AJAX-Websites abkratzen können (einschließlich Paginierung, Formulardaten und Klicken auf die Schaltfläche, bevor die Seite angezeigt wird). Jeder Link, den ich erwähnt habe, sagt mir, dass Javascript-Websites mit Splash gerendert werden können, aber es gibt kein gutes Tutorial/Erklärung über die Verwendung von Splash zum Rendern von JS-Websites. Bitte geben Sie mir keine Lösungen in Bezug auf die Verwendung von Browsern (Ich möchte alles programmgesteuert tun, kopflose Browservorschläge sind willkommen..aber ich möchte Splash verwenden).Wie scrape AJAX-basierte Websites mit Scrapy und Splash?

class FlipSpider(CrawlSpider): 
    name = "flip" 
    allowed_domains = ["www.amazon.com"] 

    start_urls = ['https://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=mobile'] 

    rules = (Rule(LinkExtractor(), callback='lol', follow=True), 

    def parse_start_url(self,response): 

     yield scrapy.Request(response.url, self.lol, meta={'splash':{'endpoint':'render.html','args':{'wait': 5,'iframes':1,}}}) 

    def lol(self, response): 
     """ 
     Some code 
+1

Haben Sie [splash doc] (https://github.com/scrapy-plugins/scrapy-splash#installation) befolgt? Was ist dein Problem genau? –

+0

Ja, habe ich getan. Splash Doc erwähnt nur die Befehle, die wir verwenden können. Ich will wissen, wie man sie benutzt, um das Javascript einer Webseite laufen zu lassen, um den dynamischen Inhalt zu bekommen ... – Rohan

+0

Gut, wenn Sie keine spezifische Frage oder ein Problem über Spritzen haben, kopiere ich das Dokument nicht ... Wenn Sie sich beziehen zu dem Dokument sollten Sie in der Lage sein, eine JavaScript-basierte Website zu crawlen –

Antwort

0

können Sie Verhalten emulieren, wie ein ckick oder scroll, durch eine JavaScript Funktion writting und indem ich Splash das Skript auszuführen, wenn es Ihre Seite macht.

Etwas exemple:

Sie definieren eine JavaScript Funktion, die ein Element in der Seite auswählt und dann Klicks darauf:

(Quelle: splash doc)

-- Get button element dimensions with javascript and perform mouse click. 
_script = """ 
function main(splash) 
    assert(splash:go(splash.args.url)) 
    local get_dimensions = splash:jsfunc([[ 
     function() { 
      var rect = document.getElementById('button').getClientRects()[0]; 
      return {"x": rect.left, "y": rect.top} 
     } 
    ]]) 
    splash:set_viewport_full() 
    splash:wait(0.1) 
    local dimensions = get_dimensions() 
    splash:mouse_click(dimensions.x, dimensions.y) 

    -- Wait split second to allow event to propagate. 
    splash:wait(0.1) 
    return splash:html() 
end 
""" 

Dann, wenn Sie request, ändern Sie die endpoint und setzen Sie es auf "execute", und Sie fügen "lua_script": _script zu args hinzu.

Exemple:

def parse(self, response): 
    yield SplashRequest(response.url, self.parse_elem, 
         endpoint="execute", 
         args={"lua_source": _script}) 

Sie alle Informationen über splash Scriptinghere

+0

Danke! Gute Erklärung. Ich habe mich gefragt, ob wir alle Javascripts auf einer Webseite mit scrapy + splash ausführen können. – Rohan

1

Das Problem mit Splash und Paginierung finden, ist folgende:

ich nicht in der Lage war, Produkt ein Lua-Skript, das eine neue Webseite liefert (nach dem Klick auf den Paginierungslink), die im Antwortformat ist. und nicht reines HTML.

Also, meine Lösung folgt - Klicken Sie auf den Link und extrahieren Sie diese neu generierte URL und leiten Sie einen Crawler auf diese neue URL.

Also, ich auf der Seite, die Paginierung Link habe ich ausführen

yield SplashRequest(url=response.url, callback=self.get_url, endpoint="execute", args={'lua_source': script}) 

mit folgenden Lua Script

def parse_categories(self, response): 
script = """ 
      function main(splash) 
       assert(splash:go(splash.args.url)) 
       splash:wait(1) 
       splash:runjs('document.querySelectorAll(".next-page")[0].click()') 
       splash:wait(1) 
       return splash:url() 
      end 
      """ 

und der GET_URL-Funktion

def get_url(self,response): 
    yield SplashRequest(url=response.body_as_unicode(), callback=self.parse_categories) 

Auf diese Weise konnte ich um meine Abfragen zu wiederholen.

Gleicher Weg, wenn Sie keine neue URL erwarten, kann Ihr Lua-Skript nur reines HTML produzieren, das Sie mit Regex arbeiten müssen (das ist schlecht) - aber das ist das Beste, was ich tun konnte.