Не срабатывает код парсера, на tornado framework python
Разбираю парсер, он написан на tornado framework, использует api запросы, собирает данные с вк. Есть файл сервера, который присылает запрос на запуск парсера (чтобы он начал собирать информацию), есть список id групп по ВК (в mysql), и 4 файла самого парсера, из которых важны первые два: start_worker и worker_vk, один соответственно запускает, второй уже начинает выполнять работу и передавать часть данных в 3-4 файлы в зависимости от сортировки. В start_worker у меня ссылки на 2 хендлера (в торнадо новичок), которые являются классами в worker_vk. По включении start_worker он должен ожидать запроса от сервера и после того, как принимает его - начинать парсить.
start_worker принимает запрос и сервер проверяет подключение с 2 хендлерами (они возвращают положительный ответ), после чего инфа уходит в классы (логично), в них обоих есть принты в самом начале, чтобы знать, что они запустились. НО! Основной класс (хендлер) парсера не возвращает ничего. Просто тишина. То есть второй класс - возвращает print и информацию (ниже в коде увидите сам класс), а второй, который мне как раз нужен - молчит. Может есть здесь знающие по tornado?
Код start_worker:
# -*- encoding: utf-8 -*-
import tornado.ioloop
import tornado.web
import worker_vk as vk
###################Запуск ВК-воркера на порту 1111
if __name__ == "__main__":
app = tornado.web.Application([
(r"/get_streamres1", vk.GetStreamRes1),
(r"/get_resmaxdates1", vk.GetResMaxDates1)
])
app.listen(1111)
tornado.ioloop.IOLoop.instance().start()
Код worker_vk (нерабочий класс - GetStreamRes1, после 'keko1' ни звука):
# -*- encoding: utf-8 -*-
from __future__ import absolute_import
import tornado.escape
import tornado.ioloop
import tornado.web
import tornado_mysql
from tornado.httpclient import HTTPClient
from tornado.httpclient import AsyncHTTPClient
from tornado.concurrent import Future
from datetime import datetime
from tornado import gen
import requests
from tornado.ioloop import IOLoop
import json
from tornado.escape import json_decode, json_encode, url_unescape
from get_posts import fetch_vk_post
import vk
import time
###############Получение ресурсов, max_date для парсинга, передача данных штабу для insert/update БД #где цикл
class GetStreamRes1(tornado.web.RequestHandler):
print('keko1')
def post(self):
print('1')
self.set_header('Content-Type', 'application/json; charset=UTF-8')
try:
finisherror=[]
finishdisable=[]
# print ("New resources")
# print(datetime.now().strftime("%Y-%m-%d %H:%M:%S:%f"))
try:
base_posts1=[]
finishgood=[]
stream=json_decode(self.request.body) # декодировка из джсона
resources=stream['name'] # массив инфы для ресурсов
print("NOW_TIME_%s_PULL_RES_%s"%(datetime.now().strftime("%Y-%m-%d %H:%M:%S:%f"), resources))
def resources_vk(resources):
try:
owner_id1=source_id1=count=0
for g in resources:
try:
source_id1=g[0]
owner_id1=int(g[1]) # инфа для парса групп
max_date1=g[2]
vk_tokens=g[3]
stream=g[4] # ?
except Exception as e:
print("VK_RES", e)
###RESOURCE_GET_POSTS
result =fetch_vk_group(vk_tokens,
owner_id1,
source_id1, # передаёт массив инфы в парс групп
max_date1,
stream)
except Exception as e:
print("RESOURCES_VK_ERROR", e)
return result
################################Парсинг ресурса, возврат данных для передачи штабу
# @gen.coroutine
def fetch_vk_group(token,owner_id1, source_id1,max_date1,stream): # инфа приходит
try:
base_posts1=[]
attachments1=[]
all_likes1=[]
users1=[]
insert_max_date1=0
update_max_date1=0
finishgood=[]
disable =[]
count=0
try:
session = vk.Session(access_token=token) # подключение
api = vk.API(session, v='5.52', lang='ru')
try:
res1 = api.wall.get(owner_id=owner_id1, # метод
offset=0,
count=100,
extended=1,
fields='bdate,city,country,photo_100,screen_name,sex',
filter='all')
if res1['items']:
if int(res1['items'][0]['owner_id'])==owner_id1: # Проверка овнер ид
count1=res1['count'] # кол-во нужных постов?
try:
###############Получение сформированных словарей с данными для записи в БД
s=fetch_vk_post(res1, source_id1, owner_id1, max_date1) # get_posts py
print(s)
count = s['count']
base_posts1=s['base_posts'] #?
attachments1=s['attachments']
all_likes1=s['all_likes'] # кол-во лайков?
users1=s['users'] # подписчики?
insert_max_date1=s['insert_max_date'] # ?
update_max_date1=s['update_max_date']
print("YES POSTS FOR RES1_%s_RES_POSTS1_%s_IMAS_ADD_%s"%(source_id1,count1,count))
finishgood.append(source_id1)
except Exception as e:
print(e)
else:
finishgood.append(source_id1)
except vk.exceptions.VkAPIError as error_msg:
error_code=error_msg.code
if error_code==6:
print("SLEEP_60_NO POSTS RES1_ERROR_CODE_%s_ERROR_MSG_%s_FOR_%s"%(error_code,error_msg,source_id1))
finisherror.append(source_id1)
if error_code in (15,18):
print("NO POSTS RES1_ERROR_CODE_%s_ERROR_MSG_%s_FOR_%s"%(error_code,error_msg,source_id1))
finishdisable.append(source_id1)
except Exception as e:
print("VK_ERROR", e)
print("STREAM",stream) # ?
print("__________________________________") # ?
except Exception as e:
print("MAIN_VK_ERROR", e)
return {"finisherror":finisherror,
"finishgood":finishgood,
"disable":disable,
"base_posts1":base_posts1, # возвращает массив о постах
"attachments1":attachments1,
"all_likes1":all_likes1,
"users1":users1,
"insert_max_date1":insert_max_date1,
"update_max_date1":update_max_date1
}
res=resources_vk(resources) # запуск парсинга ресурсов, полученных с базы
errors1= res['finisherror'] # ид в которых ошибки
good1 = res['finishgood'] # хорошие ид
disable1=res['disable'] # выключенные сообщества?
base_posts1=res['base_posts1'] # посты
attachments1=res['attachments1'] # аттачменты
all_likes1=res['all_likes1'] # лайки?
users1=res['users1'] # подписчики
insert_max_date1=res['insert_max_date1'] # ?
update_max_date1=res['update_max_date1'] # ?
res_updates_status=[]
res_updates_dates=[]
res_inserts_posts=[]
res_inserts_attachments=[]
res_inserts_likes=[]
res_inserts_users=[]
res_inserts_dates=[]
print("errors1",errors1)
print("good1",good1)
print("disable1",disable1)
res_updates_dates.append({"max_date":(update_max_date1)}) # ?
res_inserts_dates.append({"max_date":(insert_max_date1)}) # ?
print("res_updates_dates",res_updates_dates[0])
print("res_inserts_dates",res_inserts_dates[0])
# res_updates_status.append({"good":good1,
# "error":errors1,
# "disable":disable1})
##################Запись данных в словари
res_inserts_posts.append({"base_posts1":base_posts1})# -*- encoding: utf-8 -*-
res_inserts_attachments.append({"attachments1":attachments1})
res_inserts_likes.append({"all_likes1":all_likes1})
res_inserts_users.append({"users1":users1})
#####################Функция обновления max_date ресурса
def update_res(rest_url,res_updates):
try:
try:
http_client = tornado.httpclient.AsyncHTTPClient()
request = http_client.fetch(request=rest_url,
method="POST",
headers={'Content-type': 'application/json'},
body=json.dumps(dict(update=res_updates)))
except Exception as e:
print("rest_update_error0",e)
except Exception as e:
print("rest_update_error1",e)
#####################Функция передачи данных штабу
def insert_res(rest_url,res_insert,name):
# рес инсерт - то, что нужно инсертить
# нейм - вид инфы для сортировки
if name == "posts":
d = dict(posts=res_insert) # в словари добавляем посты (пост: рес инсерт поста, лайки: рес инсерт лайков)
if name == "attachments":
d = dict(attachments=res_insert)
if name == "likes":
d = dict(likes=res_insert)
if name == "users":
d = dict(users=res_insert)
if name == "max_date":
d = dict(max_date=res_insert)
try:
try:
http_client = tornado.httpclient.AsyncHTTPClient() # неблокирующий хттп клиент
request = http_client.fetch(request=rest_url, # фетч - отправка реквеста
method="POST", # ?
headers={'Content-type': 'application/json'}, # ?
body=json.dumps(d)) # ?
except Exception as e:
print("rest_update_error0",e)
except Exception as e:
print("rest_update_error1",e)
###############################Insert posts,attachments,likes,users,max_date
print("res_inserts_posts",res_inserts_posts)
rest_url="http://94.247.130.44:9999/rest_insert" # ?
# insert_res(rest_url, res_inserts_posts, "posts")
# insert_res(rest_url, res_inserts_attachments, "attachments")
# insert_res(rest_url, res_inserts_likes, "likes")
# insert_res(rest_url, res_inserts_users, "users")
# insert_res(rest_url, res_inserts_dates, "max_date")
###############################Обновление max_date ресурса
rest_url="http://94.247.130.44:9999/rest_update"
# update_res(rest_url,res_updates_status)
# update_res(rest_url, res_updates_dates)
except Exception as e:
print(e)
except:
print({"False"})
if finisherror!=[]:
print("Sleep")
elif finishdisable!=[]:
print("Disable")
else:
print("True")
#####################Проверка сигнала от штаба
class GetResMaxDates1(tornado.web.RequestHandler):
print('keko2')
def post(self):
print('2')
self.set_header('Content-Type', 'application/json; charset=UTF-8')
try:
try:
get_res=json_decode(self.request.body)
print("res_ids", get_res)
except Exception as e:
self.write(e)
except:
self.write({"False"})
self.write("True")