2017-09-24 45 views
1

我已经用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

这个网站很好奇。假设您有权限(根据其使用条款)刮擦网站,您可能会要求他们寻求帮助。当我在页面上下滚动时,只是看着页面的HTML变化,看起来他们动态地从页面加载和卸载内容。这可以解释为什么你的代码只能看到你期望的一小部分项目。也许他们可以为您提供更方便的API来访问您所需的信息。 –

+1

@ Breaks Software,我对他们的数据并不感兴趣。我想学习的是如何处理我在刮这样的网站时遇到的情况。 – SIM

+0

由于它们似乎在动态加载和卸载内容,我不确定是否有有效的方法来使用Selenium或任何其他浏览器抓取工具来解决此问题。你是否试图在你的“while”块中包含“for”代码块,将捕获的项目存储在列表/字典中? –

回答

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

+0

感谢mostaszewski,为您解答。在您的示例中,您已经显示我应该让我的刮板等待一段时间以获取新加载的内容,并且您已设置硬编码延迟,在此情况下为5秒。我用明确的等待来做同样的事情,并且我在上面的例子中显示的相同位置做了延迟放置参数。我哪里错了? – SIM

+0

你可以发布你的代码的例子吗? – mostaszewski

+0

Omg !!!你在说什么?只要看看上面。 – SIM