我正在开发一个简单的组件来刮取来自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");
答案 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");