Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 12, 2019 05:20:15

irgit
Зарегистрирован: 2018-02-04
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

rami
Вот мой вариант:

Спасибо огромное!!! Ваши уроки бесценны! Хороший код python - это поэзия, черт побери! Это круто!

Офлайн

#2 Июнь 13, 2019 06:56:42

irgit
Зарегистрирован: 2018-02-04
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

Добрый день уважаемые эксперты. С учётом ваших замечаний написал парсер правовой информации с использованием selenium (на сайте аякс). Оцените пожалуйста код, как его можно улучить и оптимизировать?

 from selenium import webdriver
from bs4 import BeautifulSoup as bs
import time
import re
URL = 'http://publication.pravo.gov.ru/SignatoryAuthority/region17' #ссылка на ваш регион
COUNT = 3040 #всего документов на сайте по региону
def page_parser(soup):
    '''
    извлекаем данные из страницы
    :return page_doc ->set(title, url, file, type_file, page_doc, date, id)
    '''
    PLUS_URL = 'http://publication.pravo.gov.ru{}'
    all_doc = []
    for item in soup.findAll("div", {"class": "tr"})[1:]:
        try:
            content = item.find( "div", {"class": "td vis"})
            title = content.find('a').text
            url = content.find( 'a' ).get('href')
            url = PLUS_URL.format(url)
            file = content.find('span', attrs={'class': 'notforprint'}).find('a').get('href')
            file = PLUS_URL.format(file)
            type_file = content.find( 'span', attrs={'class': 'notforprint'} ).find( 'a' ).text
            page_doc = content.find( 'span', attrs={'class': 'pagesindoccount'} ).text
            page_doc = re.findall('(\d+)', page_doc)[0]
            id = item.find( "div", {"class": "td vis notforprint"})\
                .find('span', attrs={'class': 'pagesindoccount information'}).text
            date = item.find( "div", {"class": "td vis notforprint"})\
                .findAll('span', attrs={'class': 'pagesindoccount information'})[1].text
            doc = (id, title, date, url, file, type_file, page_doc)
            all_doc.append(doc)
        except:
            z=0
    return all_doc
driver = r'D:\AnacodaProgect\geckodriver.exe' #драйвер для Firefox https://github.com/mozilla/geckodriver/releases
browser = webdriver.Firefox(executable_path=driver)
browser.get(URL)
page_count = []
OUTPUT_FILE = 'pravo_doc.csv'
with open(OUTPUT_FILE, 'w') as f:
    print('Начинаю парсить данные, ожидайте...')
    for pagination in range(1, (COUNT//30)+1):
        time.sleep(4)
        browser.find_element_by_class_name("page-nave-next").click()
        soup = bs( browser.page_source, 'lxml')
        for doc in (page_parser(soup)):
            stroka = '|'.join(doc)
            page_count.append(stroka)
            print ('Получено {} документов из {}'.format(len(page_count),COUNT))
            f.write(stroka + '\n')
f.close()
print('Описательная часть {} правовых актов региона получена'.format(len(page_count)))

Отредактировано irgit (Июнь 13, 2019 07:26:32)

Офлайн

#3 Июнь 13, 2019 09:43:07

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

irgit
С учётом ваших замечаний написал…
Не совсем с учётом

Два дня назад PEHDOM писал вам об обработке ошибок, но вы продолжаете except: z=0.

— Что случилось??? Это опасно???
— Не беспокойтесь, мы и не такое пережили, просто z=0

Константы PLUS_URL и OUTPUT_FILE лучше перенести к другим константам под блок импорта.

f.close() не нужно, контекстный менеджер with сам закроет файл когда нужно.

Офлайн

#4 Июнь 13, 2019 10:21:30

irgit
Зарегистрирован: 2018-02-04
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

rami
Два дня назад PEHDOM писал вам об обработке ошибок, но вы продолжаете except: z=0.
каюсь Больше не буду)

rami
f.close() не нужно, контекстный менеджер with сам закроет файл когда нужно.
буду знать

Всё понял, спасибо огромное!!!

pravo

Отредактировано irgit (Июнь 13, 2019 10:46:45)

Офлайн

#5 Июнь 13, 2019 11:02:53

irgit
Зарегистрирован: 2018-02-04
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

Возник такой вопрос, когда данные открыл в pandas. В одной строке csv файла не оказалось значения ‘id’, как проверить все переменные, чтобы все строки были полными - без “битых” (пустых) значений?

irgit
doc = (id, title, date, url, file, type_file, page_doc)
all_doc.append(doc)

Полагаю, вот такой вариант не годится.
 if not id or not title or not date...:
Как разом проверить все значения множества?


Отредактировано irgit (Июнь 13, 2019 11:03:27)

Офлайн

#6 Июнь 13, 2019 11:50:05

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

irgit
Как разом проверить все значения множества?
ключевое слово “множества” используйте например пересечение множеств,

 a= {'1','2',''}
b={''}
print(a&b)
>>> 
{''}
>>>
если результирующее множество не пустое, значит в исходном есть пустые строки



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Июнь 13, 2019 11:53:05)

Офлайн

#7 Июнь 13, 2019 12:43:56

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

Используйте функцию all():

 doc = my_id, title, date, url, file, type_file, page_doc = '', 'title', 'date', 'url', 'file', 'type_file', 'page_doc'
all(doc)
False

P.S. Не используйте для имени переменной id, т.к. это встроенная функция в Python.

Отредактировано rami (Июнь 13, 2019 12:47:52)

Офлайн

#8 Июнь 13, 2019 14:20:05

irgit
Зарегистрирован: 2018-02-04
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

rami
Используйте функцию all():
Спасибо за хороший рецепт)

Офлайн

#9 Апрель 16, 2020 07:24:02

irgit
Зарегистрирован: 2018-02-04
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

Здравствуйте. Осваиваю классы и не могу понять, как вызвать класс внутри класса. Посмотрите пожалуйста код, затык на вызове with connection.cursor() as cursor: Заранее благодарю за советы

 # -*- coding: utf-8 -*-
"""
Класс подключения к базе MSQL
"""
import pymysql.cursors
# Настройки базы
base = 'megaparser'
base_user = 'root'
base_pass = ''
class Connect_my_base(object):
    """Создаём соединение с базой"""
    def __init__(self, base, base_user, base_pass):
        """Инициализируем соединение"""
        self.base = base
        self.base_user = base_user
        self.base_pass = base_pass
    def sql_connection(self):
        """Соединяемся с базой"""
        connection = pymysql.connect(host='localhost',
                                     user=self.base_user,
                                     password=self.base_pass,
                                     db=self.base,
                                     charset='utf8mb4',
                                     cursorclass=pymysql.cursors.DictCursor)
        return connection
class Get_sql(object):
    """Делаем запрос к базе"""
    def __init__(self, sql, cursor):
        self.sql = sql
    def get_row(self):
        connection = Connect_my_base(base, base_user, base_pass)
# -- КАК ВЫЗВАТЬ pymysql.cursors к классу Connect_my_base?
# -- что-то типа with connection.cursor() as cursor:

Отредактировано irgit (Апрель 16, 2020 07:42:13)

Офлайн

#10 Апрель 16, 2020 08:33:31

irgit
Зарегистрирован: 2018-02-04
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

irgit
Здравствуйте. Осваиваю классы и не могу понять, как вызвать класс внутри класса. Посмотрите пожалуйста код, затык на вызове with connection.cursor() as cursor: Заранее благодарю за советы

Переделал на вот такой класс. Посмотрите пожалуйста, как улучить класс

 # -*- coding: utf-8 -*-
"""
Класс подключения к базе MSQL
Автор Иргит Валерий
Пример: Connect_my_base(base, base_user, base_pass).get_site(sql)
"""
import pymysql.cursors
class Connect_my_base(object):
    """Создаём соединение с базой"""
    def __init__(self, base, base_user, base_pass):
        """Инициализируем соединение"""
        self.base = base
        self.base_user = base_user
        self.base_pass = base_pass
    def connect_base(self):
        """Соединяемся с базой"""
        connection = pymysql.connect(host='localhost',
                                     user=self.base_user,
                                     password=self.base_pass,
                                     db=self.base,
                                     charset='utf8mb4',
                                     cursorclass=pymysql.cursors.DictCursor)
        return connection
    def get_site(self, sql):
        connection = self.connect_base()
        with connection.cursor() as cursor:
            cursor.execute(sql)
            rows = cursor.fetchall()
            cursor.close()
            connection.close()
            return rows

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version