使用Scrapy刮擦Walmart.com并获得Generic Error 500

时间:2017-11-12 18:14:18

标签: python scrapy akamai

我是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意味着被阻止/被禁止,我是否有可能调整某些内容或者可以调整某些内容以再次产生结果?

任何帮助都会非常感激,我在WM.com上尝试过不同的产品并获得相同的效果,我可以通过浏览器轻松获得它。

1 个答案:

答案 0 :(得分:1)

您的刮刀可能已被禁止进入该网站,因为您在其他方面检测到刮擦或恶意(例如,每分钟发送过多请求¹,而不是关注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,其中因素略有不同,但始终是&gt;这意味着根据该公式的延迟时间通常也将> 1秒钟,我甚至听说过30左右的因素,这意味着延迟时间可能是15秒或更长。