Может ли bs4 получать динамическое содержимое веб-страницы, если запросы не могут?

#python #web-scraping #beautifulsoup #python-requests

#python #очистка веб-страниц #beautifulsoup #python-запросы

Вопрос:

Итак, я пробовал Selenium ранее и теперь хотел протестировать bs4. Я попытался запустить следующий код, но получил None результат.

 res_pewdiepie = requests.get(
    'https://www.youtube.com/user/PewDiePie')
soup = bs4.BeautifulSoup(res_pewdiepie.content, "lxml")
subs = soup.find(id="sub-count")
print(subs)
 

После некоторого исследования я обнаружил, что запросы не загружают динамическое содержимое, такое как подсчет на YouTube или Socialblade. Есть ли способ получить эту информацию с помощью bs4 или мне нужно вернуться к чему-то вроде Selenium?
Заранее спасибо!

Комментарии:

1. Иногда, если вы посмотрите на сетевое взаимодействие, происходящее в фоновом режиме, вы можете выполнить запрос post или get в другой домен для получения информации. Однако в этом случае я не смог найти обходной путь. Страница, загруженная с помощью BS4, является страницей согласия с их условиями. Возможно, вам нужно добавить правильные заголовки запросов и файлы cookie.

Ответ №1:

BeautifulSoup может анализировать только текст, который вы ему предоставляете, в данном случае источник страницы. Если информации там нет, она ничего не может с этим поделать. Итак, я считаю, что вам нужно вернуться к чему-то, что поддерживает javascript.

Некоторые параметры: python-запросы selenium
-html

Ответ №2:

Я использую splash для подобных вещей. Вы можете запустить его в контейнере docker. Вы можете настроить, как долго он ожидает рендеринга для каждого запроса. Существует также плагин scrapy, если вы выполняете какой-либо серьезный обход. Вот фрагмент одного из моих сканеров, запускающих Splash локально с помощью Docker. Удачи.

 target_url = "https://somewhere.example.com/"
splash_url = "http://localhost:8050/render.json"
body = json.dumps({"url": target_url, "har": 0, "html": 1, "wait": 10,})
headers = {"Content-Type": "application/json"}

response = requests.post(splash_url, data=body, headers=headers)
result = json.loads(response.text)
html = result["html"]