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
- Mobaxterm SSH RDP FTP...
- Thunderbird Email client
- Filezilla FTP client/server
- Nirsoft Win utils
- Sysinternals Win utils
- Pi-Hole AD block by DNS
- NUT UPS manager
- Rpi MON Raspberry monitoring
- Free CAD 3D modelling
- Free Commander Far-like filemanager
- Bitwarden Password manager
Py lib I recommend
- Django web framework
- celery multi-tasking
- celery-beat Celery + Django
- celery-results Celery + Django
- Pillow Python image lib
- wsgi mod Apache + Python
- requests best in WEB requests
- openpyxl make Excell docs
- p4python Perforce + Python
- paramiko SSH + Python
- pyvmomi ESXi Vcenter + Python
I'm using these libraries so you can ask me about them.
vk execute VS python while
Итак, финишная прамая на сегодня:
- скрипт на 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 раз!
tech
Tech posts, about installing or setting-up something.
raspberry
Everything related to raspberry
python
Using Python or coding in Python.
linux
Anything related to Linux user experience
octopus
Octopus is a framework for test execution, statistics collection and virtual machine deployment automation.
windows
WIndows OS and related issues and stuff.
REST
REST API for\from different services
Django
Django Web(Server) Framework
virtualization
Topics related to OS virtualization software
SQL DB
SQL type database and related issues
project man
Project management tools and thoughts, software and not.
web
Site hostings, web server, web browsing, web developing.
personal
Just personal thoughts, they aren't always readable or adequate
photo
My photos or photo related stuff.