#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"]