2014-06-17 10 views
7

È possibile esaminare tutti gli URI di un determinato URL (sito Web) utilizzando selenium?

Il mio obiettivo è quello di avviare il browser firefox utilizzando il selenio con un determinato URL di mia scelta (so come farlo grazie a questo sito Web), e quindi lasciare che Firefox esplori tutte le pagine che l'URL (sito Web) ha. Apprezzo qualsiasi suggerimento/aiuto su come farlo in Python.Come sfogliare un intero sito Web utilizzando il selenio?

+2

Hai davvero bisogno di seguire tutti i link su un sito web? Qual è la motivazione? Che tipo di dati vuoi ottenere dal sito web? È consentito il crawling del Web per il sito Web? Fornisce un'API? Che dire dei collegamenti esterni che vanno a domini diversi? Perché hai bisogno di un vero browser (selenio)? Grazie. – alecxe

+0

E cosa significa "sfogliare un intero sito" significa anche qui? Stai cercando solo l'HTML o hai bisogno anche di JavaScript, CSS, immagini, font e download? Come ti aspetti di interagire con questo "super crawler" di Python? In altre parole: quale problema stai cercando di risolvere qui? –

+1

Credo che il selenio non sia uno strumento appropriato per questo. Selenium ha lo scopo di fornire la possibilità di eseguire test automatizzati tramite interfaccia utente. Se hai bisogno di un crawler, dai un'occhiata a http://www.portent.com/blog/random/python-web-crawler-code.htm o scrivi il tuo. – olyv

risposta

4

È possibile utilizzare un metodo ricorsivo in una classe come quella indicata di seguito per eseguire questa operazione.

public class RecursiveLinkTest { 
    //list to save visited links 
    static List<String> linkAlreadyVisited = new ArrayList<String>(); 
    WebDriver driver; 

    public RecursiveLinkTest(WebDriver driver) { 
     this.driver = driver; 
    } 

    public void linkTest() { 
     // loop over all the a elements in the page 
     for(WebElement link : driver.findElements(By.tagName("a")) { 
      // Check if link is displayed and not previously visited 
      if (link.isDisplayed() 
         && !linkAlreadyVisited.contains(link.getText())) { 
       // add link to list of links already visited 
       linkAlreadyVisited.add(link.getText()); 
       System.out.println(link.getText()); 
       // click on the link. This opens a new page 
       link.click(); 
       // call recursiveLinkTest on the new page 
       new RecursiveLinkTest(driver).linkTest(); 
      } 
     } 
     driver.navigate().back(); 
    } 

    public static void main(String[] args) throws InterruptedException { 
     WebDriver driver = new FirefoxDriver(); 
     driver.get("http://newtours.demoaut.com/"); 
     // start recursive linkText 
     new RecursiveLinkTest(driver).linkTest(); 
    } 
} 

Spero che questo ti aiuti.

+1

Immagino che tu l'abbia programmato in Java. Proverò a tradurlo in Python. –

+2

funziona bene in java. visita tutti i link nel sito. – Sighil

+0

Questo programma conta anche i link esterni al sito web. Come posso evitarlo? Voglio sfogliare tutte le pagine dello stesso sito web, nessun collegamento esterno. –

0

L'API di selenio fornisce tutte le funzionalità tramite cui è possibile eseguire varie operazioni come tipo, clic, goto, navigazione, passaggio tra fotogrammi, trascinamento della selezione, ecc. Quello che si intende fare è semplicemente sfogliare in termini semplici, cliccando e fornendo diversi URL all'interno del sito web, se ho capito bene. Ya, puoi sicuramente farlo tramite il webdriver Selenium. E puoi creare un file di proprietà, per una maggiore facilità e prontezza dove-in puoi passare diverse proprietà come URL, Base URI, ecc. E fare i test di automazione tramite Selenium Webdriver in diversi browser.

+0

Posso rilevare usando "selenio" gli URI all'interno di un dato URL (sfogliare, come hai detto tu?)? –

2

Come menziona Khyati, tuttavia, il selenio non è un webcrawler o un robot. Devi sapere dove/cosa stai provando a testare.

Se vuoi davvero seguire questa strada ti consiglio di premere sulla pagina, tirare indietro tutti gli elementi e quindi scorrere per fare clic su qualsiasi elemento che corrisponda alla funzionalità di navigazione (ad esempio "// a" o clic del collegamento ipertestuale).

Anche se si va su questo percorso e c'è una pagina che apre un'altra pagina, allora ha un collegamento indietro che si desidera mantenere un elenco di tutti gli URL visitati e assicurarsi di non duplicare una pagina del genere.

Questo funzionerebbe, ma richiederebbe anche un po 'di logica per farlo accadere ... e potresti trovarti in un ciclo infinito se non stai attento.

+0

Grazie. Sembra difficile ... –

0

Questo è possibile. L'ho implementato utilizzando il webdriver e l'URI Java. Questo è stato principalmente creato per identificare i collegamenti interrotti.

L'utilizzo di "getElements" con tag può essere ottenuto utilizzando il webdriver una volta aperto e salvato il valore "href".

Controlla tutto lo stato del collegamento utilizzando la classe URL di java e Metti in pila.

Quindi inserire il collegamento dallo stack e il collegamento "Ottieni" utilizzando Webdriver. Ancora una volta ottenere tutti i collegamenti dalla pagina rimuovere i collegamenti duplicati che sono presenti nello stack.

Loop fino a quando la pila è vuota.

È possibile aggiornarlo in base alle proprie esigenze. Ad esempio i livelli di attraversamento, esclusi altri collegamenti che non hanno dominio del sito Web specificato ecc.

Si prega di commentare se si riscontrano difficoltà nell'implementazione.

+0

Se lancio Firefox con ogni URI tramite 'get', non firefox freeze e non risponderà? –

+0

@begueradj non stai inizializzando/avviando il browser stai solo aprendo l'url nel browser e poi usando la pagina per ottenere l'URL. – lAH2iV

+0

Il mio obiettivo è che Firefox esplori tutti gli URI dell'URL –

0

So che hai chiesto un esempio python, ma stavo proprio nel mezzo di creare una semplice rep per i test dei goniometri e l'attività che vuoi realizzare sembra essere molto facile da fare con il goniometro (che è solo un wrapper WebDriver)

ecco il codice in javascript:

describe('stackoverflow scrapping', function() { 
    var ptor = protractor.getInstance(); 

    beforeEach(function() { 
    browser.ignoreSynchronization = true; 
    }); 

    afterEach(function() { 

    }); 

    it('should find the number of links in a given url', function() { 
    browser.get('http://stackoverflow.com/questions/24257802/how-to-browse-a-whole-website-using-selenium'); 

    var script = function() { 
     var cb = arguments[ 0 ]; 
     var nodes = document.querySelectorAll('a'); 
     nodes = [].slice.call(nodes).map(function (a) { 
     return a.href; 
     }); 
     cb(nodes); 
    }; 

    ptor.executeAsyncScript(script).then(function (res) { 
     var visit = function (url) { 
     console.log('visiting url', url); 
     browser.get(url); 
     return ptor.sleep(1000); 
     }; 

     var doVisit = function() { 
     var url = res.pop(); 
     if (url) { 
      visit(url).then(doVisit); 
     } else { 
      console.log('done visiting pages'); 
     } 
     }; 

     doVisit(); 

    }); 
    }); 

}); 

è possibile clonare il repo da here

Nota: lo so goniometro non è probabilmente il miglior strumento per esso, ma era così semplice e per farcela, ci provo.

Ho provato questo con firefox (è possibile utilizzare il ramo firefox-conf per questo, ma richiede di licenziare manualmente il webdriver) e chrome. Se stai usando osx, questo dovrebbe funzionare senza problemi (presumendo che tu abbia installato nodejs)

Problemi correlati