Python 如何使用selenium浏览整个网站?

Python 如何使用selenium浏览整个网站?,python,firefox,selenium,selenium-webdriver,web-scraping,Python,Firefox,Selenium,Selenium Webdriver,Web Scraping,是否可以使用以下命令检查给定URL(网站)的所有URI? 我的目标是使用selenium和我选择的给定URL启动firefox浏览器(多亏了这个网站,我知道怎么做),然后让firefox浏览URL(网站)拥有的所有页面。我非常感谢您对如何在Python中执行此操作的任何提示/帮助。Selenium API提供了所有工具,您可以通过这些工具执行各种操作,如键入、单击、转到、导航、在帧之间切换、拖放等。 你的目标只是简单的浏览,如果我理解正确的话,点击并在网站内提供不同的URL。是的,你完全可以通

是否可以使用以下命令检查给定URL(网站)的所有URI?


我的目标是使用selenium和我选择的给定URL启动firefox浏览器(多亏了这个网站,我知道怎么做),然后让firefox浏览URL(网站)拥有的所有页面。我非常感谢您对如何在Python中执行此操作的任何提示/帮助。

Selenium API提供了所有工具,您可以通过这些工具执行各种操作,如键入、单击、转到、导航、在帧之间切换、拖放等。 你的目标只是简单的浏览,如果我理解正确的话,点击并在网站内提供不同的URL。是的,你完全可以通过SeleniumWebDriver来实现。
您还可以创建一个属性文件,以便更好地方便和准备,您可以在其中传递不同的属性,如URL、基本URI等,并在不同的浏览器中通过Selenium Webdriver进行自动化测试。

正如Khyati提到的,Selenium可能不是webcrawler或robot。你必须知道你要测试的地方/内容

如果你真的想沿着这条路走下去,我建议你点击页面,将所有元素拉回来,然后循环单击与导航功能相对应的任何元素(即“//a”或超链接单击)

虽然如果你沿着这条路径走,有一个页面打开了另一个页面,然后有一个链接回来,你会想保留一个所有访问过的URL的列表,并确保你不会重复这样的页面


这是可行的,但也需要一些逻辑来实现……如果不小心,您可能会发现自己陷入了一个无休止的循环。

您可以在下面给出的类中使用递归方法来实现这一点

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();
    }
}
公共类递归链接测试{
//保存已访问链接的列表
静态列表linkAlreadyVisited=newarraylist();
网络驱动程序;
公共递归链接测试(WebDriver){
this.driver=driver;
}
公共无效链接测试(){
//循环页面中的所有a元素
用于(WebElement链接:driver.findElements(按.tagName(“a”)){
//检查链接是否显示且以前未访问过
if(link.isDisplayed()
&&!linkAlreadyVisited.contains(link.getText())){
//将链接添加到已访问的链接列表
linkAlreadyVisited.add(link.getText());
System.out.println(link.getText());
//单击链接。这将打开一个新页面
link.click();
//在新页面上调用recursiveLinkTest
新的RecursiveLinkTest(驱动程序).linkTest();
}
}
driver.navigate().back();
}
公共静态void main(字符串[]args)引发InterruptedException{
WebDriver=newfirefoxdriver();
驱动程序。获取(“http://newtours.demoaut.com/");
//启动递归链接文本
新的RecursiveLinkTest(驱动程序).linkTest();
}
}

希望这对您有所帮助。

这是可能的。我已经使用Java webdriver和URI实现了这一点。这主要是为了识别断开的链接

一旦打开并保存“href”值,就可以使用webdriver获取带有标记的“getElements”

使用java的URL类检查所有链接状态,并将其放入堆栈中

然后从堆栈中弹出链接并使用Webdriver“获取”链接。再次从页面中获取所有链接删除堆栈中存在的重复链接

循环此操作,直到堆栈为空

您可以根据您的要求进行更新。例如,遍历级别,不包括没有给定网站域的其他链接等


如果你在执行中遇到困难,请评论。

< P>我知道你要求一个Python例子,但我正准备为量角器测试设置一个简单的Reo,你要完成的任务似乎很容易用量角器(这只是WebDrand的包装器)

以下是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();

    } );
  } );

} );
您可以从中克隆回购协议

注:我知道量角器可能不是最好的工具,但它是如此简单,我只是给它一个尝试


我用firefox(您可以使用firefox conf分支,但需要手动启动webdriver)和chrome进行了测试。如果您使用osx,这应该可以正常工作(假设您安装了nodejs)

我可以使用
selenium
检测给定URL中的URI吗(如您所说的浏览)?我想你已经用Java编程了。我会尝试将它翻译成Python。它在Java中工作正常。访问网站中的所有链接。这个程序还包括网站的外部链接。我如何避免这种情况?我想浏览同一网站的所有页面,没有外部链接。假设网站中的所有内部链接遵循相同的模式,您可以设置一个条件,阻止代码单击外部链接。例如:如果您的网站是,那么您的内部链接在其url中也会有相同的链接。希望这对您有所帮助。这不是一个
java
问题。OP询问的是用
python
编写的解决方案。您真的需要遵循所有的解决方案吗网站上的链接?动机是什么?你想从网站中获取什么样的数据?网站允许网络爬网吗?它提供API吗?外部链接到不同领域如何?为什么需要真正的浏览器(selenium)?谢谢。那么“浏览整个网站”在这里意味着什么呢?你是只寻找HTML,还是也需要JavaScript、CSS、图像、字体和下载?你希望如何与Python的“超级爬虫”交互?换句话说:你想解决什么问题?我相信Selenium不适合这个工具。Selenium旨在为您提供执行自动测试的能力