我正在滚动浏览Google Play商店和应用程序的评论,由应用程序页面的URL指定。然后,Selenium找到评论并向下滚动以加载所有评论。滚动部分有效,没有无头选项,我可以观看硒到达网站的尽头。不起作用的是保存 html 内容以供进一步分析。
根据其他答案,我尝试了不同的方法来保存源代码。
innerHTML = DRIVER.execute_script("return document.body.innerHTML")
或
innerHTML = DRIVER.page_source
两者都会导致相同的错误消息和异常。
我用于滚动页面并加载所有评论的代码
SCROLL_PAUSE_TIME = 5
options = Options()
options.headless = True
FP = webdriver.FirefoxProfile()
FP.set_preference("intl.accept_languages", "de")
for url in START_URLS:
try:
DRIVER = webdriver.Firefox(options=options, firefox_profile=FP)
DRIVER.get(url)
time.sleep(SCROLL_PAUSE_TIME)
app_name = DRIVER.find_element_by_xpath('//h1[@itemprop="name"]').get_attribute('innerText')
all_reviews_button = DRIVER.find_element_by_xpath('//span[text()="Alle Bewertungen lesen"]')
all_reviews_button.click()
time.sleep(SCROLL_PAUSE_TIME)
last_height = DRIVER.execute_script("return document.body.scrollHeight")
while True:
DRIVER.execute_script("window.scrollTo(0, document.body.scrollHeight);")
try:
DRIVER.find_element_by_xpath('//span[text()="Mehr anzeigen"]').click()
except:
pass
time.sleep(SCROLL_PAUSE_TIME)
new_height = DRIVER.execute_script("return document.body.scrollHeight")
if new_height == last_height:
logger.info('Durchlauf erfolgreich')
innerHTML = DRIVER.execute_script("return document.body.innerHTML")
with open(app_name +'.html','w', encoding='utf-8') as out:
out.write(html)
break
last_height = new_height
except Exception as e:
logger.error('Exception occurred', exc_info=True)
finally:
DRIVER.quit()
日志文件,显示无限滚动到达页面末尾,但无法保存文件
10.09.19 16:12:00 - INFO - Durchlauf erfolgreich
10.09.19 16:12:13 - ERROR - Exception occurred
Traceback (most recent call last):
File "scraper.py", line 57, in <module>
innerHTML = DRIVER.execute_script("return document.body.innerHTML")
File "C:UserstenscherAppDataLocalProgramsPythonPython36libsite-packagesseleniumwebdriverremotewebdriver.py", line 636, in execute_script
'args': converted_args})['value']
File "C:UserstenscherAppDataLocalProgramsPythonPython36libsite-packagesseleniumwebdriverremotewebdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:UserstenscherAppDataLocalProgramsPythonPython36libsite-packagesseleniumwebdriverremoteerrorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: [Exception... "Failure" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: chrome://marionette/content/proxy.js :: sendReply_ :: line 275" data: no]
壁虎司机的最后一部分.log
...
1568124670155 Marionette WARN TimedPromise timed out after 500 ms: stacktrace:
bail@chrome://marionette/content/sync.js:223:64
1568124693017 Marionette WARN TimedPromise timed out after 500 ms: stacktrace:
bail@chrome://marionette/content/sync.js:223:64
1568124734637 Marionette INFO Stopped listening on port 57015
[Parent 14684, Gecko_IOThread] WARNING: pipe error: 109: file z:/task_1560820494/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341
[Child 10464, Chrome_ChildThread] WARNING: pipe error: 109: file z:/task_1560820494/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341
[Parent 14684, Gecko_IOThread] WARNING: pipe error: 109: file z:/task_1560820494/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341
JavaScript error: resource:///modules/sessionstore/SessionStore.jsm, line 1639: TypeError: subject.QueryInterface is not a function
A content process crashed and MOZ_CRASHREPORTER_SHUTDOWN is set, shutting down
[Child 2508, Chrome_ChildThread] WARNING: pipe error: 109: file z:/task_1560820494/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341
[Child]
我想将页面另存为文件,并在下一步中解析 html 以提取评论。但是,保存部分不适用于大页面。如果我在 100 步后退出 while 循环并保存页面,它可以正常工作。
NS_ERROR_FAILURE (0x80004005(
这是所有错误的一般错误,对于不适用更具体的错误代码的所有错误,都会发生此错误。
但是此错误消息...
selenium.common.exceptions.WebDriverException: Message: [Exception... "Failure" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: chrome://marionette/content/proxy.js :: sendReply_ :: line 275" data: no]
。暗示木偶在尝试读取/存储/复制page_source()
时抛出错误。
相关的HTML DOM将帮助我们以更好的方式调试问题。然而,问题似乎在于page_source()
非常大/大,超过了木偶可以处理的最大值的最大值。可能这是一个你正在处理的更大的string
。
解决方案
一个快速的解决方案是避免将page_source()
传递给变量并打印它以找出实际问题所在。
print(DRIVER.execute_script("return document.body.innerHTML"))
或
print(DRIVER.page_source)
<小时 />参考
您可以在以下位置找到一些相关的讨论:
- WebDriverException: Message: [(NS_ERROR_FAILURE(" 位置: "JS frame :: chrome://marionette/content/proxy.js] with Selenium GeckoDriver and Python
尾声
文档链接:
网页- 驱动:网页高度较大时截图生成错误
- WebDriver:TakeScreenshot在画布"scale(("中失败,用于大型网页
- 如果宽度或高度大于 32767,则在 ctx.scale(( 中NS_ERROR_FAILURE异常
- event.synthesizeMouseAtPoint(( 应仅在存在有效的窗口句柄时才调用 nsIDOMWindowUtils.sendMouseEvent((