Парсер для вк записывает в файл только часть данных
Данный код должен собирать все по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
Помогите пожалуйста разобраться в чем проблема
Ответы (1 шт):
В словаре нет ключа text, возможно на одной из записей в группе расположена только фотография без описания. Как вариант эту ошибку можно обработать через try и except и ваш код продолжит дальше выполняться.