我在这里有一个严重的问题。我搜索了堆栈溢出和许多其他网站。他们提供相同解决方案的所有地方,我已经尝试了所有这些,但我无法解决这个问题。
我有以下代码,
Document doc = Jsoup.connect(url).timeout(30000).get();
这里使用Jsoup库,我得到的结果不等于我们可以看到的实际页面源,但右键单击页面 - >页面来源。我使用上面的代码行获得的结果中缺少许多部分。 在Google上搜索了一些网站后,我看到了这个方法,
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);
但没有运气。 当我在互联网上搜索这个问题时,我看到许多网站,它说我必须在下载网页的页面源时设置正确的charSet和网页的编码类型。但是我如何动态地从我的代码中了解这些东西? java中是否存在任何类。我也经历过crawler4j,但对我来说并没有多大帮助。请帮帮我们我已经坚持了这个问题一个多月了。我尽我所能地尝试过。所以最后的希望是堆栈溢出的众神一直在帮助!!
答案 0 :(得分:4)
我最近有这个。我会遇到某种机器人保护。将原始行更改为:
Document doc = Jsoup.connect(url)
.userAgent("Mozilla/5.0")
.timeout(30000)
.get();
答案 1 :(得分:3)
问题可能是您的网页是由在浏览器中运行的Javascript呈现的,单独的JSoup无法帮助您解决此问题,因此您可以尝试使用使用Selenium模拟浏览器的HtmlUnit:{{3} }。
<强>更新强>
HTML有不同的原因有几个。最可能的是该网页包含<javascript>
元素,其中包含动态页面逻辑。这可能是您网页中的一个应用程序,它根据响应向服务器发送请求并添加或删除内容。
JSoup永远不会渲染这样的页面,因为它是Chrome,Firefox或IE等浏览器的工作。 JSoup是一个轻量级的解析器,用于从服务器获取的纯文本html。
所以你可以做的是你可以使用一个模拟网页浏览器并在内存中呈现页面的网页驱动程序,因此它将具有与用户显示的内容相同的内容。你甚至可以用这个驱动程序点击鼠标。
在链接答案中建议的Web驱动程序实现是HtmlUnit。这是最轻量级的解决方案,但它可能会给您带来意想不到的结果:using Jsoup to sign in and crawl data。
如果您想要最真实的页面呈现,您可能需要考虑Selenium vs HtmlUnit?。
答案 2 :(得分:1)
为什么要以这种方式解析网页?如果网站上有可用的消耗品服务,则该网站可能有REST API。
要回答您的问题,使用网络浏览器查看的网页可能不一样,因为使用URLConnection下载了相同的网页。
以下几个原因导致这些差异:
Request Headers:当客户端(java应用程序/浏览器)发出URL请求时,它会将各种标头设置为请求的一部分,并且Web服务器可能会相应地更改响应的内容。 / p>
Java Script:收到回复后,如果响应中存在java脚本元素,则由浏览器javascript引擎执行,这可能会更改DOM的内容。
浏览器插件,例如IE浏览器帮助程序对象,Firefox扩展程序或Chrome扩展程序,可能会更改DOM的内容。
简单来说,当您使用URLConnection请求URL时,您正在接收原始数据,但是当您使用浏览器的地址栏请求相同的URL时,您将被处理(通过javascript /浏览器插件)网页。
URLConnection / JSoup允许您根据需要设置请求标头,但由于第2点和第2点,您仍然可以获得不同的响应。 3. Selenium允许您远程控制浏览器并使用api访问呈现的页面。 Selenium用于Web应用程序的自动测试。