Написание инстаграм гусеничного с Scrapy. Как я могу перейти на следующую страницу?

python scrapy instagram

4781 просмотра

2 ответа

409 Репутация автора

В качестве упражнения я решил написать скрипт на python, который бы получал все изображения указанного пользователя. Я немного знаком со Scrapy, поэтому я выбрал его в качестве инструмента для чистки. В настоящее время скрипт способен загружать изображения только с первой страницы (максимум 12).

Из того, что я могу сказать, страницы Instagram генерируются с помощью JavaScript. Scrapy response.body(который похож на исходный код, просматриваемый из Chrome) не показывает структуру html, как Инспектор Chrome. В Chrome, после 12 изображений, внизу есть кнопка со ссылкой на следующую страницу.

Например, instagram.com/instagram . Ссылка на страницу 2 - instagram.com/instagram/?max_id=1292385931151632610 . На странице 2 есть ссылка на страницу 3 с max_id=1287301939457754444.

Как я могу получить этот номер в Scrapy, чтобы отправить туда своего паука? response.bodyдаже не содержит этого числа. Есть ли другой способ перейти на следующую страницу?

Я знаю, что Instagram API даст некоторые преимущества, но я подумал, что это можно сделать без всех этих токенов.

Автор: seeker_of_bacon Источник Размещён: 18.07.2016 04:11

Ответы (2)


2 плюса

13881 Репутация автора

Решение

согласно robots.txt политике вы должны avvoid ползать /api/, /publicapi/и /query/путь, так тщательно (и ответственно) на пользователе пагинации ползать.

Кроме того, из того, что я вижу, разбиение на страницы начинается с запроса «Загрузить еще», который фактически является https://www.instagram.com/query/запросом (который необходимо проверить) только с двумя необходимыми значениями ownerи end_cursorотправляется как POSTзапрос.

Эти значения можно найти в исходном теле запроса внутри '//script[contains(., "sharedData")]/text()'

Автор: eLRuLL Размещён: 18.07.2016 04:36

3 плюса

2653 Репутация автора

Вы также можете добавить параметр __a=1(как в https://www.instagram.com/instagram/?__a=1), чтобы включить только JSON в window._sharedDataобъект.

Я использовал подобный скрипт для создания чего-то похожего:

username=instagram
max=
while :;do
  c=$(curl -s "https://www.instagram.com/$username/?__a=1&max_id=$max")
  jq -r '.user|.id as$user|.media.nodes[]?|$user+" "+.id+" "+.display_src'<<<"$c"
  max=$(jq -r .user.media.page_info.end_cursor<<<"$c")
  jq -e .user.media.page_info.has_next_page<<<"$c">/dev/null||break
done
Автор: nisetama Размещён: 13.08.2016 06:08
Вопросы из категории :
32x32