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

时间:2020-03-09 11:35:00

标签: python api web-scraping beautifulsoup

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

这是我的代码:

response = requests.get('https://www.trackcorona.live')
data = BeautifulSoup(response.text,'html.parser')
li = data.find_all(class_='numbers')
confirmed = int(li[0].get_text())
print('Confirmed Cases:', confirmed)

由于返回了一个空列表(li),因此出现了以下错误(尽管几天前都在工作)

 IndexError                               
 Traceback (most recent call last)
<ipython-input-15-7a09f39edc9d> in <module>
      2 data=BeautifulSoup(response.text,'html.parser')
      3 li=data.find_all(class_='numbers')
----> 4 confirmed = int(li[0].get_text())
      5 countries = li[1].get_text()
      6 dead = int(li[3].get_text())

IndexError: list index out of range

3 个答案:

答案 0 :(得分:3)

好吧,实际上该网站正在CloudFlare后面生成重定向,然后在页面加载后通过JavaScript动态加载,因此我们可以使用selenium和{ {1}},但我将为您提及最快的解决方案,因为我们将即时渲染requests_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)

110981 503的提示:

基本上,该代码引用了response code

从技术上讲,无法满足您发送的service unavailable请求。原因是因为请求被卡在请求的https://www.trackcorona.live/GET之间,是在同一https://www.trackcorona.live/?cf_chl_jschl_tk=的同一receiver上将其处理到另一个源的地方

HOST持有__cf_chl_jschl_tk__=进行身份验证的地方。

因此,您通常应按照自己的代码为token提供所需的数据。

类似于以下内容的host网址:

end

输出:

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()

现在可以呼叫结尾https://www.trackcorona.live/?__cf_chl_jschl_tk__=575fd56c234f0804bd8c87699cb666f0e7a1a114-1583762269-0-AYhCh90kwsOry_PAJXNLA0j6lDm0RazZpssum94DJw013Z4EvguHAyhBvcbhRvNFWERtJ6uDUC5gOG6r64TOrAcqEIni_-z1fjzj2uhEL5DvkbKwBaqMeIZkB7Ax1V8kV_EgIzBAeD2t6j7jBZ9-bsgBBX9SyQRSALSHT7eXjz8r1RjQT0SCzuSBo1xpAqktNFf-qME8HZ7fEOHAnBIhv8a0eod8mDmIBDCU2-r6NSOw49BAxDTDL57YAnmCibqdwjv8y3Yf8rYzm2bPh74SxVc ,因此您需要传递必需的URL

类似的东西:

Form-Data

在这里您将得到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')}" data = { 'r': 'none', 'jschl_vc': 'none', 'pass': 'none', 'jschl_answer': 'none' } r = req.post(redirect, data=data) print(r.text) Main() ,而没有需要的值。因为您的值是通过text呈现的。

答案 1 :(得分:1)

该站点受到Cloudflare DDoS保护的保护,因此返回的HTML是一个Cloudflare页面,说明了这一点,而不是您想要的内容。您首先需要导航,大概是通过获取和设置一些cookie等。

作为替代方案,我建议您看一下硒。它会驱动浏览器,并执行页面上的所有js,如果您刚开始,应该会更轻松地完成此任务。

希望有帮助!

答案 2 :(得分:0)

该网站现在受到Cloudflare DDoS保护的保护,因此无法通过python请求直接访问。 您可以使用https://github.com/Anorov/cloudflare-scrape进行尝试,它会绕过此页面。 pip包的名称为cfscrape