【问题标题】:How to mimic a web browser from Java using jSoup如何使用 jSoup 从 Java 模拟 Web 浏览器
【发布时间】:2011-12-09 11:44:36
【问题描述】:

我在 jSoup 中使用这样的查询:

Document doc = Jsoup.connect(urlString).timeout(1000).post();

它适用于某些网站,但是:

  • 它不适用于 Google 搜索查询(例如 urlString = "http://www.google.com/search?q=text") - 我不知道为什么,它有什么特别之处

  • 结果文档包含诸如“应在您的浏览器中打开 JavaScript”之类的消息,我宁愿避免

  • 可能还有更多的怪癖,但我还没有完全测试过...

我的问题:如果我们可以更接近地模仿网络浏览器,这些问题是否可以避免?最好的方法是什么?

通过 Web 浏览器获取页面和通过 Java(URLConnection 或 jSoup)获取页面之间可能会遇到哪些其他差异?

【问题讨论】:

  • Jsoup 是一个 HTML 解析器,不是一个 HTML 单元测试器,也不是一个无 GUI 的网络浏览器。您可能会发现HtmlUnit 更有趣。谷歌阻止机器人,检查他们的政策文件。而是使用他们的公共搜索 API。
  • 谢谢。我是这个主题的新手,并且天真地认为我可以用一行(上面的)代码来实现这一点,但后来意识到它并不总是像我想要的那样工作:) 我想我会看看 HtmlUnit ...
  • 关于谷歌,这只是我遇到的第一个根本不响应我的url请求的站点,但我担心有更多的站点无法通过这种方式访问​​。我仍然想知道为什么...
  • 要么是为了防止带宽浪费,要么是因为已经有一个更紧凑的公共 Web 服务 API 可以访问您要查找的数据,或者是因为它需要启用 JavaScript 的客户端。
  • 谢谢,但我很好奇服务器可以在我的上述 url 请求中检测到哪些参数,从而帮助他们决定根本不响应。据我所知,javascript 功能仅在客户端检测到,当收到 html 时,我认为谷歌搜索无论如何都可以在没有 JavaScript 的情况下工作。

标签: java url html-parsing jsoup


【解决方案1】:

我想回答你的问题。 在 Google 中,当你搜索时,参数是在 URL 中传递的,所以它是一个 get 请求。 在这种情况下,您应该使用 .get() 方法。

虽然有很多网站,但参数是通过 post 请求传递的。 以所有网站的简单登录页面为例,用户名和密码都是通过POST REQUEST传递的,此外页面内部还有很多隐藏字段也是需要传递的。 如果我们错过了那个参数,就会导致错误。

【讨论】:

    【解决方案2】:

    我意识到某些网站没有响应的问题实际上是我使用的是 post() 而不是 get()。使用 get() 现在可以正常工作了!

    将 userAgent 添加到查询中也可能会有所帮助,例如:

    .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6")
    

    与此同时,我还为相同的任务测试了 HtmlUnit,它确实有效,但对于简单地获取 HTML 文件(用于某种处理)来说,这似乎有点过头了。它基本上是在后台运行一个完全不可见的网络浏览器来完成这项任务。

    【讨论】:

    • 那些需要 javascript 和 cookie 的网站呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多