网页可以在浏览器中打开,但在使用HttpClient处理时返回400错误

时间:2014-01-28 11:35:23

标签: java web-scraping httpclient

我正在开发一个简单的组件来刮取来自booking.com的酒店评论。 我开始使用HttpClient来获取特定页面的内容。 这是一个例子:

  String url = "http://www.booking.com/hotel/sg/"+
             "parkroyal-on-pickering.en.html#tab-reviews";

  //you can try to load this page in the browser if you want, 
  //so you will have a better idea about what I am trying to do

  GetMethod method = new GetMethod(url);

  int returnCode = client.executeMethod(method);

  BufferedReader br = new BufferedReader(new InputStreamReader(
                    method.getResponseBodyAsStream(), "utf-8"));
  String readLine;

  StringBuilder source = new StringBuilder();

  while (((readLine = br.readLine()) != null)) {
    source.append(readLine);
    source.append("\n");
  }

  return source;

我能够获得内容,到目前为止一直很好。

但是,当我尝试浏览页面时,问题就出现了。包含评论的网页部分由Javascript动态生成。单击NextPage按钮时,将检索接下来的25个评论。

我查看了网页的源代码,找到了加载评论的实际网址,如下所示:

http://www.booking.com/reviewlist.html?cc1=sg&pagename=parkroyal-on-pickering&offset=25

我试图在浏览器中打开它,它工作正常,我能够看到评论。但是,当我使用之前使用的代码时,现在它只是不起作用,并返回了400错误代码。

所以基本上,对于URL如:

http://www.booking.com/reviewlist.html?cc1=sg&pagename=parkroyal-on-pickering&offset=25

我在第一页上使用和工作的HttpClient代码无法检索内容,而实际的浏览器(Chrome和IE)能够加载页面。

我实际上对HttpClient或网页抓取很新,任何建议或建议都将不胜感激。

更新:正如Rhand建议的那样,我玩了一下requestHeaders,结果发现我试图调用的url,需要以下两个标题:

 method.setRequestHeader("Accept-Language","en-US,en;q=0.8,zh-CN;q=0.6");
 method.setRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) 
              AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.76 
              Safari/537.36"); 

3 个答案:

答案 0 :(得分:0)

尝试添加浏览器生成的HTTP标头,例如“Accept-Encoding:gzip,deflate,sdch”。 我通过逐个添加它来实现它。

答案 1 :(得分:0)

您提出请求的方式可能有问题。您可以检查浏览器发送的标头并模仿这些标头。

例如:在Google Chrome中,使用开发者工具:View HTTP headers in Google Chrome?

BTW:Booking.com确实有一个API,您应该使用它:https://secure.booking.com/partnerreg.html

答案 2 :(得分:0)

刚刚使用wget向该URL发出了一些请求,似乎服务器需要在请求中出现以下标头 - 以便返回200 OK。

User-Agent: Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

Accept-Encoding: gzip,deflate,sdch

如果没有这些,服务器似乎返回400 Bad Request(您可以稍微使用标题值)。

因此,在您的代码中,只应该使用上面的每个标题调用GetMethod.addRequestHeader()

GetMethod method = new GetMethod(url);
method.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36");
method.addRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
method.addRequestHeader("Accept-Encoding", "gzip,deflate,sdch");