Как извлечь случаи Коронавируса с веб-сайта? - PullRequest
1 голос
/ 09 марта 2020

Я пытаюсь извлечь Коронавирус с веб-сайта (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 ]

3 голосов
/ 09 марта 2020

Ну, на самом деле сайт генерирует перенаправление за CloudFlare, а затем он загружается динамически через JavaScript после загрузки страницы, поэтому мы можем использовать несколько подходов, таких как selenium и 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.

С технической точки зрения отправленный вами запрос GET не может быть обработан. причина в том, что запрос застрял между receiver запроса, который является https://www.trackcorona.live/, где он обрабатывает его к другому источнику того же HOST, который https://www.trackcorona.live/? cf_chl_jschl_tk =

Где __cf_chl_jschl_tk__= содержит token для аутентификации.

Поэтому вы обычно должны следовать своему коду на сервер host с необходимые данные.

Примерно так: end url:

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 без желаемых значений. потому что ваши значения отображаются через JS.

1 голос
/ 09 марта 2020

Этот сайт защищен DDoS-защитой Cloudflare, поэтому возвращаемым Html является страница Cloudflare с указанием этого, а не содержимого, которое вы хотите. Сначала вам нужно будет это осуществить, предположительно, получив и установив некоторые файлы cookie, например, c.

. В качестве альтернативы я рекомендую взглянуть на Selenium. Он запускает браузер и будет выполнять любые действия js на странице, и вам будет гораздо легче справиться с этим, если вы только начинаете.

Надеюсь, это поможет!

0 голосов
/ 09 марта 2020

Сайт теперь защищен Cloudflare DDoS Protection, поэтому к нему нельзя напрямую получить доступ с помощью python запросов. Вы можете просто попробовать это с https://github.com/Anorov/cloudflare-scrape, который обходит эту страницу. Пиппакет называется cfscrape

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...