[英]Scraping with Selenium on Dynamic Content (MULTIPLE Pages) - Python
我一直在尝试从 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 dataframe
url = ["https://www.doordash.com/store/popeyes-toronto-254846/en-CA", "https://www.doordash.com/store/sunset-grill-toronto-211003/en-CA"]
url = pd.DataFrame(数据) URL
错误消息如下(更长)。 它说没有这样的元素,但是,我在页面加载完成后单独尝试了它,找到了这些元素并抓取了正确的内容。 只是当我尝试抓取多个页面时,它给了我一个错误。
任何帮助,将不胜感激!
您可以使用time模块来暂停脚本。
import time
time.sleep(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)
通过使用with webdriver.Chrome(ChromeDriverManager().install()) as driver:
退出语句后驱动程序连接将关闭。
我建议你使用waits 。 它可能比time.sleep
更好,因为你不必自己找到完美的时间,而且它更可靠,但它使代码更大(尽管你可以为它创建 function):
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
对于每次打开浏览器,请参阅ZacLanghorne的答案
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.