用 Scrapy 抓取 Walmart.com 并得到通用错误 500

Scraping Walmart.com with Scrapy and getting Generic Error 500

我是 Python 和 Scrapy 的新手,我一直在抓取 walmart.com 并取得了一些积极的结果。

它在整个星期甚至 25 小时前都在工作,但是昨晚我开始收到此响应,它在 scrapy 中没有显示为错误,这是通过 txt 文件抓取并返回的内容。

<!doctype html>
<html lang="en-US" itemscope itemtype="http://schema.org/WebPage">
<head>
    <title>Omnivore Walmart</title>

</head>
<body id="WalmartBodyId" class="WalmartMainBody SimpleMode">



<!-- SiteCatalyst code version: H.23.3
Copyright 1996-2009 Adobe, Inc. All Rights Reserved
More info available at http://www.omniture.com
-->


<script language="JavaScript" type="text/javascript">
var s_account="walmartcom";
</script>
<script language="JavaScript" type="text/javascript" src=" https://secure.walmartimages.com/webanalytics/wmStat/wmStat.jsp"></script>
<script language="JavaScript" type="text/javascript">

var omni = {
"adid" : s_omni.getQueryParam('adid'),
"fbref" : s_omni.getQueryParam('fb_ref'),
"sourceid" : s_omni.getQueryParam('sourceid'),
"povid" : s_omni.getQueryParam('povid'),
"findingMethod" : s_omni.getQueryParam('findingMethod'),
getCampaignId : function() {
if(this.adid) { return this.adid; }
else if (this.fbref) { return this.fbref.split('_')[1]; }
else if (this.sourceid){ return this.sourceid; }
else { return ''; }
}
};
s_omni.pageName="Akamai Error 500:https://www.walmart.com/ip/Pringles-Loaded-Baked-Potato-Potato-Crisps-5-5-oz-Canister/144650857";
s_omni.channel="Walmart.com";
s_omni.campaign=omni.getCampaignId();
s_omni.prop1="Akamai Error";
s_omni.prop2="Akamai Error 500";
s_omni.prop48="Akamai 500:Generic Error - AKAMAI REFERENCE ERROR NO:3.1be3ab42.1510509312.48a15f11"; 

var s_code=s_omni.t();if(s_code) document.write(s_code);
</script>

<br>
    <table>
        <tr>
            <td>Error Page</td>
        </tr>

    </table>

    <br>
        <table>
            <tr>
                <td>Could not connect to server</td>
            </tr>
        </table>

</body>
</html>

我研究过并且大多数人认为 500 表示 blocked/banned 的情况很少见,我是否可能调整了一些东西或者可以调整一些东西再次产生结果?

任何帮助将不胜感激,我在 WM.com 上尝试了不同的产品并得到了相同的结果,我可以毫无问题地通过浏览器访问它。

您的抓取工具可能已被网站禁止,因为您被检测到抓取或以其他方式存在恶意(例如,每分钟发送过多请求 ¹,未关注 robots.txt)。

既然你说它在几个小时前仍然有效,我假设该禁令是基于 IP 的。您现在可以执行以下操作:

  • 是否禁止来自 scrapy 的所有请求,或者是否可以在启动刮板时执行一些请求,然后在几个请求后它停止工作?
  • 看看你是否可以从普通浏览器访问 Walmart.com 或 https://www.walmart.com/ip/Pringles-Loaded-Baked-Potato-Potato-Crisps-5-5-oz-Canister/144650857,但 IP 相同(如果它在服务器上,你可以使用 curlwget 或创建从本地 PC 到服务器的 SSH 隧道)
    • 如果这行得通,封禁不仅仅基于 IP,所以你可以尝试更改 scrapy 的 USER_AGENT 看看它是否再次生效
  • 在另一台 PC 上尝试相同的 scrapy 设置(但只是很快),看看它是否有效(如果是,那么禁令至少包括 IP)

接下来,您应该降低抓取速度。我假设你爬得太激进了。在大多数情况下,只需降低抓取速度就足够了。但是,对于沃尔玛,我也可以相信他们有更先进的措施,例如根据 URL 访问模式检测机器人等(我的意思是,如果您仅按分钟请求,沃尔玛甚至可以检测到您)。

规避封禁问题的一些想法:

  • 使用 DOWNLOAD_DELAYAUTOTHROTTLE_* 设置降低抓取速度
  • 使用IP轮换的爬行集群
    • scrapinghub 提供这个,但它不是免费的,而且由于 scrapinghub 被很多人使用,他们的代理可能有同样的问题
  • 不要使用scrapy的默认用户代理(但我假设你已经改变了,至少现在你的情况不是问题)

脚注

¹ 是的,每分钟。在正常的网络抓取中,我们尝试为大多数网站延迟几秒钟。有些人在礼貌爬取中使用公式factor * response-time-of-website,其中的因素有点不同,但总是> 1。这意味着根据这个公式的延迟时间通常也会> 1秒,我什至听说过周围的因素30,意味着延迟时间可以是15秒或更多。