最简单的方法是"浏览"页面并使用Java提交表单

use*_*236 13 html java httprequest web-scraping headless-browser

我需要做的是浏览网页,登录,然后浏览到该网站上需要您登录的另一个网页,因此需要保存cookie.之后,我需要单击该页面上的一个元素,我将在其中填写表单并获取网页返回给我的消息.我需要实际进入页面并单击按钮的原因只是直接导航到链接是因为每次登录时都会为您分配一个会话ID并单击该链接,并且它始终不同.按钮看起来像这样,它不是正常的href链接:

<span id=":tv" idlink="" class="sA" tabindex="0" role="link">Next</span>
Run Code Online (Sandbox Code Playgroud)

无论如何,最简单的方法是什么?谢谢.

更新:在尝试了HTMLunit和其他无头浏览器库之后,它似乎并没有使用任何"无头"的东西.我最近发现的关于这个页面的另一件事是,所有HTML都是以某种奇怪的格式......它都在一个脚本标签内.这是一个例子.

"?ui\x3d2\x26view\x3dss\x26mset\x3dmain\x26ver\x3d-68igm85d1771\x26am\x3d!Zsl-0RZ-XLv0BO3aNKsL0sgMg3nH10t5WrPgJSU8CYS-KNWlyrLmiW3HvC5ykER_n_5dDw\x26fri"],"http://example.com/?ctx\x3d%67mail\x26hl\x3den",,0,"Gmail","Gmail",[["us","c130f0854ca2c2bb",[["n"],["m","New features!"],["u"],["k","0"],["p","1000:500000,10,200000,5,100000,3,75000,2,0,1"],["h","https://survey.googleratings.com/wix/p1679258.aspx?l\x3d1033"],["at","query,5,contacts,5,adv,5,cf,5,default,20"],["v","https://www.youtube.com/embed/Ra8HG6MkOXY?showinfo\x3d0"],
Run Code Online (Sandbox Code Playgroud)

当我检查按钮上的元素时,我在上面为按钮发布的HTML代码出现了,但在进行查看源时却没有.基本上,我需要做的是使用某种GUI并让用户导航到链接,然后让程序填写信息.有谁知道我怎么做到这一点?谢谢.

Ane*_*new 5

请查看Selenium的5分钟入门指南:http://code.google.com/p/selenium/wiki/GettingStarted

  • 该堆栈中另一个非常宝贵的工具是用于firefox的SeleniumIDE插件.它允许您在页面上记录您的操作,然后将交互导出到Java代码. (2认同)

Mar*_*uee 1

正如其他人指出的那样,这在 Selenium 中应该是可能的。

我使用 Selenium 登录然后抓取网站并发现网站上每个表单(30 多个表单)的值的每个排列。这些值稍后用于填写并提交具有特定值排列的表单。这个网站的 JS/jQuery 含量非常高,我使用 Selenium 对 javascript 执行器、css 选择器和 XPath 的内置支持来完成此任务。

我实现了 HtmlUnit 和 HttpUnit 作为更快的替代方案,但发现考虑到我正在爬行的网站的 JS 语义,它们不如 Selenium 可靠。

很难为您提供如何完成它的代码,因为您的 Selenium 实现将是特定于页面的,并且我无法查看您正在编码的页面来弄清楚该按钮脚本垃圾发生了什么。不过,我包含了一些可能相关的 selenium 代码 (Java) 片段:

Element element = driver.findElements(By.id(value)); //find element on page
List<Element> buttons = parent.findElements(By.xpath("./tr/td/button")); //find child element
button.click();
element.submit() //submit enclosing form
element.sendKeys(text); //enter text in an input
String elementText = (String) ((JavascriptExecutor) driver).executeScript("return arguments[0].innerText || arguments[0].textContent", element); //interact with a selenium element via JS
Run Code Online (Sandbox Code Playgroud)

如果您在不同页面上编写类似的功能,那么界面后面的PageObjects会有所帮助。

Anew 发布的链接是一个很好的起点,而且 StackOverflow 提供了几乎所有 Selenium 问题的答案。