我有一个使用Selenium和Chromium的网络爬虫,运行在Ubuntu Linux 16.04上。 所有新的抓取请求都会进入 Apache/WSGI,它为每个请求创建一个新的 python 线程,并使用 pyvirtualdisplay 和 Xvfb 生成 Chromium 进程来加载网站、登录、截屏等。
我使用带有标志的铬: 禁用扩展、禁用 GPU、无头、无沙盒
caps = DesiredCapabilities().CHROME
caps["pageLoadStrategy"] = "none"
然后我有一个函数,每秒检查一次页面是否已加载(因为某些页面在合理的时间内没有完全加载,所以我尝试等到它们至少是交互式的再继续(:
driver.execute_script("var state = document.readyState; return state;")
奇怪的是,现在当我尝试加载页面时,它会立即显示它处于"完成"状态(并在接下来的 15 秒内继续如此(。 但是当我实际尝试查找元素时,找不到它 - 所以我认为它实际上没有加载。 通常它会说它是"加载",然后是"交互式",等等。
我尝试重新启动Apache,但似乎没有修复任何问题。 可能出了什么问题?
我可以在我的进程列表中看到,当新请求进来时,Chromium 和 Xvfb 确实正在运行:
7429 ? S 0:00 Xvfb -br -nolisten tcp -screen 0 1024x768x24 :2165
7430 ? Sl 0:00 /var/www/html/flaskapp/chromedriver --port=39146
7438 ? Sl 0:00 /usr/lib/chromium-browser/chromium-browser --disable-background-networking --disable-client-side-phishing
7440 ? S 0:00 /usr/lib/chromium-browser/chromium-browser --type=zygote --no-sandbox --enable-logging --headless --log-l
7457 ? Sl 0:00 /usr/lib/chromium-browser/chromium-browser --type=gpu-process --no-sandbox --enable-logging --headless --
7468 ? S 0:00 /usr/sbin/apache2 -k start
7469 ? Sl 0:00 /usr/lib/chromium-browser/chromium-browser --type=renderer --no-sandbox --enable-automation --enable-logg
您需要使用所需的参数配置ChromeDriver。几点:
-
如果您完全等到元素至少是交互式的,然后再继续,那么配置是没有意义的:
caps["pageLoadStrategy"] = "none"
-
更好的方法是将
pageLoadStrategy
配置为normal
或坚持默认策略一起删除配置:caps["pageLoadStrategy"] = "normal" # complete
-
您可以在以下位置找到详细的讨论:
- 如何让硒不等到脚本缓慢的整页加载?
- Chrome 驱动程序的页面加载策略(更新至 Selenium v3.12.0(
-
pageLoadStrategy
eager
尚未在Chrome中实现。 -
您可以在以下位置找到详细的讨论:
- 回复:[chromedriver] 将页面加载策略添加到功能(evaj...@google.com 的问题2125123002(
- 问题 2125123002: [chromedriver] 将页面加载策略添加到功能(已关闭(
-
因此,为了确保加载所需的元素,您需要根据讨论中详述的普遍条件诱导WebDriverWait如何确保是否为Selenium + Python加载了一些HTML元素?