간단하게 웹에서 데이터를 긁어올 일이 있어 mechanize를 이용해 로그인을 하고 데이터를 수집하려고 했으나 일반적인 방법으로는 속도가 너무 느려 gevent를 활용하여 개발하였다.(python에서 thread를 쓰는 것은 좋지 않은 방법이다)
1. Mechanize
mechanize는 urllib, urllib2 혹은 requests 모듈과 같이 python에서 웹 요청을 보낼 수 있는 모듈이다. 다른 모듈과 다른 점은 가상으로 브라우저를 생성하여 웹 요청을 보내므로 cookie 혹은 session을 쉽게 다룰수 있고, select_form, submit 과 같은 함수들을 이용해 로그인을 할 수 있다.
- 기본적인 mechanize 사용법
- Form 태그를 이용한 Login
대략 이정도로 사용 가능합니다. 더 자세한 내용은 링크의 문서를 확인해보세요.
2. Gevent
gevent는 libev 기반으로 하는 동시성 파이썬 라이브러리 입니다. python의 경우 GIL(Global Interpreter Lock) 때문에 멀티쓰레딩이 오히려 느린 단점이 존재합니다. 이러한 문제를 해결하고 동시성을 부여하기 위해 Gevent & Greenlet을 이용하면 해결할 수 있습니다.
Mac & linux의 경우 libev 패키지가 설치되어 있어야 되고, cython 라이브러리가 설치되어 있어야 합니다.(Windows는 모르겠네요)
- 간단한 예제
- monkey patch
monkey patch 적용(엥? urllib2 뭔가 에러가 있는듯...?)
- 첫 번째 시도(무식하게 전부다 event loop...)
모든 url request를 gevent.spawn(worker, hakbun, browser)를 통해 wrapping 하고 joinall로 전부 실행하니 정말 빠르게 수행하긴 한다. 하지만 대략 3000개 이상 커넥션 연결이 되고 데이터 받기까지 지속되다 보니 Connection Reset by peer 라는 에러를 출력하며 실패했다.
아마 Connection 이 너무 많아서 더이상 요청할 수 없었나보다.
- 두 번째 시도(Pool & map)
- 세 번째 시도(Pool & join)
'Programming' 카테고리의 다른 글
[Python] Flask & Socket IO 웹 소켓을 이용한 채팅 (3) | 2015.02.03 |
---|---|
[Python] gevent & monkey pathcing (0) | 2015.01.28 |
node.js로 블로그 만들기 <<1>> (2) | 2014.12.01 |
[Python] Beautiful Soup과 smtp lib 이용해 게시판 파싱 & 메일 (0) | 2013.10.30 |
[Python] 시작해봅시다 (1) | 2013.04.02 |