我正在尝试获取此website's forum的整个html网页。向下滚动后,只能加载注释部分。滚动后,您会发现最终(在第4页上)将出现一个加载下一页按钮,您必须单击该按钮才能获得后续注释。经过大量搜索之后,下面的代码可以很好地到达注释的最后一页。它的大部分也来自此stackoverflow post和this。
作为参考,我在Windows 10上,我的Chrome驱动程序版本为76.0.3809.132
。我还使用了PhantomJS来查看哪个加载速度更快。两个驱动程序.exe
文件都与我要从中执行脚本的文件放在同一目录中。直到今天我还没有遇到任何问题。
import selenium.webdriver as webdriver
from selenium.webdriver.chrome.options import Options
def scrollDownAllTheWay(driver):
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
driver.execute_script("window.scrollTo(0, 100*document.body.scrollHeight);")
time.sleep(3)
if "Load next page</button>" in driver.page_source:
driver.find_element_by_css_selector('.myButton').click()
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
#Load this and comment out chrome headless code below, if needed.
#driver = webdriver.PhantomJS()
#Chrome driver
options = Options()
options.add_argument("--headless")
driver = webdriver.Chrome(options=options)
driver.get("https://www.chessable.com/discussion/thread/58883/official-chessable-launch-schedule-2019/")
scrollDownAllTheWay(driver)
当我使用webdriver.PhantomJS()
运行上面的脚本时(用它代替了Chrome部分),我没有任何问题。该功能一直运行到无头浏览器到达最后一页为止。很好。
当我用webdriver.Chrome()
无头运行下面的脚本时,遇到以下错误:
ElementClickInterceptedException: Message: element click intercepted: Element <button id="load-next-comments" class="myButton">...</button> is not clickable at point (388, 23). Other element would receive the click: <div class="headerHolder">...</div> (Session info: headless chrome=76.0.3809.132)
我找不到任何有助于解决此问题的 。更为奇怪的是,如果禁用options.add_argument("--headless")
部分(将其注释掉),页面加载就很好了,并完成了整个页面的滚动。我可以看到最终点击是在本地Chrome浏览器中执行的,然后看到它停止滚动并在完成后单击。
问题:为什么无头Chrome会话在这里不能正常运行,但无头版本却如此?
编辑::我刚刚发现了这个post,这可能会有所帮助,但我不确定。
注意:我愿意使用其他浏览器驱动程序,例如FireFox()
或其他任何可能的解决方法,但问题仍然存在。
答案 0 :(得分:1)
该按钮上方有一个元素,使其不可单击。 如果您更改:
for err in names:
filename_list.append((err[1].replace("* FROM CLIP NAME: ", "").replace("_MOV", ".mov")))
到
driver.find_element_by_css_selector('.myButton').click()
应该可以。实际上,除非您要进行“质量检查”,否则使用javascript进行所有操作并不是一个坏主意。
答案 1 :(得分:1)
我在Chromedriver中遇到了同样的问题。
通过在我的代码中添加以下选项来解决此问题:
options.add_argument("--window-size=1920,1080")
options.add_argument("--start-maximized")
options.add_argument("--headless")
PS:我在这里找到了解决方案:https://github.com/SeleniumHQ/selenium/issues/4685
答案 2 :(得分:0)
JavaScript
不是必需的。如果您将window-size
设置为headless
模式,它将单击next_page按钮。希望这会有所帮助。
import selenium.webdriver as webdriver
from selenium.webdriver.chrome.options import Options
def scrollDownAllTheWay(driver):
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
driver.execute_script("window.scrollTo(0, 100*document.body.scrollHeight);")
time.sleep(3)
if "Load next page</button>" in driver.page_source:
driver.find_element_by_css_selector('.myButton').click()
print('clicked')
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
options = Options()
options.add_argument("--headless")
options.add_argument('window-size=1920x1080')
driver = webdriver.Chrome(options=options)
driver.get("https://www.chessable.com/discussion/thread/58883/official-chessable-launch-schedule-2019/")
scrollDownAllTheWay(driver)
要验证代码是否有效,只需在屏幕截图之前或之后进行截图,您就会知道它是否在起作用。
import selenium.webdriver as webdriver
from selenium.webdriver.chrome.options import Options
def scrollDownAllTheWay(driver):
last_height = driver.execute_script("return document.body.scrollHeight")
i = 1
while True:
driver.execute_script("window.scrollTo(0, 100*document.body.scrollHeight);")
time.sleep(3)
if "Load next page</button>" in driver.page_source:
driver.save_screenshot("screenshot_{}.png".format(i))
i = i+1
driver.find_element_by_css_selector('.myButton').click()
driver.save_screenshot("screenshot_{}.png".format(i))
i = i + 1
print('clicked')
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
options = Options()
options.add_argument("--headless")
options.add_argument('window-size=1920x1080')
driver = webdriver.Chrome(options=options)
driver.get("https://www.chessable.com/discussion/thread/58883/official-chessable-launch-schedule-2019/")
scrollDownAllTheWay(driver)