我在Scrapy云上部署的刮板与本地版本相比产生了意外的结果。 我的本地版本可以轻松地(从在线零售商处)提取product item的每个字段,但是在易碎的云上,字段“成分”和“价格列表”始终显示为空。 您会在图片中看到附上的两个元素,因此我总是会空着,而它工作得很好 我使用的是Python 3,堆栈配置了scrapy:1.3-py3配置。 我以为首先是正则表达式和unicode的问题,但似乎没有。 所以我尝试了所有方法:ur,ur 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
似乎这种匹配从来不会在刮y的云上发生。
对于价格,我的代码如下:
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)
那是同样的故事。仍然是空的。
我重复一遍:在我的本地版本上运行正常。 这两个数据是唯一一个引起问题的问题:我正在使用刮擦的云提取一堆其他数据(也使用Regex),对此我感到非常满意吗?
有什么主意吗?
答案 0 :(得分:1)
我真的经常与ScrapingHub一起工作,通常我的调试方式是:
为了检查是否没有重定向使页面略有不同,例如查询字符串?lang=en
您可以打印或使用记录器来检查想要通过解析器的所有内容。因此,如果您确实要确保刮板在本地计算机和ScrapingHub上显示相同,则可以print(response.body)
并比较可能导致这种差异的原因。
如果找不到,我将尝试在ScrapingHub上部署一个小蜘蛛,如果今天我能有空的话,请编辑这篇文章!
答案 1 :(得分:1)
即使在项目的yml文件中正确设置了堆栈,也请检查Scrapping Hub的日志是否显示了预期的Python版本。