Scrapy playwright scrolldown and wait to load the html

Viewed 69

I have a page

https://www.tradeinn.com/runnerinn/en/mens-shoes-trail-running-shoes/10005/s#fq=id_familia=10002&sort=v30_sum;desc@tm10;asc&fe=&pf=id_subfamilia=10005@&start=0

where products are automatically loaded after you scroll down (only 48 products showed initially). There should be in total about 630 products.

Here is my spider code. I always get only 48 results instead of 630+. Any idea why it is not loaded all?

import scrapy
from scrapy_playwright.page import PageMethod


class PicturesSpider(scrapy.Spider):
    name = 'pictures'
    allowed_domains = ['www.tradeinn.com']
    start_urls = ['http://www.tradeinn.com/']

    def start_requests(self):
        yield scrapy.Request(url='https://www.tradeinn.com/runnerinn/en/mens-shoes-trail-running-shoes/10005/s#fq=id_familia=10002&sort=v30_sum;desc@tm10;asc&fe=&pf=id_subfamilia=10005&&start=144',
                             meta={'playwright': True,
                                   'playwright_include_page': True,
                                   'playwright_page_method': [PageMethod('wait_for_selector', 'div::boton_cargar_mas.color_runnerinn'),
                                                              PageMethod("evaluate", "window.scrollBy(0, document.body.scrollHeight)")]},
                             callback=self.parse)


    def parse(self, response):
        images = response.css('div.BoxImage')
        for image in images:
            image_link = image.css('img::attr(src)').get()
            image_description = image.css('img::attr(alt)').get()
            yield {
                'image_link': image_link,
                'image_description': image_description
            }

Any advise what should I change to get the whole content?

1 Answers

The following is one way to get the images on that page - apparently only 398, not 600+ - it's even specified in the top breadcrumb - Trail Running Shoes(398)). Solution is based on Selenium, you're welcome to functionalize it, OOP it, whatever, I'm only giving you the actual method of obtaining the images.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import time as t

chrome_options = Options()
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument('disable-notifications')
chrome_options.add_argument("--headless")
chrome_options.add_argument("window-size=1280,1080")

webdriver_service = Service("chromedriver/chromedriver") ## path to where you saved chromedriver binary
browser = webdriver.Chrome(service=webdriver_service, options=chrome_options)
wait = WebDriverWait(browser, 20)
actions = ActionChains(browser)


url = 'https://www.tradeinn.com/runnerinn/en/mens-shoes-trail-running-shoes/10005/s#fq=id_familia=10002&sort=v30_sum;desc@tm10;asc&fe=&pf=id_subfamilia=10005@&start=0'
browser.get(url)
pbody = wait.until(EC.presence_of_element_located((By.TAG_NAME, 'body')))
for x in range(14):
    pbody.send_keys(Keys.PAGE_DOWN)
    print('scrolled')
    t.sleep(1)
t.sleep(5)
images = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'img[class="imagen_buscador"]')))
print(len(images))
for i in images:
    print(i.get_attribute('src'))

Result in terminal:

scrolled
scrolled
scrolled
[...]
398
https://www.tradeinn.com/h/13855/138556150/nike-juniper-trail-running-shoes.jpg
https://www.tradeinn.com/h/13855/138552239/nike-react-pegasus-4-trail-running-shoes.jpg
https://www.tradeinn.com/h/13727/137276760/merrell-vapor-glove-3-shoes.jpg
https://www.tradeinn.com/h/13842/138429239/adidas-terrex-agravic-flow-2-goretex-trail-running-shoes.jpg
https://www.tradeinn.com/h/13855/138556425/nike-wildhorse-7-trail-running-shoes.jpg
https://www.tradeinn.com/h/13842/138429416/adidas-terrex-two-goretex-trail-running-shoes.jpg
https://www.tradeinn.com/h/13842/138429408/adidas-terrex-two-boa-trail-running-shoes.jpg
https://www.tradeinn.com/h/13855/138556423/nike-wildhorse-7-trail-running-shoes.jpg
https://www.tradeinn.com/h/13857/138574338/new-balance-410v7-all-terrain-trail-running-shoes.jpg
https://www.tradeinn.com/h/13857/138574792/new-balance-fresh-foam-x-hierro-v7-trail-running-shoes.jpg
https://www.tradeinn.com/h/13857/138574340/new-balance-410v7-all-terrain-trail-running-shoes.jpg
https://www.tradeinn.com/h/13789/137892027/adidas-terrex-two-boa-trail-running-shoes.jpg
https://www.tradeinn.com/h/13727/137276761/merrell-vapor-glove-3-shoes.jpg
https://www.tradeinn.com/h/13836/138368054/joma-trek-trail-running-shoes.jpg
https://www.tradeinn.com/h/13710/137107634/vibram-fivefingers-v-trail-2.0-trail-running-shoes.jpg
https://www.tradeinn.com/h/13789/137891690/adidas-terrex-agravic-flow-trail-running-shoes.jpg
https://www.tradeinn.com/h/13789/137892315/adidas-terrex-swift-r3-trail-running-shoes.jpg
https://www.tradeinn.com/h/13855/138552241/nike-react-pegasus-4-trail-running-shoes.jpg
https://www.tradeinn.com/h/13803/138030718/nike-wildhorse-7-trail-running-shoes.jpg
[..]

For Selenium docs, see https://www.selenium.dev/documentation/

Related