📜  使用Python和Selenium抓取 COVID-19 统计数据

📅  最后修改于: 2022-05-13 01:54:30.547000             🧑  作者: Mango

使用Python和Selenium抓取 COVID-19 统计数据

Selenium是一个开源的 Web 测试工具,它允许用户跨不同的浏览器和平台测试 Web 应用程序。它包括大量软件,开发人员可以使用这些软件来自动化 Web 应用程序,包括 IDE、RC、webdriver 和Selenium网格,它们都有不同的用途。此外,它还可以抓取动态网页,而 Beautiful Soup 则不能。

1.PythonPython的Selenium绑定

Selenium Python绑定提供了一个简单的 API 来使用它的 WebDriver 编写功能测试。通过 API,您可以轻松访问Selenium WebDriver 的所有功能。

pip install Selenium

1.B网络驱动程序

Selenium需要 Web 驱动程序来与所选浏览器(即 Chrome、Safari、Firefox 等)进行交互和交互。Web 驱动程序是用于设置与用户 Web 浏览器交互的包。它通过对所有人都通用的有线协议进行交互。

您可以轻松安装与您的浏览器兼容的网络驱动程序。以下链接将帮助您:

Chrome:https://sites.google.com/a/chromium.org/chromedriver/downloads
Edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Firefox:https://github.com/mozilla/geckodriver/releases
Safari:https://webkit.org/blog/6900/webdriver-support-in-safari-10/

2.A使用Python绑定

如果你已经安装了Selenium Python绑定,你可以像这样从Python开始使用它:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep

睡眠模块一直等到浏览器 URL 完全加载。现在我们创建一个浏览器 webdriver 实例(这里是 Chrome),如下所示:

driver=webdriver.Chrome("C:/chromedriver.exe")
driver.get("https://www.covid19india.org/")
sleep(2) //Waits for 2 seconds after navigating to the URL

driver.get()方法导航到 URL 给出的页面,随后 chromedriver 等待页面完全加载,然后将控制权返回给脚本。

2.B网页抓取

有多种策略可以在页面中定位元素。在这种情况下,我们使用find_element_by_xpath()方法导航到https://www.covid19india.org/ 上所需的 HTML 呈现值。上面的脚本从所需的 URL 中提取了七个不同的值,即:

  • 总病例
  • 活跃病例总数
  • 治愈病例总数
  • 总死亡人数
  • 新的阳性病例
  • 新康复病例
  • 额外的死亡人数

这些提取的 COVID-19 统计数据值使用Python使用print()语句实时显示在用户控制台上,如下所示:

def extractor():

    TCases = driver.find_element_by_xpath("/html/body/div/div/div[2]/div[1]/div[2]/div[1]/h1/span")

        TActive = driver.find_element_by_xpath("/html/body/div/div/div[2]/div[1]/div[2]/div[2]/h1/span")

    TRecov = driver.find_element_by_xpath("/html/body/div/div/div[2]/div[1]/div[2]/div[3]/h1/span")

    TDeath = driver.find_element_by_xpath("/html/body/div/div/div[2]/div[1]/div[2]/div[4]/h1/span")

        New_Cases = driver.find_element_by_xpath("/html/body/div/div/div[2]/div[1]/div[2]/div[1]/h4/span")

        New_Rcov = driver.find_element_by_xpath("/html/body/div/div/div[2]/div[1]/div[2]/div[3]/h4/span")

        New_Death = driver.find_element_by_xpath("/html/body/div/div/div[2]/div[1]/div[2]/div[4]/h4/span")
        
    print("Total Cases:", TCases.text)

    print("Total Active Cases:", TActive.text)

    print("Total Recovered Cases:", TRecov.text)

    print("Total Deaths:", TDeath.text)

    print("New Cases:", New_Cases.text[1:len(New_Cases.text)-1])

    print("New Recovered Cases:", New_Rcov.text[1:len(New_Rcov.text)-1])

    print("Additional Deaths yet:", New_Death.text[1:len(New_Death.text)-1])


整个脚本可以使用sleep()模块在给定的时间间隔后自动执行,如下所示:

while True:
    extractor()
    sleep(60*60)   // The loop executes after every hour in this case


while 循环无限期地执行并在每小时后运行extractor()函数。

这是整个网络抓取程序:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep
  
driver = webdriver.Chrome("C:/chromedriver.exe")
driver.get("https://www.covid19india.org/")
sleep(2)
  
  
def extractor():
    TCases = driver.find_element_by_xpath(
        "/html / body / div / div / div[2]/div[1]/div[2]/div[1]/h1 / span")
    TActive = driver.find_element_by_xpath(
        "/html / body / div / div / div[2]/div[1]/div[2]/div[2]/h1 / span")
    TRecov = driver.find_element_by_xpath(
        "/html / body / div / div / div[2]/div[1]/div[2]/div[3]/h1 / span")
    TDeath = driver.find_element_by_xpath(
        "/html / body / div / div / div[2]/div[1]/div[2]/div[4]/h1 / span")
    New_Cases = driver.find_element_by_xpath(
        "/html / body / div / div / div[2]/div[1]/div[2]/div[1]/h4 / span")
    New_Rcov = driver.find_element_by_xpath(
        "/html / body / div / div / div[2]/div[1]/div[2]/div[3]/h4 / span")
    New_Death = driver.find_element_by_xpath(
        "/html / body / div / div / div[2]/div[1]/div[2]/div[4]/h4 / span")
  
    print("Total Cases:", TCases.text)
    print("Total Active Cases:", TActive.text)
    print("Total Recovered Cases:", TRecov.text)
    print("Total Deaths:", TDeath.text)
    print("New Cases:", New_Cases.text[1:len(New_Cases.text)-1])
    print("New Recovered Cases:", New_Rcov.text[1:len(New_Rcov.text)-1])
    print("Additional Deaths yet:", New_Death.text[1:len(New_Death.text)-1])
  
  
while True:
    extractor()
    sleep(60 * 60)

上述程序在用户控制台上的输出如下:

Total Cases: 2, 17, 187

Total Active Cases: 1, 07, 017

Total Recovered Cases: 1, 04, 071

Total Deaths: 6, 088

New Cases: +2561
New Recovered Cases: +543
Additional Deaths yet: +23
//The above COVID-19 values differ with time. Your output may differ. 

因此,上述脚本使用Selenium自动进行网络抓取,并每小时在用户控制台上打印更新的统计信息。

使用它,您可以为每个网站创建一个自定义的自动化脚本,以自动化您的所有操作。老实说,网络抓取和自动化是没有限制的,以上只是一个让你开始的例子。