2017-07-07 89 views
0

我使用Scrapy和飞溅凑这个页面:https://www.athleteshop.nl/shimano-voor-as-108mm-37184Scrapy飞溅不尊重渲染“等待”时间

这是我在Scrapy壳牌获得的图像与视图(响应)scrapy shell img

我需要以红色突出显示的条形码。但它是在JavaScript中生成的,因为它可以在带有F12的Chrome中的源代码中看到。 但是,尽管在Scrapy Shell和Splash localhost中正确显示,尽管Splash localhost为我提供了正确的html,但是我想要选择的条形码始终等于response.xpath(“// table [@ class =' data_table'] // tr [@class ='even']/td [@ class ='data last']/text()“)。extract_first()

选择器不是问题,因为它在Chrome的源代码中起作用。 我一直在寻找在网络上的答案,因此两天,似乎没有人有同样的问题。只是Splash不支持它吗? 的设置都是经典的人如下:

SPLASH_URL = 'http://192.168.99.100:8050/' 
DOWNLOADER_MIDDLEWARES = { 
'scrapy_splash.SplashCookiesMiddleware': 723, 
'scrapy_splash.SplashMiddleware': 725, 
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 
810, 
} 
SPIDER_MIDDLEWARES = { 
'scrapy_splash.SplashDeduplicateArgsMiddleware': 100, 
} 
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter' 
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage' 

我的代码如下(解析部分,旨在在点击该网站内部的搜索引擎提供的链接,它工作正常):

def parse(self, response): 
     try : 
      link=response.xpath("//li[@class='item last']/a/@href").extract_first() 
      yield SplashRequest(link, self.parse_item, endpoint = 'render.html', args={'wait': 20}) 
     except Exception as e: 
      print (str(e)) 


    def parse_item(self, response): 
     product = {} 
     product['name']=response.xpath("//div[@class='product-name']/h1/text()").extract_first() 
     product['ean']=response.xpath("//table[@class='data-table']//tr[@class='even']/td[@class='data last']/text()").extract_first() 
     product['price']=response.xpath("//div[@class='product-shop']//p[@class='special-price']/span[@class='price']/text()").extract_first() 
     product['image']=response.xpath("//div[@class='item image-photo']//img[@class='owl-product-image']/@src").extract_first() 
     print (product['name']) 
     print (product['ean']) 
     print (product['image']) 

名称和图片网址上的打印效果非常好,因为它们不是由javascript生成的。 代码是没问题的,设置都很好,Splash localhost向我展示了一些很好的东西,但是我的选择器在Scrapy Shell中都不能用于执行脚本(它不会显示任何错误)。

问题可能是Scrapy Splash会立即呈现而不关心等待时间(20秒!)放在参数中。请问我做错了什么?

在此先感谢。

回答

0

在我看来,条码字段的内容不是动态生成的,我可以在页面源中看到它,并从scrapy外壳中以response.css('.data-table tbody tr:nth-child(2) td:nth-child(2)::text').extract_first()提取。

+0

好吧我不明白我过去两天做错了什么。对我而言,这是一个愚蠢的问题。万分感谢 !! – pattes

+0

实际上,您的解决方案适用于此页面,但对其他页面不起作用,并且由于我抓取了其中的许多页面,因此我必须使用类别属性。我曾尝试过我忘记的解决方案。当我尝试下面的选择器时,它不起作用,为什么? response.css('。data-table tbody tr.even td.data.last :: text')。extract_first() – pattes

+1

没关系,我终于找到了一个解决方案:response.xpath(“// table [@ class ='data -table '] // TD [含有(文本(),' 条码“)] /以下同胞:: *”)。extract_first() – pattes