我编写了简单的代码来获取给定网址的content-type
。为了加快处理速度,我进行了更改,将请求方法设置为HEAD
// Added a random puppy face picture here
// On entering this query in browser (or Poster<mozilla> or Postman<chrome>), the
// content type is shown as image/jpeg
URL url = new URL("http://www.bubblews.com/assets/images/news/521013543_1385596410.jpg");
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setRequestMethod("HEAD");
connection.connect();
String contentType = connection.getContentType();
System.out.println(contentType);
if (!contentType.contains("text/html")) {
System.out.println("NOT TEXT/HTML");
// Do something
}
如果不是text/html
,我正在努力实现某些目标,但当我将请求方法设置为HEAD
时,内容类型显示为text/html
。如果我使用HEAD
或Poster
触发相同的Postman
请求,我会将content-type
视为image/jpeg
。
那么在这个Java代码的情况下,是什么让内容类型发生了变化?有人可以指出我可能犯的任何错误吗?
注意:我使用this帖子作为参考
答案 0 :(得分:1)
您应该添加Accept
标头和/或User-Agent
标头。
大多数Web服务器根据客户端设置的标头提供不同的内容(例如Web浏览器,Java HttpURLConnection,curl,...)。对Accept
,Accept-Encoding
,Accept-Language
,User-Agent
,Cookie
和Referer
尤其如此。
例如,如果Referer
标头未链接到内部页面,则Web服务器可能拒绝提供图像。
在您的情况下,如果某个机器人正在抓取它,则Web服务器不会传送图像。因此,如果您伪造您的请求,就好像它来自Web浏览器,服务器可能会提供它。
在抓取网站时,您应该尊重robots.txt
(因为您的行为像机器人一样)。因此严格来说,在做大量请求时假装User-Agent
时应该小心,或者创建一个大企业。我不知道有多大网站对这种行为做出反应,特别是当有人绕过那里做生意时......
请不要将此视为一个告密者。我只是想指出你,所以你不要遇到麻烦。也许这根本不是问题,YMMV。