Форум программистов, компьютерный форум, киберфорум
Python: Web
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16

Парсер учебных заведений - первый опыт

25.01.2019, 10:05. Показов 1670. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал парсер учебных заведений (как учебный проект)

Прошу оценить, возможно, дополнить


Кликните здесь для просмотра всего текста

Python
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
 #- получаем урл страницы
 #- получаем список итемсов на странице
 #- заходим в кадлую статью 
 #- получаем данные
 
import requests
from bs4 import BeautifulSoup
import time
import csv
 
def get_html(i):
    r = requests.get(i)   
    return r.text
 
 
def csv_write(data, path):
    """ Записываем в файл данные полученные при парсинге
    """
    with open(path, 'w', newline='') as csv_file:
        writer = csv.writer(csv_file, delimiter=',')
        for line in data:
            writer.writerow(line)
    
 
def get_page_data(item_page):
    """ Получаем данные со страницы из списка страниц
    """
    r = requests.get(item_page)
    soup = BeautifulSoup(r.text, 'lxml')
    
    item_data = []    
    try:
        get_title = soup.find('h1', class_='b-heading_title').text.strip()
        item_data.append(get_title)
    except:
        get_title = 'Без названия'
    
    try:
        get_descr = soup.find('div', class_='b-organization_title').text.strip()
        item_data.append(get_descr)
    except:
        get_descr = 'null'
 
    try:
        text = soup.find(attrs={"class":"b-organization"}).find_all('p')
        for x in text:
            item_data.append(x.get_text())
    except:
        text = 'адрес не указан'
    
    return item_data
 
 
def main():
    path = '/csv/additional.csv'
    i = 1
    url = 'http://15kids.ru/institutions/additional/krym/page_'  # 21 num/
    url_list = []
    for p in range(1, 11):
        page_url = url + str(p) + '/'
        url_list.append(page_url)
    print(url_list)
    
    items_urls_list = []
    for i in url_list:
        page = get_html(i)
        soup = BeautifulSoup(page, 'lxml')
        links = soup.findAll('h2')
        for l in links:
            link = l.find('a').get('href')
            items_urls_list.append('http://15kids.ru' + link)
            
        time.sleep(1)
    counter = 1
    print('Всего список из', len(items_urls_list), 'статей')
    for item_page in items_urls_list:
        item_data = get_page_data(item_page)
        with open(path, 'a', newline='') as csv_file:
            writer = csv.writer(csv_file, delimiter=',')
            writer.writerow(item_data)
            print('Статья', counter, 'добавлена в базу')
        counter += 1
        time.sleep(1)
      
 
if __name__ == '__main__':
    main()
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.01.2019, 10:05
Ответы с готовыми решениями:

БД высших учебных заведений Киева
Добрый всем день,но не у меня.Ребят,очень нуждаюсь в помощи.Курсовую нужно скоро сдавать а у меня ничего не готово.Знаю сам виноват,но...

Перечень Учебных заведений СПб
Добрый день Возникла необходимость иметь под рукой перечень школ , детсадов, Вузов, техникумов города. подскажите откуда можно подтянуть...

Антивирус для учебных заведений
Требуется антивирус для школы на 120 компьютеров на WinXP. Либо как можно более дешевый, либо бесплатный, что наиболее желательно. ...

6
102 / 75 / 38
Регистрация: 08.11.2017
Сообщений: 272
25.01.2019, 11:28
А что здесь проверять и что смотреть?

Не по теме:

Каждый раз читаю ваши темы и сообщения с интересом, в темах про джанго вы всем советуете odoo , потом спрашиваете как питон с вебом работает, вы говорите что все настройки сервера слетают при перезагрузке и потом опять говорите что odoo это супер. Далее вы говорите что используете в своих проектах django rest + vue , после чего спрашиваете как (элементарно) достать текст из html документа и теперь вот эта странная тема.

1
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
25.01.2019, 12:06  [ТС]
kratorr, спасибо за отзыв

Не по теме:

я специализируюсь на придумывании идей, привлечение клиентов, настройка программ (CRM и т.п.), работаю в команде, где периодически занимаемся автоматизацией предприятий, организацией бизнес-процессов и т.п.

Естественно, кто-то занимается vue, кто-то собственными разработками. Я вот, параллельно, учу python3, django

чтобы в свои годы быть полезным и стараюсь не отставать =)

отсюда и разношерстность постов

0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
25.01.2019, 15:24
Цитата Сообщение от IRIP Посмотреть сообщение
Прошу оценить,
1) Не нужно писать пустых (без указания перехватываемой ошибки) except
2) Не нужно вообще писать такую кучу try except.
Все ваши операции однотипны - для этого есть цикл.
3) Паттерны\селекторы не нужно хардкодить по месту использования. Для этого есть конфиги.
4) Вместо try except достаточно проверок, что элемент найден.

Если бы я писал парсеры в таком же стиле - мой код (из-за огромного числа селекторов) очень скоро стал бы трудночитаемым даже для меня.
Поэтому я пишу как-то так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class PatternConfig():     
    
    XPATHS = [
        ('oblikovuetsya',     '(//div[contains(.,"Обліковується у:")]/following-sibling::*)[1]/p'),
        ('name',              '//p[@class="info-about__name"]'),
        ('email',             '//div[contains(.,"E-mail:")]/following-sibling::*[1]/a'),
        ('phone',             '//div[contains(.,"Мобільний:")]/following-sibling::*[1]/a'),
        ('stationary_phone',  '//div[contains(.,"Стаціонарний:")]/following-sibling::*[1]/a'),                     
        ('address',           '(//div[contains(.,"Адреса:")]/following-sibling::*)[1]'),    
        ('certificate',       '(//p[contains(.,"№ Свідоцтва")]/following-sibling::*)[1]'),
        ('date_issue',        '(//p[contains(.,"Дата видачі свідоцтва:")]/following-sibling::*)[1]'),
        ('org',               '(//p[contains(.,"Орган, що видав свідоцтво:")]/following-sibling::*)[1]'),
        ('solution_number',   '(//p[contains(.,"Номер рішення:")]/following-sibling::*)[1]'),
        ('decision_date',     '(//p[contains(.,"Дата прийняття рішення:")]/following-sibling::*)[1]'),
        ('experience_lawyer', '(//p[contains(.,"Загальний стаж адвоката:")]/following-sibling::*)[1]'),
        ('form_activity',     '(//div[contains(.,"Форми адвокатської діяльності")]/following-sibling::div)[1]/descendant::div[2]'),
        ('assistants',        '(//div[contains(.,"Інформація про помічників")]/following-sibling::div)[1]/div')
    ]
 
...
root = lxml.html.fromstring(html)   
for typ,xpath in PATTERNS['XPATHS']:
    profile = root.xpath(xpath)
    ... дальнейшие операции по извлечению данных
1
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
25.01.2019, 19:59  [ТС]
Garry Galler, одна из задач, среди прочего
обработать проект, на котором у каждой позиции
возможно до 50 параметров! Это просто ужас =)

при чем около 5 000 позиций возможно дублируются и / или
параметры могут быть разными, а Названия одинаковыми


Ваш пример мне очень понравился, спасибо
правда пока не очень ясно, что и куда писать =)


Да! Вот еще одно - как записать в csv строку с данными dict

try:
with open(path, 'a', newline='') as csv_file:
w = csv.writer(csv_file, delimiter=',')
w.writerow(data)
except:
print('Ошибка записи статьи!')


записывает типа:

Кликните здесь для просмотра всего текста

t
i
t
l
e
i
m
a
g
e
t
e
x
t
t
i
t
l
e
i
m
a
g
e
t
e
x
t
t
i
t
l
e
i
m
a
g
e
t
e
x
t
t,i,t,l,e
i,m,a,g,e
t,e,x,t
title,image,text
title,image,text
0
151 / 86 / 35
Регистрация: 05.08.2017
Сообщений: 257
26.01.2019, 09:10
Цитата Сообщение от IRIP Посмотреть сообщение
при чем около 5 000 позиций возможно дублируются и / или
параметры могут быть разными, а Названия одинаковыми
Я думаю что тут обычным requests не обойтись, парсить 5к страниц синхронными запросами такое себе занятие
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
26.01.2019, 11:08  [ТС]
Resistanse, да, конечно, асинхронность запросов по списку заранее сгенерированных урлов
планирование закачки фотофайлов и т.п. =)

как вариант, вообще, стягивать все через wget =)


Тут важно понимать КАК КЛАССИФИЦИРОВАТЬ
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.01.2019, 11:08
Помогаю со студенческими работами здесь

Получить список учебных заведений в стране
Подскажите, пожалуйста, как или где можно получить списки учебных заведений определенной страны, для того чтобы потом их загрузить в...

В городе имеется n высших учебных заведений
В городе имеется n высших учебных заведений, которые производят закупку компьютерной техники. Есть шесть компьютерных фирм: A,B,C,D,E,F....

Известны данные о количестве учащихся в каждом из 15 учебных заведений
Задание на записи: Известны данные о количестве учащихся в каждом из 15 учебных заведений и о типе этого заведения (школа, техникум или...

Получить список учебных заведений (с указанием названия) расположенных в Харькове
'Получить список учебных заведений (с указанием названия) расположенных в Харькове и имеющих кол-во студентов дневной формы более 2000...

Нужны задачки (из учебных заведений) для тренировки и повышения навыка
Всем здравствуйте. Интересно было бы узнать, что и как сейчас задают и проверяют в универах. Прошу дайте интересные задания, дабы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru