Комментарии 31
следующая статья будет про "что такое скрэпинг"))
Пока писалась статья, уже классы на work.ua все поменяли :)
У меня парсер на work.ua с ноября 2019 работает. Сейчас проверил, все работает. Зачем пугаете? :)
Открыл ссылку из статьи https://www.work.ua/ru/jobs-odesa/?page=2 и не нашёл там класса заголовка h2 с классом add-bottom-sm.
Статья крайне поверхностная и рассчитана, по всей видимости, для совсем начинающих. Практически никакие особенности парсинга в ней не раскрыты. Возможно, следовало написать, как получить список тех страниц, которые надо парсить, как можно обходить различные каптчи, как авторизовываться на сайте, чтобы парсить личный кабинет и т.п. Это ведь самое интересное в этом процессе.
Кстати, в реальных условиях парсить лучше асинхронно (но ограничив количество одновременных запросов), иначе на сайтах с большим количеством страниц будете ждать завершения обхода очень долго.
Статус 200 состояния HTTP — означает, что мы получили положительный ответ от сервера
Увы, не всегда так. Некоторые сайты и на несуществующую страницу отдают код 200 и пишут "Страница не найдена".
P.s. зачем тут Pandas я вообще не понял, если честно
зачем тут Pandas я вообще не понял, если честно
Видимо, чтобы записать CSV.........
А в условиях, что сейчас все больше сайтов подгружают контент через AJAX оно вообще работать не будет.
Нормальная статья. Названы библиотеки, приведен пример. Я ожидал больше текста, но как быстрый туториал вполне сойдет.
Панды нужны для того, чтобы датафрейм сделать.
Однако таким способом большие сайты (да и не очень большие) вы будете парсить очень долго, потому что библиотека requests не подходит для асинхронных запросов - и все страницы будут скачиваться строго последовательно. То есть этот пример в статье вообще не годится для использования в большинстве случаев.
Спасибо, буду знать. Я года три назад проходил курс по скрапингу и парсингу от университета Мичигана, там именно requests использовали. Я потом написал своего паука, но сильно разгуляться не смог, меня быстро забанили в гугле за частые запросы, так что, опытанакопить не получилось.
А какие библиотеки вы бы посоветовали?
Ну, во-первых, есть библиотека (можно даже сказать фреймворк) для парсинга, явно достойный внимания - это Scrapy. Во-вторых, если уж хочется руками писать побольше, то есть aiohttp или httpx. С помощью этих библиотек можно делать асинхронные запросы к сайту (т.е. делать запросы к следующим страницам, не дожидаясь, пока загрузятся предыдущие, грубо говоря). Единственное, бездумно лупить кучами асинхронных запросов тоже не стоит - надо ограничивать RPS, конечно, с помощью того же семафора из Asyncio. Соответственно, чтобы не банили, так же нужно менять UserAgent (например, с помощью fake-useragent), а также использовать прокси. Ну а для разбора html библиотека beautifulsoup4, упомянутая автором статьи, годится.
проходил курс по скрапингу
меня быстро забанили в гугле за частые запросы
Логично, что курс не очень - не учитывает некоторые тонкости.
httpx для получения контента. Он гораздо проще чем aiohttp, неплохо масштабируется и поддерживает работу с прокси.
lxml для парсинга. Изучение XMLPath/JSONPath сильно упрощает жизнь с разнородными источниками сериализованных данных независимо от языка программирования. Не стоит писать код привязаный к beautifulsoup в случаях, когда можно ограничится одним запросом.
Наверняка пригодится fake_useragent
и умение обращатся с каким-нибудь http/socks-прокси. Для сайтов с динамическим содержимым нужно ещё уметь работать с headless версией браузера.
Headless это селениум? Полезная штука.
С XML я работал, это знакомая тема.
Что такое "неплохо масштабируется" в контексте httpx?
"неплохо масштабируется"
Не очень корректно подобрал словосочетание – он хорошо расширяется.
В случае с httpx можно описать клиент (сессию) и присвоить ему общие для запросов параметры, пул коннектов, прокси, заголовки и таймауты. Все за исключением пула можно переопределить при выполнении запроса. В aiohttp для изменения таймаутов нужно создавать ещё один экземпляр ClientSession и передавать в него все куки…
здравствуйте. Я новичок, и хочу попрактиковаться в парсинге на python, однако, как я понял эта статья не самая качественная. Вы знаете какой-нибудь другой урок (или серию уроков), который если сильно постараться сможет понять новичок (или нагуглить некоторые моменты), и в котором расскрыты все эти тонкости? Заранее спасибо :)
Ну прямо пошаговых инструкций я не видел. Мне кажется, самый годный способ научиться - начать парсить сайты. Начать с каких-то простых, затем начать парсить ту информацию, которая защищена аутентификацией, допустим, потом - сайты с CAPTCHA. Потом освоить использование прокси, Scrapy, asyncio, aiohttp, Selenium и т.п. Соответственно это всё должно сопровождаться активным гуглежом.
Как обойти последнюю версию CloudFlare? Не даёт себя парсить в упор.
cloudscraper. Когда я его использовал с месяц-два назад, он в 4/5 случаев выдавал страницу вместо заглушки. С учетом того, что работает аналогично requests, и заменять ничего не нужно было, меня такой результат устроил.
Не спрашивать больше 2 конкурентных запросов в секунду, для большего количества – использовать прокси.
Добавлять referrer с ссылкой на корневую страницу домена, а так же accept-language.
Использовать актуальный и популярный user-agent
В 2021 думаю имеет смысл в начале любой подобной статьи оставлять рекомендации поискать в начале API ресурса, который планируется парсить и как можно это сделать, если на апи нет открытой документации. Во многих случаях это оказывается удобнее и экономичнее чем парсить html.
Так и не увидел ответ на "почему стоит научиться".
Жаль, не получилось. Дошла до самого последнего этапа но заветного "После запуска появится файл test.csv — с результатами поиска"- нет.
На . "df = pd.DataFrame(data=parse()) df.to_csv(FILE_NAME) " выдает ошибку "ValueError: arrays must all be same length ".
И что интересно-на 1 этапе код выдает одинаковые результаты и с новыми и со старыми классами с work.ua
Попробуйте вот так, если ещё актуально
import csv
import requests
from bs4 import BeautifulSoup as bs
URL_TEMPLATE = "https://www.work.ua/ru/jobs-odesa/?page=2"
FILE_NAME = "test.csv"
def parse(url = URL_TEMPLATE):
result_list = {'href': [], 'title': [], 'about': []}
r = requests.get(url)
soup = bs(r.text, "html.parser")
vacancies_names = soup.find_all('h2', class_='add-bottom-sm')
vacancies_info = soup.find_all('p', class_='overflow')
for name in vacancies_names:
result_list['href'].append('https://www.work.ua'+name.a['href'])
result_list['title'].append(name.a['title'])
for info in vacancies_info:
result_list['about'].append(info.text)
return result_list
results = parse()
with open(FILE_NAME, 'w') as f:
w = csv.DictWriter(f, results.keys())
w.writeheader()
w.writerow(results)
Почему стоит научиться «парсить» сайты, или как написать свой первый парсер на Python