...
Just my blog

Blog about everything, mostly about tech stuff I made. Here is the list of stuff I'm using at my blog. Feel free to ask me about implementations.

Soft I recommend
Py lib I recommend

I'm using these libraries so you can ask me about them.

vk execute VS python while

Итак, финишная прамая на сегодня:py_vk

  • скрипт на 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:vk_execute_getComments

  • список 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 раз!