PHP Curl 을 이용한 FTP 요청 처리

외부 업체와 계약하여 뉴스 컨텐츠를 수급하는데, 뉴스 데이타 저장소로 FTP를 사용하기로 하였습니다. 
PHP 에는 ftp_xxx 로 시작하는 ftp 처리용 함수들이 준비되어 있어 이걸 쓰면 쉽게 끝나겠구나 생각햇었는데, 
위의 함수들을 이용했을때 ftp  서버 접속후 명령어 처리가  미묘하게 동작이 안되는 경우가 생겼습니다. 
(개발용 서버는 잘되고, 운영서버는 안되는 그런 상황) 

네트웍 환경이나, 방화벽 설정에 따른 영향 일것으로 추정은 되지만, 이걸 찾는건 너무 귀찮은 작업이 될것 같아 다른 방법을 찾아보니, curl 을 통해서도 ftp 파일전송이 가능하다는걸 알게되었습니다. 

테스트한 코드들이 아까워서 좀더 범용적으로 사용할수 있도록 class 화 시켰습니다. 
php 의 ftp_xxxx() 함수들  때문에 고통 받는 사람들에게 도움이 되면 좋겠네요. php ftp 함수보다 훨씬 안정적으로 동작합니다.

미구현된 기능이 몇가지 있는데, 아직 쓰는 경우가 없어서 구현하지 않았습니다.

 

Facebook Comments

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