Как парсить вк python
Перейти к содержимому

Как парсить вк python

  • автор:

Парсинг новостной группы в Vk

Author24 — интернет-сервис помощи студентам

беда какая-то с картинками, дело в том что картинок несколько бывает к новости прикрепляют, также и ауди бывает(не плоъо было бы и аудио это получать, но все по-тихоньку)как-то не сложилось у меня с картинками. так же хотел спросить, вот содержимое без проблем мы получаем, а картинки только с помощью регулярок можно достать или есть какой-то другой более удобный способ? в общем мой код.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
from selenium import webdriver from bs4 import BeautifulSoup import re import csv driver = webdriver.Firefox() url = "http://vk.com/oldlentach" driver.get(url) driver.implicitly_wait(10) page = BeautifulSoup(driver.page_source, "html.parser") names = [] pictures = [] rows = page.findAll('div',{'class':"wall_post_text"}) for name in rows: names.append(name.text) for i in range(len(names)): names[i] = names[i].strip() divs = page.find_all('img', {'class':'page_post_thumb_sized_photo'}) p = re.compile('src="https://www.cyberforum.ru/python-web/(.*?jpg)"') pictures = p.findall(str(divs)) with open ('lenta.csv','w',encoding='utf8') as csvfile: writer = csv.writer(csvfile) for row in zip(names,pictures): writer.writerow(row)
Здесь вы можете заказать любую студенческую или школьную работу.

Парсниг записей со стены в вк сообществах

Написал парсер сообщества (URL и текст записей приходят как надо) Необходимо выполнять парсинг не одной группы, а 200 групп. Как это можно реализовать? Вот код:

import json import requests from bs4 import BeautifulSoup import os def post_date(): token = "Мой токен" version = 5.131 domain = "группа" count_post = 200 filter_post = "suggests" offset = 0 response = requests.get('https://api.vk.com/method/wall.get', params=< 'access_token': token, 'v': version, 'domain': domain, 'count': count_post, 'offset': offset >) data = response.json() items = data["response"]["items"] for item in items: text_post = item.get("text").strip() url_sec = str(item['from_id']) + '_' + str(item['id']) url = f"https://vk.com/studentkazani?w=wall" print(f"\n ") def main(): post_date() if __name__ == '__main__': main() 

Отслеживать
2,744 4 4 золотых знака 9 9 серебряных знаков 27 27 бронзовых знаков
задан 25 мар 2023 в 9:19
user537020 user537020
У вас проблемы с циклами?
25 мар 2023 в 10:38
@СергейШ Не понимаю как это оформить
– user537020
25 мар 2023 в 11:14
в цикле на каждой интеракций меняете нужную вам группу.
25 мар 2023 в 11:23

@СергейШ Можете пожалуйста написать код пример? Как именно менять (глупые вопрос наверное но я только учусь)

– user537020
25 мар 2023 в 11:34

В данный момент у вас есть код, который парсит одну группу. Почему бы это не превратить в функцию и парсить 200 групп по разным id? // Изучите получше питон (в интернете есть множество курсов и разных книжек) и после задавайте чуть более конкретные вопросы.

Python-сообщество

[RSS Feed]

  • Начало
  • » Python проекты
  • » Парсер сообщений вк на предмет фотографий

#1 Авг. 26, 2015 17:07:39

BlackSan Зарегистрирован: 2015-08-26 Сообщения: 1 Репутация: 0 Профиль Отправить e-mail

Парсер сообщений вк на предмет фотографий

Здравствуйте форумчане, вот решил выложить свой небольшой проект, сразу попрошу не бросаться тапками, хотелось бы конструктивной критики. Python начал осваивать буквально неделю назад и наваял небольшой парсер сообщений вк:

Суть программы заключается в следующем, после запуска вы видите диалог с просьбой вести acces_token вк от страницы сообщения которой будем парсить, затем запрашиваетcя ID пользователя диалог с которым будем парсить, далее происходит парсинг диалога с сохранением из него фотографий.

Чем мотивирован пост :
По большей части данный код был написан для изучения “на практике” и ускоренного впитывания Python’a , по-этому хотел бы узнать ваше мнение о коде: что нравиться, что не нравиться, что можно изменить и как, заранее огромное спасибо

  • Конструктивная критика
  • Поправки по коду
  • Подсказки по улучшению алгоритмов
  • Любые ценные наставления
#Подключаем необходимые модули import os import vk import urllib import time import requests #--------- END ---------# #Создание папки для фотографии def mkDirForPh(dirName, co = 0, iF = 1): while iF: if (dirName in os.listdir()): #если такая папка есть, пробуем добавить - (1) если и такая есть добавляем - (2) и т.д. co = co + 1 dirName = str(withUID) + "(" + str(co) + ")" else:# если папки с названием dirName в этой директории нет, создаем ее и переходим в нее os.mkdir(dirName) os.chdir(dirName) iF = 0 #--------- END ---------# #Поиск ссылки на оригинал изображения def urlTOP(messAr,url=""): #urlToOriginalPhoto if "photo_2560" in messAr: url = "photo_2560" elif "photo_1280" in messAr: url = "photo_1280" elif "photo_807" in messAr: url = "photo_807" elif "photo_604" in messAr: url = "photo_604" elif "photo_130" in messAr: url = "photo_130" elif "photo_75" in messAr: url = "photo_75" else: print('error of sizeing') url = messAr[url] return url #--------- END ---------# #Скачивание изображения def DownloadFile(url): local_filename = url.split('/')[-1] r = requests.get(url) f = open(local_filename, 'wb') for chunk in r.iter_content(chunk_size=512 * 1024): if chunk: # filter out keep-alive new chunks f.write(chunk) f.close() return #--------- END ---------# #Диалог def IDC(F = 1): #input dialog check while F: if 'token' in globals():#если переменная токена определена F = 0 print('token - Y') else: temp = input('Введите ваш токен: ') if len(temp) > 10 and str(type(temp)) == "": global token token = temp continue else: print('Токен введен не правильно!') F = 1 continue if 'withUID' in globals():#если переменная withUID определена F = 0 print('ID - Y') else: temp = input('Введите ID человека, из диалога с которым, вы хотите скачать все фото(пример:947530459) без пробелов и букв ID!: ') if len(temp) > 0 and str(type(temp)) == "": global withUID withUID = temp continue else: print('ID введен не правильно!' + str(type(temp))) F = 1 continue #--------- END ---------# IDC() #подключаемся к vkAPI vkAPI = vk.API(access_token=token) #Достаем сообщения lm = vkAPI.messages.getHistory(count = 200, user_id=withUID) # Получаем Имя и Фамилию собеседника withUsr = vkAPI.users.get(users_ids=withUID) #Количество сообщений с собеседником print ("Всего сообщений: "+str(lm['count'])) # Инициализация счетчиков MPC = 0 #MessParseCounter счетчик для масива lm SPC = 0 #SavedPhotosCounter счетчик сохраненных сообщений #создаем папку с именем withUID mkDirForPh(str(withUID)) #парсим массив сообщений for i in range(lm['count']): # co - кол-во итераций, lm['count'] - кол-во сообщений всего if(MPC > 199):#По скольку сообщения мы вытягиваем по 200 шт, проверяем, какое по счету сообщение мы будем парсить, если MPC > 199 : MPC = 0 и получаем новые 200 сообщений lm = vkAPI.messages.getHistory(count = 200, user_id=withUID, offset=i) MPC = 0 time.sleep(0.5)#делаем небольшую паузу if 'attachments' in lm['items'][MPC]: #если в сообщении есть прикрепление for j in range(len(lm['items'][MPC]['attachments'])): #парсим прикрепления на предмет фотографий if 'photo' in lm['items'][MPC]['attachments'][j]: #если приложение являеться фотографией #сохраняем фотографию url = urlTOP(lm['items'][MPC]['attachments'][j]['photo'])# получаем URL на картинку print("i = " + str(i) + "| j = " + str(j) + "| MPC = " + str(MPC) + "| SPC = \r" + str(SPC)) # дебаг DownloadFile(url)#скачиваем файл #print (url) SPC+=1#инкрементируем счетчик сохраненных фотографий #конец for MPC+=1 #Инкрементируем счетчик обработанных сообщений print('Сообщений сканировано:'+ str(i+1) +'\nЗагружено всего фотографий:' + str(SPC)) print('Все скачанные фотографии будут лежать в папке:'+ os.getcwd()) 

P.S. Код старался комментировать как можно больше
Так-же созрел вопрос, чем лучше компилировать Python?

attachment

Прикреплённый файлы:
sc2.png (167,9 KБ)

Сбор данных с помощью API Вконтакте

Так вот, сделав несколько пробных выборок для анализа, мы поняли, что поиск по фамилии и имени дает слишком ненадежные результаты, т.к. даты рождения многих пользователей скрыты, и даже выгрузив все совпадения по ФИ, вы все равно не сможете потом идентифицировать нужные данные.

Важно: мы заметили, что при поиске по ФИ + ДР Вконтакте выдаст подходящих пользователей, даже если их дата рождения скрыта. Это можно было использовать, только нужно обеспечить связь с данными поискового запроса. Для работы с API VK мы решили использовать Python с библиотекой vk_api (установка: pip install vk_api). Итого нам потребуются 2 библиотеки:

import pandas as pd import vk_api

Далее – импорт входных данных в формате ID, Имя, Фамилия, Отчество (можно оставить пустым, так как Вконтакте отчество отсутствует), День рождения, Месяц рождения, Год рождения. Пример: (0,Петр,Петрович,,1,1,1950)

data = pd.read_csv('in.txt', encoding = 'cp1251')

Затем авторизация и получение токена VK:

vk_session = vk_api.VkApi('+79XXXXXXXXXX', 'password') vk_session.auth() vk = vk_session.get_api()

После этого мы можем начинать выполнять запросы к API. Полный перечень методов можно найти на странице vk.com/dev/methods.

Разберем для примера использование метода users.search и сохранение полученных результатов. Основные параметры это q – строка поискового запроса, так же для поиска нам понадобятся birth_day, birth_month, birth_year, count – количество результатов (поставим максимум – 1000), fields – список дополнительных полей, в примере укажем ‘bdate, city’. Результат будет возвращен в виде словаря Python. Разберем подробно:

t=<> #создаем словарь для хранения данных, получаемых от API VK for j in range(0, len(data)): #запускаем поиск по массиву #Далее следует обращение к API с нашими параметрами: t[j]=vk.users.search(q = data['N'][j] + ' ' + data['F'][j], birth_day = data['D'][j], \ birth_month = data['M'][j], birth_year = data['Y'][j], count = 1000, fields='bdate, city') for h in (t[j]['items']): #Сохраняем результаты поиска в файл"users.txt" with open('users.txt','a') as f1: f1.write((str(data['id'][j]) + ';' #ID исходный + str(t[j]['count']) + ';' #Количество найденных пользователей + str(h['id']) + ';' #ID пользователя VK + h['last_name'] + ';' #Фамилия + h['first_name'] + ';' #Имя + h.get('bdate','') + ';' #Дата рождения + h.get('city',<>).get('title','') #У города несколько параметров - нам нужно название: title + ';\n').encode('cp1251', 'replace').decode('cp1251'))#Для удаления нестандартных символов, которые могут вызывать ошибки

Далее мы можем в этом же цикле осуществить поиск и сохранение ID друзей пользователя, за это отвечает метод friends.get. Если друзей нет (или скрыты), метод вернет ошибку, поэтому используем try/except:

try: m=vk.friends.get(user_id = str(h['id']), count = 50000) for q in m['items']: #Сохраняем ID друзей в файл "friends.txt" with open('friends.txt','a') as f2: f2.write(str(data['id'][j]) + ';' + str(h['id']) + ';' + str(q) + ';\n') except: #Если друзей нет (или скрыты) пишем в файл 0 для этого ID with open('friends.txt','a') as f2: f2.write(str(data['id'][j]) + ';' + str(h['id']) + ';0;\n')

Если мы хотим выполнить большое количество запросов, нужно добавить паузу между ними, например, команда sleep библиотеки time. Без этого учетная запись VK может быть заблокирована. Экспериментальным путем подобраны значения 9 секунд для поиска без друзей и 5 для поиска с друзьями (меньше, т.к. получение и сохранение списка друзей занимает несколько секунд). Производительность при использовании одной учетной записи Вконтакте составляет 8-10 тыс. пользователей в сутки. Полученные результаты сохраняются в файлы users.txt и friends.txt и могут в дальнейшем быть обработаны в БД или средствами Python.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *