Python 如何使用selenium浏览整个网站?
是否可以使用以下命令检查给定URL(网站)的所有URI?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。是的,你完全可以通
我的目标是使用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旨在为您提供执行自动测试的能力