我的刮刀无法从网页上获取所有项目

时间:2017-12-31 07:40:11

标签: python python-3.x selenium selenium-webdriver web-scraping

我已经在python中编写了一些与selenium结合使用的代码来解析网页中的不同产品名称。如果使浏览器向下滚动,则几乎没有可见的按钮可见。如果页面向下滚动直到没有任何加载点击按钮,则网页显示它的完整内容。我的刮刀似乎做得很好,但我没有得到所有的结果。该页面中有大约200种产品,但我有90种产品。我应该在刮刀中带来什么改变才能得到它们?提前谢谢。

我正在处理的网页:Page_Link

这是我尝试的脚本:

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

driver = webdriver.Chrome()
driver.get("put_above_url_here")
wait = WebDriverWait(driver, 10)

page = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,".listing_item")))
for scroll in range(17):
    page.send_keys(Keys.PAGE_DOWN)
    time.sleep(2)
    try:
        load = driver.find_element_by_css_selector(".lm-btm")
        load.click()
    except Exception:
        pass

for item in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "[id^=item_]"))):
    name = item.find_element_by_css_selector(".pro-name.el2").text
    print(name)
driver.quit()

2 个答案:

答案 0 :(得分:3)

尝试使用以下代码获取所需数据:

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

driver = webdriver.Chrome()
driver.get("https://www.purplle.com/search?q=hair%20fall%20shamboo")
wait = WebDriverWait(driver, 10)

header = driver.find_element_by_tag_name("header")
driver.execute_script("arguments[0].style.display='none';", header)

while True:

    try:
        page = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".listing_item")))
        driver.execute_script("arguments[0].scrollIntoView();", page)
        page.send_keys(Keys.END)
        load = wait.until(EC.element_to_be_clickable((By.PARTIAL_LINK_TEXT, "LOAD MORE")))
        driver.execute_script("arguments[0].scrollIntoView();", load)
        load.click()
        wait.until(EC.staleness_of(load))
    except:
        break

for item in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "[id^=item_]"))):
    name = item.find_element_by_css_selector(".pro-name.el2").text
    print(name)
driver.quit()

答案 1 :(得分:0)

你应该只使用Selenium作为最后的手段。

在网页中进行简单的浏览会显示其调用的API以获取您的数据。

它返回一个包含所有细节的JSON输出:

Link

您现在可以轻松地循环并存储在数据框中。

非常快,错误少于硒。

相关问题