Здравствуйте. Вопрос мой скорее связан с ориентированием в среде языков программирования. На данный момент я являюсь скорее вэб-мастером, со знаниями photoshop\html5\css (в основном работаю над своими сайтами + создаю сайты клиентам, используя WordPress).
Последнее время все чаще задаюсь вопросом, чтобы освоить один из языков программирования, чтобы стать более серьезным специалистом. Это значит, что я спрашиваю себя для чего мне это нужно - что я буду с этим делать. Ответы получаются такие:
1) Освоив, например PHP, я могу создавать плагины для WordPress и другие смежные скрипты (сразу скажу, что мне часто приходится это делать, т.к. сайты создаю с нуля и под разные нужды). К тому же нередко приходят интересные идеи, и хотелось бы творить, реализовывая это самостоятельно. Скажем, к этому пункту подходит перспектива стать разработчиком на PHP в рамках WordPress. Ведь сейчас он популярен, сайтов становится всё больше, и даже e-Commerce прорывается, базируясь на каком-нибудь Woo.
2) Парсинг (тема вопроса). Мне нравится эта тема, когда можно собрать определенные данные, обработать их и вывести во что-то интересное. На практике уже не раз приходилось встретиться с такими проектами (для себя), но работу я поручал другим программистам.
Сейчас я наконец созрел для того, чтобы освоить один из языков программирования, чтобы реализовывать свои задачи самостоятельно. Мне это действительно интересно. Я считаю важным понимание зачем мне это понадобится, поэтому специально описал 1, и 2-ы пункты. Зная что я буду делать, я смогу более детально изучить интересуемую область. Я решил обратиться к вам за советом, чтобы понять с чего правильно начать и в целом услышать что вы думаете. Спасибо!
1) Нужно иметь представление, как загружаются и работают сайты. Тут необходимо иметь представление и о том, что полезный контент может появится на сайте и после загрузки через определенное время.
2) Нужно иметь представление, как работает самый обычный способ получения контента - Curl. Попробуйте скопировать что то, поработать, представить в xml документ и тд. Тут вы определитесь с принципом работы парсера.
- парсер получает вводую информацию -> с учетом программы и вводных данных, парсер запрашивает определенные данные -> парсер обрабатывает данные для пользователя -> при необходимости, парсер повторяет запрос (инициированный пользователем или рекурсий) -> конец
3) Далее вы дойдете до механизмов защиты от парсинга:
- ограничение запросов на 1 ip, на один клиент и тд
- подгузка информации после загрузки контента
- дополнительный запрос на подгрузку контента с CSRF и другими способами
- блокирование ip
Это откроет вам парсеры типа PhantomJs, Научит пользоваться прокси, мимикрировать под популярные браузеры и тд.
Так же вы дойдете до многопоточности работы парсера, и подумаете о переходе на C и подобный язык программирования. Общаясь с сайтом уже посредством api.
А дальше, сталкиваяь с новыми проблемами, будете их решать.
С 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).
Спасибо за ответ! Очень полезно. Учитывая, что я ещё не знаю PHP, и скорее всего я начну именно с него (он мне нужен для моего пункта 1).
Что вы имеете ввиду я понял. В смысле, что для меня это не китайский, где я вообще не понимаю что значит API, JSON или css-селекторы. Но вот сразу пункт 1 - curl, разве это не PHP?
Ещё раз спасибо за инструкцию, она мне действительно подсказала какой дорогой двигаться. Хоть и не во всех подробностях, но я понял связку. Остаётся только разбираться.
И всё-таки. Чтобы сделать свой первый парсер - мне понадобиться начать с основ PHP, самых азов. Или есть более короткий путь, который научил бы меня работать по похожему сценарию (я не ищу волшебной палочки). Или это был бы тупиковый путь, который не сделал бы из меня программиста.
Для парсинга обычных страничек используйте php-либу phpQuery.
Для парсинга ajax-стариничек, то есть страниц с динамически загружаемым контентом, которые phpQuery видит как пустые, используйте java-либу htmlUnit, с помощью которой можно написать простенький код получения и сохрания страницы в файл, который потом можно распарсить с помощью phpUnit.
Язык селекторов phpQuery аналогичный jQuery, так что сложностей возникнуть не должно.
Самый простой способ -- выбрать сайт, открыть его в f11 и тренироваться.
Для парсинга я бы посоветовал использовать Python. Он довольно гибкий и простой в изучении. И для этих целей подходит как нельзя лучше. Особенно если нужно парсить динамический контент (AJAX, javascript и постзагруза)
Альтернативой здесь может быть Java, но это слишком сложно для начинающих
Можно использовать такую связку: Python, Selenium+phantomjs ( загрузка страниц ), beautifulsoup (парсинг html), pymysql (для выгрузки в ДБ).
Если контент статический то все еще проще - Python + beautifulsoup
Работает все очень быстро. А главное api очень интуитивное и разобраться в функционале очень легко.
В самом парсинге нет ничего сложного - берете несколько кусков чужого кода (например несколько однотипных страниц HTML с товаром или новостями), определяете то что вам нужно вытащить, далее смотрите какие-то закономерности, вложенности, признаки и т.д. Определяете - всегда ли это работает или нет. Пишете шаблон (или шаблоны в циклах), потом проверяете тестами - лучше онлайн (например https://regex101.com/ ), чтобы можно было сразу видеть результат.
Другое дело как быть со "спарсенными" данными - стоит им доверять полностью или нет. Что делать с данными, если что-то пошло не так.
Отличная библиотека для парсинга сайтов - 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())
Если хотите начать с чего-то приземленного не боясь запутаться - посмотрите в сторону xpath. Применяется почти во всех современных языках (в том числе C#, Java). Для практики самое то. Примерно разобравшись с тем, что это такое, сразу поставьте себе задачу. К примеру, спарсить много данных, залить всё в свою БД (сразу и с этим потренируетесь), и дальше, к примеру, строить графики (самый простой вариант).
Для парсинга изучайте запросы и ответы от HTTP серверов, через сниффер (например Charles). Освойте базы языка C#. Используйте библиотеку xNet для C# от нашего соотечественника. Для хранения данных советую SQLite и NoSQL (в зависимости от задачи).
Тьму проектов уже сделал на них, работает очень шустро, рекомендую.
Нахожусь в вашей ситуации, только дольше. Поэтому шишек набито больше. Парсинг лучше делать средствами Python и XPath, и передавать уже отпарсенное в промежуточном формате обработчику на PHP если это вообще будет нужно после парсинга. Очень хорошая библиотека для парсинга - BeautifulSoup, для последнего питона - https://github.com/il-vladislav/BeautifulSoup4
(2) теоретически парсинг _любых_ текстовых форматов в самом общем смысле можно делать связкой flex/bison/C++:
1) прописывая регулярки для элементов языка входных данных (строки, числа, тэги,...), затем
2) на bison описываете грамматику входного языка (вложенные тэги, правила расстановки атрибутов, вложенные скобочные выражения и т.п.),
flex/bison генерит пару сишных/С++ файлов, выполняющих всю грязную работу по синтаксическому разбору формата, дергая для каждого определенного элемента _ваш_ кусок сишного кода. Что потом делать с этими данными (пихать с СУБД, генерировать AST для компилятора, просто вычленять нужные единичные данные,..) описываете сами на С++.
У этого подхода соотношение низкоуровневость*гемор/универсальность стремиться к бесконечности, но по мере наработки библиотеки С++ кода для ваших узких задач для каждой N+1 задачи все сводится к генерации типовых высокоуровневых объектов (символов, списков, деревьев и т.п.), и пары десятков строк кода именно для этой задачи.
Хотя если задачи не выходят за рамки топового парсинга веб-контента на PHP, лучше смотреть готовые библиотеки, еще можно глянуть Python+PLY ([p]ython [l]ex [y]acc)
парсить можно на чем угодно. встречал много примеров на пайтоне. а так вообще подойдет на самом деле любой язык программирования, все зависит от удобства и адаптации... как правило выгоднее использовать интерпретируемые языки программирования и скриптовые
Попробуйте сделать парсер самостоятельно по инструкции
в бесплатном парсере (работает через браузер) https://catalogloader.com/kak-sdelat-parser-sajta-... удобный интерфейс и все через браузер.
для простых задач эта инструкция для парсеров сайтов или интернет-магазинов вполне себе.
есть возможность выгрузки в разные формаыт csv exce xml json + доступ по API