Я не могу получить все товары со страницы сайта (скраппинг 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<ype=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 элементов на каждой странице.