Comments 29
А обработка ошибок где?
Если файл не открылся, например. Почему код только 200?
Как-то не очень на миддла, если честно.
Извините, если ошибся)
А обработка ошибок где?
Я не миддлОбработка ошибок то где? :) Или джунам не нужно обрабатывать?
я работаю джуниор разработчиком полгода, стек Python/Django, поначалу конечно тоже не использовал try/exception, обычно пихал везде logger.info() вместо print, чтобы в случае чего понять где ошибка, потом понял что так жить нельзя, так как моим кодом будут пользоваться люди, я то ладно в логе посмотрю, что там поломалось, а они как поймут? Начал заворачивать все в if/else, но где то на 2 месяц работы понял что это тоже не дело и начал использовать try/exception внезапно оказалось очень удобно, мой сервис не падает и мне сухо и спокойно)
Я подозреваю, что автор пишет в основном для себя или для одного клиента, какие-то разовые заказы, поэтому и не сталкивался с проблемами, когда сервисом пользуется много людей и есть интеграция со сторонними сервисами и очень важно, чтобы все действия в сервисе были максимально информативны ну и нужна какая никакая отказоустойчивость сервиса в плане возникновения ошибок или сбоя в коде.
Раньше писал для себя, учил, работал на фрилансе с какими-либо минимальными заказами и использовал правило Главное, чтобы работало. Сейчас же приходится переучиватся, вспоминать PEP8, ибо когда передаешь код получаешь тонну критику в сторону качества.
по названиям функций и методов пришел к выводу, что данный код генерирует список ссылок на посты только с первой страницы общей ленты Хабра. Это верно?
requests, чтобы парсер работал еще быстрее, то лучше использовать Session.
session = requests.Session()
r = session.get('http://some.url')
fake_useragent — полезный инструмент, но необходимо использовать только последнию версию (иначе может поломаться). И, наверное, вместо конкретного браузера лучше использовать ua.random ("# and the best one, random via real world browser usage statistic")
Откройте пожалуйста для себя итераторы, try...except, lxml, logging. Форматирование строк в стиле php, попробуйте f'...'. Определитесь какие вы хотите использовать кавычки для строк и делайте единообразно. Узнайте про локальную и глобальную области видимости. Вот после этого уже будет ближе к джуну.
Попробуйте писать в PyCharm и внимательно анализируйте все предупреждения — он будет неким судьёй вашему коду.
Хотя бы вручную тестируйре код на разные вариации. Если хабр не вернёт http200, то Вы получите ни о чем не говорящую ошибку, создадите пустой файл и после этого скрипт вылетит с исключением.
Впечатлил даже не суп в 2019 году, а это:
ua = UserAgent()
headers = {'accept': '*/*', 'user-agent': ua.firefox}
Вы прикидываетесь реальным браузером с acceptом */*. Какую глубокую цель вы преследуете этим двумя строками, пусть даже не обращая внимания на то, что requests и так выставляет Accept: */* по умолчанию?
хочется пожелать автору 2 вещи — успешного профессионального роста (без сарказма, тут я добрый) и обдумывать, несет ли хоть какую-то пользу для окружающих подобного рода «статья» (а вот тут я злой — потому что на запрос «python scraping» гугл выдает кучу материала по requests и bs)
Спасибо, за пожелания. На счет пользы статьи. Во время своих первых попыток парсинга я не понимал что я делаю, в то время я даже основы ООП не выучил. К сожалению про lxml я не знал, а Scrapy стал для меня слишком сложным, потому решил сделать парсер на bs4 + reuqests, зная, что хабр, кроме опытных программистов читают такие же джуны, как и я.
если не секрет, сколько времени и/или выполненных задач прошло от «первых попыток парсинга» до «решил сделать парсер на bs4 + requests»? просто у меня в свое время на подобное (только на java) ушло пару вечеров (1й вечер поиск популярных решений, 2й вечер — чтение доков к выбранной библиотеке)
В моей серии постов будет описан мой путь от Junior'a до Middle'a
Не совсем понятно, в какой части пути вы сейчас находитесь? Это анонс будущих статей или ретроспектива? И если первое, то на какие ориентировочно календарные сроки рассчитана серия?
От Junior'a до Middle'a: Парсер