├── LICENSE ├── README.md ├── example.py └── wsparser.py /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) [year] [fullname] 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Yandex.Wordstat-parser 2 | Simple class for parsing left and right column for Yandex Wordstat via Direct API -------------------------------------------------------------------------------- /example.py: -------------------------------------------------------------------------------- 1 | # Подлючаем класс парсера WordstatParser, импортируем необходимые модули 2 | from wsparser import WordstatParser 3 | import time 4 | 5 | ################################################################################## 6 | # Вводим исходные данные для парсинга 7 | ################################################################################## 8 | 9 | # Задаем URL адрес API Яндекс.Директа 10 | # Адрес песочницы: url ='https://api-sandbox.direct.yandex.ru/v4/json/' 11 | # Адрес полного доступа: url ='https://api.direct.yandex.ru/v4/json/' 12 | url ='https://api-sandbox.direct.yandex.ru/v4/json/' 13 | # Указываем свой токен на доступ к API Яндекс.Директ 14 | token = 'AgAAAAAX1GmLIIX9s4uEoSNiSEyjjxTsAHZ0p8w' 15 | # Указываем логин своей учетной записи от Яндекс.Директ 16 | userName = 'yandex.username' 17 | 18 | # Пишем список общих минус-слов, как в примере (со знаком "-") 19 | minusWords = [ 20 | '-купить', 21 | '-дешево', 22 | '-скачать', 23 | '-бесплатно' 24 | ] 25 | 26 | # Пишем список фраз, по которым будем парсить 27 | phrases = [ 28 | 'фотошоп', 29 | 'photoshop' 30 | ] 31 | 32 | # Указываем регион, при необходимости (можно оставить пустым) 33 | geo = [] 34 | 35 | ################################################################################## 36 | # Код скрипта парсинга 37 | ################################################################################## 38 | 39 | # Добавляем минус-слова ко всем фразам 40 | data = [] 41 | for i in range(len(phrases)): 42 | data.append(phrases[i]) 43 | for j in range(len(minusWords)): 44 | data[i] += ' '+minusWords[j] 45 | 46 | # Создаем парсер 47 | parser = WordstatParser(url, token, userName) 48 | 49 | try: 50 | # Запрашиваем кол-во оставшихся баллов Яндекс.Директ API 51 | units = parser.getClientUnits() 52 | if 'data' in units: 53 | print ('>>> Баллов осталось: ', units['data'][0]['UnitsRest']) 54 | else: 55 | raise Exception('Не удалось получить баллы', units) 56 | 57 | # Отправляем запрос на создание нового отчета на сервере Яндекс.Директ 58 | response = parser.createReport(data, geo) 59 | if 'data' in response: 60 | reportID = response['data'] 61 | print ('>>> Создается отчет с ID = ', reportID) 62 | else: 63 | raise Exception('Не удалось создать отчет', response) 64 | 65 | # Проверяем список отчетов на сервере. Должен появиться новый. Ожидаем его готовности 66 | reportList = parser.getReportList() 67 | if 'data' in reportList: 68 | lastReport = reportList['data'][len(reportList['data'])-1] 69 | i = 0 70 | while lastReport['StatusReport'] != 'Done': 71 | print ('>>> Подготовка отчета, ждите ... ('+str(i)+')') 72 | time.sleep(2) 73 | reportList = parser.getReportList() 74 | lastReport = reportList['data'][len(reportList['data'])-1] 75 | i+=1 76 | print ('>>> Отчет ID = ', lastReport['ReportID'], ' получен!') 77 | else: 78 | raise Exception('Не удалось прочитать список отчетов', reportList) 79 | 80 | # Читаем отчет 81 | report = parser.readReport(reportID) 82 | if 'data' in report: 83 | # Сохраняем результаты парсинга в файлы (отдельно фразы, отдельно частотности). 84 | # Если rightCol == True, будет сохраняться правая колонка Яндекс.Вордстат (в дополнение к левой) 85 | parser.saveReportToTxt(report, True) 86 | print ('>>> Результаты парсига успешно сохранены в файлы!') 87 | else: 88 | raise Exception('Не удалось прочитать отчет', report) 89 | 90 | # Удаляем на сервере Яндекс.Директ новый отчет (он больше не нужен) 91 | report = parser.deleteReport(reportID) 92 | if 'data' in report: 93 | print ('>>> Отчет с ID = ', reportID, ' успешно удален с сервера Яндекс.Директ') 94 | else: 95 | raise Exception('Не удалось удалить отчет', report) 96 | 97 | print ('>>> Все готово!') 98 | 99 | # Все готово! Ищем файлы "phrases_lef.txt" и "shows_left.txt" с резльтатами парсинга в директории этого скрипта 100 | except Exception as e: 101 | print ('>>> Поймано исключение:', e) -------------------------------------------------------------------------------- /wsparser.py: -------------------------------------------------------------------------------- 1 | import json, urllib.request, urllib.error 2 | class WordstatParser: 3 | def __init__(self, url, token, username): 4 | self.url = url 5 | self.token = token 6 | self.username = username 7 | 8 | def getClientUnits(self): 9 | data = { 10 | 'method': 'GetClientsUnits', 11 | 'token': self.token, 12 | 'param': [self.username] 13 | } 14 | data = json.dumps(data, ensure_ascii=False).encode('utf8') 15 | request = urllib.request.urlopen(self.url,data) 16 | response = json.loads(request.read().decode('utf8')) 17 | return response 18 | 19 | def createReport(self, phrases, geo = []): 20 | data = { 21 | 'method': 'CreateNewWordstatReport', 22 | 'token': self.token, 23 | 'param': { 24 | 'Phrases': phrases, 25 | 'GeoID': geo 26 | } 27 | } 28 | data = json.dumps(data, ensure_ascii=False).encode('utf8') 29 | request = urllib.request.urlopen(self.url,data) 30 | response = json.loads(request.read().decode('utf8')) 31 | return response 32 | 33 | def getReportList (self): 34 | data = { 35 | 'method': 'GetWordstatReportList', 36 | 'token': self.token 37 | } 38 | data = json.dumps(data, ensure_ascii=False).encode('utf8') 39 | request = urllib.request.urlopen(self.url,data) 40 | response = json.loads(request.read().decode('utf8')) 41 | return response 42 | 43 | def readReport (self, reportID): 44 | data = { 45 | 'method': 'GetWordstatReport', 46 | 'token': self.token, 47 | 'param': reportID 48 | } 49 | data = json.dumps(data, ensure_ascii=False).encode('utf8') 50 | request = urllib.request.urlopen(self.url,data) 51 | response = json.loads(request.read().decode('utf8')) 52 | return response 53 | 54 | def deleteReport (self, reportID): 55 | data = { 56 | 'method': 'DeleteWordstatReport', 57 | 'token': self.token, 58 | 'param': reportID 59 | } 60 | data = json.dumps(data, ensure_ascii=False).encode('utf8') 61 | request = urllib.request.urlopen(self.url,data) 62 | response = json.loads(request.read().decode('utf8')) 63 | return response 64 | 65 | def saveReportToTxt (self, report, rightCol): 66 | phrases = open('phrases_left.txt', 'w') 67 | shows = open('shows_left.txt', 'w') 68 | for i in range(len(report['data'])): 69 | for j in report['data'][i]['SearchedWith']: 70 | phraseToReport = str(j['Phrase']) 71 | phrases.write(phraseToReport+'\n') 72 | showsToReport = str(j['Shows']) 73 | shows.write(showsToReport+'\n') 74 | phrases.close() 75 | shows.close() 76 | if rightCol == True: 77 | phrases = open('phrases_right.txt', 'w') 78 | shows = open('shows_right.txt', 'w') 79 | for i in range(len(report['data'])): 80 | for j in report['data'][i]['SearchedAlso']: 81 | phraseToReport = str(j['Phrase']) 82 | phrases.write(phraseToReport+'\n') 83 | showsToReport = str(j['Shows']) 84 | shows.write(showsToReport+'\n') 85 | phrases.close() 86 | shows.close() 87 | 88 | --------------------------------------------------------------------------------