Как скрести страницу с информацией о продукте на селен - PullRequest
2 голосов
/ 18 марта 2020

Я изучаю селен. Прямо сейчас мой этот код может очистить весь заголовок продукта со страницы шрифта этого URL https://www.daraz.com.bd/consumer-electronics/?spm=a2a0e.pdp.breadcrumb.1.4d20110bzkC0bn, но я хочу щелкнуть ссылку на каждый продукт на этой странице, чтобы перейти на страницу сведений о продукте, чтобы я мог очистить информация со страницы сведений о продукте. вот мой код:

from selenium import webdriver
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.common.exceptions import TimeoutException

#argument for incognito Chrome
option = webdriver.ChromeOptions()
option.add_argument(" — incognito")

browser = webdriver.Chrome()

browser.get("https://www.daraz.com.bd/consumer-electronics/?spm=a2a0e.pdp.breadcrumb.1.4d20110bzkC0bn")

# Wait 20 seconds for page to load
timeout = 20
try:
    WebDriverWait(browser, timeout).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='c16H9d']")))
except TimeoutException:
    print("Timed out waiting for page to load")
    browser.quit()



# find_elements_by_xpath returns an array of selenium objects.
titles_element = browser.find_elements_by_xpath("//div[@class='c16H9d']")


# use list comprehension to get the actual repo titles and not the selenium objects.
titles = [x.text for x in titles_element]
# print out all the titles.
print('titles:')
print(titles, '\n')
browser.quit()

Ответы [ 2 ]

4 голосов
/ 18 марта 2020

Вместо того щелчка, который вы имеете в виду, я предлагаю получить href и открыть один за другим.

Вам нужен этот локатор: By.XPATH, "//div[@class='c16H9d']//a" и используйте .visibility_of_all_elements_located для ожидания всех элементов вместо .visibility_of_element_located.

После этого получите href с помощью этого метода: .get_attribute('href')

и откройте новое окно с уже полученными указанными c href.

browser.get("https://www.daraz.com.bd/consumer-electronics/?spm=a2a0e.pdp.breadcrumb.1.4d20110bzkC0bn")

# Wait 20 seconds for page to load
timeout = 20

elements = WebDriverWait(browser, timeout).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@class='c16H9d']//a")))

for element in elements:
    #get href
    href = element.get_attribute('href')
    print(href)
    #open new window with specific href
    browser.execute_script("window.open('" +href +"');")
    # switch to new window
    browser.switch_to.window(browser.window_handles[1])


    #......now you are on the new window, scrape here
    #example to scrape 'title' in the new window
    xx = WebDriverWait(browser, timeout).until(EC.visibility_of_element_located((By.CLASS_NAME, "pdp-mod-product-badge-title")))
    print(xx.text)


    #close the new window
    browser.close()
    #back to main window
    browser.switch_to.window(browser.window_handles[0])

browser.quit()
2 голосов
/ 18 марта 2020

Вы можете использовать BeautifulSoup, чтобы сделать жизнь проще.

Я немного изменил ваш код, чтобы проиллюстрировать, как вы можете перемещаться по всем ссылкам на отдельные товары на странице.

from selenium import webdriver
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.common.exceptions import TimeoutException
from bs4 import BeautifulSoup

#argument for incognito Chrome
option = Options()
option.add_argument("--incognito")


browser = webdriver.Chrome(options=option)

browser.get("https://www.daraz.com.bd/consumer-electronics/?spm=a2a0e.pdp.breadcrumb.1.4d20110bzkC0bn")

# Wait 20 seconds for page to load
timeout = 20
try:
    WebDriverWait(browser, timeout).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='c16H9d']")))
except TimeoutException:
    print("Timed out waiting for page to load")
    browser.quit()

soup = BeautifulSoup(browser.page_source, "html.parser")

product_items = soup.find_all("div", attrs={"data-qa-locator": "product-item"})
for item in product_items:
    item_url = f"https:{item.find('a')['href']}"
    print(item_url)

    browser.get(item_url)

    item_soup = BeautifulSoup(browser.page_source, "html.parser")

    # Use the item_soup to find details about the item from its url.

browser.quit()

Короче говоря, это именно то, что arundeep chohan упоминается в разделе комментариев. Вы можете создать новый экземпляр browser, скажем browser1 = webdriver.Chrome(), который может перемещаться по всем URL-адресам продукта.

Кроме того, я понял, что режим incognito не работает в вашем сценарии. Вам необходимо определить chrome_options и передать его в качестве аргумента методу webdriver.Chrome.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...