我有以下几行代码来收集给定网址的源代码:
URL url = new URL(websiteAddress);
URLConnection connection = url.openConnection(); // throws an IOException
connection.setConnectTimeout(timeoutInMilliseconds);
bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = bufferedReader.readLine()) != null) {
outputString += line;
}
然而,我遇到的问题是,Wi-Fi热点经常会将您重定向到您必须单击“我同意”的页面。如果在单击该复选框之前运行此代码,则它会从热点登录页面而不是目标页面收集源代码。
我想要做的是检查是否达到了预期的页面。我希望在创建InputStreamReader之后调用connection.getURL()
会向我显示已到达的实际网页,但没有这样的运气。如何确定是否已重定向预期的URL?
答案 0 :(得分:1)
一种方法是在web
页面中查找任何特定元素,如果它不存在,那么您就知道您可能在其他页面中(可能重定向到某个登录页面)。
答案 1 :(得分:0)
我唯一可以建议的是让服务器知道响应是什么,并首先查询以确保至少连接到该服务器。这(通常)足以假设完全连接。
然后,您可以继续查询您感兴趣的网址。
问题在于,如果计算机在某个网址上请求该页面,那么很多wifi热点的工作方式就是拦截该请求并返回该页面。通常没有任何线索,形成计算机的POV,页面返回的页面不是请求的页面。
答案 2 :(得分:0)
一种选择是致电setFollowRedirects(false)
。默认情况下,连接会静静地跟踪重定向,并尝试访问返回200
HTTP响应的页面。禁用重定向将确保更准确地返回预期页面,只需确认响应为200
。
也就是说,@ rec的评论值得考虑 - 仅仅检查响应代码是不够的,因为路由器可以通过许多不同的方式中断您的请求,其中许多是无法检测到的。例如,恶意路由器可以拦截您的所有请求并以微妙但危险的方式更改响应内容 - 这称为man-in-the-middle attack。
根据定义,您无法避免MitM攻击,除非您可以在自己和远程站点之间打开安全可信的连接(通常是HTTPS),但假设您并不真正关心攻击,更好的策略就是假设你得到的数据可能会以多种方式被破坏,而是使你的抓取逻辑更加强大。
我不能直接与如何说话,如果不了解您的用例和遇到的问题,您的逻辑会更强大,但要点是添加检查可能会出现问题出现,并抛出一个异常,然后你可以优雅地处理堆栈。
例如,如果您的代码是:
System.out.println(outputString.subString(outputString.indexOf('A'));
如果outputString didn't actually have an
'A'字符,则会失败。所以要明确检查:
int aPos = outputString.indexOf('A');
if (aPos < 0) {
throw new InvalidParseException("Didn't find an 'A', cannot proceed");
}
System.out.println(outputString.subString(aPos);
在处理用例最有意义的地方处理InvalidParseException
。