如何修复 HTTP 错误获取 URL。爬行时Java中的状态= 500?

Posted

技术标签:

【中文标题】如何修复 HTTP 错误获取 URL。爬行时Java中的状态= 500?【英文标题】:how to fix HTTP error fetching URL. Status=500 in java while crawling? 【发布时间】:2014-03-18 11:56:23 【问题描述】:

我正在尝试从评论页面抓取用户对 imdb 电影的评分: (我数据库中的电影数量约为 600,000)。我使用jsoup解析页面如下:(对不起,我没有在这里写完整的代码,因为它太长了)

try 
  //connecting to mysql db
  ResultSet res = st
        .executeQuery("SELECT id, title, production_year " +
                "FROM title " +
                "WHERE kind_id =1 " +
                "LIMIT 0 , 100000");
  while (res.next())
       .......
       .......
     String baseUrl = "http://www.imdb.com/search/title?release_date=" +
            ""+year+","+year+"&title="+movieName+"" +
            "&title_type=feature,short,documentary,unknown";
    Document doc = Jsoup.connect(baseUrl)
            .userAgent("Mozilla")
            .timeout(0).get();
      .....
      ..... 
//insert ratings into database
      ...

我测试了前 100 部,然后是前 500 部以及我数据库中的前 2000 部电影,它运行良好。但问题是,当我测试 100,000 部电影时,我得到了这个错误:

org.jsoup.HttpStatusException: HTTP error fetching URL. Status=500,   URL=http://www.imdb.com/search/title?release_date=1899,1899&title='Columbia'%20Close%20to%20the%20Wind&title_type=feature,short,documentary,unknown
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:449)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:424)
at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:178)
at org.jsoup.helper.HttpConnection.get(HttpConnection.java:167)
at imdb.main(imdb.java:47)

我搜索了很多这个错误,我发现它是一个服务器端错误,错误号为 5xx。

然后我决定设置一个条件,当连接失败时,它会再尝试 2 次,然后如果仍然无法连接,则不会停止并转到下一个 url。因为我是java新手,所以我尝试搜索类似的问题并在***中阅读这些答案:

Exceptions while I am extracting data from a Web site

Jsoup error handling when couldn't connect to website

Handling connection errors and JSoup

但是,当我按照他们的建议尝试使用“Connection.Response”时,它告诉我“Connection.Response 无法解析为一种类型”。

如果有人可以帮助我,我将不胜感激,因为我只是一个新手,我知道这可能很简单,但我不知道如何解决它。


好吧,我可以通过添加“ignoreHttpError(true)”来修复 http 错误状态 500,如下所示:

org.jsoup.Connection con = Jsoup.connect(baseUrl).userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (Khtml, like Gecko) Chrome/19.0.1042.0 Safari/535.21");
con.timeout(180000).ignoreHttpErrors(true).followRedirects(true);
Response resp = con.execute();
Document doc = null;

if (resp.statusCode() == 200) 
    doc = con.get();
......

希望它可以帮助那些有同样错误的人。

但是,在爬取了 22907 部电影的评论页面(大约 12 小时)后,我又遇到了一个错误: “读取超时”。

感谢任何解决此错误的建议。

【问题讨论】:

org.jsoup.Connection.Response 呢? 我试过了,但我收到了这个错误:在 java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) 的 java.net.PlainSocketImpl.socketConnect(Native Method) 处被拒绝连接 我试过了,它得到了输出:Connection.Response con = Jsoup .connect( "http://www.imdb.com/search/title?release_date=1899,1899&title='Columbia'%20Close%20to%20the%20Wind&title_type=feature,short,documentary,unknown") .userAgent( "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21") .timeout(10000).execute(); System.out.println(con.body()); @PopoFibo:对不起,错误是:HTTP error fetching URL。状态=403,URL=imdb.com/search/… 在 org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:449) 在 org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:424) 在 org. jsoup.helper.HttpConnection.execute(HttpConnection.java:178) at org.jsoup.helper.HttpConnection.get(HttpConnection.java:167) 403 表示禁止,某些站点不允许机器人,因此您必须在获取响应时使用.useragent()。尝试复制我上面评论中的代码,看看您是否在控制台中看到任何类似 javascript 或 html 的代码,这意味着连接成功 【参考方案1】:

将我的 cmets 升级为答案:

Connection.Responseorg.jsoup.Connection.Response

仅当存在有效的 http 代码 (200) 时才允许 document 实例,请将您的调用分为 3 个部分; ConnectionResponseDocument

因此,您上面的部分代码被修改为:

while (res.next())
       .......
       .......
       String baseUrl = "http://www.imdb.com/search/title?release_date=" + ""
                + year + "," + year + "&title=" + movieName + ""
                + "&title_type=feature,short,documentary,unknown";
       Connection con = Jsoup.connect(baseUrl).userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21").timeout(10000);
       Connection.Response resp = con.execute();
       Document doc = null;
        if (resp.statusCode() == 200) 
            doc = con.get();
                    ....
        

【讨论】:

@PopoFico:非常感谢您的回答,它帮助很大。因为 Connection.Response 对我不起作用,正如您在我为我的数据库中的前 50 部电影尝试之前建议的那样,它起作用了:org.jsoup.Connection con = Jsoup.connect(baseUrl).userAgent(".... ").timeout(10000);响应 resp = con.execute();现在,我正在测试 10,000 部电影以查看结果;)再次感谢您的大力帮助:) 好吧,不幸的是,我再次收到错误状态 500:( @monamona 这就是使用 Connection.Response 背后的全部想法,以获取状态代码的句柄,如果它不是 200(如您的情况下为 500),请不要继续使用文档实例并继续下一个 @monamona 或者,如果可行的话,尝试将超时时间从 10000 增加到 60000(一分钟)

以上是关于如何修复 HTTP 错误获取 URL。爬行时Java中的状态= 500?的主要内容,如果未能解决你的问题,请参考以下文章

使用scrapy爬行时如何跳过某些文件类型?

放入 S3 预签名 URL 时如何修复“403 Forbidden”

如何修复运行时错误-线程“main”java.util.NoSuchElementException中的异常

如何修复 Java Web 应用程序中 JSP 重定向中的 HTTPS-HTTP 混合内容错误

当 URL 包含百分比符号时如何停止错误 400? (阿帕奇)

在 URL 上使用 Imagick 的 readImageFile 时如何修复“检测到无效的 CRT 参数”错误?