当前位置: 首页 > 面试题库 >

如何在新标签页中打开网站中的每个产品以通过Python使用Selenium进行剪贴

呼延才
2023-03-14
问题内容

我正在使用selenium抓取一个网站“ https://www.medline.com/catalog/category-
products.jsp?itemId=Z05-CA02_03&N=111079+4294770643&iclp=Z05-CA02_03

对于单页和单个产品,我可以通过传递产品网址来进行抓取,但是我试图通过selenium来做到这一点,即在逐个选择所有产品后自动选择产品页面,并且应该移至下一页并在打开后产品详细信息页面应该刮掉,这是由美丽的汤完成的,这里是基本URL中的产品URL“
https://www.medline.com/product/SensiCare-Powder-Free-Nitrile-Exam-
Gloves/SensiCare/Z05-PF00342 ?question =&index = P1&indexCount =
1 “

这是我的代码:

    chromeOptions = webdriver.ChromeOptions()
    chromeOptions.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(executable_path='C:/Users/ptiwar34/Documents/chromedriver.exe', chrome_options=chromeOptions, desired_capabilities=chromeOptions.to_capabilities())
    driver.get("https://www.medline.com/catalog/category-products.jsp?itemId=Z05-CA02_03&N=111079+4294770643&iclp=Z05-CA02_03")

    while True:
        try:  
            WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[contains(@class, 'resultGalleryViewRow')]//div[@class='medGridProdTitle']//a[contains(@href]"))).click()
            print("Clicked for next page")
        except TimeoutException:
            print("No more pages")
            break
    driver.quit()

在这里它不会引发错误

它没有打开每个产品的页面,我想在新选项卡中打开每个产品,在将其废弃后删除并打开新产品的新选项卡


问题答案:

从网页https://www.medline.com/catalog/category- products.jsp?itemId=Z05-CA02_03&N=111079+4294770643&iclp=Z05-CA02_03中打开每个产品的
html" target="_blank">标签,并取消它,你必须诱导_WebDriverWait_的number_of_windows_to_be(2),你可以使用下面的[定位策略:

  • 代码块:
        from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    import time

    chrome_options = webdriver.ChromeOptions() 
    chrome_options.add_argument("start-maximized")
    driver = webdriver.Chrome(options=chrome_options, executable_path=r'C:\WebDrivers\chromedriver.exe')

    driver.get("https://www.medline.com/catalog/category-products.jsp?itemId=Z05-CA02_03&N=111079+4294770643&iclp=Z05-CA02_03")
    my_hrefs = [my_elem.get_attribute("href") for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[contains(@class, 'resultGalleryViewRow')]//div[@class='medGridProdTitle']//a")))]
    windows_before  = driver.current_window_handle # Store the parent_window_handle for future use
    for my_href in my_hrefs:
        driver.execute_script("window.open('" + my_href +"');")
        WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2)) # Induce  WebDriverWait for the number_of_windows_to_be 2
        windows_after = driver.window_handles
        new_window = [x for x in windows_after if x != windows_before][0] # Identify the newly opened window
        driver.switch_to.window(new_window) # switch_to the new window
        time.sleep(3) # perform your webscrapping here
        print(driver.title) # print the page title or your perform your webscrapping
        driver.close() # close the window
        driver.switch_to.window(windows_before) # switch_to the parent_window_handle
    driver.quit() #quit your program
  • 控制台输出:
        SensiCare Powder-Free Nitrile Exam Gloves | Medline Industries, Inc.
    MediGuard Vinyl Synthetic Exam Gloves | Medline Industries, Inc.
    CURAD Stretch Vinyl Exam Gloves | Medline Industries, Inc.
    CURAD Nitrile Exam Gloves | Medline Industries, Inc.
    SensiCare Ice Blue Powder-Free Nitrile Exam Gloves | Medline Industries, Inc.
    MediGuard Synthetic Exam Gloves | Medline Industries, Inc.
    Accutouch Synthetic Exam Gloves | Medline Industries, Inc.
    Aloetouch Ice Powder-Free Nitrile Exam Gloves | Medline Industries, Inc.
    Aloetouch 3G Powder-Free Synthetic Exam Gloves | Medline Industries, Inc.
    SensiCare Powder-Free Stretch Vinyl Sterile Exam Gloves | Medline Industries, Inc.
    CURAD Powder-Free Textured Latex Exam Gloves | Medline Industries, Inc.
    Accutouch Chemo Nitrile Exam Gloves | Medline Industries, Inc.
    Aloetouch 12" Powder-Free Nitrile Exam Gloves | Medline Industries, Inc.
    Ultra Stretch Synthetic Exam Gloves | Medline Industries, Inc.
    Generation Pink 3G Synthetic Exam Gloves | Medline Industries, Inc.
    SensiCare Extended Cuff Powder-Free Nitrile Exam Gloves | Medline Industries, Inc.
    Eudermic MP High-Risk Powder-Free Latex Exam Gloves | Medline Industries, Inc.
    Aloetouch Powder-Free Latex Exam Gloves | Medline Industries, Inc.
    CURAD Powder-Free Nitrile Exam Gloves | Medline Industries, Inc.
    Medline Sterile Powder-Free Latex Exam Gloves | Medline Industries, Inc.
    SensiCare Silk Powder-Free Nitrile Exam Gloves | Medline Industries, Inc.
    Medline Sterile Powder-Free Latex Exam Glove Pairs | Medline Industries, Inc.
    MediGuard 2.0 Nitrile Exam Gloves | Medline Industries, Inc.
    Designer Boxed Vinyl Exam Gloves | Medline Industries, Inc.


 类似资料:
  • 我正在使用selenium“https://www.medline.com/catalog/category-products.jsp?itemid=Z05-CA02_03&n=111079+4294770643&iclp=Z05-CA02_03”搜索一个网站 它不打开每一个产品的页面,我想在新的标签打开每一个产品,刮掉它后删除并打开新的标签为一个新的产品

  • 问题内容: 因此,我试图在WebDriver内的新选项卡上打开网站。我想这样做,因为使用PhantomJS为每个网站打开一个新的WebDriver大约需要3.5秒,所以我想提高速度… 我正在使用多进程python脚本,并且我想从每个页面中获取一些元素,因此工作流程如下: 但是我找不到任何方法来实现这一目标。 这是我正在使用的代码。网站之间永远都需要花时间,我需要它很快。允许使用其他工具,但是我不知

  • 在将此标记为重复之前。请阅读问题。这种问题我见过很多回答。但是没有一个真的管用。 这是我的代码。当我运行这个而不是打开一个新选项卡时,它只会在当前选项卡中打开。我如何才能在新选项卡中打开第二个链接?

  • 问题内容: 我有检查网站的程序,我想知道如何通过Python中的代理检查它… 这是代码,例如 问题答案: 默认情况下,使用环境变量来确定要使用的HTTP代理: 如果您想在应用程序内部指定代理,则可以给以下参数提供一个参数: 编辑: 如果我正确理解您的评论,则您想尝试多个代理并在尝试时打印每个代理。这样的事情怎么样?

  • 问题内容: 自从将近一个月以来,我一直在使用CasperJS测试框架来制作一些测试套件,但是其中之一面临着一个问题。 这是我要执行的操作:我正在浏览一个url(第1页),并且必须从另一个url(像在图形浏览器中那样模拟新选项卡)执行另一个操作,而不必退出第一个(第1页)。来自第二个URL的操作将更改我的第一个URL。希望它足够清楚:) 因此,现在,当我到达观察第一个URL的步骤时,我通过执行操作打

  • 问题内容: 我想使用Selenium WebDriver和Python在不同的选项卡中打开很多URL。 我不确定出了什么问题: 我查阅了教程,在我看来,这段代码应该可以实现我想要的功能。实际发生的情况是打开浏览器,打开url1,打开一个新标签, 但是 url2然后加载到原始标签中,而不是新标签中(即使新标签似乎是活动的)。 (我使用的是Chrome,因为使用Firefox时我根本无法加载任何URL