在动态内容(多页)上使用Selenium进行抓取-Python

在动态内容(多页)上使用Selenium进行抓取-Python,python,selenium,web-scraping,Python,Selenium,Web Scraping,我一直在尝试从Doordash中获取动态内容餐厅标题、评级、餐厅类型,我要获取的不仅仅是一个网站,而是多个网站,可能在Doordash上的单个域上有100-1000页左右 我得到了一个“单刮工作,然而,当我使用下面的代码,它给了我一个很长的错误 def ScrapeDoorDash(df): for i in df: url = df[i] print(url) driver = webdriver.Chrome(ChromeDriverManager().install

我一直在尝试从Doordash中获取动态内容餐厅标题、评级、餐厅类型,我要获取的不仅仅是一个网站,而是多个网站,可能在Doordash上的单个域上有100-1000页左右

我得到了一个“单刮工作,然而,当我使用下面的代码,它给了我一个很长的错误

def ScrapeDoorDash(df):
for i in df:
    url = df[i]
    print(url)
    driver = webdriver.Chrome(ChromeDriverManager().install())
    driver.get(url)
    restaurantname = driver.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/div/div[1]/header/div[2]/h1').text
    rating = driver.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/div/div[1]/header/div[2]/div[1]/div[3]/div/span[1]').text
    #estauranttype = driver.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/div/div[1]/header/div[2]/div[1]/div[1]/span').text
    #Store into / print Out
    print (restaurantname, rating, restauranttype)
XPath已经正确了,但我注意到Selenium每次都会打开chrome,让它在抓取内容之前完成加载。在我上面提供的代码中,我注意到在第一页加载完成之前,错误已经出现了

有没有一种方法可以实现一些代码来暂停for循环,让它在进入URL数据框中的下一个项目之前先加载和刮取

请使用下面的创建URL数据框

url = ["https://www.doordash.com/store/popeyes-toronto-254846/en-CA", "https://www.doordash.com/store/sunset-grill-toronto-211003/en-CA"]
url=pd.DataFramedata 网址

错误消息是belowit,但要长得多。它说没有这样的元素,但是,当页面加载完成后,我单独尝试了它,找到了这些元素,并删除了正确的内容。只是当我尝试刮取多个页面时,它会给我一个错误。


任何帮助都将不胜感激

您可以使用时间模块暂停脚本

把它放在请求和风景线之间

脚本将暂停您放入括号中的时间,以秒为单位。在这种情况下为2秒


执行一些测试并使用最短的时间让脚本工作。

您可以使用时间模块暂停脚本

把它放在请求和风景线之间

脚本将暂停您放入括号中的时间,以秒为单位。在这种情况下为2秒

做一些测试,用最短的时间让脚本工作。

正如Fabix所说,时间模块允许您在从网页检索元素之前休眠代码

此外,为了防止chrome驱动程序为每个url打开新实例,请在循环外部打开浏览器

import time

def ScrapeDoorDash(urls):
    with webdriver.Chrome(ChromeDriverManager().install()) as driver:
        for url in urls:
            print(url)
            driver.get(url)
            time.sleep(3)
            restaurantname = driver.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/div/div[1]/header/div[2]/h1').text
            rating = driver.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/div/div[1]/header/div[2]/div[1]/div[3]/div/span[1]').text
            restauranttype = driver.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/div/div[1]/header/div[2]/div[1]/div[1]/span').text
            #Store into / print Out
            print (restaurantname, rating, restauranttype)
通过与webdriver.chromechromedivermanager.install as driver一起使用:在您退出该语句后,驱动程序连接将关闭。

正如Fabix所说,时间模块将允许您在从网页检索元素之前休眠代码

此外,为了防止chrome驱动程序为每个url打开新实例,请在循环外部打开浏览器

import time

def ScrapeDoorDash(urls):
    with webdriver.Chrome(ChromeDriverManager().install()) as driver:
        for url in urls:
            print(url)
            driver.get(url)
            time.sleep(3)
            restaurantname = driver.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/div/div[1]/header/div[2]/h1').text
            rating = driver.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/div/div[1]/header/div[2]/div[1]/div[3]/div/span[1]').text
            restauranttype = driver.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/div/div[1]/header/div[2]/div[1]/div[1]/span').text
            #Store into / print Out
            print (restaurantname, rating, restauranttype)
通过与webdriver.chromechromedivermanager.install as driver一起使用:退出该语句后,驱动程序连接将关闭。

我建议您使用。它可能比time.sleep更好,因为你不必自己找到完美的时间,而且它更可靠,但它使代码更大,尽管你可以为它创建函数:

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.common.exceptions import TimeoutException

xpath = "..."
wait_time = 10
# driver will try to find element by xpath for 10 seconds
# if could not find, will raise TimeoutException

interval = 0.1 # time between attempts to search xpath. 0.5 seconds by default

# returns found element
elem = WebDriverWait(driver, wait_time , interval ).until(EC.presence_of_element_located((By.XPATH, xpath)))
some = elem.text
有关每次打开浏览器的信息,请参见Zaclanghorn的答案,我建议您使用。它可能比time.sleep更好,因为你不必自己找到完美的时间,而且它更可靠,但它使代码更大,尽管你可以为它创建函数:

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.common.exceptions import TimeoutException

xpath = "..."
wait_time = 10
# driver will try to find element by xpath for 10 seconds
# if could not find, will raise TimeoutException

interval = 0.1 # time between attempts to search xpath. 0.5 seconds by default

# returns found element
elem = WebDriverWait(driver, wait_time , interval ).until(EC.presence_of_element_located((By.XPATH, xpath)))
some = elem.text
有关每次打开浏览器的信息,请参见Zaclanghorn的回答