Pull to refresh

Comments 31

следующая статья будет про "что такое скрэпинг"))

Пока писалась статья, уже классы на work.ua все поменяли :)

У меня парсер на work.ua с ноября 2019 работает. Сейчас проверил, все работает. Зачем пугаете? :)

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

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

Статус 200 состояния HTTP — означает, что мы получили положительный ответ от сервера

Увы, не всегда так. Некоторые сайты и на несуществующую страницу отдают код 200 и пишут "Страница не найдена".

P.s. зачем тут Pandas я вообще не понял, если честно

зачем тут Pandas я вообще не понял, если честно

Видимо, чтобы записать CSV.........

Тогда логичный вопрос: чем модуль csv не угодил?)

А в условиях, что сейчас все больше сайтов подгружают контент через AJAX оно вообще работать не будет.

Нормальная статья. Названы библиотеки, приведен пример. Я ожидал больше текста, но как быстрый туториал вполне сойдет.

Панды нужны для того, чтобы датафрейм сделать.

Однако таким способом большие сайты (да и не очень большие) вы будете парсить очень долго, потому что библиотека requests не подходит для асинхронных запросов - и все страницы будут скачиваться строго последовательно. То есть этот пример в статье вообще не годится для использования в большинстве случаев.

Спасибо, буду знать. Я года три назад проходил курс по скрапингу и парсингу от университета Мичигана, там именно requests использовали. Я потом написал своего паука, но сильно разгуляться не смог, меня быстро забанили в гугле за частые запросы, так что, опытанакопить не получилось.

А какие библиотеки вы бы посоветовали?

Ну, во-первых, есть библиотека (можно даже сказать фреймворк) для парсинга, явно достойный внимания - это Scrapy. Во-вторых, если уж хочется руками писать побольше, то есть aiohttp или httpx. С помощью этих библиотек можно делать асинхронные запросы к сайту (т.е. делать запросы к следующим страницам, не дожидаясь, пока загрузятся предыдущие, грубо говоря). Единственное, бездумно лупить кучами асинхронных запросов тоже не стоит - надо ограничивать RPS, конечно, с помощью того же семафора из Asyncio. Соответственно, чтобы не банили, так же нужно менять UserAgent (например, с помощью fake-useragent), а также использовать прокси. Ну а для разбора html библиотека beautifulsoup4, упомянутая автором статьи, годится.

 проходил курс по скрапингу

меня быстро забанили в гугле за частые запросы

Логично, что курс не очень - не учитывает некоторые тонкости.

Учитывая то, что специализация называется Python for Beginners, а на скрапинг был выделен 1 (один) урок, то некоторые тонкости наверняка были упущены :)

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, и заменять ничего не нужно было, меня такой результат устроил.

Пользовал все библиотеки, какие на Питоне есть. только на заглушку смотрел...

  1. Не спрашивать больше 2 конкурентных запросов в секунду, для большего количества – использовать прокси.

  2. Добавлять referrer с ссылкой на корневую страницу домена, а так же accept-language.

  3. Использовать актуальный и популярный user-agent

UFO just landed and posted this here

В 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)

Sign up to leave a comment.

Articles