Je suis en train d'explorer un site qui utilise un chargement paresseux pour les images de produits.Faire défiler automatiquement la page vers le bas dans Splash et Scrapy
Pour cette raison j'ai inclus scrapy-splash
afin que le javascript puisse être rendu aussi avec splash je peux fournir un argument wait
. Auparavant, j'avais un doute que c'est à cause du moment où le scrapy.Request
brut retourne une image de placeholder à la place des originaux.
J'ai également essayé d'attendre l'argument à 29,0 secondes, mais mon robot n'a toujours pas 10 éléments (il devrait contenir 280 éléments en fonction des calculs). J'ai un pipleline d'article qui vérifie si l'image est vide dans l'article ainsi je raise DropItem
.
Je ne suis pas sûr, mais j'ai également remarqué que ce n'est pas seulement le problème wait
. Il semble que les images soient chargées lorsque je défile vers le bas. Ce que je cherche est un moyen d'automatiser un comportement de défilement vers le bas dans mes demandes.
Voici mon code Araignée
def parse(self, response):
categories = response.css('div.navigation-top-links a.uppercase::attr(href)').extract()
for category in categories:
link = urlparse.urljoin(self.start_urls[0], category)
yield SplashRequest(link, callback=self.parse_products_listing, endpoint='render.html',
args={'wait': 0.5})
Pipeline
class ScrapperPipeline(object):
def process_item(self, item, spider):
if not item['images']:
raise DropItem
return item
Réglages
IMAGES_STORE = '/scrapper/images'
SPLASH_URL = 'http://172.22.0.2:8050'
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
ITEM_PIPELINES = {
'scrapper.pipelines.ScrapperPipeline': 300,
'scrapy.pipelines.images.ImagesPipeline': 1
}
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddleware.useragent.UserAgentMiddleware': None,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
# 'custom_middlewares.middleware.ProxyMiddleware': 210,
}