我已经在python中编写了一个与selenium结合使用的刮刀,以获取redmart.com上的所有产品名称。每次我运行我的代码时,我只能从该页面获得27个名字,尽管该页面有很多名称。仅供参考,页面启用了延迟加载方法。我的刮刀可以到达页面底部但只刮掉27个名字。我无法理解我在刮刀中应用的逻辑迷失了什么。希望得到任何解决方法。
这是我到目前为止写的脚本:
from selenium import webdriver; import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)
driver.get("https://redmart.com/new")
check_height = driver.execute_script("return document.body.scrollHeight;")
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
try:
wait.until(lambda driver: driver.execute_script("return document.body.scrollHeight;") > check_height)
check_height = driver.execute_script("return document.body.scrollHeight;")
except:
break
for names in driver.find_elements_by_css_selector('.description'):
item_name = names.find_element_by_css_selector('h4 a').text
print(item_name)
driver.quit()
答案 0 :(得分:0)
您必须等待加载新内容。
这是一个非常简单的例子:
driver.get('https://redmart.com/new')
products = driver.find_elements_by_xpath('//div[@class="description"]/h4/a')
print(len(products)) # 18 products
driver.execute_script('window.scrollTo(0,document.body.scrollHeight);')
time.sleep(5) # wait for new content to be loaded
products = driver.find_elements_by_xpath('//div[@class="description"]/h4/a')
print(len(products)) # 36 products
有效。
您还可以查看XHR请求,并尝试在不使用“time.sleep()”和“driver.execute_script”的情况下抓取您想要的任何内容。
例如,在滚动网站时,会从此网址加载新产品:
https://api.redmart.com/v1.6.0/catalog/search?q=new&pageSize=18&page=1
如您所见,可以修改 pageSize (最多100个产品)和页面等参数。使用此URL,您甚至无需使用Selenium和Chrome即可抓取所有产品。您可以使用Python Requests
完成所有这些操作