【问题标题】:Scraping a web page from a website built with React and jQuery从使用 React 和 jQuery 构建的网站中抓取网页
【发布时间】:2021-11-11 05:06:40
【问题描述】:

我需要从以下链接中提取产品名称、价格和默认颜色: Link

但是,每次我加载以下脚本时,检索的信息都会有所不同(有时会打印所有三个值,有时会打印 1-2 个或没有)。无论 WebDriverWait 如何,都会发生这种情况。

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.webdriver.common.action_chains import ActionChains as AC
#import json
from bs4 import BeautifulSoup as soup
browser = webdriver.Firefox()
browser.get('https://shop.mango.com/gb/women/skirts-midi/midi-satin-skirt_17042020.html?c=99')

wait = WebDriverWait(browser, 100).until(EC.presence_of_all_elements_located)

s = soup(browser.page_source, 'html.parser')
name = s.select('.product-name')[0].getText()
price = s.select('.product-sale')[0].getText()
color = s.select('.colors-info')[0].getText()
print(name, price, color)

能否请您告知如何提取所有三个元素?如果我尝试下载带有请求或抓取的页面,则缺少上述元素。

【问题讨论】:

  • 您正在使用 beautoful 汤而不是 Selenium 来提取项目。所以 webdriverwait 不会对其产生任何影响。
  • @cruisepandey 与 selenium 相同:``` browser.get('shop.mango.com/gb/women/skirts-midi/…) wait = WebDriverWait(browser, 100).until(EC.presence_of_all_elements_located) name = browser.find_element_by_class_name( 'product-name').text price = browser.find_element_by_class_name('product-sale').text color = browser.find_element_by_class_name('colors-info').text product = {'name': name, 'price': price , 'color': color } with open('product5.json','w') as product_dumped : json.dump(product,product_dumped) ```

标签: python selenium selenium-webdriver beautifulsoup scrapy


【解决方案1】:

几点:

  1. 有一个接受 cookie 按钮,您必须单击该按钮才能继续操作。

  2. 在 cookie 按钮之后有一个模态关闭按钮,我们必须单击它才能继续下一步。

  3. 在这种情况下使用显式等待,元素的可见性。

  4. 首选CSS 而不是xpath

  5. 最大化浏览器。

代码:

driver = webdriver.Chrome(driver_path)
driver.maximize_window()
#driver.implicitly_wait(50)
wait = WebDriverWait(driver, 20)

driver.get('https://shop.mango.com/gb/women/skirts-midi/midi-satin-skirt_17042020.html?c=99')

try:
    print("to accept cookies")
    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[id='onetrust-accept-btn-handler']"))).click()
except:
    pass

try:
    print("to close modal pop up windows")
    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div[class*='closeModal'][class$='confirmacionPais']"))).click()
except:
    pass


name = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'product-name'))).text
price = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'product-sale'))).text
color = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'colors-info'))).text

print(name, price, color)

进口:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

输出:

to accept cookies
to close modal pop up windows
Midi satin skirt £39.99 Black

【讨论】:

  • 非常感谢@cruuisepandey,它工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多