【问题标题】:How can I read the stock data from a Digikey website using Python and Selenium?如何使用 Python 和 Selenium 从 Digikey 网站读取股票数据?
【发布时间】:2021-08-02 06:32:45
【问题描述】:

这是一个示例 Digikey 网站:https://www.digikey.com/en/products/detail/panasonic-electronic-components/ERJ-8ENF2211V/88928?s=N4IgTCBcDaIKICUBSBaAHHAcgMTGAjPgGogC6AvkA

我正在尝试从上述网站读取库存可用性数据,在这种情况下,在发布时为 42,107。我在下面包含了我的代码的 sn-p。那里有一些我正在使用的额外调试行,而且我是一个完全的 python 菜鸟,所以放轻松:)。

“ENTER MPN”部分运行良好,可以将我带到上面提供的链接。我在早期添加了“等待加载”部分作为预防措施,以确保加载内容并且我可以直观地看到我试图捕获的数据。

当我尝试阅读库存可用性时,我收到一条错误消息,指出该元素不存在。我直接从检查表示库存数量的行中获取 Xpath,所以我相当确定这是正确的。另一个有趣的事情是,我能够在顶部的“产品属性”或“摘要”部分中搜索并找到所有元素。我只是找不到“价格和采购”部分中包含的任何元素。从一些阅读中,我认为这可能是一个 iFrame 问题,我需要切换到正确的框架,但我也尝试循环浏览所有找到的 iFrame 并进行读取,但也没有任何效果。

很高兴尝试一些想法!

# Enter MPN
search_box_xpath = '//html/body/header/div[2]/div[1]/div/div[2]/div[2]/input'
wait.until(EC.visibility_of_element_located((By.XPATH, search_box_xpath)))
search_box = driver.find_element_by_xpath(search_box_xpath)
driver.execute_script("arguments[0].click();", search_box)
search_box.send_keys(MPN) # Type in MPN

search_button_xpath = '//html/body/header/div[2]/div[1]/div/div[2]/div[3]/button'
wait.until(EC.visibility_of_element_located((By.XPATH, search_button_xpath)))
search_button = driver.find_element_by_xpath(search_button_xpath)
driver.execute_script("arguments[0].click();", search_button)

# Wait for load
time.sleep(5)

# Try and read Stock availability
stockText_xpath = '//html/body/div[2]/main/div/div[1]/div[2]/div/div/div[2]/div/div[1]'
wait.until(EC.visibility_of_element_located((By.XPATH, stockText_xpath)))
print('ELEMENT FOUND!')
stockText = driver.find_element_by_xpath(stockText_xpath)
raw_input('FOUND STOCK TEXT!')

【问题讨论】:

  • XPATH of "//span[contains(text(), "In Stock")] 可能会这样做。请注意,如果您在那里使用帐户,这违反了他们的服务条款:“您不得使用任何机器人、抓取工具、蜘蛛程序或其他自动化方式访问或收集本网站的内容,或在任何其他网站或网页上镜像、联合品牌或框架主页或本网站的任何其他页面。”
  • 像这样的长 xpath 非常不稳定。您是否在stockText = driver.find_element_by_xpath(stockText_xpath) 行收到错误消息?
  • 错误实际上是来自检查可见性的那一行上方的等待命令
  • 另外,即使我在价格和采购部分搜索可以找到的更简单的东西(driver.find_element_by_class_name('jss334')),它仍然找不到它

标签: python-2.7 selenium iframe


【解决方案1】:

正如其他人提到的,您应该使用更强大的 xpath。下面是如何缩短 xPath 的一个示例。以下将打开 URL,搜索“MPN”并点击“In Stock”复选框

driver.get('https://www.digikey.com/en/products/detail/panasonic-electronic-components/ERJ-8ENF2211V/88928?s=N4IgTCBcDaIKICUBSBaAHHAcgMTGAjPgGogC6AvkA')

search_box_xpath = "//input[@name='keywords']"
WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH, search_box_xpath)))
search_box = driver.find_element_by_xpath(search_box_xpath)
search_box.send_keys("MPN") # Type in MPN

search_button_xpath = "//button[@class='search-button']"
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH, search_button_xpath))).click()
    
stock_availability = "(//span[@class='MuiIconButton-label'])[1]"
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH, stock_availability))).click()

编辑

我刚刚重新阅读了您的问题,这有点令人困惑。如果您只是在查找您提供的直接 URL 上列出的总库存(不搜索任何内容),您可以使用以下内容:

total_stock_xpath = "//div[@class='jss195']/div/div"
total_stock = WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH, total_stock_xpath))).text
print(total_stock)

打印:

37,107 In Stock

根据需要格式化 Python 2.7

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多