abd*_*sco 1 python selenium google-chrome beautifulsoup web-scraping
我想定期检查我的互联网速度,如果它下降到某个阈值,则重置我的路由器,这似乎可以修复我的 ISP“提供”的糟糕连接。
虽然可能有更简单的方法可以继续解决这个问题,但我认为我应该从 Fast.com 获取结果,它为我提供了我需要的结果,例如下载速度、上传速度以及到我附近的服务器的 ping 时间。
寻找任何指针。
编辑 2020-11-03:我已经修复了代码,并且由于Carlos ,它再次工作了。
该页面是 JS 驱动的,没有简单的方法可以通过简单地从页面上删除 HTML 来获取结果,因此单独使用requestsandbs4不会对您有帮助。
您需要运行一个完整的现代浏览器来运行测试,并等待所需的时间,然后获取结果。
好吧,让我们使用Selenium来实现这一点,它可以控制 Chrome、Firefox、Safari,基本上任何浏览器。
通过运行以下命令安装软件包:
pip install selenium
Run Code Online (Sandbox Code Playgroud)
我们还需要安装一个驱动程序来控制我们的浏览器,您可以在这里找到它(事实上,请完整阅读有关安装的页面,它拥有运行它所需的一切)。然后我们需要将该可执行文件放入我们的PATH. 最简单的方法就是将其放在c:\WindowsWindows 或/usr/binLinux 下。但是在 SO 和互联网上有大量的文档,所以学习正确的方法来正确地做到这一点,你会需要它。
有了这个,我们还需要Beautiful Soup,它是事实上的 HTML 解析器(注意,我们可以继续使用 selenium 和浏览器,但我习惯使用 bs4 来完成这项工作)。安装它使用
pip install bs4
Run Code Online (Sandbox Code Playgroud)
现在要获得结果,我们需要运行浏览器,访问https://fast.com,让测试完成,然后获取结果的 HTML,然后提取我们需要的信息。
好吧,我们可以等待,大约 30 秒,直到一切完成。但如果提前结束怎么办?或者根本就没有完成?那么我们就会无缘无故地等待。有更好的方法。
测试完成后,旋转器变为绿色。如果我们从开发者控制台观察 DOM,我们会看到它有一个succeeded类。
但是如果我们展开结果,我们会看到上传结果尚未出现,当发生这种情况时,页面会再次更新,我们会达到以下状态:
Selenium 有一个显式的等待功能,可以让您等到页面上发生某些事情。我们将使用它来检查并等待.succeeded页面上出现一些带有类的元素。如果您只需要下载速度,只需等待 spinner 获取.succeeded类即可,如果您还需要上传结果,则需要等待。对于这项工作,我们可以使用这个辅助函数:
pip install selenium
Run Code Online (Sandbox Code Playgroud)
结果输入后,我们将获取包含上传和下载结果的父元素的 HTML。
pip install bs4
Run Code Online (Sandbox Code Playgroud)
然后我们将 HTML 提供给 BeautifulSoup 并提取值。
这是完整的代码:
from selenium.common.exceptions import TimeoutException
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
def wait_until_present(driver: Chrome, selector: str, timeout: int = 5):
condition = EC.presence_of_element_located((By.CSS_SELECTOR, selector))
try:
WebDriverWait(driver, timeout).until(condition)
except TimeoutException as e:
raise LookupError(f'{selector} is not present after {timeout}s') from e
Run Code Online (Sandbox Code Playgroud)
输出:
{'upload': '320 Kbps', 'download': '3.4 Mbps'}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2082 次 |
| 最近记录: |