【问题标题】:Why is JSoup timing out at random places in my code?为什么 JSoup 在我的代码中随机出现超时?
【发布时间】:2019-07-31 00:44:17
【问题描述】:

我目前正在尝试使用 Java 中的 JSoup 为我正在从事的棒球编码项目抓取 retrosheets.org。

我在我的代码中执行了多个 JSoup 连接,其中一些连接是在一个循环中完成的(因此会执行很多次)。所以,总的来说,我在我的程序中建立了数百个连接来抓取必要的数据。

该程序运行约 5 秒,然后在连接上挂断(每次都不同)。然后,当我尝试在浏览器中单独访问该网站时,该网站将无法加载。这可能是什么原因造成的?执行太多连接是否有问题?

这是我正在执行的连接示例(所有连接都遵循相同的格式)。

doc = Jsoup.connect("https://www.retrosheet.org/boxesetc/index.html").maxBodySize(0).userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15").get();

This is the error I am getting

【问题讨论】:

    标签: java web-scraping connection timeout jsoup


    【解决方案1】:

    这绝对是目标网站端的负载保护 - 它检测到来自同一 IP 的过多请求并将其阻止一段时间或限制来自该 IP 的连接/请求数量。这就是为什么您也无法在浏览器中打开网站的原因 - 这根本与 JSoup 或 Java 无关,而是关于从您的 IP 到目标网站的连接/请求被阻止/限制。

    【讨论】:

    • 有办法解决这个问题吗?谢谢你的回答。
    • 好吧,你可以限制你的请求——例如在执行它们的代码中插入延迟。您也可以实现重试(可选地在重试之间也有延迟)。您创建的许多连接也可能存在问题 - JSoup 可能不会重用连接,但如果您将 Commons HTTPClient 与连接池连接管理器一起使用 - 那一个会。您可以通过 Commons HTTPClient 检索 HTML,然后仅使用 JSoup 进行解析(不使用它的 HTTP 客户端功能)。最好 - 做所有这些(延迟 + 重试 + Commons HTTPClient 进行检索)。
    • 这是通过 JSoup 将字符串解析为 HTML 的方法(基本 URL 参数允许 JSoup 提供来自相对 URL 的绝对 URL):jsoup.org/apidocs/org/jsoup/…
    • P.S.如果我的答案正确解决了您的问题 - 您介意对其进行投票和/或将其标记为正确答案吗?谢谢!
    猜你喜欢
    • 2019-11-28
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2022-07-05
    • 2013-03-30
    • 1970-01-01
    相关资源
    最近更新 更多