0

我正在使用具有 150 个线程的 Apache HttpComponents 来下载大约 5000 个不同 URL 的 HTML 源代码。

URL 包含在 a 中LinkedBlockingQueue,并SourceGetterThreads尽可能从队列中获取。然后一个线程将尝试使用EntityUtils.toString(HttpClient.execute().getEntity). 然后将 HTML 源代码的字符串表示形式放在另一个LinkedBlockingQueue上,我有另外 10 个线程准备好对它们从第二个队列中获取的源代码执行有用的工作。

我的问题在于我注意到在源代码上执行的工作中有错误。我Matcher用来匹配特定模式并记录找到的模式。但是有时源代码不正确,与 URL 不匹配(即保存在我的 java 内存中的源代码与在 Chrome 或 FireFox 中查看时的源代码不同)。这似乎是随机的,因此有时源代码是正确的,有时不是。

有人知道这是为什么吗?

4

1 回答 1

0

您尝试从中获取页面的站点很可能会根据请求标头执行某种请求过滤,例如User-Agent. 所以他们可以简单地根据分析结果返回不同的内容。这样做的原因有很多:

  1. 为搜索机器人提供适当的信息
  2. 拒绝网络爬虫获取网站内容
  3. 识别移动设备并为其用户提供不同的 HTML/CSS/JS
  4. 如果您密集地查询同一个站点,可能会触发某种 DOS 攻击保护,从而导致返回存根错误页面而不是常规内容

如果您想获得与浏览器中相同的内容,那么对您的客户端的最基本建议是表现得像浏览器:

  1. 始终提供User-Agent标题
  2. 遵循 HTTP 重定向(HTTP 代码 302,303)
  3. 如果需要,维护 cookie 和身份验证例程
  4. 准备好支持 HTTPS 方案

如果没有您尝试运行的源代码,很难说更多,但是您使用的 Apache HTTP 客户端绝对能够完成所有这些事情。例如,这里是如何设置User-Agent值:

String url = "http://www.google.com/search?q=httpClient";
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
request.addHeader("User-Agent","Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2");
HttpResponse response = client.execute(request);
于 2013-10-12T22:49:11.373 回答