Я не могу получить все товары со страницы сайта (скраппинг aliexpress с помощью pyhon selenium).

Я пытаюсь провести веб-скраппинг Aliexpress с помощью Selenium и Python, и все вроде бы в порядке. Проблема, с которой я столкнулся, заключается в том, что мой код соскабливает только и ровно 10 продуктов с каждой страницы вместо всех продуктов, и я до сих пор не знаю причину этого. Кроме того, мне нужен метод, позволяющий просматривать ссылки на каждый продукт для извлечения отзывов и комментариев. Вот мой код :

from selenium import webdriver  
from lxml import html 
from time import sleep
from itertools import zip_longest
import csv

driver = webdriver.Edge(executable_path=r"C:/Users/OUISSAL/Desktop/wscraping/XEW/scraping/codes/msedgedriver")
    
with open ("data.csv", "w", encoding="utf-8") as csvfile:
    wr = csv.writer(csvfile)
    wr.writerow(["Title","Price", "Currency", "Reviews", "Number of orders"])
    for page_nb in range (1,4):
            driver.get('https://www.aliexpress.com/wholesale?trafficChannel=main&d=y&CatId=0&SearchText=bluetooth+earphones&ltype=wholesale&SortType=default&page={}'.format(page_nb))
            sleep(1)
            tree = html.fromstring(driver.page_source)
            driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
            sleep(10)
            for product_tree in tree.xpath('/html/body/div[3]/div/div/div[2]/div[2]/div/div[2]'):
                title = product_tree.xpath('.//*[@id="root"]/div/div/div[2]/div[2]/div/div[2]//div[2]/div[1]/h1/text()')
                price = product_tree.xpath('.//*[@id="root"]/div/div/div[2]/div[2]/div/div[2]//div[2]/div[2]/span[2]/text()')
                currency = product_tree.xpath('.//*[@id="root"]/div/div/div[2]/div[2]/div/div[2]//div[2]/div[2]/span[1]/text()')
                review = product_tree.xpath('.//*[@id="root"]/div/div/div[2]/div[2]/div/div[2]//div[2]/div[4]/span[2]/text()')
                nb_sold = product_tree.xpath('.//*[@id="root"]/div/div/div[2]/div[2]/div/div[2]//div[2]/div[4]/span[1]/text()')
                list = [title, price, currency, review, nb_sold]
            
            exported = zip_longest(*list)
            wr.writerows(exported)  
            print(list)     
                    
driver.close()

Спасибо!

Вам необходимо свести использование Xpath к минимуму, насколько это возможно.

Попробуйте найти элементы по синтаксису CSS, например:

Это найдет элемент div, который имеет слово 123 в атрибуте class

"div[class*='123']"

Это найдет элемент через Xpath, в тексте которого есть слово Hello:

"*[text(contains(),'Hello')]"

Следует избегать длинного корня Xpath, поскольку он не читается и дольше выполняется. После того, как вы потренируетесь в использовании некоторых селекторов CSS и Xpath, вам будет легче находить элементы, щелкать по ним или читать данные внутри них.

Также сон всего в 1 секунду может оказаться неэффективным в будущем. Сайт может ответить с некоторой задержкой, и вы увидите, что произойдет через 3 секунды или больше. Читайте об элементе WebDriverWait, который умеет ждать до определенного порога и условиях ожидания

Есть две проблемы:

Первый:

Вы должны использовать html.fromstring(driver.page_source) после прокрутки вниз.

Второй:

Он добавляет элементы только тогда, когда они отображаются внутри окна (в viewport), поэтому вы не можете перейти непосредственно к концу страницы. Вы должны прокручивать страницу частично (в цикле), используя, например, window.innerHeight.

current_offset = 0

while True:
    driver.execute_script("window.scrollBy(0, window.innerHeight);")
    sleep(.5)  # JavaScript has time to add elements

    new_offset = driver.execute_script("return window.pageYOffset;")
    #print(new_offset,current_offset)
    if new_offset <= current_offset:
        break

    current_offset = new_offset

Полный рабочий код с другими изменениями в xpath.

Это дает мне 60 элементов на каждой странице.

Вернуться на верх