0

假设我有一个分配了 10 个 IP 的 squid 代理服务器(本地在我的 gigE 网络上)。

假设我有一个不同的服务器,分配了不同的 10 个 IP,运行 ac# 应用程序,该应用程序运行 10 个线程,每个线程用于抓取网站。每个线程使用不同的分配 IP 来发送其 HTTP 请求。

我的问题是,如果我在该应用程序中运行 10 个线程,其中每个线程使用来自代理服务器的代理 IP 来抓取网站。我还在该应用程序中尝试了 10 个线程,其中每个线程直接在服务器上使用本地分配的 IP 来抓取站点。从一个页面到另一个页面,使用代理 IP 的线程,或使用来自其自己服务器的直接 IP 的线程,哪个会更快地爬取站点?

我会想象服务器上的直接 IP,因为代理服务器具有固有的延迟,但它证明代理服务器稍微快一些。所以我很困惑。也许是因为使用直接 IP 会使用一些处理能力,并且通过使用代理服务器,它能够将该处理外包给代理服务器?非常感谢您的帮助。

4

1 回答 1

0

您提到有 10 个不同的线程“抓取该站点”,听起来您有 10 个线程抓取同一站点的不同页面。

在这种情况下,使用代理通常更快。请记住,大多数 html 页面看起来像这样:

foo1.html
  |
  +--- Link: somefile01.xml
  |
  +--- Link: somestlyesheet.css
  |
  +--- Image: somepicture01.jpg
  |
  +--- Image: somepicture02.jpg

foo2.html
  |
  +--- Link: somefile01.xml
  |
  +--- Link: somestlyesheet.css
  |
  +--- Image: somepicture01.jpg
  |
  +--- Image: somepicture03.jpg

在真正的网络浏览器拉取 之后,它会为、、和(通常并行)foo1.html执行 http GET 。据推测,如果您从同一个站点抓取页面,您正在抓取的页面在内容上有一些共同的重叠(例如上面显示的和)。somefile01.xmlsomestylesheet.csssomepicture01.jpgsomepicture02.jpgfoo1.htmlfoo2.html

如果您在代理上启用了 http 对象缓存,您的线程将更快,因为您将获得这些文件的一部分的缓存命中。如果缓存命中,则文件会从 LAN 上的 Squid 缓存本地传送到您的代码,而不必每次都从远程服务器获取它。

如果您有 10 个线程都爬取不同的站点,那么您应该期望性能较慢,除非它们包含的唯一文件是jquery.js. 顺便说一句,谷歌为网络开发人员提供了一种使用他们的缓存来加载几个常见的 javascript 文件的方法。

于 2012-05-20T10:28:16.900 回答