在抓取网站时获取过去的请求限制

时间:2011-12-12 14:57:54

标签: web-crawler distributed-computing

我正在开发一个网页抓取工具,可以为不想编制索引的网站编制索引。

我的第一次尝试: 我写了一个c#crawler,遍历每一页并下载它们。 这导致我的IP在10分钟内被其服务器阻止。

我将它移动到亚马逊EC2并编写了一个运行大约50个实例的分布式python脚本。这仍然高于启动我的门槛。每月花费约1900美元......

我回到了我最初的想法并把它放在缩短版的TOR网络上。这很有效,但速度很慢。

我没有想法。我怎么能越过他们阻止我重复请求。

我说“阻止”他们实际上是在一个肯定存在的页面上给我一个随机的404未找到的错误。它是随机的,只有在我在一小时内传递了大约300个请求后才开始发生。

4 个答案:

答案 0 :(得分:13)

好的,首先是:如果网站不希望您经常抓取它,那么您不应该!这是基本的礼貌,你应该总是努力坚持它。

但是,我确实知道有一些网站,比如Google,通过整天抓取您的网站来赚钱,当您尝试抓取Google时,他们会阻止您。

解决方案1:代理服务器

在任何情况下,获得一堆EC2机器的替代方法是获取代理服务器。代理服务器比EC2,case和point便宜很多: http://5socks.net/en_proxy_socks_tarifs.htm

当然,代理服务器没有EC2那么快(带宽明智),但是你应该能够达到与50 EC2实例相比或更高吞吐量的平衡,大大低于你的实际情况。现在付钱。这涉及到您搜索价格合理的代理并找到能够为您提供类似结果的代理。这里需要注意的是,就像您一样,可能有其他人使用代理服务来抓取您正在抓取的网站,他们可能不会如何抓取它们,因此整个代理服务可能会被阻止到期代理服务的其他客户的活动(我个人看过)。

解决方案2:You-Da-Proxy!

这有点疯狂,我没有在这背后做数学,但你可以自己开始代理服务并向其他人出售代理服务。无论如何,您无法使用所有EC2机器的带宽,因此降低成本的最佳方式是执行亚马逊的工作:分租硬件。

答案 1 :(得分:2)

到目前为止,使用代理是解决此问题的最常用方法。还有其他更高级别的解决方案,提供一种“页面下载即服务”,保证您获得“干净”的页面(而不是404s等)。其中一个被称为Crawlera(由我的公司提供),但可能还有其他人。

答案 2 :(得分:2)

对于这种情况,我通常使用https://gimmeproxy.com来检查代理每秒。

要获得工作代理,您只需提出以下请求:

https://gimmeproxy.com/api/getProxy

您将获得所有代理数据的JSON响应,您可以在以后根据需要使用这些数据:

{
  "supportsHttps": true,
  "protocol": "socks5",
  "ip": "156.182.122.82:31915",
  "port": "31915",
  "get": true,
  "post": true,
  "cookies": true,
  "referer": true,
  "user-agent": true,
  "anonymityLevel": 1,
  "websites": {
    "example": true,
    "google": false,
    "amazon": true
  },
  "country": "BR",
  "tsChecked": 1517952910,
  "curl": "socks5://156.182.122.82:31915",
  "ipPort": "156.182.122.82:31915",
  "type": "socks5",
  "speed": 37.78,
  "otherProtocols": {}
}

答案 3 :(得分:1)

每当我必须传递我正在抓取的页面的请求限制时,我通常会使用proxycrawl,因为这是最快的方式。 您不必关心任何事情,基础设施,ips,被阻止等......

他们有一个简单的API,您可以根据需要随时调用它们,它们将始终返回跳过限制的有效响应。

<!DOCTYPE html>
<html>
<head>

<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://cdn.datatables.net/1.10.15/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.10.15/js/dataTables.bootstrap.min.js"></script>
<link rel="stylesheet" href="https://cdn.datatables.net/1.10.15/css/jquery.dataTables.min.css">





  </head>

  <body>

   <h2>My Customers</h2>

 <table id="example" class="table table-striped table-bordered" cellspacing="0" width="100%">
<thead>
  <tr class="header">
        <th>id</th>
        <th>ContactOwner</th>
        <th>LeadSource</th>
        <th>First_name</th>
        <th>Last_name</th>
        <th>AccountName</th>
        <th>Title</th>
        <th>EmailID</th>
        <th>Department</th>
        <th>Industry</th>
        <th>Phone</th>
        <th>Mobile</th>
        <th>Fax</th>
        <th>DOB</th>
        <th>Assistant</th>
        <th>AsstPhone</th>
        <th>ReportsTo</th>
        <th>LinkedIn</th>
        <th>CallStatus</th>
        <th>Street</th>
        <th>OtherStreet</th>
        <th>City</th>
        <th>State</th>
        <th>Zip</th>
        <th>Country</th>
        <th>Description</th>
  </tr>
  </thead>
  <tbody>
  		<tr>
  			<td>id</td>
        <td>ContactOwner</td>
        <td>LeadSource</td>
        <td>First_name</td>
        <td>Last_name</td>
        <td>AccountName</td>
        <td>Title</td>
        <td>EmailID</td>
        <td>Department</td>
        <td>Industry</td>
        <td>Phone</td>
        <td>Mobile</td>
        <td>Fax</td>
        <td>DOB</td>
        <td>Assistant</td>
        <td>AsstPhone</td>
        <td>ReportsTo</td>
        <td>LinkedIn</td>
        <td>CallStatus</td>
        <td>Street</td>
        <td>OtherStreet</td>
        <td>City</td>
        <td>State</td>
        <td>Zip</td>
        <td>Country</td>
        <td>Description</td>
  		</tr>
  		<tr>
  			<td>id</td>
        <td>ContactOwner</td>
        <td>LeadSource</td>
        <td>First_name</td>
        <td>Last_name</td>
        <td>AccountName</td>
        <td>Title</td>
        <td>EmailID</td>
        <td>Department</td>
        <td>Industry</td>
        <td>Phone</td>
        <td>Mobile</td>
        <td>Fax</td>
        <td>DOB</td>
        <td>Assistant</td>
        <td>AsstPhone</td>
        <td>ReportsTo</td>
        <td>LinkedIn</td>
        <td>CallStatus</td>
        <td>Street</td>
        <td>OtherStreet</td>
        <td>City</td>
        <td>State</td>
        <td>Zip</td>
        <td>Country</td>
        <td>Description</td>
  		</tr>
  		<tr>
  			<td>id</td>
        <td>ContactOwner</td>
        <td>LeadSource</td>
        <td>First_name</td>
        <td>Last_name</td>
        <td>AccountName</td>
        <td>Title</td>
        <td>EmailID</td>
        <td>Department</td>
        <td>Industry</td>
        <td>Phone</td>
        <td>Mobile</td>
        <td>Fax</td>
        <td>DOB</td>
        <td>Assistant</td>
        <td>AsstPhone</td>
        <td>ReportsTo</td>
        <td>LinkedIn</td>
        <td>CallStatus</td>
        <td>Street</td>
        <td>OtherStreet</td>
        <td>City</td>
        <td>State</td>
        <td>Zip</td>
        <td>Country</td>
        <td>Description</td>
  		</tr>
  		<tr>
  			<td>id</td>
        <td>ContactOwner</td>
        <td>LeadSource</td>
        <td>First_name</td>
        <td>Last_name</td>
        <td>AccountName</td>
        <td>Title</td>
        <td>EmailID</td>
        <td>Department</td>
        <td>Industry</td>
        <td>Phone</td>
        <td>Mobile</td>
        <td>Fax</td>
        <td>DOB</td>
        <td>Assistant</td>
        <td>AsstPhone</td>
        <td>ReportsTo</td>
        <td>LinkedIn</td>
        <td>CallStatus</td>
        <td>Street</td>
        <td>OtherStreet</td>
        <td>City</td>
        <td>State</td>
        <td>Zip</td>
        <td>Country</td>
        <td>Description</td>
  		</tr>
  		<tr>
  			<td>id</td>
        <td>ContactOwner</td>
        <td>LeadSource</td>
        <td>First_name</td>
        <td>Last_name</td>
        <td>AccountName</td>
        <td>Title</td>
        <td>EmailID</td>
        <td>Department</td>
        <td>Industry</td>
        <td>Phone</td>
        <td>Mobile</td>
        <td>Fax</td>
        <td>DOB</td>
        <td>Assistant</td>
        <td>AsstPhone</td>
        <td>ReportsTo</td>
        <td>LinkedIn</td>
        <td>CallStatus</td>
        <td>Street</td>
        <td>OtherStreet</td>
        <td>City</td>
        <td>State</td>
        <td>Zip</td>
        <td>Country</td>
        <td>Description</td>
  		</tr>
  		<tr>
  			<td>id</td>
        <td>ContactOwner</td>
        <td>LeadSource</td>
        <td>First_name</td>
        <td>Last_name</td>
        <td>AccountName</td>
        <td>Title</td>
        <td>EmailID</td>
        <td>Department</td>
        <td>Industry</td>
        <td>Phone</td>
        <td>Mobile</td>
        <td>Fax</td>
        <td>DOB</td>
        <td>Assistant</td>
        <td>AsstPhone</td>
        <td>ReportsTo</td>
        <td>LinkedIn</td>
        <td>CallStatus</td>
        <td>Street</td>
        <td>OtherStreet</td>
        <td>City</td>
        <td>State</td>
        <td>Zip</td>
        <td>Country</td>
        <td>Description</td>
  		</tr>

  </tbody>
  </table>      
 </body>
 </html>

到目前为止,我已经使用它几个月并且效果很好。他们甚至有一个免费的计划。