如何从网站中提取冠状病毒病例?

Yod*_*oda 1 python api beautifulsoup web-scraping

我正在尝试从网站 ( https://www.trackcorona.live ) 中提取冠状病毒,但出现错误。

\n\n

这是我的代码:

\n\n
response = requests.get(\'https://www.trackcorona.live\')\ndata = BeautifulSoup(response.text,\'html.parser\')\nli = data.find_all(class_=\'numbers\')\nconfirmed = int(li[0].get_text())\nprint(\'Confirmed Cases:\', confirmed)\n
Run Code Online (Sandbox Code Playgroud)\n\n

它给出了以下错误(尽管它在几天前工作),因为它返回一个空列表(li)

\n\n
 IndexError                               \n Traceback (most recent call last)\n<ipython-input-15-7a09f39edc9d> in <module>\n      2 data=BeautifulSoup(response.text,\'html.parser\')\n      3 li=data.find_all(class_=\'numbers\')\n----> 4 confirmed = int(li[0].get_text())\n      5 countries = li[1].get_text()\n      6 dead = int(li[3].get_text())\n\nIndexError: list index out of range\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\x8b

\n

αԋɱ*_*cαη 6

好吧,实际上该网站正在后面生成重定向CloudFlare,然后在JavaScript页面加载后动态加载它,因此我们可以使用多种方法,例如seleniumrequests_html但我会为您提到最快的解决方案,因为我们将JS动态渲染:)

import cloudscraper
from bs4 import BeautifulSoup

scraper = cloudscraper.create_scraper()

html = scraper.get("https://www.trackcorona.live/").text

soup = BeautifulSoup(html, 'html.parser')

confirmed = soup.find("a", id="valueTot").text

print(confirmed)
Run Code Online (Sandbox Code Playgroud)

输出:

import cloudscraper
from bs4 import BeautifulSoup

scraper = cloudscraper.create_scraper()

html = scraper.get("https://www.trackcorona.live/").text

soup = BeautifulSoup(html, 'html.parser')

confirmed = soup.find("a", id="valueTot").text

print(confirmed)
Run Code Online (Sandbox Code Playgroud)

提示503 response code

基本上该代码引用了service unavailable.

从技术上讲,GET您发送的请求无法得到满足。这是因为请求卡在了receiver请求之间,即https://www.trackcorona.live/HOST ,它在哪里将其处理到同一请求(即https://www.trackcorona.live/ )上的另一个源cf_chl_jschl_tk =

哪里__cf_chl_jschl_tk__=持有token待认证。

因此,您通常应该按照您的代码来提供host所需的数据。

类似于下面显示的endurl:

110981
Run Code Online (Sandbox Code Playgroud)

输出:

import requests
from bs4 import BeautifulSoup


def Main():
    with requests.Session() as req:
        url = "https://www.trackcorona.live"
        r = req.get(url)
        soup = BeautifulSoup(r.text, 'html.parser')
        redirect = f"{url}{soup.find('form', id='challenge-form').get('action')}"
        print(redirect)


Main()
Run Code Online (Sandbox Code Playgroud)

现在为了能够调用结束,URL所以您需要传递必需的Form-Data

像这样的东西:

https://www.trackcorona.live/?__cf_chl_jschl_tk__=575fd56c234f0804bd8c87699cb666f0e7a1a114-1583762269-0-AYhCh90kwsOry_PAJXNLA0j6lDm0RazZpssum94DJw013Z4EvguHAyhBvcbhRvNFWERtJ6uDUC5gOG6r64TOrAcqEIni_-z1fjzj2uhEL5DvkbKwBaqMeIZkB7Ax1V8kV_EgIzBAeD2t6j7jBZ9-bsgBBX9SyQRSALSHT7eXjz8r1RjQT0SCzuSBo1xpAqktNFf-qME8HZ7fEOHAnBIhv8a0eod8mDmIBDCU2-r6NSOw49BAxDTDL57YAnmCibqdwjv8y3Yf8rYzm2bPh74SxVc
Run Code Online (Sandbox Code Playgroud)

在这里你最终会得到text没有你想要的值。因为你的值是通过呈现的JS