[첫화면으로]Perl/WWW-Mechanize

마지막으로 [b]

Cpan:WWW::Mechanize

1. UTF-8이 아닌 사이트에 폼 전송할 때 문자열 인코딩 문제

    # 폼의 캐릭터셋을 지정하고
    $mech->form_name("form_edit")->accept_charset("euc-kr");
    # submit_form할 때 넘겨주는 데이타는 디코드된 스트링으로 넘겨줌

2. content() 메쏘드의 반환값

WWW::Mechanize를 써서 get()한 후 content()를 써서 웹 페이지의 내용을 반환받을 때, 이전에는 raw data, 즉 바이트 스트림으로 반환되었는데, 어느 버전에서부터인가 decode된 스트링으로 반환된다. 따라서 받은 후에 다시 decode를 할 필요가 없다. (기존 모듈에 맞춰 작성했던 것은 수정해주어야 함)

[Change 문서]를 보면 아마도 2008.9.27에 나온 1.49_01 버전부터 인 듯.

문제는, 항상 디코드되는 게 아니라, 웹페이지의 인코딩이 뭔지 알 수 없거나 실패할 경우는 디코드하지 않은 상태로 반환하기 때문에, 반환값을 일일이 검사해야 하는 경우가 있다. 예를 들어 euc-kr로 인코딩한 웹페이지인데 메타 태그에는 iso-2022라고 적혀 있는 식이라면 디코드하지 못 한다.

3. get()에서 실패하면 die

get($url) 해서 웹페이지를 긁어올 때 404에러 등이 나면 그 시점에 die해 버린다. [Changes]를 보면 1.49_01부터는 autocheck 의 기본값이 1로 되어 있어서 그렇다. new(autocheck => 0)으로 하고 직접 리턴값 또는 success 를 불러서 검사할 수 있다.

4. 객체의 메모리 사용량 지속 증가

크롤링 봇 등 장시간 사용되는 프로그램의 메모리 사용량이 지속적으로 증가하여 살펴보니 Mechanize 객체의 크기가 계속 커지고 있었다. 그래서 객체 하나를 계속 사용하지 않고 필요할 때마다 새로 생성하고 버리는 식으로 했는데, 문서를 보니 방문 페이지 히스토리를 담는 스택의 크기가 무한대여서 그랬던 듯. 객체를 생성할 때 `stack_depth => 고정값` 옵션을 주니 그 후로는 이런 문제 없음

아 놔 영어권 사람들이라 이게 얼마나 심각한 문제인지 몰랐나 이 사람들... 기존에는 웹페이지 읽은 후에 수동으로 디코드 한 번 해 주던 걸 죄다 찾아서 지워야 하고 그랬더니 반대로 전에는 그냥 그 데이타를 넘겨주면 되던걸 인코드해줘야 하고...

-- Raymundo 2012-2-23 11:52 pm
이름:  
Homepage:
내용:
 


컴퓨터분류

마지막 편집일: 2018-1-17 8:59 am (변경사항 [d])
1796 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기