Найти - Пользователи
Полная версия: Исходник парсера вакансий с praca.by в csv-файл . Excel коряво открывает csv. В блокноте проблем не вижу. Решил сам.
Начало » Python для новичков » Исходник парсера вакансий с praca.by в csv-файл . Excel коряво открывает csv. В блокноте проблем не вижу. Решил сам.
1
123ksn
Весь исходник. Это первая моя программа на питоне. Что бы воспользоваться, сделайте на сайте выборку вакансий по 2м критериям: 1.для Минска, 2. за последние сутки. Выделив адресную строку, скопируйте её в буфер (CTRL+C). После этого запустите этот скрипт и когда он попросит, введите цифру один. Так я сделал интерактивный ввод URL. Замечания писать не надо, я и сам знаю, что много огрехов. А вот за улучшающий код буду благодарен.
Да, сейчас стоит ограничение на две страницы. Поправьте здесь # for i in range(1,LastPage):
Сам спросил, сам и отвечу. Каждая строка csv-файла — это одна строка таблицы Т.е. у меня между данными, разделенными “;” внутри поля (данных) есть символ новой строки, соответственно после него данные помещаются в первый столбец и вся таблица рассинхронизируется. Еще рекомендую к прочтению статью “Редактируем CSV-файлы, чтобы не сломать данные”. Узнал для себя много нового.
Парсинг контактных данных(телефонов) пока не реализован, т.к. они формируются Ява скриптом, т.е. в готовом виде в карточке вакансии нет.
Долго матерился пока наконец-то не узнал, что pip install для Установки библиотек запускается не из питона, а из CMD.exe.
Исправил формирование полей CSV-файла. Теперь открывается в Экселе нормально (через данные-импорт). Но я теперь открываю в другой программе CSVed.exe.
P.S. Профи прошу не смотреть исходник, т.к. вас может стошнить.

 # форматировать код Ctrl + Alt + L
# установить символ комментария Ctrl + /
# Alt+Enter, чтобы просмотреть список возможных исправлений
# сохраняйте HTML-файл локально, чтобы протестировать его несколько раз
# иначе сайт может заблокировать
# Прежде чем парсить данные "супом", нужно проверять, доступны ли они
# при отключенном JavaScript. Когда недоступны, открываем браузером
# Выход - использовать Selenium webdriver.
# https://parsemachine.com/articles/urok-1-pishem-parser-kataloga-tovarov-na-python/
# https://vc.ru/newtechaudit/109368-web-parsing-osnovy-na-python
# https://pythonru.com/biblioteki/parsing-na-python-s-beautiful-soup
# https://istories.media/workshops/2021/09/10/parsing-s-pomoshchyu-python-urok-1/
# https://evilinside.ru/parsing-sajtov-na-python-podrobnyj-videokurs-i-programmnyj-kod/#
# Тэг, в общем случае, - это многострочная строка, коллекция строк
# начинающаяся с символа <. Внутри тэга может быть много дополнительной информации
# подключаю необходимые библиотеки
import requests  # что бы Получить HTML-код по URL-адреса
from bs4 import BeautifulSoup, __version__  # парсер HTML
from fake_useragent import UserAgent  # генерация правдоподобных юзер-агентов
import pyperclip # для работы с буфером обмена
import time # для правдоподобных задержек
import re # регулярка
import csv # для работы с csv файлом
# функция чтения HTML-файла (.txt????)
def write_to_fileTXT(HTML_page):
    # запись  в файл.
    try:
        with open("HTML_page.txt", "a") as fopen:  # Open the txt file.
            txt_open = writer(fopen)
            txt_open.writerow(HTML_page)
    except:
        return False
# функция записи списка в текстовый csv-файл (открывается экселем)
def write_to_csv(list_date):
    '''
    запись спарсенных данных в CSV файл.
    В Windows 'b', добавленный к режиму, открывает файл в двоичном
    режиме, поэтому существуют также такие режимы, как
    'rb', 'wb' и 'r + b'.
    Python в Windows проводит различие между текстовыми и двоичными
    файлами; символы конца строки в текстовых файлах автоматически
    слегка изменяются при чтении или записи данных. Это скрытое
    изменение данных файла подходит для текстовых файлов ASCII,
    но оно приведет к повреждению двоичных данных, подобных тем,
    что содержатся в файлах JPEG или EXE. Будьте очень осторожны,
    используя двоичный режим при чтении и записи таких файлов.
    В Unix не повредит добавить 'b' к режиму, чтобы вы могли
    использовать его независимо от платформы для всех двоичных файлов.
    '''
    try:
        # newline = '' что бы не было пустыхустых строк через одну запись
        with open("allvacancy.csv", "a") as fopen:  # Open the csv file.
            csv_writer = csv.writer(fopen, delimiter = ";", lineterminator="\r")
            # delimiter- для разделения полей.По умолчанию это','
            # lineterminator = "\r"-Это разделитель между строками таблицы, по умолчанию он"\r\n"
            csv_writer.writerow(list_date)# запись по одной строке
            # csv_writer.writerows(list_date)
    except:
        return False
# запрашиваем данные с сервера (сайта)
# Внимание! проверки нужно делать на каждом запросе/поиске!!!
# Если сервер ответил <Response [200]>, тогда продолжаем
def response_UserAgent(URLx):
    """
         получаю URL (ссылку на нужный объект сайта)
         НАДО!!!прикидываюсь браузером (человеком за ПК)
         получаю ответ сервера (сайта)
         возвращаю ответ, который надо потом проверить
     """
    # запрашиваем данные по ссылке
    response = requests.get(URLx, headers={'User-Agent': UserAgent().chrome})
    if response.status_code == 200:
        return response
        # else requests.ConnectionError:
    else:
        print("50_def check_response: response(otvet) <> 200. Quit")
        return None
        # quit()
# проверить список на непустоту
def check_list(list):
    if list == []:
        print('72_def check_list: list is [] empty. quit()')
        quit()
    else:
        print('75_def check_list: list is not empty')
# перевожу в суп содержимое переданной страницы
def getsoup(ResponseX):
    """
        возвращаю soup
    """
    # получаем содержимое страницы и переводим в суп
    response_html = ResponseX.content
    # response_text = ResponseX.text
    # есть несколько парсеров: html.parser,lxml
    # soup = BeautifulSoup(response_html, 'html.parser')
    soup = BeautifulSoup(response_html, 'lxml')
    return soup
# выберем режим ввода информации в программу:
# 1-URL из буфера обмена
# 2-HTML-файл с диска
def InputURL():
    Mode = int(input("select Mode. 1-input with clipboard, 2 -input with file:"))
    while True:
        try:
            if Mode == 1:
                inp_clipboard = pyperclip.paste()# вставляем URL из буфера обмена
                # pyperclip.copy(s)
                print('104_return inp_clipboard='+inp_clipboard)
                return inp_clipboard
            elif Mode == 2:
				# with open ('ффф.html','r',encoding='utf-8') as f:
                print('107_open (ффф.html1)')
                return ''
        except Exception:
            print("90_Clipboard is empty(bufer obmena pustoy).")
            return ''
# ============ Начало программы ============
# изменилась структура. 28.11.2022 Сейчас сохранён url 2-й страницы, что бы видеть всю структуру запроса
url = 'https://praca.by/search/vacancies/?page=2&search[cities-radius][%D0%9C%D0%B8%D0%BD%D1%81%D0%BA]=1&search[query-text-params][headline]=0&upped_period=1'
# 13.11.2022
# url = 'https://praca.by/search/vacancies/?upped_period=1&search[city][%D0%9C%D0%B8%D0%BD%D1%81%D0%BA]=1'
baseURL = 'https://praca.by/search/vacancies/?'
pageURL = 'page='
EndURL = '&search[cities-radius][%D0%9C%D0%B8%D0%BD%D1%81%D0%BA]=1&search[query-text-params][headline]=0&upped_period=1'
__version__
# заремировал, что бы работать с файлом с диска, а не сайтом
# Запрос URL из буфера обмена
url1= InputURL()
if url1 == '':
    url1 = InputURL()
    #EndIf
# проверяю, будет ли отработан запрос по этому урлу
R1=response_UserAgent(url1)# ответ на запрос
# Метод get библиотеки requests возвращает объект Response,
# а не какой-то там html
# s_Text=requests.get(url1).text
# print(s_Text)
if R1.status_code == 200:
    print("115_response(otvet)= Ok-> soup")
else:
    print("117_ response(otvet) <> 200. Quit(vihod)")
    quit()
# ResponseText показал, что есть 2432 строки, но раскрывать не стал
# загружаю исходный текст полученной страницы в парсер BeautifulSoup 'lxml'
#  и создаю Первый его объект soup
soup_root=getsoup(R1)
# ===== для тестов открываю заранее сохраненный файл====
# with open ('ффф.html','r',encoding='utf-8') as f:
# with open('ффф.html','r',encoding='utf-8') as fp:
#     soup_root = BeautifulSoup(fp, 'lxml')
# soup это ПОЧТИ тот же response.content
# У soup  совсем другие методы работы с HTML кодом
# можно бродить по вершинам (Чего?), указывая путь из тегов
# soup.Tag1.Tag2.Tag3     (soup.html.head.title)
# можно получить значение из места, на которе указали
# soup.Tag1.Tag2.Tag3.text
# Создал Переменные для названий тэгов и классов, что бы лучше
# понимать работу методов soup, который использует
# НЕ символы/строки, а ТЭГИ и дочерние атрибуты (КЛАССЫ CSS)
NameTagDiv = 'div'
NameTagLi = 'li'
NameTagUl = 'ul'
ClassNamePageIt = 'pagination__item'
ClassNamePageLst = 'pagination__list'
# в HTML (soup)нахожу блок/таблицу/элемент 'div', в котором
# находятся строкИ кода по выбору найденных страниц (кнопки)
# buttons = soup.find('ul', class_ = 'pagination__list')
# print(buttons)
# но можно и по другому: найти ВСЕ строки с тегом 'li' и классом = 'pagination__item'
# objlistPages = soup.find_all('li', class_ = 'pagination__item')
# возврашается Тип ОБЪЕКТ (список???).
# "правильный" синтаксис для понимания soup.find:
objlistPagesSoup = soup_root.find(NameTagUl, attrs={"class": ClassNamePageLst})
# Если ругается AttributeError: 'NoneType' object has no attribute...
# то можно посмотреть командой print(type(objlistPages))
# Проверка, что ответ/список не пустой
check_list(objlistPagesSoup)
# что отобразит команда objlistPagesSoup.text не обёрнутая в print()?
# '\n\n←123456789...→' не очень понятно
# а вот так понятней: print(objlistPagesSoup.text)
# ←123456789...→ так выглядит в браузере список страниц
# Получить последний элемент списка. индекс=-1 [-1],
# т.е. первый сзади.
# Последняя страница (LastPage) в выданном результате
LastPage1 = objlistPagesSoup.find_all('li', class_='pagination__item')[-1]
# проверим список на непустоту
check_list(LastPage1)
# <li class="pagination__item"><a href="?page=45&amp;upped_period=1&amp;search[city][%D0%9C%D0%B8%D0%BD%D1%81%D0%BA]=1"><i class="mdi mdi-fast-forward"></i></a></li>
# Теперь надо узнать какая это страница (?page=45) из содержимого
Page = LastPage1.find('a')
Page
# [<a href="?page=45&amp;upped_period=1&amp;search[city][%D0%9C%D0%B8%D0%BD%D1%81%D0%BA]=1"><i class="mdi mdi-fast-forward"></i></a>]
# Теперь вычленю цифру ?page=45.
# Тип soup конвертирую в тип строка и ищу по строке = и разделяю по ней
PageStr = str(Page.find).split('=')
PageStr3 = PageStr[2]
PageStr3
# '49&amp;search[cities-radius][%D0%9C%D0%B8%D0%BD%D1%81%D0%BA]'
Page4 = PageStr3.split('&')
Page4
# ['49', 'amp;search[cities-radius][%D0%9C%D0%B8%D0%BD%D1%81%D0%BA]']
Page5 = Page4[0]
Page5
# '45'
LastPage = int(Page5)
print('LastPage=',LastPage)
NameTagA = 'a'
ClassNameVac = 'vac-small__title-link'
SleepPages=2 #задержка чтения страниц
SleepKartochek=1 #задержка чтения карточки вакансии
write_to_csv(["Вакансия", "Зарплата", "Наниматель", "Город", "МестоРаботы", "РежимРаботы", "ПолнЧастЗанятость", "ОпытРаботы", "Образование", "ОписаниеРаботы", "МестоРаботы", "URL_вакансии"])
# for i in range(1,LastPage): # боевой код
for i in range(1, 2):  # для отладки. только 1 страница
    time.sleep(SleepPages) #задержка чтения страниц
    # собираю полный URL (запрос) с указанием нужной страницы
    url_gen = baseURL + pageURL + str(i) + EndURL
    # запрос к сайту за страницами с вакансиями
    Resp_v = response_UserAgent(url_gen)  # ответ на запрос
    print('*************************************204 i=',i)
    # проверка ответа
    if Resp_v.status_code == 200:
        print("207_response(otvet)= Ok-> soup")
    else:
        print("209_response(otvet) <> 200. Quit(vihod)")
        quit()
    soup_v = getsoup(Resp_v)
    # soup2 = BeautifulSoup(resp.content, 'lxml')
    # все вакансии(ссылки) выбранной(i) страницы
    vacansii_on_page = soup_v.find_all(NameTagA, attrs={"class": ClassNameVac})
    # vacansii
    check_list(vacansii_on_page)
    # print(vacansii)
        # одна из строк <a class="vac-small__title-link" href="https://praca.by/vacancy/497531/" target="_blank">Повар</a>
        # 1 надо вычленить url, что бы пройти по нему и получить доп информацию
        # 2 отсюда могу взять название вакансии
        # переменные для парсинга карточки вакансии
    NameTagh1 = 'h1'
    ClassNameKart = 'no-margin-top no-margin-bottom'
    NameTagDiv = 'div'
    ClassNameSalary = 'vacancy__salary'
    n = 0
    for k in vacansii_on_page:
        time.sleep(SleepKartochek)  # задержка чтения карточек
        # значение атрибута href, т.е ссылка на карточку вакансии
        url_Kartochki = k.attrs["href"]
        name_vac = k.string
        print('262 ---------------Kartochka-----------')
        print('263_name_vac', name_vac)
        # запрашиваю карточку вакансии с сайта
        # resp = requests.get(url_Kartochki)
        Resp_k = response_UserAgent(url_Kartochki)
        # проверка ответа
        if Resp_k.status_code == 200:
            print("256_response(otvet)= Ok-> soup")
        else:
            print("258_response(otvet) <> 200. Quit(vihod)")
            quit()
        soup_k = getsoup(Resp_k)
        Kartochka = soup_k.find(NameTagh1, attrs={"class": ClassNameKart}).text.strip()
        print(Kartochka)
        # Зарплата +дополнительные условия
        if (soup_k.find(NameTagDiv, attrs={"class": "vacancy__salary"}) != None):
            salary = soup_k.find(NameTagDiv, attrs={"class": "vacancy__salary"}).text.strip()
            # print('275', salary)
        else:
            salary = ''
            print('302********************* Зарплата не указана')
        # Обязанности
        if (soup_k.find(NameTagDiv, attrs={"class": "description wysiwyg-st"}) != None):
            description = soup_k.find(NameTagDiv, attrs={"class": "description wysiwyg-st"}).text.strip()
            description = description.replace("\r", "")
            description = description.replace("\n", "")
            # Заменить перевод строки и лишние пробелы
            # description = Repl(description)
            # print('275', description)
        else:
            description = ''
            print('311********************* Обязанности не указаны')
        # Адрес работы
        if (soup_k.find(NameTagDiv, attrs={"class": "job-address"}) != None):
            job_address = soup_k.find(NameTagDiv, attrs={"class": "job-address"}).text.strip()
            # print('275', job_address)
        else:
            job_address = ''
            print('319********************* Адрес работы не указан')
        firma = soup_k.find('div', attrs={"class": "vacancy__org-name"}).text.strip()
        # print(firma)
        # город <div class="vacancy__city">Минск</div>
        city = soup_k.find('div', attrs={"class": "vacancy__city"}).text.strip()
        # print('288', city)
        all_harakt = soup_k.find_all('div', attrs={"class": "vacancy__item"}) #.text.strip()
        aaa=[]
        for elem in all_harakt:
            aa = [elem.text.strip().split('\t')[-1]]
            aaa.append(aa)
            # print(*aa, sep='\n')#* Распаковывает итерируемый объект в аргументы функции
        region1=aaa[0]# На территории работодателя
        # преобразую элемент списка в строку и применяю к ней strip()
        # иначе получаю в виде ['Минск']
        region=" ".join(map(str,region1)).strip()
        time_work1=aaa[1]# Фиксированный / полный рабочий день
        time_work = " ".join(map(str, time_work1)).strip()
        full_partial_load1=aaa[2]# Полная
        full_partial_load = " ".join(map(str, full_partial_load1)).strip()
        experience1=aaa[3]# Опыт работы от 1 года
        experience = " ".join(map(str, experience1)).strip()
        education1=aaa[4]# Высшее образование
        education = " ".join(map(str, education1)).strip()
        # print(*time_work, sep='\n')
        n = n + 1
        print('309 page=', i, 'nom kartochki=', n, 'SleepKartochek=',SleepKartochek,'SleepPages=',SleepPages)
        print('==========================================================')
        # Описание работы,description
        # Место работы,job_address
        # URL_вакансии
        write_to_csv([Kartochka, salary, firma, city, region, time_work, full_partial_load, experience, education, description, job_address, url_Kartochki])
py.user.next
123ksn
Исходник парсера вакансий с praca.by в csv-файл . Excel коряво открывает csv. В блокноте проблем не вижу. Решил сам.
Это что такое?
картинка
  
>>> 'бЮЙЮМЯХЪ'.encode('koi8-r').decode('cp1251')
'Вакансия'
>>>

Не, даже после перекодирования он всё равно неправильно собран.

Это вот разные значения из столбца B
трудовой отпуск 30 календарных дней

Минск

2 мин. от станции метро пл. Победы.

оговаривается при собеседовании.
То есть видно, что данные не из тех столбцов попали не в те столбцы.

Ну вот, можешь теперь смело его выкидывать, потому что он непригоден для дальнейшей точной работы. Всё идёт вперемешку, с этим работать дальше нельзя. Это вот результат, когда программа неправильно написана. То есть она неправильно написана, и поэтому она неправильно работает, а когда она неправильно работает, она неправильно данные собирает. Теперь тебе второй раз надо будет всю программу писать. Один раз ты её написал неправильно.

Так… Где-то я писал это… Сейчас, подожди, найду…

А, вот оно!
Здесь писал вход в советы.
Здесь писал сами советы.

Вот этот топик на три страницы прочитай. Там я много философии всякой написал о том, как надо учиться программированию. Вот один раз время потратил на всё описание, вот теперь могу переиспользовать этот материал, который написал когда-то.

Вот ты выложил программу сейчас свою сюда. Ты молодец! Хоть она и дерьмовая, но ты правильно сделал, что: 1) ты её написал; 2) ты её выложил для получения критики и обратной связи; 3) ты её будешь корректировать и пробовать написать снова.
Это всё важно для обучения программированию. Без этого нельзя обойтись. Когда-то давно я тоже писал такие программы и у меня так же ничего не получалось с ними, хотя кода было много и мне было жалко, что я столько времени потратил, а мне говорят, что у меня код говно, и я всех вокруг убеждал из-за этого, что у меня есть способности и так далее. Короче, эти времена прошли примерно лет через десять.

Когда закончишь трахаться вот с этой программой (ну там много ты ещё будешь с ней возиться, чтобы написать её и пользоваться ей), тогда начинай проходить учёбу. Потому что чтобы написать программу, надо сначала научиться их писать. И это реально.

Так-то ты говоришь, что не собираешься учиться, но деятельность вся твоя идёт так, что ты собираешься учиться. Вот эти все лазания по форумам об этом всём и говорят. Если тебе это не надоело делать, то ты учишься фактически уже. Если человеку это всё не надо, то это выглядит вообще по-другому. Там человек не то что на форумы разные не пойдёт за информацией, он вообще даже с одной программой собственной и трёх часов не сможет просидеть. А для программирования нужно ночами сидеть с программами.
123ksn
py.user.next
Это что такое?
>>> ‘бЮЙЮМЯХЪ’.encode('koi8-r').decode('cp1251')
'Вакансия'
>>>
Не, даже после перекодирования он всё равно неправильно собран.
Это вот разные значения из столбца B

Здравствуйте уважаемый py.user.next. Я не знаю, как Вам удалось получить такой результат. Прокомментировать не могу. Да, по некоторым описаниям есть расползание по нескольким столбцам, но такого, как на Вашей картинке и тексте у меня никогда не было. Если хотите, могу прикрепить в качестве доказательства спарсенную в обед информацию - CSV-файл 455кБ. Но я думаю это лишнее.
Я же предупреждал:
123ksn
P.S. Профи прошу не смотреть исходник, т.к. вас может стошнить.
На сегодняшний момент меня такой вариант устраивает. Так же я с Вами нигде не спорил и не говорил, что Вы не правы в своих нравоучениях. Правы, правы, правы! Да, если будет свободное время, я немного “допилю” явные косяки, а может и нет, если быстро найду новую работу.
py.user.next
Так-то ты говоришь, что не собираешься учиться, но деятельность вся твоя идёт так, что ты собираешься учиться. Вот эти все лазания по форумам об этом всём и говорят. Если тебе это не надоело делать, то ты учишься фактически уже.
Я никогда не говорил, что я не собираюсь учиться. Я говорил, что не собираюсь учиться питону на профессиональном уровне (для трудоустройства). Мне скоро 60 и я всю жизнь учусь и делаю это для удовольствия. Мне нравится быть инженером широкого профиля, а не узким профильником.
Спасибо за критику. Хотите - поправьте код, а пока он меня устраивает, не буду. Лучше выучу соло металлики на гитаре. Удачи.
ZerG
А зачем вы сюда выложили? Это не законченное творение да и к тому же кривое.
Разве я могу взяв ваш код ипортировать его как модуль и использовать в своих целях?
Нет!
Раз оно уже получило данные с сайта то наверное и представить их нужно как то либо в екселе либо в пдфе либо на почту отправить в читабельном юзервиде

Копировать и вставлять урл? МОветон - зачем тогда писать код - он должен сам брать и делать что нужно а не кликать
А если нужна критика так есть такой сайт - говнокод называеться
Он как раз для этого
py.user.next
123ksn
Я не знаю, как Вам удалось получить такой результат.
Это из твоего файла. Он неправильно закодирован. Кодировать надо всё в кодировку utf-8. Чтобы в питоне кодировать в utf-8, надо файл открывать, указывая ему кодировку через параметр encoding. Соответственно, если ты не кодируешь в utf-8, то при появлении какого-нибудь символа в данных, которые кодировка koi8-r не может кодировать, возникнет ошибка кодирования и скрипт упадёт. А кодировка utf-8 кодирует все символы, которые есть в Unicode.

123ksn
Я говорил, что не собираюсь учиться питону на профессиональном уровне
А ты думаешь, что я тебе про работу питонщиком говорю? Я тебе говорю о том, что, чтобы это всё получалось делать, нужно это всё знать. А чтобы это всё знать, надо этому всему учиться. Не будешь учиться - не будешь знать. Не будешь знать - не будет получаться. Работы тут вообще даже близко никакой нет. Речь идёт о навыках элементарных.

123ksn
Мне скоро 60 и я всю жизнь учусь и делаю это для удовольствия. Мне нравится быть инженером широкого профиля, а не узким профильником.
Ну, то есть ты хочешь сказать, что до шестидесяти дожил и совершенно ничего не умеешь. Там по чуть-чуть, тут по чуть-чуть, так годы и прошли. Ну, теперь поздно что-то менять. Старики у нас тут были, ну, и чем это заканчивалось? Да ничем. Питон требует трёх лет для вхождения. Это, знаешь, дело даже не в питоне, а в том, что это первый твой язык программирования. То есть тебе вместе с питоном надо будет изучать так же впервые все элементы из теории программирования. Профессионал-то выучит язык питон быстро и будет почти сразу на нём писать всё. А вот новичок, который новичок не в питоне, а вообще в программировании, будет учить три года питон. Потому что всё время будет уходить на изучение обычных вещей вроде алгоритмов, псевдокода, сортировок, массивов, файлов, кодировок (как в твоём случае ) и так далее, - это всё то, что к питону вообще не относится. Это просто надо знать ещё до питона.

Я вот прошлому старику сказал и тебе сейчас скажу то же самое. Я думаю, у тебя времени нет на программирование. Потому что сначала нужно потратить несколько лет на обучение этому. А потом надо тратить несколько лет на то, чтобы практику набирать. С начала лет десять проходит в среднем. Три года на вход в программирование, семь лет на практику. Во время практики ты также доучиваешься, потому что после входа у тебя открывается такая “дверь” и ты резко получаешь доступ ко всем знаниям, к которым раньше у тебя доступа не было. Ну, ты оказываешься в ситуации, когда у тебя открыто много направлений, много дорог, и ты можешь пойти по любой и они все одинаково вкусные. Типа так много всего и всё такое вкусное! Вот. Вот это это происходит через три года после начала. И вот там ты начинаешь учиться уже.

Я вот сейчас хочу выучить много языков, а у меня времени на это нет. Вот где-то десять языков примерно я сейчас изучаю, не больше. И они все у меня на разном уровне изученности (какие-то очень глубоко изучены, а какие-то очень поверхностно изучены). Но благодаря этому я как раз проекты пишу когда, у меня нет дефицита в средствах. Например, расширение для бразузера я себе написал на JavaScript, приложение в смартфон я себе написал на Java, программы с графическим интерфейсом для компьютера я себе написал и на C++ с Qt4, и на Python с Qt4. А те же видео с YouTube я отыскиваю через скрипты на Python, но скриптами на Python этими в операционной системе я управляю через скрипты на Shell, а для текстового редактора я пишу функции на ELisp, а программка для опроса лампочек на модеме у меня на C (потом модем исчез со временем и программка только осталась в роли мемуара такого). А чтобы изучить это всё, знаешь, сколько прошло ночей один на один с кодом? Когда ты всю ночь сидишь и в четыре часа ночи колупаешь этот код в тишине, который по схеме Горнера вычисляет корни многочлена, потому что он у тебя просто не получается и всё. Всю ночь этой хернёй занимаешься, а потом наутро думаешь “Ну вот, не получилось нифига. Ну, будем считать, что плохой результат - это тоже результат, это опыт.”, и так себя успокаиваешь, чтобы мотивация не упала.

Ты ещё спроси, откуда я знаю всё про Unicode и про все его кодировки, про все там иероглифы и про всякую индийскую хрень! Потому что я отсидел точно так же несколько ночей чисто с Unicode'ом. Это не за секунду делается и изучается, типа чотатама почитал на википедии десять минут и типа всё знаешь, а это вот такими ночами сидишь и долбишь эту теорию всю и тексты на английском.
123ksn
py.user.next
Ну, то есть ты хочешь сказать, что до шестидесяти дожил и совершенно ничего не умеешь. Там по чуть-чуть, тут по чуть-чуть, так годы и прошли. Ну, теперь поздно что-то менять. Старики у нас тут были, ну, и чем это заканчивалось? Да ничем. Питон требует трёх лет для вхождения.
py.user.next? Отвечу Вам мудростями. 1)Не судите по себе. Это я к тому, что я умею всё, но не на 100%. Если мне надо, я могу очень быстро нарастить свои знания почти в любой области. Вам этого не понять.
2)Пока человек жив, менять никогда не поздно.
3)Вы, сударь, опять опускаете себя ниже плинтуса, называя меня стариком. Возраст - это состояние души. Судя по Вашим назидательным постам, скорее это Вы глубокий старик. Большинству 40-летних я дам фору, конечно если только мерилом не является программирование на питоне.
4)Когда реально поумнеете, поймете смысл этой притчи:
Сидит неподвижно буддистский монах на горе и смотрит вдаль. К нему подходит другой монах и спрашивает:
-Что делаешь, брат?
-Смотрю как деревья растут.
-Всё суетишься, брат.
py.user.next
123ksn
Отвечу Вам мудростями. 1)Не судите по себе.
Вот у тебя у самого какие-то проблемы с этим. Ты приходишь на форум и начинаешь всем втирать, какой ты замечательный. Когда тебе говорят “дядь, а не пойти бы тебе к кому-нибудь там другому и в жилетку поплакать где-нибудь в другом месте? что ты нам-то втираешь про себя? ты думаешь, ты кому-то здесь упал вместе со всей своей жизнью?”, ты начинаешь обижаться, как ребёнок какой-то тупой. Ну, типа, знаешь, как когда у людей начинается старческое слабоумие, они резко становятся никому не интересны и из-за этого они начинают активно привлекать к себе внимание в стиле “ой! а я заболел! смотрите, чо у меня тут!”. Но это не помогает и в итоге мы получаем непрерывное нытьё “смотрите на меня! смотрите на меня!”. Да ты не нужен никому, всё, давай, до свидания!

123ksn
Большинству 40-летних я дам фору
А нам на это похеру. Нам всё равно на тебя. Что есть ты, что нет тебя.

123ksn
3)Вы, сударь, опять опускаете себя ниже плинтуса
У тебя какая-то совковая фигня тут ещё проистекает? Пока что ниже плинтуса тут только ты. Почему ты ниже плинтуса? Потому что ты припёрся в новое поколение и пытаешься старыми способами заявить о себе. Мало того что ты нафиг не упал со своим нытьём про свою жизнь, так ты ещё и забиваешь общую тему разговорами о себе, когда ты ничего из себя не представляешь. Ты всю жизнь прожил, ты ничего из себя не представляешь и ты никому ничего не можешь дать, потому что ты абсолютно бесполезен. Ты просто тюлень. Лежишь и ничего не делаешь всю жизнь. Старость подошла, тебя вообще все бросили - и ты припёрся сюда.

Тут не работают совковые методы, каким ты там был пионером, комсомольцем и прочая чушь. Никому это не интересно, все вас считают задротами.

123ksn
Возраст - это состояние души. Судя по Вашим назидательным постам, скорее это Вы глубокий старик.
Мы - свободное поколение. И тебе этого не понять, что это вообще такое. Поэтому нам наплевать на тебя и мы тебе об этом открыто говорим. А ты же, в свою очередь, ужимками какими-то общаешься, боясь пукнуть лишний раз не в ту сторону, чтобы тебе по башке учительница линейкой не дала. Тебя вот вырастили в такой среде и ты не понимаешь нихера сейчас, в наше время.

123ksn
4)Когда реально поумнеете, поймете смысл этой притчи:
Ты просто старый дурак, попавший в новое время. Ты лучше расскажи, как ты, такой замечательный и активный, во время развала СССР такой молодой, живучий и многофункциональный мастер на все руки стоял и смотрел, как он разваливается, и ничего не делал при этом? Просрал всё?! Ну так теперь иди и ной в какую-нибудь жилетку какого-нибудь пенсионного фонда. Там тебя будут выслушивать каждый день, они как раз для того и сделаны. Там ты что-то из себя представлял, здесь ты - никто.

Отстань от нас, ты нам не нужен со своей этой фигнёй тупой.


tags: ussr
123ksn
py.user.next
123ksn
Отвечу Вам мудростями. 1)Не судите по себе.
Вот у тебя у самого какие-то проблемы с этим. Ты приходишь на форум и начинаешь всем втирать, какой ты замечательный. Когда тебе говорят “дядь, а не пойти бы тебе к кому-нибудь там другому и в жилетку поплакать где-нибудь в другом месте? что ты нам-то втираешь про себя? ты думаешь, ты кому-то здесь упал вместе со всей своей жизнью?”, ты начинаешь обижаться, как ребёнок какой-то тупой. Ну, типа, знаешь, как когда у людей начинается старческое слабоумие, они резко становятся никому не интересны и из-за этого они начинают активно привлекать к себе внимание в стиле “ой! а я заболел! смотрите, чо у меня тут!”. Но это не помогает и в итоге мы получаем непрерывное нытьё “смотрите на меня! смотрите на меня!”. Да ты не нужен никому, всё, давай, до свидания!

123ksn
Большинству 40-летних я дам фору
А нам на это похеру. Нам всё равно на тебя. Что есть ты, что нет тебя.

123ksn
3)Вы, сударь, опять опускаете себя ниже плинтуса
У тебя какая-то совковая фигня тут ещё проистекает? Пока что ниже плинтуса тут только ты. Почему ты ниже плинтуса? Потому что ты припёрся в новое поколение и пытаешься старыми способами заявить о себе. Мало того что ты нафиг не упал со своим нытьём про свою жизнь, так ты ещё и забиваешь общую тему разговорами о себе, когда ты ничего из себя не представляешь. Ты всю жизнь прожил, ты ничего из себя не представляешь и ты никому ничего не можешь дать, потому что ты абсолютно бесполезен. Ты просто тюлень. Лежишь и ничего не делаешь всю жизнь. Старость подошла, тебя вообще все бросили - и ты припёрся сюда.

Тут не работают совковые методы, каким ты там был пионером, комсомольцем и прочая чушь. Никому это не интересно, все вас считают задротами.

123ksn
Возраст - это состояние души. Судя по Вашим назидательным постам, скорее это Вы глубокий старик.
Мы - свободное поколение. И тебе этого не понять, что это вообще такое. Поэтому нам наплевать на тебя и мы тебе об этом открыто говорим. А ты же, в свою очередь, ужимками какими-то общаешься, боясь пукнуть лишний раз не в ту сторону, чтобы тебе по башке учительница линейкой не дала. Тебя вот вырастили в такой среде и ты не понимаешь нихера сейчас, в наше время.

123ksn
4)Когда реально поумнеете, поймете смысл этой притчи:
Ты просто старый дурак, попавший в новое время. Ты лучше расскажи, как ты, такой замечательный и активный, во время развала СССР такой молодой, живучий и многофункциональный мастер на все руки стоял и смотрел, как он разваливается, и ничего не делал при этом? Просрал всё?! Ну так теперь иди и ной в какую-нибудь жилетку какого-нибудь пенсионного фонда. Там тебя будут выслушивать каждый день, они как раз для того и сделаны. Там ты что-то из себя представлял, здесь ты - никто.

Отстань от нас, ты нам не нужен со своей этой фигнёй тупой.


tags: ussr


Отредактировано py.user.next (вчера 21:38:36)
Рекомендую показать свой последний пост своему отцу. Пусть он Вами гордится.
Ещё есть одна маленькая просьба. Не подчищайте эту ветку. Пройдёт совсем немного времени и Вам будет чертовски стыдно за Ваши слова.
py.user.next
123ksn
Ещё есть одна маленькая просьба. Не подчищайте эту ветку.
Мы не подчищаем ветки, потому что у нас это не принято. Враньё, воровство и подчищание веток - это ваша прерогатива! Потому что вы - ссыкливые приспособленцы.

123ksn
Пройдёт совсем немного времени и Вам будет чертовски стыдно за Ваши слова.
Ты ошибаешься в своих предсказаниях. Передавай привет Горбачёву, продавшему страну за смайлики.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB