В этой статье вы научитесь собирать список фото и ИД аккаунтов из инстаграма по любому хештегу.
|
хештеги |
Нужны базовые знания языка программирования, не обязательно 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 млн., так же в ленту не попадут посты из закрытых аккаунтов, хотя в общем количестве они фигурируют. Проверено экспериментальным путем.
В следующем посте мы кастомизируем наш скрипт для работы с локацией, то есть вместо хештега будем собирать тоже самое, но с привязкой к конкретному месту.
Всем спасибо за внимание.
Если есть вопросы пишите в комментариях