2014-06-23 19 views
11

Sono molto nuovo in questo web crawling. Sto utilizzando crawler4j per eseguire la scansione dei siti Web. Sto raccogliendo le informazioni richieste eseguendo la scansione di questi siti. Il mio problema qui è che non ero in grado di eseguire la scansione del contenuto per il seguente sito. http://www.sciencedirect.com/science/article/pii/S1568494612005741. Voglio sottoporre a scansione le seguenti informazioni dal sito di cui sopra (Si prega di dare un'occhiata allo screenshot allegato).Scansione web (pagine abilitate Ajax/JavaScript) utilizzando java

enter image description here

Se si osserva lo screenshot allegato ha tre nomi (evidenziato in caselle rosse). Se fai clic su uno dei link vedrai un popup e quel popup contiene l'intera informazione su quell'autore. Voglio carpire le informazioni che ci sono in quel popup.

Sto utilizzando il seguente codice per eseguire la ricerca per indicizzazione del contenuto.

public class WebContentDownloader { 

private Parser parser; 
private PageFetcher pageFetcher; 

public WebContentDownloader() { 
    CrawlConfig config = new CrawlConfig(); 
    parser = new Parser(config); 
    pageFetcher = new PageFetcher(config); 
} 

private Page download(String url) { 
    WebURL curURL = new WebURL(); 
    curURL.setURL(url); 
    PageFetchResult fetchResult = null; 
    try { 
     fetchResult = pageFetcher.fetchHeader(curURL); 
     if (fetchResult.getStatusCode() == HttpStatus.SC_OK) { 
      try { 
       Page page = new Page(curURL); 
       fetchResult.fetchContent(page); 
       if (parser.parse(page, curURL.getURL())) { 
        return page; 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } finally { 
     if (fetchResult != null) { 
      fetchResult.discardContentIfNotConsumed(); 
     } 
    } 
    return null; 
} 

private String processUrl(String url) { 
    System.out.println("Processing: " + url); 
    Page page = download(url); 
    if (page != null) { 
     ParseData parseData = page.getParseData(); 
     if (parseData != null) { 
      if (parseData instanceof HtmlParseData) { 
       HtmlParseData htmlParseData = (HtmlParseData) parseData; 
       return htmlParseData.getHtml(); 
      } 
     } else { 
      System.out.println("Couldn't parse the content of the page."); 
     } 
    } else { 
     System.out.println("Couldn't fetch the content of the page."); 
    } 
    return null; 
} 

public String getHtmlContent(String argUrl) { 
    return this.processUrl(argUrl); 
} 
} 

Sono stato in grado di eseguire la scansione del contenuto dal collegamento/sito di cui sopra. Ma non ha le informazioni che ho segnato nelle caselle rosse. Penso che quelli siano i collegamenti dinamici.

  • La mia domanda è come posso eseguire la scansione del contenuto dal collegamento/sito Web di cui sopra ... ???
  • Come eseguire la ricerca per indicizzazione del contenuto da siti Web basati su Ajax/JavaScript ... ???

Per favore qualcuno può aiutarmi in questo.

Grazie & Saluti, Amar

+0

r u got soluzione per questo problema.? – BasK

+0

non so quale sia l'inizio e la fine. quindi puoi spiegare un breve codice e spiegare? – BasK

risposta

6

Ciao Ho trovato la soluzione alternativa con un'altra libreria. Ho usato Selinium WebDriver (org.openqa.selenium.WebDriver) libreria per estrarre il contenuto dinamico. Ecco il codice di esempio.

public class CollectUrls { 

private WebDriver driver; 

public CollectUrls() { 
    this.driver = new FirefoxDriver(); 
    this.driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 
} 

protected void next(String url, List<String> argUrlsList) { 
    this.driver.get(url); 
    String htmlContent = this.driver.getPageSource(); 
} 

Qui il "htmlContent" è quella richiesta. Per favore fatemi sapere se avete problemi ... ???

Grazie, Amar

+0

Grazie amar. puoi spiegarmi brevemente su di me – BasK

+0

@Amar, ho provato la stessa codifica e ho sostituito ** l'url ** con la pagina web dinamica che hai menzionato *** http: //www.sciencedirect.com/science/article/pii/S1568494612005741* **; Eppure non ha scansionato la pagina popup; Ha scansionato solo la pagina statica; La tua soluzione richiede un altro codice aggiuntivo? –

+0

Ciao Kumar, se usi crawler-4j non vedrai l'intero contenuto html (nemmeno il contenuto statico della pagina). Supponiamo ad esempio di usare il crawler-4j e prendere il contenuto html e cercare quei nomi (menzionati nella schermata). Non troverai quei nomi nel tuo contenuto html perché questi nomi renderanno in modo dinamico. Ma possiamo vedere quei nomi controllando quell'elemento. Quindi c'è una differenza quando si guarda l'origine della pagina e quando si ispeziona un elemento. Quindi, utilizzando questo driver web per selenio, possiamo ottenere il contenuto html (e lo stesso del contenuto dell'elemento ispezionato). – Amar

4

È presto detto, è Crawler4j crawler statica. Significa che non può analizzare il JavaScript su una pagina. Quindi non c'è modo di ottenere il contenuto che desideri eseguendo la scansione di quella pagina specifica che hai menzionato. Ovviamente ci sono alcuni workaround per farlo funzionare.

Se è solo la pagina che si desidera sottoporre a scansione, è possibile utilizzare un debugger di connessione. Dai un'occhiata a this question per alcuni strumenti. Scopri la pagina che la richiesta AJAX chiama e scansiona quella pagina.

Se si dispone di vari siti Web con contenuto dinamico (JavaScript/ajax), è consigliabile utilizzare un crawler abilitato al contenuto dinamico, ad esempio Crawljax (scritto anche in Java).

+0

il contenuto dinamico include gmail? Crawljax sarebbe, teoricamente, in grado di gestirlo? – Thufir

+0

In teoria si.In pratica dovresti fare un sacco di ottimizzazioni e modifiche per farlo funzionare a una velocità ragionevole. Se vuoi raschiare le mail, prova a guardare https://developers.google.com/gmail/ – Erwin

+0

@pyerwin, https://github.com/crawljax/crawljax/issues/3 Questa funzione è davvero aggiunto in Crawljax? Il problema precedente è ** Chiuso ** non ** Risolto **, quindi ho avuto questo dubbio –

1
I have find out the Solution of Dynamic Web page Crawling using Aperture and Selenium.Web Driver. 
Aperture is Crawling Tools and Selenium is Testing Tools which can able to rendering Inspect Element. 

1. Extract the Aperture- core Jar file by Decompiler Tools and Create a Simple Web Crawling Java program. (https://svn.code.sf.net/p/aperture/code/aperture/trunk/) 
2. Download Selenium. WebDriver Jar Files and Added to Your Program. 
3. Go to CreatedDataObjec() method in org.semanticdesktop.aperture.accessor.http.HttpAccessor.(Aperture Decompiler). 
Added Below Coding 

    WebDriver driver = new FirefoxDriver(); 
    String baseurl=uri.toString(); 
    driver.get(uri.toString()); 
    String str = driver.getPageSource(); 
     driver.close(); 
stream= new ByteArrayInputStream(str.getBytes());