我在EC2实例上.所以没有GUI.
$pip install selenium
$sudo apt-get install firefox xvfb
Run Code Online (Sandbox Code Playgroud)
然后我这样做:
$Xvfb :1 -screen 0 1024x768x24 2>&1 >/dev/null &
$DISPLAY=:1 java -jar selenium-server-standalone-2.0b3.jar
05:08:31.227 INFO - Java: Sun Microsystems Inc. 19.0-b09
05:08:31.229 INFO - OS: Linux 2.6.32-305-ec2 i386
05:08:31.233 INFO - v2.0 [b3], with Core v2.0 [b3]
05:08:32.121 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub
05:08:32.122 INFO - Version Jetty/5.1.x
05:08:32.123 INFO - Started HttpContext[/selenium-server/driver,/selenium-server/driver]
05:08:32.124 INFO - Started HttpContext[/selenium-server,/selenium-server]
05:08:32.124 INFO - Started HttpContext[/,/]
05:08:32.291 INFO - Started org.openqa.jetty.jetty.servlet.ServletHandler@1186fab …
Run Code Online (Sandbox Code Playgroud) 好吧,所以我在一个小泡菜.我遇到了JSoup的问题,因为页面需要Javascript才能完成加载某些页面.幸运的是,我过去曾经解决过这个问题(解析了原始的javascript代码),这非常繁琐.最近,我试图制作一个程序来登录网站,但它需要一个元素的令牌.除非执行JavaScript,否则该表单元素不可见,因此它甚至根本无法提取.所以我决定调查Selenium.
第一个问题,这是我应该研究的图书馆吗?我之所以如此倾向于使用HttpClient,是因为其中一些网站的流量非常高并且不会一直加载但我不需要这些页面一直加载.我只需要将它加载到我可以检索登录令牌的位置.一旦我发现所需的方法与让Selenium自动执行点击/等待/类型序列,我更喜欢使用原始JSON/POST方法与Web服务器通信.
基本上,我只需要selenium来加载页面的1/4,只是为了检索请求令牌.我的程序的其余部分将使用HttpClient发送POST方法.
或者我应该让selenium做所有的工作?我的目标是速度.我需要登录,快速购买物品.
编辑:实际上,我可能会使用HtmlUnit因为它非常小.我只需要抓取信息,而且我不想运行Selenium的StandAlone Server.这是更好的方法吗?
我在这里有一个严重的问题。我已经通过堆栈溢出和许多其他站点进行了搜索。每个地方他们都给出相同的解决方案,我已经尝试了所有这些,但我无法解决这个问题。
我有以下代码,
Document doc = Jsoup.connect(url).timeout(30000).get();
Run Code Online (Sandbox Code Playgroud)
这里我使用 Jsoup 库,我得到的结果不等于我们可以看到的实际页面源,但右键单击页面 - > 页面源。我使用上述代码行得到的结果中缺少许多部分。在谷歌上搜索了一些网站后,我看到了这个方法,
URL url = new URL(webPage);
URLConnection urlConnection = url.openConnection();
urlConnection.setConnectTimeout(10000);
urlConnection.setReadTimeout(10000);
InputStream is = urlConnection.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
int numCharsRead;
char[] charArray = new char[1024];
StringBuffer sb = new StringBuffer();
while ((numCharsRead = isr.read(charArray)) > 0) {
sb.append(charArray, 0, numCharsRead);
}
String result = sb.toString();
System.out.println(result);
Run Code Online (Sandbox Code Playgroud)
但没有运气。当我在互联网上搜索这个问题时,我看到很多网站说我必须在下载网页的页面源时设置网页的正确字符集和编码类型。但是我将如何从我的代码中动态地了解这些东西??java中是否有任何类。我也经历了一些 crawler4j,但对我来说并没有太大作用。请帮助伙计们。我被这个问题困扰了一个多月了。我已经尽我所能。所以最后的希望寄托在一直提供帮助的堆栈溢出之神身上!!