Guzzle + domCrawler 을 이용한 심플 php 웹파싱(스크래핑)

들어가기 전에

파싱과 스크랩핑, 크롤링은 의미가 좀 다르지만, 한국에서는 보통 파싱이라는 단어로 통용된다.

파싱을 위해선 정규식을 쓰는게 일반적이지만, 웹의 데이타를 추출할때는 어려운점이 있다.

웹의 데이타를 파싱하기 위해 가장 보편적이고, 심플한 방법은 DOM 에서 데이타를 추출하는 형태이다. 웹페이지를 설계할때 css를 이용하여  계층적으로  만들기 때문에, 데이타를 추출하기 위해서도 계층적 구조로 접근이 가능한것이 유리하다.

Dom 파싱을  위해 각 언어별로 적당한 모듈이 있는데, 자바에서는 jsoup, 파이썬에선 BeautifulSoup 이 있고, nodejs 는 JSDOM, cheerio 가 있다.

문제는 PHP인데, 언어의 인지도에 비해 크롤링(파싱)부분이 취약하다.  그나마 정규식을 통해 파싱처리를 하는데, 조금 복잡한 웹페이지를 파싱할려면, 계층별로 split처리와 여러 정규식을 써야한다.  정규식 자체도 복잡하게되어 직관성이 매우 떨어지게 된다.(그러나 일단 데이타가 파싱만 되면, db처리나 활용이 편리한 이점이 있다.)

최근 php 로 데이타 파싱을 해야 할 일이 있어(정규식으로 해볼려다가 암걸리는줄 알았다.), 보던중에  php dom 파싱이 가능한 라이브러리가 있어 정리를 해본다. (물론 전통적인  php dom 파서가 있다. 타 언어에 비해 느리고, 잘 정의된 문서가 아닌 경우 오류가 심하고, dom 에 접근하는 방식이 직관적이지 못하다.)

웹 스크래핑(파싱) 라이브러리는 쉬운 사용법과, 직관적인 selector 사용이 가능해야 하며, 태그 일부가 유실되어 깨진 문서라고 하더라도 오류없이 파싱되어야 한다. 속도도 어느정도 되어야 한다.

설치

설치는 composer 를 통해서 설치할수 있다 

 

Guzzle + Dom crawler + css selector 라이브러리를 사용했는데, 굳이 따로 쓸필요없이, Goutte 라이브러리만 써도 된다. 아래 예제에서 Sir class는 위의 방식대로 작업한것이고, 아래 Sir2 클래스 파일은 Goutte를 사용한 방식이다. 내부에서 쓰는 라이브러리가 동일함으로 그냥 Goutte 를 쓰는걸 추천한다. 

예제코드중 Sir1 클래스는 sir.co.kr 자유게시판 목록을 스크래핑(파싱) 하는 코드이며, Sir2 클래스는 로그인 인증처리후 쪽지함 목록을 스크래핑(파싱)하는 코드이다. 본인이 테스트한 서버는 https 접속시 ssl 인증서 오류가 발생하여, 옵션 코드를 추가하였다.  

아래코드는 예제입니다. 테스트로만 사용하세요. 지나치게 많은 request를 sir.co.kr 로 보내면 아이피가 차단될수 있습니다.

예제코드

 

구현 코드를 보면, php에서 정규식을 사용하는것보다 심플하고 직관적으로 웹페이지 파싱이 가능하다는걸 알수 있습니다. php 에서 웹페이지에 대한 파싱이 필요한 경우 guzzle + dom crawler 는 좋은 선택이 될수 있습니다. 라이브러리 에 대한 자세한 사용법은 공식홈페이지와 아래 링크를 참고바랍니다. 

참고 정보

Scraping products from Walmart with PHP, Guzzle, Crawler and Doctrine

PHP Simple HTML DOM Parser vs FriendsOfPHP Goutte

Facebook Comments

TensorFlow-GPU 설치 삽질

우분투 16 에서 가이드 문서대로 파일받아서 열심히 설치하고 테스트를 돌리니 실패

혹시 가이드 문서가 오류인가 해서 다른 사용자가 작성한 설치문서대로 따라해도 오류발생. 혹시나 해서 해외 블로그까지 뒤져가며 테스트 해보았으나, 문제가 발생했다.

원인은 그래픽카드가 구형이라서 발생한 문제, tensorflow-gpu는 CUDA 버전 3.0 이상만 지원함.. 갖고 있던 그래픽카드가 560ti (옛날에는 나름 좋은사양) 는 cuda 2.0 지원..

지원 목록은 https://developer.nvidia.com/cuda-gpus 에서 확인가능합니다. 일단 GeForce 5xx  계열은 안되고,  6xx 은 일부 상위,, 7xx 계열은 대부분 지원하는걸로 나옵니다. 가급적 CUDA 최신버전을 제공하는 1050 ~ 1060 (물론 자금이 여유롭다면 그 상위모델로) 을 쓰는게 좋을것 같네요.

대부분 윈도우나 우분투에서 설치실패하는 이유는 버전문제가 심할거라 봅니다. 인터넷 설치문서에 그래픽 카드 모델과 버전에 대해서 설명이 빠진글들이 많군요. 

그래픽 카드 사야겠네요. 하아~ 한두푼짜리도 아닌데….

 

Facebook Comments

파이썬으로 첫번째 프로젝트

공부만 해서는 실력이 안 늘것 같아서, 간단하면서 실용적인 개인 프로젝트를 하나 진행할 예정입니다. 

배송업체별로 스크랩 모듈을 개발해볼생각

한 20개정도 만들어야 하는데, 업체별로 하루에 하나씩 만들면 한달정도면 완성것 같네요.

 

Facebook Comments

리눅스 데스크탑으로 개발 후기

우분투 16 민트를 설치하고 개발환경을 설정하여 개발중입니다.

회사에서는 우분투, 집에서는 윈도우인데요.

편한건 모르겠고, 여러가지 불편한점이 많네요.. ㅠ

 

1. 장점

– 속도가 빠릅니다.

  윈도우 쓸때는 깔린 응용어플이 많아서인지 모르겠지만 많이 며칠 켜두면 느렸습니다.

  우분투는 며칠 켜두어도 별 문제 없습니다.

– 물론 개발특성상 리눅스로 개발을 해야 하는 상황이라서 설치했습니다. 이게 장점이라면 장점

– vi 를 자주 쓰게됨.. 

   이게 왜 장점이야 하면, 윈도우 환경에서는 vi 가 조금 불편하니까 안쓰게 됨. 앞으로 vi 에 익숙해져야 하는데, 리눅스에서는 자주 써야 하는 상황이됨.. 

– 어지간한 개발툴은 리눅스 지원함. 젯브레인사의 개발툴은 다 지원되고, vscode도 지원, 서브라임텍스트도 지원할거임.

 

2. 단점

 – 한글입력이 짜증남..

   한글키가 잘되긴 하는데 한영 변환시 가끔 alt 키로 인식하는지 특수키가 눌려진 상황이됨

    지금 쓰는 한글 입력기는 텔레그램 한글 입력 안됨(이게 가장 큰 단점)

 – 윈도우에서 쓰던 어플중에 리눅스용이 없는게 많음

    hedisql 없음.ㅠ.ㅠ, editplus 없음… evernote(클론은있지만) 없음. wine 으로 연동해봤지만, 디자인 구려서 못씀

 

 

3. 결론

 – 개발하는데는 크게 불편함 없음.

– 텔레그램은 빨리 한글 지원해주면 좋겠다.

– 굴림체 ttc 파일로 폰트 설치하니까, 윈도우랑 폰트 차이 거의 없어짐.

 

Facebook Comments

PHP 로 API 서비스 개발 with slim3

앱과 통신하는데 필요한 api 서비스 개발중인데.. 

기존 사이트가 php라서 빠르고 심플하면서, 확장성 높은 설계를 위해 php 를 쓰기로 함.

적당한 라이브러리를 찾아보고 있었는데,, 라라벨은 너무 덩치가 큰것 같아서 패스하고,

slim3 가 적당해보여서 개발을하고 있은데,, 전체적인 구조는 라라벨과 유사(라이브러리도 가져다 씀) 하면서도 심플하니 좋네요.

한번 만들면 비슷한 php 로 api 작업하는 경우는 금방금방 끝날것 같습니다.

국내에서는 자료가 별로 없고, 유투브나 웨비나 사이트에 강좌는 많네요. 유튜브보고 사용법 배움.

코딩 위주로 설명을 해주니, 영알못도 대충 이해됨.

모던 php 배우시는 분이라면, 라라벨도 좋지만, slim3 로 가볍게 시작해보세요.

이름처럼 슬림합니다..(그렇지만 유연하고 확장성 높음)

Facebook Comments

파이썬 pip 모듈 설치시 python.h 오류

스크래피(scrapy) 를 테스트 하기 위해 pip3 install scrapy 를 하니 다음과 같은 오류가 발생하였다.

src/twisted/test/raiser.c:4:20: fatal error: Python.h: 그런 파일이나 디렉터리가 없습니다
#include “Python.h”
^
compilation terminated.
error: command ‘x86_64-linux-gnu-gcc’ failed with exit status 1

위의 오류는 python 관련 dev 모듈이 설치되지 않아 발생하는 문제로, python-dev 를 설치하면 대부분 해결된다. 설치시 python 버전에 민감하게 반응하는데,  일반적으로 agt-get install python-dev 또는 apt-get install python3-dev 면 설치가 되는데, scrapy 를 설치할려니 동일한 오류가 발생하였다.  sudo apt-get install  python3.6-dev 와 같이 현재 설치된 python3 버전을 명시하여 설치후 다시 scrapy 를 설치하니 제대로 설치되었다.

 

 

 

 

Facebook Comments

php composer 설치치 allow_url_fopen 설정 문제

요즘  php 개발시 composer 는 필수라 설치를 하다 보니 오류가 발생했다.

php 모듈 관련된 부분과, 설정관련된 부분에서 오류가 발생하는데,  php 모듈은 phar, openssl 이 필요하다.

yum 으로 설치한 경우는 문제가 되지 않으나, 버전때문에 컴파일 설치를 한 경우네는 이 모듈들이 빠져 있는 경우가 많다. 이럴땐, configre 와 컴파일/설치를 새로 진행해야 한다. 기존 운영중인 사이트에서 컴파일은 문제가 없으나, php 를 재시작하는 경우는 주의를 기울여야 한다. service php-fpm reload 할때 서버가 안 올라갈수 있다. 환경설정은 필히 백업을 해두도록 하자.

두번째로 allow_fopen 을 on 하라는 경우인데, allow_fopen 은 보안상 이유로 꺼두는 경우가 많다. php.ini 에서 굳이 이를 on 시킨후 composer 를 설치할 필요없이 아래와 같이 옵션을 추가하면 바로 설치가 된다.

 

Facebook Comments

윈도우에서 python tensorflow 설치하다가 오류날때

아나콘다로 텐서플로우를 설치하는데, 의존성 라이브러리 설치하느라고 이것저것 다운받더니,,, 오류가 나서 멈춤. (설치가 오래 걸리길래 서핑좀 한것 뿐인데.ㅠ)

import tensorflow as tf 하니 오류가 주루룩…

pip install tensorflow  하면, 이미 패키지 다 설치했다고 함.

그래서 강제 재설치 진행

pip install –upgrade –force-reinstall tensorflow

제대로 다 설치됨..

import tensorflow as tf

두둥… 다 설치됨.

Facebook Comments

SphinxSearch (스핑크스) 설치 및 쿼리 테스트 + PHP 에서 사용-2

이전 포스트  http://blog.bongwork.com/archives/88  에서 sphinxsearch 설치와 설정을 하였습니다. 이제 PHP 에서 이를 이용하여 검색결과를 처리하는 방법을 알아보겠습니다. 이전 포스팅에서도 얘기드렸지만, 스핑크스는 mysql 프로토콜을 그대로 따라서 만들었기 때문에 php에서 mysql 쓰듯이 사용하면 됩니다. mysqli 로도 가능하고, PDO로 접속해도 됩니다. (이 글에서는 그냥 mysql 함수를 사용할것입니다.)

테이블은 g5_write_test 테이블입니다. 약 30만개의 영화정보 데이타를 미리 입력해두었습니다.(국내 데이타를 구하기 어려워서 영문으로 된 5천개짜리 데이타를 반복하여 입력했습니다.)

먼저 PHP(그누보드5) 에서 제목과 본문을 기준으로 검색합니다. 테스트 코드입니다.

 

두번째 sphinxsearch 를 이용한 검색 테스트입니다.

 

테스트 결과입니다. 개발용 서버임으로 외부에서 요청이 없는 상태라서, 임의로 request를 발생시킨 상태에서  페이지를 호출하였습니다. 페이지요청 때문에 검색결과수는 조금 다를수 있습니다.

 

접속자가 맣고, 검색작업이 많은 사이트에서는 더 큰 차이가 발생합니다. 

결론

sphinxsearch(스핑크스)를 사용하면, 사이트 내부검색으로 인하여 사이트가 느려지는 문제는 해결할수 있습니다. 물론 스핑크스를 도입했을때, 단점이 없는것은 아닙니다. 병합색인을 위한 추가 설정이 필요하고, 이에 따른 코드 수정도 필요합니다. 병합을 위하여 일정시간(대략 3-5분) 에 한번씩 병합색인을 위한 indexer 를 실행하여야 하고, 마지막 병합색인이 처리된 시간사이에 등록된 글이나 수정된 글은 검색이 안되는 문제가 있습니다. 사이트 성격에 따라 다르겠지만, 검색 결과는 몇분정도의 시간차는 발생해도 운영에 지장이 없습니다. 이런 문제보다 스핑크스를 씀으로써 얻는 이득이 크기 때문에 서비스에 이를 도입한다면 만족할거라 생각합니다. 

 

 

 

 

 

 

Facebook Comments

SphinxSearch (스핑크스) 설치 및 쿼리 테스트 + PHP 에서 사용-1

1 개요

보통 MySQL Database 를 이용하여 커뮤니티 사이트를 운영하다 보면, 사용자가 늘어거나, 컨텐츠가 늘어나는 시점에  검색이라는 계륵을 만나게 됩니다. 검색의 특성상 like 를 사용하게 되는데, 이게 빈도가 늘어나고, 범위가 늘어날수록 리소스를 많이 사용하게 됩니다. 보통 이정도 되면, 사이트 검색을 막어버리거나 사용자별 제한을 하게 됩니다. 검색을 없앨수도 없고, 그렇다고 적극 사용하게 할수도 없고, 계륵입니다.

2. 검색엔진

검색을 막을수는 없고, 꼭 넣어야 한다면, 1차적으로 해볼수 있는게 구글 내부검색입니다. 사용법도 간단하고, 성능도 좋습니다. 그러나 커스트마이징이 안됩니다. 구글검색결과 처럼 나옵니다. 

자체 검색이 가능하고, MySQL과 연동하여 사용할수 있는 검색엔진은 여러가지가 있으나, 이중 가장 편한 방법은 MySQL 의 full text search 입니다. 이것만 사용해도 검색 때문에 사이트 속도가 느려지는 문제는 해결할수 있습니다. 그러나, 검색엔진으로 사용하기에 기능이 부족합니다. 그 다음방법으로 성능이 좀더 뛰어나지만, 설치를 별도로 해야 하고, 설정을 좀 해야 하는 SphinxSearch 가 있습니다. 

3. SphinxSearch

SphinxSearch(스핑크스) 는 오픈소스로 된 풀텍스트 검색엔진입니다. 검색엔진이 기본적으로 갖춰야 하는 다양한 기능들이 있습니다. 기능에 대한 자세한 부분들은 공식 사이트나 구글링을 통해 확인을 해보시고, 이 글에서는 설치와 간단한 사용법을 포스팅합니다. 

MySQL에서 스핑크스를 쓸때 가장 큰 장점이 되는 부분은, MySQL 쿼리문 그대로 사용이 가능하다는 점입니다. connection 도 MySQL의 패킷 구조를 따라합니다. PHP 소스에서 MySQL과 동일하게 접속하고, MySQL 쿼리처럼 질의하면 됩니다. 그외 특징으로는 C++ 로 작성되어 있어서 검색속도가 빠르고, 분산처리가능, 동적 색인과 증분색인이 가능하다는 점입니다.

4. 환경구성

설치와 테스트는 CentOS 6 환경에서 이루어졌습니다. CentOS7 이나 Ubuntu 에서 설치 방식이 조금 다를수 있으나 설정파일은 동일합니다. 설치가 어렵지 않기 때문에, 설정만 유의 해서 보면 됩니다.

테스트를 위해 그누보드5를 사용했으며, 게시판 검색을 위해 게시판 데이타를 50만건가량 입력했습니다. 50만건 정도 되는 데이타를 구하기가 어려워,  https://www.kaggle.com/tmdb/tmdb-movie-metadata  cvs 데이타를 내려받아 php 코드로 여러번 반복 등록처리하였습니다. 해외 빅데이타 처리를 위한 샘플 데이타가 많은데, 그건 또 너무 커서 사용이 어려웠습니다.(GB 단위) 국내에서 샘플로 쓸 데이타는 찾질 못했네요.

5. 설치 및 설정

CentOS6의 경우 yum 레파지토리가 없어서, rpm 다운로드후 설치합니다. 

설치후 실행할려면  libmysqlclient.so.x 을 찾는 경우가 있는데,  이 경우 yum 으로 mysql client 를 설치후 vi /etc/ld.so.conf.d/mysql.conf 에 라이브리 경로를 입력하고, ldconfg 를 한번 실행주면 됩니다.

설치가 완료되었습니다. sphinx는 중요한 파일이 3가지가 있습니다. 

  1. indexer 
    • 색인을 수행하는 명령어입니다.
  2. searchd
    • 검색과 검색결과를 전송해주는 데몬입니다.
  3. sphinx.conf
    • 스핑크스 설정파일입니다. /etc/sphinx/sphinx.conf 에 위치합니다.

위의 설치 상태에서 실행해도 오류가 발생합니다. 이제 sphinx.conf 를 설정해야합니다.

설정할수 있는 부분들이 많은데, 실제 동작하는 설정파일을 보는게 좋습니다. 동작하도록 만들어둔뒤에 추가적인 설정을 하나씩 고쳐서 실행해보면서 기능을 익히도록 합니다. 아래 설정은 그누보드5에서 test 라는 게시판을 색인합니다. 실제 서비스에서는 여러테이블을 색인해야 하고, 병합색인과 관련된 설정과, 게시판 수정/삭제시 기존 색인문서를 삭제하는 기능도 추가되어야 합니다.

위 설정에서 mysql 접속정보를 제대로 넣어야 합니다. 127.0.0.1 로 접속할수 있는 계정이 설정되어야 하고, localhost 로 접속할때는 sql_sock  주석을 해제하고, mysql.sock 파일 경로를 넣으셔야 합니다. 제대로 설정하고, indexer를 실행해봅니다. 

indexer 가 제대로 동작하면, searchd 를 실행합니다. searchd 까지 정상 실행되면, 이제부터 검색을 할수가 있게 됩니다.

indexer 실행시 옵션이 있는데, -all 로 하면 전체 색인, –merge는 병합색인(이 경우 sphinx.conf 에 병합색인 관련 설정이 들어가야 합니다.) –rotate 는 searchd 데몬에 영향을 주지 않고, 색인을 하라는 옵션입니다.(searchd 가 실행중일때 indexer 를 그냥 실행하면 오류가 발생합니다.)

indexer board –rotate 는 board는 index 설정을 실행하라는 뜻입니다. (sphinx.conf 에 보시면 index board 는 설정 섹션이 있습니다.)

정상적으로 searchd가 실행되었으면,  mysql 로 접속하여, 테스트 해봅니다. 위에서 설명한대로 sphinx는 mysql 클라인트를 그대로 사용할수 있습니다. 기본 실행포트인 9306 포트로 접속하시면 됩니다. 아이디와 비번은 입력할필요 없습니다. mysql 마찬가지로 limit 로 출력 결과수를 조정할수 있습니다. 기본값은 20.

 

 

 

 

Facebook Comments