Граббинг сайта на Python c использованием библиотеки Grab


Программа использует один из сайтов сайта суда России как источник данных, в коде это https://vytegorsky--vld.sudrf.ru.
Она производит поиск заданных слов в списке назначенных дел в период от текущего дня до назначаемого дня и отправляет результат поиска на электронный почтовый ящик.

В списке search_list назначаются слова, по которым будет произведен поиск.
Количество просматриваемых дней начиная от текущего, в которых будет происходить поиск устанавливается переменной DaysFuture.
Также устанавливаются параметры SMTP сервера и почтовых ящиков отправителя и получателя.
Процесс выполнения кода журналируется в файл example_app.log.


SearchOnTheWebsiteExample-ru.py
#  Поиск набора символьных строк на сайте суда в разделе 
#   <Список дел, назначенных к слушанию> с перебором дней слушаний,
#   с отправкой результатов поиска на почтовый адрес, 
#   с логированием процесса выполнения
 
from grab import Grab
from datetime import datetime, timedelta
import smtplib
from smtplib import email
from email.mime.text import MIMEText
import logging
 
# настройка логирования
logger = logging.getLogger("example_app")
logger.setLevel(logging.INFO)
fh = logging.FileHandler("example_app.log")
formatter = logging.Formatter('%(asctime)s  %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)
 
# в лог пустая строка и сообщение о запуске
logger.info("")
logger.info("Start")
 
# кол-во дней начиная от текущего, в которых будет происходить поиск
DaysFuture = 5
 
# список: 
#   колонка [0]: слово поиска как строка
#   колонка [1]: список дат страниц, на которой поиск был успешным
search_list = [ \
    [u'ПОИСКОВОЕ СЛОВО_1',[]],    \
    [u'поисковое_слово_2',[]],  \
    ]
 
# назначение параметров для отправки почтовых сообщений
 
# SMTP сервер, например smtp.gmail.com
smtp_server = "smtp.gmail.com" 
port = 465  
 
# отправитель, например sender@gmail.com
email_from = "ОТПРАВИТЕЛЬ"
 
# пароль
password = "ПАРОЛЬ_ПОЧТОВОГО_ЯЩИКА"
 
# получатель, например recipient@gmail.com
email_dest = 'ПОЛУЧАТЕЛЬ'
 
# Тема почтового сообщения
subject = u"Информация с сайта суда на " + datetime.now().strftime("%Y-%m-%d")
 
# в лог сообщение о начале получения данных
logger.info("Grab start")
 
g = Grab()
 
# установка кодовой страницы и времени ожидания
def prepare(self):
   self.setup_grab(document_charset='windows-1251')
   self.setup_grab(timeout = 10)
 
# цикл по датам (страницам дат)
for CounterDays in range(0,DaysFuture):
 
    CounterDate = (datetime.now() + timedelta(days=CounterDays)).strftime("%d.%m.%Y")
    url = 'https://vytegorsky--vld.sudrf.ru/modules.php?name=sud_delo&srv_num=1&H_date=' + CounterDate
    counter_go = 0
    # после 10 неудачных попыток получения данных, производим запись в лог и выполняем
    #  переход на следующую дату
    while True:
        try:
            g.go(url)
            break
        except Exception as e:
            counter_go = counter_go + 1
            if counter_go > 10:
                logger.info("Grab error: " + url + " , " +  + str(e))
                break
            continue
 
    # двигаясь по списку слов поиска (колонка [0]), при успешном нахождении слова в тексте страницы, 
    # сохраняем дату страницы в колонка результата (колонка [1]), как элемент списка
    for row in search_list:
        if g.doc.text_search(row[0].encode('cp1251'), byte=True):
            row[1].append(CounterDate)
 
# в лог сообщение о завершении получения данных
logger.info("Grab completed")
 
# в лог сообщение о начале формирования и отправки почтового сообщения
logger.info("Start sending an email message")
 
# формирование текста сообщения
email_text = ''
for row in search_list:
    if len(row[1]) > 0:
        if len(email_text) != 0:
            email_text = email_text + '\n'
        email_text =  email_text + row[0]  + ': '
        email_text_line = ''
        for one_date in row[1]:
            if len(email_text_line) != 0:
                email_text_line = email_text_line + u','
            email_text_line =  email_text_line + one_date 
        email_text = email_text + email_text_line
 
# Отправка почтового сообщения
m = MIMEText(email_text)
 
m['Subject'] = subject
m['From'] = email_from
m['To'] = email_dest
 
try:
    server = smtplib.SMTP_SSL(smtp_server, port)
    server.login(email_from, password)
    server.sendmail(email_from, email_dest, m.as_string())
    server.quit()
    # в лог
    logger.info("Send mail message complete")
except Exception as e:
    # в лог
    logger.info("Error sending mail message: " + str(e))
 
# в лог
logger.info("Completed")
  • ru/grabbing_of_the_court_site_using_python.txt
  • Последние изменения: 2018/06/27 22:06
  • — 2SRTVF