2014-06-17 13 views
7

Có thể xem tất cả các URI của một URL cụ thể (trang web) bằng cách sử dụng selenium không?

Mục tiêu của tôi là khởi chạy trình duyệt firefox bằng selen với một URL đã cho tôi chọn (tôi biết cách làm điều đó nhờ trang web này), và sau đó để firefox duyệt tất cả các trang mà URL (trang web) có. Tôi đánh giá cao bất kỳ gợi ý/trợ giúp về cách làm điều đó trong Python.Làm cách nào để duyệt toàn bộ trang web bằng selen?

+2

Bạn có thực sự cần theo tất cả các liên kết trên một trang web không? Động lực là gì? Bạn muốn loại dữ liệu nào ra khỏi trang web? Có cho phép thu thập thông tin trên web cho trang web không? Nó có cung cấp một API không? Điều gì về các liên kết bên ngoài đi đến các tên miền khác nhau? Tại sao bạn cần một trình duyệt thực (selenium)? Cảm ơn. – alecxe

+0

Và 'duyệt toàn bộ một trang web' có nghĩa là gì? Bạn đang tìm kiếm chỉ cho HTML, hoặc bạn cần JavaScript, CSS, hình ảnh, phông chữ và tải xuống quá? Làm thế nào để bạn mong đợi để tương tác với 'siêu trình thu thập thông tin' này từ Python? Nói cách khác: bạn đang cố giải quyết vấn đề gì ở đây? –

+1

Tôi tin rằng Selenium không phải là công cụ thích hợp cho việc này. Selenium nhằm mục đích cung cấp cho bạn khả năng thực hiện kiểm tra tự động thông qua giao diện người dùng. Nếu bạn cần một trình thu thập thông tin, hãy xem ít nhất tại http://www.portent.com/blog/random/python-web-crawler-code.htm hoặc viết của riêng bạn. – olyv

Trả lời

4

Bạn có thể sử dụng phương pháp đệ quy trong lớp như lớp dưới đây để thực hiện việc này.

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

Hy vọng điều này sẽ giúp bạn.

+1

Tôi đoán bạn đã lập trình nó trong Java. Tôi sẽ cố gắng dịch nó sang Python. –

+2

nó hoạt động ổn trong java. truy cập tất cả các liên kết trong trang web. – Sighil

+0

Chương trình này cũng đang đếm các liên kết bên ngoài vào trang web. Làm thế nào tôi có thể tránh điều đó? Tôi muốn duyệt tất cả các trang của cùng một trang web, không có liên kết bên ngoài. –

0

API Selenium cung cấp tất cả các thiết bị mà bạn có thể thực hiện các thao tác khác nhau như gõ, bấm, goto, điều hướngĐể chuyển giữa các khung, kéo và thả, v.v. Điều bạn đang hướng đến là duyệt web đơn giản, nhấp và cung cấp URls khác nhau trong trang web, nếu tôi hiểu đúng. Ya, bạn chắc chắn có thể làm điều đó thông qua trình duyệt web Selenium. Và bạn có thể tạo một tệp thuộc tính để dễ dàng hơn và sẵn sàng hơn khi bạn có thể chuyển các thuộc tính khác nhau như URL, Base URI, vv và thực hiện kiểm tra tự động thông qua Selenium Webdriver trong các trình duyệt khác nhau.

+0

Tôi có thể phát hiện bằng cách sử dụng 'selenium' các URI trong một URL nhất định (duyệt web, như bạn đã nói) không? –

2

Như Khyati đề cập đến nó là có thể, tuy nhiên, selen không phải là một webcrawler hoặc robot. Bạn phải biết bạn đang thử nghiệm ở đâu/những gì.

Nếu bạn thực sự muốn đi xuống con đường đó, tôi khuyên bạn nên nhấn trang, kéo tất cả các phần tử và sau đó lặp lại để nhấp vào bất kỳ yếu tố nào tương ứng với chức năng điều hướng (tức là "// a" hoặc nhấp vào siêu liên kết).

Mặc dù nếu bạn đi xuống đường dẫn này và có một trang mở một trang khác thì có một liên kết ngược lại bạn muốn giữ một danh sách tất cả các URL đã truy cập và đảm bảo rằng bạn không trùng lặp một trang như vậy.

Điều này sẽ hiệu quả, nhưng cũng sẽ đòi hỏi một chút logic trong đó để làm cho nó xảy ra ... và bạn có thể thấy mình trong một vòng lặp vô tận nếu bạn không cẩn thận.

+0

Cảm ơn bạn. Có vẻ như khó khăn ... –

0

Điều này là có thể. Tôi đã thực hiện điều này bằng cách sử dụng Java webdriver và URI. Điều này chủ yếu được tạo ra để xác định các liên kết bị hỏng.

Sử dụng "getElements" có thẻ có thể sử dụng trình quản trị web khi mở và lưu giá trị "href".

Kiểm tra tất cả trạng thái liên kết bằng cách sử dụng lớp URL của java và Đặt nó trong ngăn xếp.

Sau đó, liên kết pop từ ngăn xếp và liên kết "nhận" bằng Trình quản lý web. Một lần nữa nhận được tất cả các liên kết từ trang loại bỏ các liên kết trùng lặp có mặt trong ngăn xếp.

Lặp lại bước này cho đến khi ngăn xếp trống.

Bạn có thể cập nhật nó theo yêu cầu của bạn. Chẳng hạn như các cấp độ vượt qua, ngoại trừ các liên kết khác không có miền của trang web đã cho, v.v.

Vui lòng nhận xét nếu bạn đang gặp khó khăn trong việc triển khai.

+0

Nếu tôi khởi chạy firefox với mỗi URI thông qua 'get', sẽ không đóng băng firefox và sẽ không phản hồi? –

+0

@begueradj bạn không khởi tạo/khởi động trình duyệt bạn chỉ cần mở url trong trình duyệt và sau đó sử dụng trang để lấy URL. – lAH2iV

+0

Mục đích của tôi là firefox duyệt qua tất cả các URI của URL –

0

Tôi biết bạn đã yêu cầu một ví dụ python, nhưng tôi chỉ đang ở giữa thiết lập một o đại diện đơn giản để kiểm tra thước đo góc và nhiệm vụ bạn muốn thực hiện có vẻ rất dễ làm với thước đo góc (chỉ là một wrapper xung quanh webdriver)

đây là mã trong 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(); 

    }); 
    }); 

}); 

Bạn có thể sao chép các repo từ here

Lưu ý: tôi biết thước đo có lẽ không phải là công cụ tốt nhất cho nó, nhưng nó thật đơn giản e để làm điều đó với nó mà tôi chỉ cung cấp cho nó một thử.

Tôi đã thử nghiệm tính năng này bằng firefox (bạn có thể sử dụng nhánh firefox-conf cho nó, nhưng nó sẽ yêu cầu bạn kích hoạt trình duyệt web theo cách thủ công) và chrome. Nếu bạn đang sử dụng osx, thao tác này sẽ không hoạt động (giả sử bạn đã cài đặt nodej)

Các vấn đề liên quan