python — Парсер для вк записывает в файл только часть данных
Данный код должен собирать все поcnы в пределах заданного количества «amount = 1000» из группы и записывать их в файл в виде: пост, ветки комментариев к этому посту и тд. При выполнении данного кода из 856 постов в этой группе вк в файл записывается только 311 постов и выдает такую ошибку
Traceback (most recent call last): File «C:\Users\User\PycharmProjects\parser_vk_all_comments\dubl.py», line 167, in comment_writer(all_comments, k) File «C:\Users\User\PycharmProjects\parser_vk_all_comments\dubl.py», line 33, in comment_writer a_pen.writerow([all_comments[i][‘id’], all_comments[i][‘text’], all_comments[i][‘likes’][‘count’], ‘-‘, ‘comment’, KeyError: ‘text’:
Код:
import csv import requests token = 'token' version = 5.131 owner_id = '-174228153' post_id = 0 comment_id = 0 count = 1000 amount = 1000 i = 0 def file_create(): with open('parsing.csv', 'w', encoding='utf-8') as file: a_pen = csv.writer(file) a_pen.writerow(['id', 'text', 'likes', 'reposts', 'type', 'parents_stak', 'owner_id']) # функция записи данных в файл def post_writer(all_post, i): # i индекс поста из списка with open('parsing.csv', 'a', encoding='utf-8') as file: a_pen = csv.writer(file) i = i a_pen.writerow((all_post[i]['id'], all_post[i]['text'], all_post[i]['likes']['count'], all_post[i]['reposts']['count'], 'post', '-', all_post[i]['owner_id'])) def comment_writer(all_comments, i): # получает на вход спиок коментов и индекс комента в списке with open('parsing.csv', 'a', encoding='utf-8') as file: a_pen = csv.writer(file) a_pen.writerow([all_comments[i]['id'], all_comments[i]['text'], all_comments[i]['likes']['count'], '-', 'comment', all_comments[i]['post_id'], all_comments[i]['owner_id']]) def subcomment_writer(all_undercom): # получает на вход список субкоментов и все их записывает в файл with open('parsing. csv', 'a', encoding='utf-8') as file: a_pen = csv.writer(file) t = 0 for subcom in all_undercom: while t < len(all_undercom): a_pen.writerow((all_undercom[t]['id'], all_undercom[t]['text'], all_undercom[t]['likes']['count'], '-', 'subcomment', all_undercom[t]['id'], all_undercom[t]['owner_id'])) t += 1 else: pass # получение всех постов def get_posts(token, owner_id, amount): token = token version = 5.131 owner_id = owner_id count = 100 offset = 0 all_posts = [] while offset < amount: response = requests.get('https://api.vk.com/method/wall.get', params={ 'access_token': token, 'v': version, 'owner_id': owner_id, 'count': count, 'offset': offset }) data = response.
json()['response']['items'] offset += 100 all_posts.extend(data) return all_posts # Получение id текущего поста def get_post_id(all_post, i): for post in all_post: post_id = all_post[i]['id'] return post_id # получение всех коментариев под постом def get_comments(token, owner_id, post_id, amount): token = token version = 5.131 owner_id = owner_id post_id = post_id count = 100 offset = 0 all_comments = [] while offset < amount: response = requests.get('https://api.vk.com/method/wall.getComments', params={ 'access_token': token, 'v': version, 'owner_id': owner_id, 'post_id': post_id, 'need_likes': 1, 'count': count, 'offset': offset }) data = response. json()['response']['items'] offset += 100 all_comments.extend(data) return all_comments # получение id текущего комментария def get_comment_id(all_comments, i): comment_id = None for coment in all_comments: if i < len(all_comments): comment_id = all_comments[i]['id'] else: pass return comment_id # получение ветки подкоментариев def get_vetcom(token, owner_id, post_id, comment_id, amount): token = token version = 5.131 owner_id = owner_id post_id = post_id comment_id = comment_id count = 100 offset = 0 all_comments_vet = [] while offset < amount: response = requests.get('https://api.vk.com/method/wall.getComments', params={ 'access_token': token, 'v': version, 'owner_id': owner_id, 'post_id': post_id, 'need_likes': 1, 'comment_id': comment_id, 'count': count, 'offset': offset }) data = response.
json()['response']['items'] offset += 100 all_comments_vet.extend(data) return all_comments_vet file_create() all_post = get_posts(token, owner_id, amount) # получили список постов print(len(all_post)) all_comments = None all_undercom = None while i < len(all_post): post_writer(all_post, i) post_id = get_post_id(all_post, i) # получили id текущего поста all_comments = get_comments(token, owner_id, post_id, amount) # получили список коментариев под этим постом k = 0 while k < len(all_comments): comment_writer(all_comments, k) comment_id = get_comment_id(all_comments, k) # получили id n-го комментария из списка комментариев print(len(all_comments)) all_undercom = get_vetcom(token, owner_id, post_id, comment_id, amount) # получили список подкоментариев этого коментария print(len(all_undercom)) subcomment_writer(all_undercom) k += 1 i += 1 print(len(all_post)) print(1)
Если оставить только часть которая записывает только посты без комментариев, то записываются все посты:
import csv import requests token = 'token' version = 5.131 owner_id = '-174228153' post_id = 0 comment_id = 0 count = 1000 amount = 1000 i = 0 def file_create(): with open('parsing1.csv', 'w', encoding='utf-8') as file: a_pen = csv.writer(file) a_pen.writerow(['id', 'text', 'likes', 'reposts', 'type', 'parents_stak', 'owner_id']) # функция записи данных в файл def post_writer(all_post, i): # i индекс поста из списка with open('parsing1.csv', 'a', encoding='utf-8') as file: a_pen = csv.writer(file) i = i a_pen.writerow((all_post[i]['id'], all_post[i]['text'], all_post[i]['likes']['count'], all_post[i]['reposts']['count'], 'post', '-', all_post[i]['owner_id'])) def get_posts(token, owner_id, amount): token = token version = 5.131 owner_id = owner_id count = 100 offset = 0 all_posts = [] while offset < amount: response = requests.get('https://api.vk.com/method/wall.get', params={ 'access_token': token, 'v': version, 'owner_id': owner_id, 'count': count, 'offset': offset }) data = response.
json()['response']['items'] offset += 100 all_posts.extend(data) return all_posts file_create() all_post = get_posts(token, owner_id, amount) # получили список постов print(len(all_post)) while i < len(all_post): post_writer(all_post, i) i += 1
Помогите пожалуйста разобраться в чем проблема
vkontakte api — Python скрипт парсинга Вконтакте. Имя сохраняемого файла
Помогите доработать
python
скрипт для парсинга участников группы Вконтакте, пожалуйста. Сейчас он сохраняет результат в виде club[id группы].txt
. Хочется добавить еще название группы в имя сохраняемого файла. Насколько я понимаю, для этого нужно сделать дополнительный запрос, в json
ответе будет строка name: "КИРИШИ CLUB"
. Подскажите, как ее вычленить и добавить к имени файла?import requests import time as t import csv from datetime import datetime, date, time, timedelta token = 'xxxx' def write_txt(members_list, owner_id): a = open('club'+str(owner_id)+'.txt', 'w') for i in members_list: a.write(str(i)+'\n') #писать мож a.close() def get_members_list_id(owner_id): print('Начал работать в:',datetime.strftime(datetime.now(), "%H:%M:%S")) members_list = [] #изначально пустой список участников #первый запрос на 25000, чтобы получить первые 25000 и количество участников группы r = requests.post('https://api.vk.com/method/execute.Shmakov_getClub_members?group_id='+ str(owner_id)+'&offset='+str(0)+'&count='+str(25000)+'&access_token='+token).json()['response'] members_count = r[0] #количество участников print('Участников:',members_count) members_list.extend(r[1]) #вносим первые 25000 ID if members_count > 25000: print('Больше 25k участников. Запускаем цикл') for offset in range(25000, members_count, 25000): count = offset + 25000 r = requests.post('https://api.vk.com/method/execute.Shmakov_getClub_members?group_id='+ str(owner_id)+'&offset='+str(offset)+'&count='+str(count)+'&access_token='+token).
json()['response'] members_list.extend(r[1]) #вносим все последующие ID пачками по 25000 ID #t.sleep(.35) #задержки между запросом --- ВАЖНО: если будут возникать проблемы - расскоментировать print('Цербер закончил сбор ID') else: print('>25k участников. Закончили сбор ID') print(len(members_list)) write_txt(members_list, owner_id) #записываем по 25000 ID print('Данные успешно записаны') print('Остановка:',datetime.strftime(datetime.now(), "%H:%M:%S")) get_ipython().magic('time get_members_list_id(12345)')
- python
- vkontakte-api
2
import requests req = requests.post(r'https://api.vk.com/method/groups.getById?group_id={0}'.format(owner_id)) print(req.json()['response'][0]['name'])
Результат:
КИРИШИ CLUB
Что бы подставить это в имя файла можно к примеру сделать так:
import requests owner_id = 12345 req = requests.&*_+|+\/:;[]{}<>") Public' In [27]: re.sub(r'[\W+_]', '', pub_name) Out[27]: 'VKPublic'
0
Зарегистрируйтесь или войдите
Регистрация через Google
Регистрация через Facebook
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
Почта
Необходима, но никому не показывается
Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки
vk-to-telegram — npm
Powered by Telegraf
Что это?
Инструмент для экспресса, который через VK callback api пересылает сообщения из группы в канал или чат в Telegram!
Будьте осторожны, это не отправил аудио и опрос (скоро исправлю).
Где я могу посмотреть, как это выглядит?
Таверна Героев | Overwatch -> Таверна Overwatch | Новости,
Олег Ливанов — Одинокая армия через Героку -> Олег Ливанов — Одиночная армия
Бесплатное использование
Если вы хотите протестировать этот код или использовать его на регулярной основе, свяжитесь со мной для получения подробной информации.
Установка
npm install vk-to-telegram@latest --save
Пример
const app = require('express')(), bodyParser = требуется ('парсер тела'), vkToTelegram = require('vk-to-telegram'), vkToTg = новый vkToTelegram({ botToken: 'токен вашего бота', chatName: 'телеграмм чат/название канала', // пример: '@taverofoverwatchnews' || 'tavernofoverwatchnews' vkConfirmation: 'групповое подтверждение', ownerId: 'ваш идентификатор телеграммы', fromId: 'идентификатор вашей группы', // необязательный, пример: -103208430 vkToken: 'ваш очень длинный токен от vk api' }) app.use(bodyParser.json()) // Необходимо app.post('/', vkToTg.send) // Опубликовать в ваш Telegram-канал/чат app.listen(80,()=>{ console.log('прослушивание порта 80') })
Переменные
.Переменные | Обязательно | Описание |
---|---|---|
жетон | Да | Токен бота от Botfather |
имя_чата | Да | Телеграм-канал или ссылка на группу, например ‘@tavernofheroes’ |
идентификатор владельца | Да | Ваш идентификатор телеграммы для отправки ошибки, если они есть. Вы можете узнать это от @getidsbot |
vkПодтверждение | Да | Строка подтверждения от API-сервера обратного вызова вашей группы: |
vkToken | Да | Следуйте приведенным ниже инструкциям: |
1.![]() | ||
2. Откройте настройки в созданном приложении и скопируйте идентификатор приложения | ||
3. Откройте эту ссылку, заменив идентификатор приложения: | ||
https://oauth.vk.com/authorize?client_id=ID ВАШЕГО ПРИЛОЖЕНИЯ&display=page&redirect_uri=http://vk.com/&scope=offline,video,docs&response_type=token&v=5.73 | ||
4. Нажимаем разрешить все что нужно и все! Ваш токен находится в URL-адресе запроса, не копируйте всю ссылку, только токен без других параметров. | ||
от идентификатора | Дополнительно | Идентификатор группы ВК с ‘-‘ в начале или без, если не нужно проверять. |
НЕ ЗАБЫВАЙТЕ выбрать тип события ‘Публикация на стене — NEW,REPOST’ в панели API вашей группы ВКонтакте.
Почему?
Например, потому что у меня было много ботов и при исправлении бага неудобно обновлять код во всех ботах.
Еще есть идея добавить поддержку канала дискорда, но это всего лишь идея. ᕦ( ͡° ͜ʖ ͡°)ᕤ
Контакты
Вот телеграм группа ¯\ (ツ) /¯
Так же вы можете написать мне напрямую в Telegram или на почту
Parser | Поиск | Autodesk Knowledge Network
Узнать больше См. Меньше
Не удалось получить оглавление
Посмотреть оригинал Икс
Автор:
Помощь
Справка
0 публикаций
Просмотр в продукте
Предыдущий | Следующий |
Парсер
Scaleform::GFx::XML
Scaleform::GFx::XML::Парсер
Объявление
класс Парсер : public RefCountBaseNTS,Описание
Анализатор определяет подключаемый анализатор XML, который предоставляет интерфейс на основе SAX2 для подключения пользовательских анализаторов XML.
Методы
Метод
Описание
ПарсеФайле
Разбирает файл XML с помощью предоставленного средства открытия файлов и построителя DOM.
ПарсеСтрока
Анализирует строку с помощью предоставленного построителя DOM.
Файл
XML_Support.h
{{l10n_strings.ADD_DETAILS_PROMPT}}
{{l10n_strings.SELECT_A_COLLECTION}}
{{l10n_strings.ITEM_ALREADY_EXISTS}} {{l10n_strings.ITEM_MAX_REACHED}}
{{l10n_strings.
CREATE_NEW_COLLECTION}}
(* {{l10n_strings.REQUIRED_FIELD}})
{{l10n_strings.CREATE_NEW_COLLECTION}}3
0002 0 / 80{{l10n_strings.ADD_COLLECTION_DESCRIPTION}}
{{l10n_strings.COLLECTION_DESCRIPTION}} {{addToCollection.description.length}}/500
{{l10n_strings.TAGS}}
{{$item}}{{l10n_strings.PRODUCTS}}
{{$item.Name}}{{l10n_strings.DRAG_TEXT}}
{{l10n_strings.DRAG_TEXT_HELP}}
{{l10n_strings.COLLECTION_CATEGORIES}}
{{l10n_strings.