2014-04-19 3 views
1

저는 CasperJS에 비교적 익숙하고 간단한 스크랩 스크립트를 작성했으며 지금은 좀 더 어려운 작업을 수행하고 있습니다. URL 목록에서 일종의 데이터를 긁어 내고 싶지만 일부 페이지는 "실패"합니다. 일부 페이지에는 기본적으로 captcha가 있기 때문에 captcha 해결 서비스를했습니다. 그러나 phantomjs는 captcha를 렌더링하는 데 일관성이 없으며 때로는로드되고 때로는로드되지 않습니다.casperjs 스크립트를 다시 실행하십시오.

내가 생각하는 해결책은 필요한 데이터의 양을 얻기 위해 captcha를로드하지 못한 페이지로 스크립트를 다시 실행하는 것이 었습니다. 하지만 나는 그것을 실행하지 않는 것, 나는 모든 것을 가진 함수를 만든 다음 그 안에서 casper.run() 메서드를 호출하고 그것을 긁어 내서 데이터의 양이 재실행하지 않으면 필요한 최소한을 채우는 지 확인한다. 캐쉬퍼가 함수를 호출하기 전에 스택에 단계를 추가하는 것을 본 것처럼 (실제로 틀렸다면) 올바른 방법을 알지 못한다. 또한 뭔가를 생각하고있어 run.complete 이벤트를하지만 그렇게하는 방법을 잘 모르겠습니다.

// This variable stores the amount of data collected 
pCount = 0; 
urls = ["http://page1.com","http://page2.com"];  
// Create casperjs instance... 
casper.start(); 

casper.eachThen(urls, function(response) { 
    if (pCount < casper.cli.options.number) { 
     casper.thenOpen(response.data, function(response) { 
     // Here is where the magic goes on 
     }) 
    } 
}) 
casper.run(); 

내가 함수에 casper.eachThen() 블록을 포장과 같은 것을 할 수 어쨌든 있나요 : 내 스크립트는 다음과 같은 것입니다?

casper.start(); 
function sample() { 
    casper.eachThen(urls, function(response) { 
     if (pCount < casper.cli.options.number) { 
      casper.thenOpen(response.data, function(response) { 
      // Here is where the magic goes on 
      }) 
     } 
    }) 
} 
casper.run(sample); 

또한, 나는 "불일치"를 방지하기 위해 엔진으로 slimerjs를 사용했지만, 내가 가지고 casper.evaluate() 내부 __utils__.sendAjax() 방법을 작업을 진행하게 관리 할 수있는, 그래서 그것은 계약 위반입니다. 아니면 별도의 인스턴스에서 비동기 적으로 GET 요청을 수행 할 수있는 방법이 있습니까? 그렇다면, 내가 업데이트

당신의 조언을 부탁드립니다 : 내가 casperjs 그것을 해결하기 위해 관리하지 마십시오, 내가 그럼에도 불구하고 내 특정 사용 사례에 대한 해결 방법을 발견, 뒷면에

+0

그럼이 질문을 다시 보았는데 [이 주제] (http://stackoverflow.com/questions/23891143/casperjs-how-to-repeat-a-step-x-times-onwaittimeout) 도움이 될 수 있습니다. 당신. – Fanch

답변

1

내가 캐스퍼에서이 작업을 수행하는 방법을 발견하지, 이것은 내가 그것을 해결하는 방법입니다 C#으로 작성). 이 프로그램 A는 casperjs 스크립트를 실행하고 출력을 읽는 프로그램입니다. 스크립트를 재실행해야한다면 프로그램 A에서 잡을 수 있도록 일부 사양의 메시지 만 출력합니다.

가장 좋은 방법은 아니지만 효과가있을 수 있습니다. 도움이 되었으면 좋겠다

1

어쩌면 더 많은 정보를 원하시면 내 대답을 확인 그런 기능, 그래서 뭔가 :

프로그램 A가있다

, 내 경우에는 사용자 입력을 (관리 :

casper.start() 
.thenOpen('your url'); 
.then(function(){ 
    var count = 0; 
    if (this.exists("selector contening the captcha")){ 
    //continue the script 
    } 
    else if (count==3){ 
     this.echo("in 3 attempts, it failed each time"); 
     this.exit(); 
    } 
    else{ 
     count++; 
     casper.back();//back to the previous step, so will re-open the url 
    } 
.run(); 
+0

: O는 실제로 다시 확인하지 않았습니다.() 나는 브라우저의 뒤로 버튼을 클릭하는 것과 같이 문자 그대로 이전 페이지로 가고 있다고 생각했습니다. 나는 그것을 분명히 시도 할 것이다. 나는 계속 게시 할 것이다 – davidaam

+0

네, 솔직히 말해서 나는 정보를 얻지 않으려 고 노력했다. :) – Fanch

+0

back()이 __browser의 history__에서 한 걸음 뒤로 간다. . 고마워 어쨌든 – davidaam