Итак, финишная прамая на сегодня:
- скрипт на Python, получающий комментарии из 57 постов за последних 7 дней
- скрипт Python, отправляющий аргументы для vk execute порциями по 24 поста за раз со sleep(1) – во избежание флуда
Дано 57 постов и 797 комментариев под ними.
Старый вариант:
- достается список элементов из таблицы БД где дата элемента между сегодня и -7 дней
- для каждого изъятого из таблицы элемента с index[0] производится забор комментариев
- если index[1] – значение содержит число > 100 – значит в посте больше 100 комментов (ВК не отдает более 100 коментов за один запрос) то запустить while и счетчик, до тех пор, пока индекс итераций(offset_comments) не достигнет числа равному кол-ву комментов(post_com);
all_post_comments = [] for item in post_id_comm_list: post_id = item[0] post_com = int(item[1]) if post_com > 100: offset_comments = 0 # Start value always = 0 while offset_comments < post_com: # Until post comments count more than offset - this will run. try: post_comments = vkapi('wall.getComments', owner_id=sc_owner_id, post_id=post_id, need_likes=1, offset=offset_comments, count=100, # Work 100 Debug 2 sort='asc', preview_length=1, extended='0' ) offset_comments = offset_comments + 101 # Add step - to get next comments from first 100 to next 200 all_post_comments.append(post_comments['items']) # Add items to list of items except: print("Cannot get this post id: "+post_id) elif post_com < 100: try: post_comments = vkapi('wall.getComments', owner_id=sc_owner_id, post_id=post_id, need_likes=1, offset=0, count=100, # Work 100 Debug 2 sort='asc', preview_length=1, extended='0' ) all_post_comments.append(post_comments['items']) except: print("Cannot get this post id: "+post_id) else: print("Something goes wrong - could not get any post comments, check variables") sleep(1) all_post_comments_formatted = [] for list in all_post_comments: # Unpack each list with comment items from list of lists of items for element in list: # Unpack each item from prev. list of items all_post_comments_formatted.append(element) # Add each item in one list for all items print("Script has finished his work")
Время выполнения: 62.89
Далее:
Новый вариант с vk execute:
- список post_id также достается из таблицы БД;
- далее анон. функция разбивает список на список списков по 24 элемента в каждом;
- функция для разбивания списка в формат строки, который обманом можно скормить vk execute(см предыдущий пост);
- для каждого элемента списка списков производится замена { ‘[‘ : ” , ‘ ‘ : ” , ‘]’ : ‘,’ } – и передается строкой на vk execute;
- результат в формате JSON сохраняется по ключу [‘response’];
- список всех ответов форматируется так, чтобы содержать один общий список из списка множеств;
- процедура обработки постов по “если больше 100 комментов” и loop для сбора данных с каждого поста – лежат в хранимых процедурах:
split_by_10 = lambda lst, sz: [lst[i:i+sz] for i in range(0, len(lst), sz)] splited = split_by_10(post_id_list, 24) def replace_all(text, rep_dic): for i, j in rep_dic.items(): text = text.replace(i, j) return text reps = {'[':'',' ':'',']':','} owner_id = "-80849532" all_comments = [] for item in splited: item_str = str(item) post_list_arg = replace_all(item_str, reps) r = requests.post('https://api.vk.com/method/execute.eachPost_getComments?owner_id='+owner_id+'&post_id_array_str='+post_list_arg+'&access_token='+token) sleep(1) response_data = r.json() all_comments.append(response_data['response']) all_post_comments_formatted = [] for list in all_comments: for element in list: all_post_comments_formatted.append(element) print("All comments parsed: "+str(len(all_post_comments_formatted)))
Время выполнения: 6.01
Это пипец, товарищи, я до последнего не верил, что вообще есть смысл нырять головой в этот “омут”, но как показывает время – выигрыш в х10 раз!