从本地 scrapy 到 scrapy cloud (scraping hub) - 意想不到的结果

From local scrapy to scrapy cloud (scraping hub) - Unexpected results

我部署在Scrapy云上的爬虫与本地版本相比产生了意想不到的结果。 我的本地版本可以轻松提取 product item (来自在线零售商)的每个字段,但在 scrapy cloud 上,字段 "ingredients" 和字段 "list of prices" 始终显示为空。 你会在附上的图片中看到这两个元素,结果我总是空的,但它工作得很好 我正在使用 Python 3 并且堆栈配置了 scrapy:1.3-py3 配置。 我首先认为这是正则表达式和 unicode 的问题,但似乎不是。 所以我尝试了一切:你,你的RE.ENCODE ....但没有用。

对于配料部分,我的代码如下:

    data_box=response.xpath('//*[@id="ingredients"]').css('div.information__tab__content *::text').extract()
    data_inter=''.join(data_box).strip()

    match1=re.search(r'([Ii]ngr[ée]dients\s*\:{0,1})\s*(.*)\.*',data_inter)
    match2=re.search(r'([Cc]omposition\s*\:{0,1})\s*(.*)\.*',data_inter)


    if match1:
        result_matching_ingredients=match1.group(1,2)[1].replace('"','').replace(".","").replace(";",",").strip()

    elif match2 : 
        result_matching_ingredients=match2.group(1,2)[1].replace('"','').replace(".","").replace(";",",").strip()

    else:
        result_matching_ingredients=''

    ingredients=result_matching_ingredients

似乎在scrapy cloud上从来没有匹配过。

对于价格,我的代码如下:

    list_prices=[]

    for package in list_packaging : 
        tonnage=package.css('div.product__varianttitle::text').extract_first().strip()
        prix_inter=(''.join(package.css('span.product__smallprice__text').re(r'\(\s*\d+\,\d*\s*€\s*\/\s*kg\)')))
        prix=prix_inter.replace("(","").replace(")","").replace("/","").replace("€","").replace("kg","").replace(",",".").strip()

        list_prices.append(prix)

这是同一个故事。还是空的。

我再说一遍:它在我的本地版本上运行良好。 这两个数据是唯一导致问题的数据:我正在使用 scrapy cloud 提取一堆其他数据(也使用 Regex),我对此非常满意?

有什么想法吗?

我经常使用 ScrapingHub,通常我调试的方式是:

  1. 检查工作请求(通过ScrapingHub界面)

为了检查是否没有使页面略有不同的重定向,如查询字符串?lang=en

  1. 检查作业日志(通过ScrapingHub界面)

您可以打印或使用记录器通过解析器检查您想要的所有内容。所以如果你真的想确保爬虫在本地机器和 ScrapingHub 上显示相同,你可以 print(response.body) 并比较可能导致这种差异的原因。

如果你找不到,我会尝试在 ScrapingHub 上部署一个小蜘蛛并编辑这个 post 如果我今天有时间的话!

检查 Scrapping Hub 的日志是否显示 Python 的预期版本,即使在项目的 yml 文件中正确设置了堆栈。