В этой статье вы научитесь собирать список фото и ИД аккаунтов из инстаграма по любому хештегу.
![]() |
| хештеги |
Нужны базовые знания языка программирования, не обязательно python, но мне кажется, что это лучший вариант для написания быстрых и не больших скриптов. Еще нужно понимать что такое JSON, так как получать информацию с этого инстаграма будем в нем.
Суть скрипта очень простая, мы задаем какой-то хеш-тег и программа собирает по нему из инстаграма все фотки и другие полезные данные. Все это конечно громко сказано, но сколько даст, столько даст.
И так поехали, приведу весь код сразу и потом поясню что он делает:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #!/usr/bin/env python # -*- coding: utf8 -*- import json, urllib, urllib2, random, os.path import codecs import time from urllib import urlencode DIR = os.path.abspath(os.curdir) + '/' #текущая директория куда будет писаться файл с #результатами tag = 'самара' #здесь задаем переменную с нужным нам хештегом #выполнение запроса к сайту и получение данных def get(url, timeout=10): try: return urllib2.urlopen(url, timeout=timeout).read() except: return 0 def get_max_id(jsonres): try: jres = jsonres['tag']['media']['page_info']['end_cursor'] return jres except: return 0 def have_next_page(jsonres): try: jres = jsonres['tag']['media']['page_info']['has_next_page'] if jres == True: return 1 else: return 0 except: return 0 def get_media_info(noderow): try: return [(x['code'], x['owner'], x['date'], x['caption']) for x in noderow] except: return 0 def main(tag): f = codecs.open('instagram_by_' + tag + '_data.txt', 'w', encoding='utf-8') main_url = 'https://www.instagram.com/explore/tags/' + tag + '/?__a=1' page = 1 res = json.loads(get(main_url)) max_id = None while page == 1: for i in get_media_info(res['tag']['media']['nodes']): caption = i[3] mycaption2 = caption.replace('\n','') f.write(str(i[0]) + ',' + str(i[1])+ ','+ str(i[2])+ ','+ mycaption2+'\n') page = have_next_page(res) time.sleep(3) if page == 1: print 'next page' max_id = get_max_id(res) main_url = 'https://www.instagram.com/explore/tags/' + tag + '/?__a=1' + '&max_id=' + str(max_id) res = json.loads(get(main_url)) print 'DONE!' if __name__ == '__main__': main(tag) |
Прежде чем разобраться в этом коде, попробуйте пройти по адресу https://www.instagram.com/explore/tags/здесьнужныйвамхештег/?__a=1
Я в коде использовал хештег самара
https://www.instagram.com/explore/tags/самара/?__a=1
Вам откроется вот такая картинка:
Это как раз и есть лента инстаграма в формате JSON, вот её мы с вами и сохраняем в свой файлик.
Для перехода к следующей странице ленты, так называемая пагинация, мы используем параметр '&max_id='
подставляя в него значение end_cursor и так продолжаем до тех пор пока в JSON ответе флаг параметра 'has_next_page'
не будет равен false.
По результатам работы этого небольшого скрипта вы получите файл примерно такого содержания:
В каждой строке файла, через разделитель(в нашем случае это , запятая) будет содержаться информация согласно этой функции:
def get_media_info(noderow): try: return [(x['code'], x['owner'], x['date'], x['caption']) for x in noderow] except: return 0
Где [code] - это ид фотки(поста), [owner] - это ID - пользователя , [date] - дата поста в unix timestamp формате , [caption] - это первичный комментарий пользователя в котором он описывает фото и дополнительные хештеги.
В принципе этого файла более чем достаточно для сбора и анализа аудитории, то есть благодаря наличию остальных хештегов, вы можете отфильтровать торговцев которые перечисляют кучу всевозможных городов. Так же благодаря этим данным вы можете выбрать людей занимающихся какой-то специализацией, например салоны красоты.
Конечно для более полноценного анализа этот файл лучше импортировать в какую нибудь СУБД или на крайний случай в Excel.
Сколько данных дает инстаграм, вышеуказанным скриптом достается не очень большое кол-во постов, всегда по разному может 20 тыс. может 30 тыс. хотя по общему количеству постов по популярному хештегу может быть и более 1 млн., так же в ленту не попадут посты из закрытых аккаунтов, хотя в общем количестве они фигурируют. Проверено экспериментальным путем.
В следующем посте мы кастомизируем наш скрипт для работы с локацией, то есть вместо хештега будем собирать тоже самое, но с привязкой к конкретному месту.
Всем спасибо за внимание.
Если есть вопросы пишите в комментариях

Спасибо за статью! написал себе на зенке крутой парсер картинок, все быстро работает
ОтветитьУдалить