@Oyaseo
beginner programmist

Как получить доступ к Ajax контенту во время парсинга?

Нужно собрать данные с блока, который подгружается с помощью ajax.
стандартная функция get_html(url) возвращает контент без ajax блока
def get_html(url):
	response = urllib.request.urlopen(url)
	return response.read()

def parse(html):
	soup = BeautifulSoup(html)
	div = soup.find('div', id='tz-bl-hidden-two')
	print(div)

в результате получаю:
  • Вопрос задан
  • 9075 просмотров
Решения вопроса 1
@nirvimel
В общем случае, при помощи парсинга html, не возможно получить страницу в том виде в который ее приводят ее собственные джаваскрипты при загрузке потому, что парсер - не браузер, он не исполняет джаваскрипты.
В частных случаях можно вынуть из текста скрипта все urlы по которым идут ajax запросы, производить все эти запросы в своем коде и парсить результаты. Тут куча подводных камней - во-первых, параметры ajax запроса могут быть спрятаны в коде каким-нибудь не тривиальным образом, во-вторых нужно правильно выставить все заголовки запроса со всеми куками (которыми скрипты со страницы так же могут манипулировать), потом не забыть правильно задать referrer. В общем случае у скриптов на странице всегда остается возможность, используя какие-нибудь динамически меняющиеся параметры, запутать свою работу так, что для такой страницы создать парсер будет невозможно.
Радикально иной вариант - использовать настоящий браузер (через Sillentium, например), который исполняет все скрипты и, с точки зрения противоположной стороны, неотличим от живого пользователя. Это решает все проблемы с хитрыми ajax-ами. Но это уже совсем другой порядок объемов потребляемых ресурсов и скорости. Если, например, на самом дешевом vps (с 128 Мб памяти) на гигабитном канале можно парсить в 50-100 потоков. Даже из расчета по несколько секунд на ожидание + обработку каждой страницы получаем 10-20 расперсенных страниц в секнду. Теперь если перейти на Sillentium + Webkit, то 128 Мб уже не хватает для запуска даже одного потока. Если даже запускать все это на своем домашнем десктопе с гигабайтами памяти (с vps в качестве прокси), то можно получить максимум несколько расперсенных страниц в секунду. То есть парсинг через полноценный браузер не конкурент парсерам типа lxml + requests/liburl.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
angru
@angru
Берете браузер, открываете инструмент разработчика(F12 обычно), вкладка Networking, ставите фильтр на XHR запросы, обновляете страницу, если нужно куда-то нажать, чтобы выполнился Ajax - нажимаете. Все что нужно должно отобразиться на панели запросов, также там есть вся нужная информация по запросу(заголовки, параметры, ответ), изучаете апи и сами делаете такие же запросы из питона.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы