如何使用硒浏览整个网站?
Posted
技术标签:
【中文标题】如何使用硒浏览整个网站?【英文标题】:How to browse a whole website using selenium? 【发布时间】:2014-08-07 02:39:58 【问题描述】:是否可以使用 selenium 浏览给定 URL(网站)的所有 URI? 我的目标是使用 selenium 和我选择的给定 URL 启动 firefox 浏览器(感谢这个网站,我知道该怎么做),然后让 firefox 浏览 URL(网站)拥有的所有页面。我感谢任何有关如何在 Python 中执行此操作的提示/帮助。
【问题讨论】:
您真的需要关注网站上的所有链接吗?动机是什么?您想从网站中获取什么样的数据?网站是否允许进行网络爬取?它提供 API 吗?指向不同域的外部链接呢?为什么需要真正的浏览器(selenium)?谢谢。 “浏览整个网站”在这里意味着什么?您是只寻找 html,还是需要 javascript、CSS、图像、字体和下载?您希望如何与 Python 中的这个“超级爬虫”进行交互?换句话说:你想在这里解决什么问题? 我相信 Selenium 不适合做这件事。 Selenium 旨在为您提供通过 UI 执行自动化测试的能力。如果您需要爬虫,请至少查看portent.com/blog/random/python-web-crawler-code.htm 或自己编写。 @olyv 但我的最终目标是让 firefox 在给定网站 (URL) 的所有页面 (URI) 中运行:您认为有比 selenium 更好的工具吗?跨度> @begueradj 另一种方法是编写一些 javascript 代码,然后将其保存到书签中。 【参考方案1】:您可以在如下所示的类中使用递归方法来执行此操作。
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();
希望对你有所帮助。
【讨论】:
我猜你已经用 Java 编写了它。我会试着把它翻译成 Python。 它在 java 中工作正常。访问网站中的所有链接。 这个程序也计算到网站的外部链接。我怎样才能避免这种情况?我想浏览同一个网站的所有页面,没有外部链接。 假设网站中的所有内部链接都遵循相同的模式,您可以设置一个条件来阻止代码点击外部链接。例如:如果您的网站是example.com,那么您的内部链接将在其网址中具有相同的内容。希望对你有帮助 这不是java
的问题。 OP询问python
中编写的解决方案。【参考方案2】:
正如 Khyati 所提到的,但是 selenium 可能不是网络爬虫或机器人。您必须知道要测试的位置/内容。
如果你真的想走这条路,我建议你点击页面,拉回所有元素,然后循环点击任何与导航功能相对应的元素(即“//a”或超链接点击) .
虽然如果你沿着这条路走,并且有一个页面打开另一个页面然后有一个返回链接,你会想要保留所有访问过的 URL 的列表,并确保你不会复制这样的页面。
这可行,但也需要一些逻辑才能实现......如果你不小心,你可能会发现自己陷入无限循环。
【讨论】:
【参考方案3】:我知道你要一个 python 示例,但我只是在为量角器测试设置一个简单的 rep o 的过程中,你想要完成的任务似乎很容易用量角器完成(这只是一个webdriver 的包装器)
这是javascript中的代码:
describe( '*** 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://***.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();
);
);
);
你可以从here克隆repo
注意:我知道量角器可能不是最好的工具,但使用它非常简单,我只是试了一下。
我使用 firefox(您可以使用 firefox-conf 分支,但它需要您手动触发 webdriver)和 chrome 对此进行了测试。如果您使用的是 osx,这应该没有问题(假设您安装了 nodejs)
【讨论】:
【参考方案4】:Selenium API 提供了所有工具,您可以通过这些工具执行各种操作,例如 type 、click 、 goto 、 navigateTo 、在帧之间切换、拖放等。 如果我理解正确的话,您的目标只是简单地浏览,点击并在网站内提供不同的网址。是的,你绝对可以通过 Selenium webdriver 做到这一点。 并且您可以制作一个属性文件,以便更好地方便和准备,您可以在其中传递不同的属性,如 URL、Base URI 等,并在不同的浏览器中通过 Selenium Webdriver 进行自动化测试。
【讨论】:
我可以使用selenium
检测给定 URL 中的 URI(如您所说的浏览)吗?【参考方案5】:
这是可能的。我已经使用 Java webdriver 和 URI 实现了这一点。这主要是为了识别损坏的链接。
使用带有标签的“getElements”可以使用webdriver一旦打开并保存“href”值。
使用 java 的 URL 类检查所有链接状态并将其放入堆栈。
然后从堆栈中弹出链接并使用 Webdriver “获取”链接。再次从页面中获取所有链接,删除堆栈中存在的重复链接。
循环直到堆栈为空。
您可以根据自己的要求对其进行更新。例如遍历的级别,不包括不具有给定网站域的其他链接等。
如果您在实施中遇到困难,请发表评论。
【讨论】:
如果我通过get
使用每个URI 启动firefox,firefox 不会冻结并且不会响应?
@begueradj 您没有初始化/启动浏览器,您只是在浏览器中打开网址,然后使用页面获取网址。
我的目标是Firefox浏览URL的所有URI
@begueradj 浏览意味着在浏览器中打开 - 因此打开 URL 的过程与浏览网站类似,因为我们是从网页中获取 URL,而不是直接添加。一旦尝试实施这种方法,如果您有任何不同的要求,请告诉我。以上是关于如何使用硒浏览整个网站?的主要内容,如果未能解决你的问题,请参考以下文章