2012-09-20 22 views
25

Ho scritto molti scraper ma non sono veramente sicuro di come gestire gli scrollers infiniti. In questi giorni la maggior parte dei siti Web ecc., Facebook, Pinterest ha scrollers infiniti.Scrape siti Web con scorrimento infinito

+2

La soluzione migliore è utilizzare le API di quel sito, che sarà di gran lunga l'opzione più semplice e affidabile. Oltre a questo, dovrai elaborare JavaScript, che in pratica significa eseguire un browser completo - tali librerie esistono. –

+0

suona come una simulazione, puoi indicare alcuni esempi di gestione di jscript –

risposta

24

È possibile utilizzare il selenio per eliminare il sito Web a scorrimento infinito come Twitter o Facebook.

Fase 1: Installare Selenio usando pip

pip install selenium 

Fase 2: utilizzare il codice qui sotto per automatizzare scorrimento infinito e estrarre il codice sorgente

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.support.ui import Select 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.common.exceptions import TimeoutException 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.common.exceptions import NoSuchElementException 
from selenium.common.exceptions import NoAlertPresentException 
import sys 

import unittest, time, re 

class Sel(unittest.TestCase): 
    def setUp(self): 
     self.driver = webdriver.Firefox() 
     self.driver.implicitly_wait(30) 
     self.base_url = "https://twitter.com" 
     self.verificationErrors = [] 
     self.accept_next_alert = True 
    def test_sel(self): 
     driver = self.driver 
     delay = 3 
     driver.get(self.base_url + "https://stackoverflow.com/search?q=stckoverflow&src=typd") 
     driver.find_element_by_link_text("All").click() 
     for i in range(1,100): 
      self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 
      time.sleep(4) 
     html_source = driver.page_source 
     data = html_source.encode('utf-8') 


if __name__ == "__main__": 
    unittest.main() 

Passo 3: Stampare i dati, se necessario.

+0

Il ciclo significa che scorriamo verso il basso 100 volte? dove 100 è un numero scelto a caso. È giusto? –

+0

@satarupa Hai ragione il ciclo è scorrere verso il basso 100 volte –

20

La maggior parte dei siti che hanno lo scrolling infinito (come le note di Lattyware) hanno anche un'API corretta, e sarà probabilmente meglio servito usando questo piuttosto che lo scraping.

Ma se si deve raschiare ...

Tali siti utilizzano Javascript per richiedere contenuti aggiuntivi dal sito quando si raggiunge la parte inferiore della pagina. Tutto quello che devi fare è capire l'URL di quel contenuto aggiuntivo e puoi recuperarlo. È possibile calcolare l'URL richiesto controllando lo script, utilizzando la console Web di Firefox o utilizzando uno debug proxy.

Ad esempio, aprire la console Web di Firefox, disattivare tutti i pulsanti dei filtri tranne Rete e caricare il sito che si desidera analizzare. Vedrai tutti i file mentre vengono caricati. Scorri la pagina mentre guardi la console Web e vedrai gli URL utilizzati per le richieste aggiuntive. Quindi puoi richiedere tu stesso quell'URL e vedere in che formato sono i dati (probabilmente JSON) e inserirli nel tuo script Python.

+0

Puoi per favore dare un esempio concreto di come farlo? – tatsuhirosatou

+0

Ho aggiunto qualche dettaglio in più, spero che aiuti! – kindall

1

Trovare l'URL della fonte Ajax sarà l'opzione migliore ma può essere ingombrante per alcuni siti. In alternativa è possibile utilizzare un browser headless come QWebKit da PyQt e inviare eventi di tastiera durante la lettura dei dati dall'albero DOM. QWebKit ha una bella e semplice api.

Problemi correlati