Научиться парсингу — с чего начать?

Здравствуйте. Вопрос мой скорее связан с ориентированием в среде языков программирования. На данный момент я являюсь скорее вэб-мастером, со знаниями photoshop\html5\css (в основном работаю над своими сайтами + создаю сайты клиентам, используя WordPress).

Последнее время все чаще задаюсь вопросом, чтобы освоить один из языков программирования, чтобы стать более серьезным специалистом. Это значит, что я спрашиваю себя для чего мне это нужно - что я буду с этим делать. Ответы получаются такие:

1) Освоив, например PHP, я могу создавать плагины для WordPress и другие смежные скрипты (сразу скажу, что мне часто приходится это делать, т.к. сайты создаю с нуля и под разные нужды). К тому же нередко приходят интересные идеи, и хотелось бы творить, реализовывая это самостоятельно. Скажем, к этому пункту подходит перспектива стать разработчиком на PHP в рамках WordPress. Ведь сейчас он популярен, сайтов становится всё больше, и даже e-Commerce прорывается, базируясь на каком-нибудь Woo.

2) Парсинг (тема вопроса). Мне нравится эта тема, когда можно собрать определенные данные, обработать их и вывести во что-то интересное. На практике уже не раз приходилось встретиться с такими проектами (для себя), но работу я поручал другим программистам.

Сейчас я наконец созрел для того, чтобы освоить один из языков программирования, чтобы реализовывать свои задачи самостоятельно. Мне это действительно интересно. Я считаю важным понимание зачем мне это понадобится, поэтому специально описал 1, и 2-ы пункты. Зная что я буду делать, я смогу более детально изучить интересуемую область. Я решил обратиться к вам за советом, чтобы понять с чего правильно начать и в целом услышать что вы думаете. Спасибо!
  • Вопрос задан
  • 35377 просмотров
Решения вопроса 3
kawabanga
@kawabanga
1) Нужно иметь представление, как загружаются и работают сайты. Тут необходимо иметь представление и о том, что полезный контент может появится на сайте и после загрузки через определенное время.

2) Нужно иметь представление, как работает самый обычный способ получения контента - Curl. Попробуйте скопировать что то, поработать, представить в xml документ и тд. Тут вы определитесь с принципом работы парсера.
- парсер получает вводую информацию -> с учетом программы и вводных данных, парсер запрашивает определенные данные -> парсер обрабатывает данные для пользователя -> при необходимости, парсер повторяет запрос (инициированный пользователем или рекурсий) -> конец

3) Далее вы дойдете до механизмов защиты от парсинга:
- ограничение запросов на 1 ip, на один клиент и тд
- подгузка информации после загрузки контента
- дополнительный запрос на подгрузку контента с CSRF и другими способами
- блокирование ip
Это откроет вам парсеры типа PhantomJs, Научит пользоваться прокси, мимикрировать под популярные браузеры и тд.
Так же вы дойдете до многопоточности работы парсера, и подумаете о переходе на C и подобный язык программирования. Общаясь с сайтом уже посредством api.

А дальше, сталкиваяь с новыми проблемами, будете их решать.
Ответ написан
@throughtheether
human after all
С php не имел удовольствия работать, но поводу парсинга могу пояснить.
Что вам, по большому счету, надо, так это:

1) скачать страничку сайта или сделать вызов HTTP API. В этом вам помогут библиотеки вроде curl.

2) разобрать полученные в п.1) данные. В случае API, как правило,это JSON. В случае HTML вам пригодится знание XPATH-выражений (которые также помогут, если в результате выполнения п. 1) вы имеете XML) и css-селекторов. Исполнять эти запросы будет XML- или DOM-парсер.

3) полученные в п.2) данные сохранить в конечном или промежуточном виде: CSV, записи в RDBMS (sqlite, mysql, postgresql) или NoSql (Mongo, например)

В дальнейшей работе помогут Selenium (или другой HTTP клиент с исполнением javascript), очереди заданий, кэширование (redis).

Думаю, направление для поиска я вам задал.
Ответ написан
@hdworker
Для парсинга обычных страничек используйте php-либу phpQuery.
Для парсинга ajax-стариничек, то есть страниц с динамически загружаемым контентом, которые phpQuery видит как пустые, используйте java-либу htmlUnit, с помощью которой можно написать простенький код получения и сохрания страницы в файл, который потом можно распарсить с помощью phpUnit.
Язык селекторов phpQuery аналогичный jQuery, так что сложностей возникнуть не должно.
Самый простой способ -- выбрать сайт, открыть его в f11 и тренироваться.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 15
@kryvel
Системный администратор
Для парсинга я бы посоветовал использовать Python. Он довольно гибкий и простой в изучении. И для этих целей подходит как нельзя лучше. Особенно если нужно парсить динамический контент (AJAX, javascript и постзагруза)
Альтернативой здесь может быть Java, но это слишком сложно для начинающих
Можно использовать такую связку:
Python, Selenium+phantomjs ( загрузка страниц ), beautifulsoup (парсинг html), pymysql (для выгрузки в ДБ).
Если контент статический то все еще проще - Python + beautifulsoup
Работает все очень быстро. А главное api очень интуитивное и разобраться в функционале очень легко.
Ответ написан
Комментировать
kimono
@kimono
Web developer
В самом парсинге нет ничего сложного - берете несколько кусков чужого кода (например несколько однотипных страниц HTML с товаром или новостями), определяете то что вам нужно вытащить, далее смотрите какие-то закономерности, вложенности, признаки и т.д. Определяете - всегда ли это работает или нет. Пишете шаблон (или шаблоны в циклах), потом проверяете тестами - лучше онлайн (например https://regex101.com/ ), чтобы можно было сразу видеть результат.
Другое дело как быть со "спарсенными" данными - стоит им доверять полностью или нет. Что делать с данными, если что-то пошло не так.
Ответ написан
@Unknown007
Отличная библиотека для парсинга сайтов - grab. Правда, на питоне. Самому пришлось изучить python только ради использования этой библиотеки, и не пожалел - удобный язык, как и библиотека - делаете запросы на xpath и сохраняете результаты:
g = Grab(log_file='parse_log.html')
g.go(url)
pages_block = g.doc.select('//div[contains(@class,"pager")]/div[contains(@class, "pages")]')
if pages_block:
    pages = pages_block.select('.//li/a[not(@title="Next" or @title="Previous")]')
    page_hrefs = []
    for page in pages:
        href = page.node.attrib['href']
        page_hrefs.append(href)
        print "Page: %d" % int(page.text())
Ответ написан
Pjeroo
@Pjeroo
Веб-разработчик
Регулярные выражения и DOM (если парсинг HTML)
Ответ написан
Комментировать
@kappka
Если хотите начать с чего-то приземленного не боясь запутаться - посмотрите в сторону xpath. Применяется почти во всех современных языках (в том числе C#, Java). Для практики самое то. Примерно разобравшись с тем, что это такое, сразу поставьте себе задачу. К примеру, спарсить много данных, залить всё в свою БД (сразу и с этим потренируетесь), и дальше, к примеру, строить графики (самый простой вариант).
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Деревья, регулярки, мультипоточность и NoSQL-база.
Ответ написан
mixtape774
@mixtape774
Занимаюсь Web, Desktop разработкой и реверсингом
Для парсинга изучайте запросы и ответы от HTTP серверов, через сниффер (например Charles). Освойте базы языка C#. Используйте библиотеку xNet для C# от нашего соотечественника. Для хранения данных советую SQLite и NoSQL (в зависимости от задачи).
Тьму проектов уже сделал на них, работает очень шустро, рекомендую.
Ответ написан
Комментировать
@lynnikvadim
Ответ написан
Комментировать
@ommunist
Делаю и поддерживаю мультиязычные сайты
Нахожусь в вашей ситуации, только дольше. Поэтому шишек набито больше. Парсинг лучше делать средствами Python и XPath, и передавать уже отпарсенное в промежуточном формате обработчику на PHP если это вообще будет нужно после парсинга. Очень хорошая библиотека для парсинга - BeautifulSoup, для последнего питона - https://github.com/il-vladislav/BeautifulSoup4
Ответ написан
Комментировать
@Verz1Lka
Web scraping expert
Один из самых мощных и гибких фреймворков для парсинга на python: scrapy
Ответ написан
Комментировать
@dponyatov
(2) теоретически парсинг _любых_ текстовых форматов в самом общем смысле можно делать связкой flex/bison/C++:
1) прописывая регулярки для элементов языка входных данных (строки, числа, тэги,...), затем
2) на bison описываете грамматику входного языка (вложенные тэги, правила расстановки атрибутов, вложенные скобочные выражения и т.п.),
flex/bison генерит пару сишных/С++ файлов, выполняющих всю грязную работу по синтаксическому разбору формата, дергая для каждого определенного элемента _ваш_ кусок сишного кода. Что потом делать с этими данными (пихать с СУБД, генерировать AST для компилятора, просто вычленять нужные единичные данные,..) описываете сами на С++.

У этого подхода соотношение низкоуровневость*гемор/универсальность стремиться к бесконечности, но по мере наработки библиотеки С++ кода для ваших узких задач для каждой N+1 задачи все сводится к генерации типовых высокоуровневых объектов (символов, списков, деревьев и т.п.), и пары десятков строк кода именно для этой задачи.
Ответ написан
globuzer
@globuzer
gezgrouvingus progreszive ombusgrander greyderzux
парсить можно на чем угодно. встречал много примеров на пайтоне. а так вообще подойдет на самом деле любой язык программирования, все зависит от удобства и адаптации... как правило выгоднее использовать интерпретируемые языки программирования и скриптовые
Ответ написан
Комментировать
PolarOneBear
@PolarOneBear
phpQuery или curl
phpQuery мне кажется попроще.
мне этот урок понравился https://www.youtube.com/watch?v=IU_dAU7GV8w
Ответ написан
Комментировать
@CatalogLoader
Попробуйте сделать парсер самостоятельно по инструкции
в бесплатном парсере (работает через браузер)
https://catalogloader.com/kak-sdelat-parser-sajta-... удобный интерфейс и все через браузер.
для простых задач эта инструкция для парсеров сайтов или интернет-магазинов вполне себе.
есть возможность выгрузки в разные формаыт csv exce xml json + доступ по API
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы