В настоящее время я работаю над веб-скребком, и по большей части он работает довольно хорошо. Я использовал 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)
Для справки я просмотрел отображаемый вывод, выполнив поиск по «номеру счетчика».
Мои вопросы заключаются в следующем:
Я попытался выявить и решить проблему с помощью приведенного выше сценария.
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.
Я не уверен, где вы видите «32М». но в этом случае нет необходимости использовать селен или драматург. мой ответ тебя не устраивает?
Приношу извинения, 32 М происходил на другом сайте, gotofu.com. Это происходит, когда страница загружается с отключенным JavaScript (у нее тоже есть анимированный счетчик).
для этой страницы значения находятся внутри последнего скрипта на странице, найдите константы numAnimDown
и numAnimSubs
Понял, спасибо за ответ!
Последний раз Requests-html был выпущен: 17 февраля 2019 г. Можно с уверенностью считать его устаревшим. Да, в этом случае селен подойдет.