我想从不断变化的网页中抓取数据(每两秒钟发送一次新帖子)。我在while循环中调用driver.get(),但是经过几次重复后,我没有得到新的结果。它不断不断地返回相同的帖子。我确定页面正在更改(已在浏览器中选中)
我尝试使用time.wait()和driver.refresh(),但问题仍然存在
chrome_options = Options()
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=self.cp.getSeleniumDriverPath())
while True:
driver.get(url)
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
posts = soup.find_all(some class)
(...)
some logic with the result
(...)
driver.refresh() #tried interchangably with driver.get() from the beginning of loop
据我所知,driver.get()应该在执行下一行代码之前等待页面加载。也许我在语言方面做错了一些(我对python很陌生)。我是否应该在每次循环运行时重置驱动程序的某些属性?我已经看到在这样的循环中使用driver.get()的解决方案,但是在我的情况下它不起作用。如何强制驱动程序在抓取页面之前完全刷新页面?
答案 0 :(得分:0)
我猜您的Chrome网络驱动程序正在缓存。尝试添加以下内容:
driver.manage().deleteAllCookies()
在获取页面之前。
答案 1 :(得分:0)
selenium
将出现错误。您应该实现一个time.sleep()
或某个selenium specific wait method,以确保可以处理该页面。像
import time
while True:
driver.get(url)
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
posts = soup.find_all(some class)
(...)
some logic with the result
(...)
driver.refresh()
time.sleep(5) # probably too long, but I usually try to stay on the safe side
最好的选择可能是使用
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
在我上面发布的链接中,可以确保元素存在,而不会强迫等待5秒。如果您想要的元素在.0001秒内存在,那么您的脚本将在那之后继续。这样一来,您可以将超时设置为任意大(例如120秒),而不会影响执行速度。