2014-03-13 36 views
0

我有以下問題。 我正在使用jSoup從頁面中提取圖像(我正在嘗試下載漫畫),然後轉到下一頁,下載下一個圖像,等等......通常,我從一個按鈕中將URL提取到下一頁:從javascript函數中提取URL

<a href="2.html" class="btn next_page"><span></span>next page</a> 

但當漫畫結束的一章,當我點擊頁面上的按鈕,它重定向我下一章通過JavaScript:

<a href="javascript:void(0);" onclick="next_chapter()" class="btn next_page"><span></span>next page</a> 

有一些方法來提取鏈接到下一頁?之前有人向我建議Selenium,而我嘗試了幾次並失敗了。也許有人有任何建議?

好了,這裏是我的代碼片段:

while (endManga) { 

      Document doc = Jsoup.connect(link).get(); 
      String title = doc.title(); 
      System.out.println(title); 

      Element nextButtonDiv = doc.getElementById("top_center_bar"); 
      Elements nextButton = nextButtonDiv.select("a[href]"); 
      if (nextButton.isEmpty()) 
       endManga = true; 
      else { 
       Element nextLinkElement = nextButton 
         .get(nextButton.size() - 1); 

       String nextLink; 


       //here is the problem - at some point, when one chapter ends, 
       //there isn't link to the next one, only "onclick="next_chapter()"" javascript function 


       if (nextLinkElement.attr("href").length() < 10) 
        nextLink = nextLinkElement.attr("abs:href"); 
       else 
        nextLink = nextLinkElement.attr("href"); 

       link = nextLink; 
      } 
      Element content = doc.getElementById("viewer"); 
      Elements jpgs = content.select("img[src$=.jpg]"); 

      BufferedImage image = null; 

      if (jpgs.isEmpty()) { 
       System.out.println("empty!!"); 
       counterVolume++; 
      } else { 
       for (Element imageURL : jpgs) { 
        image = ImageIO.read(new URL(imageURL.attr("src"))); 
        ImageIO.write(image, "jpg", new File("manga/" 
          + counterVolume + "_" + counterPage++ + ".jpg")); 
        System.out.println("zgrane - volume: " + counterVolume 
          + " , page: " + counterPage); 
       } 
      } 
     } 

的,這裏是我的代碼,我在那裏用硒:

WebDriver driver = new HtmlUnitDriver(); 
    driver.get("link_to_page_with_javascript_function"); 
    WebElement element = driver.findElement(By.id("top_center_bar")); 
    List<WebElement> el = element.findElements(By.tagName("a")); 
    System.out.println(element.getTagName()); 

    for(WebElement e : el){ 
     if(e.getText().equals("next page")){ 
      //here I have the button, which clicked redirects me to next chapter 
      //how can I extract the link from this function?? 
      e.click(); 
     } 
    } 
+0

想要在點擊元素之前找出下一頁**的網址嗎? – Louis

+0

@Louis我的印象是,這個問題是特定於JavaScript而不是。對不起,如果這是錯誤的,隨時恢復,如果你認爲它是適當的。 – mafu

+0

我不想單擊它。我想在不打開瀏覽器的情況下獲取網址。我想從下一頁使用jSoup獲取鏈接以提取下一張圖片。我不知道你是否得到它;如果沒有,我會將代碼片段包含到我的應用程序中。 – Dess

回答

-2
<a href="link-to-the-next-page.html" onclick="next_chapter()" class="btn next_page"><span></span>next page</a> 

然後

var next_chapter = function next_chapter(ev){ 
    ev.preventDefault() ; 
    var linkToTheNextPAge = this.href ; 
    doSomething(linkToTheNextPAge) ; 
} 

的onclick會執行並且鏈接不會跟隨。 如果我是你,我會這樣做使用eventListener

+0

我不明白爲什麼我會收到反對票。當我發佈它時,在編輯原始問題之前,操作系統沒有指定足夠的內容,這是他目前正在詢問的問題以及編程方式的有效答案。 –

0

如果URL結構是一致的,你可以手動構建正確的URL,只要知道你已經擊中了本章的結尾,作爲你的特例提取算法。

if (endOfChapter) { 
    url = 'chapter-' + newChapterNum + '/1.html'; // first page of new chapter 
} 

我知道這是不是一個普遍的解決方案,但根據您的應用範圍也可能是你所需要的。

+0

不,不幸的是,它並不一致。 – Dess

0

我不認爲有一個簡單的解決方案,實際上不讓硒進行工作。但是,我看到這些可能性:

  1. 如果你看看源代碼,你可以理解JavaScript函數和Java中重塑它的運作。如果它從網絡加載某些東西,則可能需要查看點擊創建的流量。沒有你想得到的來源,我不能更具體。

  2. 使用Selenium和click(),就像你所做的那樣。然後從selenium中取回加載的URL。您正在查找的方法稱爲driver.getCurrentUrl()。當然,將頁面的源代碼(driver.getPageSource())反饋給JSoup並使用常規的JSoup方法可能更容易。