Проблемы с извлечением содержимого JavaScript при использовании html_requests

В настоящее время я работаю над веб-скребком, и по большей части он работает довольно хорошо. Я использовал Beautiful Soup для извлечения HTML-контента; чтобы извлечь содержимое javascript, я только начал с html_requests.

К сожалению, я столкнулся с некоторыми проблемами при извлечении данных JavaScript со следующего веб-сайта https://goglobal.com/, в частности, там, где есть раздел, включающий «более 100 стран», «более 2500 сотрудников» и « Сэкономлено 3 миллиарда долларов...». Код неправильно извлекает значения. Однако код, похоже, работает нормально для других веб-сайтов, на которых загружается динамический контент.

В попытке изолировать проблему я написал следующий скрипт. Но значения с сайта goglobal по-прежнему отображаются неправильно.

from requests_html import HTMLSession
import time
session = HTMLSession()
url = "https://goglobal.com/"
r = session.get(url)

r.html.render(wait=10)
time.sleep(10)
print(r.html.html)

Для справки я просмотрел отображаемый вывод, выполнив поиск по «номеру счетчика».

Мои вопросы заключаются в следующем:

  1. Почему этот контент загружается неправильно?
  2. Есть ли способ решить эту проблему, продолжая использовать html_requets?
  3. Могу ли я решить эту проблему с помощью селена или драматурга/скрапи?

Я попытался выявить и решить проблему с помощью приведенного выше сценария.

Последний раз Requests-html был выпущен: 17 февраля 2019 г. Можно с уверенностью считать его устаревшим. Да, в этом случае селен подойдет.

Barry the Platipus 03.07.2024 16:42
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

requests-html практически устарел, используйте requests и BeautifulSoup для статического HTML и selenium/playwright для более сложных для парсинга/динамических сайтов.

В этом случае будет достаточно запросов + bs4, искомые числа доступны в статическом html, вот как их получить:

import requests
from bs4 import BeautifulSoup

url = 'https://goglobal.com/'
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
}

response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')

counters = {i.select_one('h3.title').text: i.select_one('span.counter-number').get('data-counter') for i in soup.select('div.counter-item')}
print(counters)

Причина, по которой он не работает с запросами-html, вероятно, заключается в том, что вы смотрите не в том месте, значение, на которое вы смотрите, анимировано, и анимация начинается только тогда, когда элемент виден/прокручивается в поле зрения, но фактическое номер находится в атрибуте data-counter, эквивалентный код Requests-html по-прежнему работает без рендеринга:

from requests_html import HTMLSession

session = HTMLSession()
url = "https://goglobal.com/"
r = session.get(url)

counters = {i.find('h3.title', first=True).text: i.find('span.counter-number', first=True).attrs.get('data-counter') for i in r.html.find('div.counter-item')}
print(counters)

опять же, запросы-html больше не обновляются, и я предпочитаю запросы и bs4, но в этой ситуации оба работают.

Спасибо за комментарий! Я также попробую использовать драматург и селен. Проблема с анимированной частью заключается в том, что на сайте есть значения заполнителей в статическом HTML-коде «32M» вместо анимации. Итак, при извлечении данных страниц (при использовании только beautifulsoup) вместо фактических значений продолжает отображаться 32M.

Adi 04.07.2024 08:35

Я не уверен, где вы видите «32М». но в этом случае нет необходимости использовать селен или драматург. мой ответ тебя не устраивает?

GTK 04.07.2024 17:15

Приношу извинения, 32 М происходил на другом сайте, gotofu.com. Это происходит, когда страница загружается с отключенным JavaScript (у нее тоже есть анимированный счетчик).

Adi 05.07.2024 05:02

для этой страницы значения находятся внутри последнего скрипта на странице, найдите константы numAnimDown и numAnimSubs

GTK 05.07.2024 05:44

Понял, спасибо за ответ!

Adi 08.07.2024 05:40

Другие вопросы по теме