Получить номер результатов поиска с помощью BeautifulSoup - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь использовать BeautifulSoup в Python, чтобы получить общее количество результатов поиска в CNN.

Исходный код на веб-странице:

<div class="cnn-search__results-count">

"Displaying results 1-10 out of 2208 for"

<strong>toronto</strong>

</div>

, как показано на снимок экрана 1:

Screenshot 1

Код, который я написал:

from bs4 import BeautifulSoup

import requests

url_cnn = 'https://www.cnn.com/search?q=toronto'

response_cnn = requests.get(url_cnn)

html_cnn = response_cnn.text

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

cnn = (soup.find('div', {"class": "cnn-search__results-count"}))

print(cnn)

Однако я получаю только

<div class="cnn-search__results-count"></div>

Все содержимое между ними отсутствуют.

Кто-нибудь знает, как решить эту проблему? Большое спасибо!

1 Ответ

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

Веб-сайт загружен событием JavaScript, которое динамически отображает данные после загрузки страницы. Библиотека

requests не сможет отображать JavaScript на лету. так что вы можете использовать selenium или requests_html. и действительно, есть много модулей, которые могут сделать это.

Теперь у нас есть еще одна опция в таблице, чтобы отследить, откуда данные отображаются. Мне удалось найти запрос XHR , который используется для извлечения данных из back-end API и их передачи на сторону пользователей.

Вы можете получить XHR запрос открытым Developer-Tools и проверка Сеть и проверка XHR/JS запросов, сделанных в зависимости от типа вызова, таких как fetch

import requests
import json


r = requests.get("https://search.api.cnn.io/content?q=toronto&size=10").json()

data = json.dumps(r, indent=4)

# print(data) #to see the full output in nice format.

# print(r.keys()) # to see the keys of the JSON dict

print(r["meta"])

Вывод:

{'start': 1, 'end': 10, 'total': 10, 'of': 2208, 'maxScore': None, 'duration': 
55}

Примечание: вы можете поиграть с q=toronto, чтобы запросить другой keyword, и size=10, чтобы определить размер вывода.

...