2014-06-23 36 views
11

Tôi rất mới thu thập dữ liệu web này. Tôi đang sử dụng crawler4j để thu thập thông tin các trang web. Tôi đang thu thập thông tin được yêu cầu bằng cách thu thập thông tin các trang web này. Vấn đề của tôi ở đây là tôi không thể thu thập nội dung cho trang web sau. http://www.sciencedirect.com/science/article/pii/S1568494612005741. Tôi muốn thu thập thông tin sau từ trang web nói trên (Vui lòng xem ảnh chụp màn hình đính kèm).Thu thập thông tin web (các trang được bật Ajax/JavaScript) bằng cách sử dụng java

enter image description here

Nếu bạn quan sát các ảnh chụp màn hình kèm theo nó có ba tên (Nổi bật trong hộp màu đỏ). Nếu bạn nhấp vào một liên kết, bạn sẽ thấy cửa sổ bật lên và cửa sổ bật lên đó chứa toàn bộ thông tin về tác giả đó. Tôi muốn thu thập dữ liệu thông tin có trong cửa sổ bật lên đó.

Tôi đang sử dụng mã sau để thu thập nội dung.

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); 
} 
} 

Tôi có thể thu thập nội dung từ liên kết/trang web đã đề cập ở trên. Nhưng nó không có thông tin mà tôi đánh dấu trong các ô màu đỏ. Tôi nghĩ đó là những liên kết động.

  • Câu hỏi của tôi là làm cách nào để thu thập nội dung từ liên kết/trang web đã nói trên ... ???
  • Cách thu thập nội dung từ các trang web dựa trên Ajax/JavaScript ... ???

Bất kỳ ai cũng có thể giúp tôi về vấn đề này.

Cảm ơn & Kính trọng, Amar

+0

r u có giải pháp cho câu hỏi này.? – BasK

+0

tôi không biết cái nào đang bắt đầu và kết thúc. u có thể giải thích mã ngắn gọn và giải thích? – BasK

Trả lời

6

Xin chào, tôi đã tìm thấy giải pháp thay thế với thư viện khác. Tôi đã sử dụng thư viện Selinium WebDriver (org.openqa.selenium.WebDriver) để trích xuất nội dung động. Đây là mã mẫu.

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(); 
} 

Ở đây, "htmlContent" là yêu cầu. Vui lòng cho tôi biết nếu bạn gặp phải bất kỳ sự cố nào ... ???

Cảm ơn, Amar

+0

Cảm ơn amar. u có thể giải thích ngắn gọn về tôi – BasK

+0

@Amar, tôi đã thử mã hóa tương tự và thay thế ** url ** bằng trang web động mà bạn đã đề cập *** http: //www.sciencedirect.com/science/article/pii/S1568494612005741* **; Tuy nhiên, nó không thu thập dữ liệu trang popup; Nó chỉ thu thập dữ liệu trang tĩnh; Giải pháp của bạn có yêu cầu bất kỳ mã bổ sung nào khác không? –

+0

Hi Kumar, Nếu bạn sử dụng trình thu thập thông tin-4j bạn sẽ không thấy toàn bộ nội dung html (thậm chí không phải nội dung trang tĩnh). Ví dụ: sử dụng trình thu thập thông tin-4j và lấy nội dung html và tìm kiếm các tên đó (được đề cập trong ảnh chụp màn hình). Bạn sẽ không tìm thấy những tên đó trong nội dung html của bạn bởi vì những tên đó sẽ hiển thị theo cách năng động. Nhưng chúng ta có thể thấy những tên đó bằng cách kiểm tra yếu tố đó. Vì vậy, có một sự khác biệt khi bạn nhìn vào nguồn trang và khi bạn kiểm tra một phần tử. Vì vậy, bằng cách sử dụng trình điều khiển web selen này, chúng tôi có thể nhận được nội dung html (và giống như nội dung phần tử được kiểm tra). – Amar

4

Nói đơn giản, Crawler4j là bánh xích tĩnh. Có nghĩa là nó không thể phân tích cú pháp JavaScript trên một trang. Vì vậy, không có cách nào để lấy nội dung bạn muốn bằng cách thu thập dữ liệu trang cụ thể mà bạn đã đề cập. Tất nhiên có một số cách giải quyết để làm cho nó hoạt động.

Nếu chỉ là trang này bạn muốn thu thập thông tin, bạn có thể sử dụng trình gỡ lỗi kết nối. Hãy xem this question để biết một số công cụ. Tìm hiểu trang mà AJAX-yêu cầu gọi và thu thập dữ liệu trang đó.

Nếu bạn có nhiều trang web có nội dung động (JavaScript/ajax), bạn nên cân nhắc sử dụng trình thu thập thông tin hỗ trợ nội dung động, như Crawljax (cũng được viết bằng Java).

+0

có nội dung động bao gồm gmail không? Crawljax, về mặt lý thuyết, có thể xử lý điều đó? – Thufir

+0

Về mặt lý thuyết có.Trong thực tế, bạn sẽ phải làm rất nhiều tối ưu hóa và tinh chỉnh để làm cho nó làm việc ở một tốc độ hợp lý. Nếu bạn muốn xóa thư, tôi đoán, hãy thử xem https://developers.google.com/gmail/ – Erwin

+0

@pyerwin, https://github.com/crawljax/crawljax/issues/3 Tính năng này có thực sự không được thêm vào trong Crawljax? Vấn đề trên là ** Đóng ** không ** Cố định **, Vì vậy, tôi đã nghi ngờ này –

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()); 
Các vấn đề liên quan