2014-08-27 6 views
1

나에게 Heroku에 다음과 같은 오류가 계속 크레이그리스트에서 일부 데이터를 끌어 기계화 사용에 대한 기계화 403 오류 : status: Net::HTTPForbidden 1.1 403 ForbiddenHeroku가

I가 발생하지 않도록하는 몇 가지 방법은 무엇인가 궁금 내 설정은 다음과 같습니다 :

agent = Mechanize.new do |agent| 
    agent.log    = @logger 
    agent.user_agent_alias = 'Mac Safari' 
    agent.robots   = false 
end 

아이디어가 있으십니까?

+0

왜 그들이 그것을 금지했는지 알아 내야합니다. 403은 실제 설명이없는 "아니오"입니다. 단순화하고 OpenURI를 사용하여 일부 페이지를 가져 와서 어떤 일이 발생하는지 확인하십시오. 그런 다음 다양한 사용자 에이전트 서명을 사용하여 Mechanize를 시도하십시오. 또는 API를 가지고 있는지 문의하십시오. –

+0

지리학, 리퍼러, 쿠키를 기반으로 할 수도 있고 아니면 너무 열심히 공격했을 수도 있습니다. – pguardiario

+0

예. 10 분 간격으로 긁어 모으기 때문에주의를 끌 것입니다. 잠재적으로 사용자 에이전트를 변경하는 임시 해결책이 있습니까? 각 쿠키를 덤핑했지만 여전히 403 오류가 발생했습니다. – barnett

답변

0

기계화 및 기타 브라우저 에뮬레이터로 작업 할 때 네트워크를 모니터링해야하므로 Google 크롬 개발자 도구를 선호합니다.

는 일반 브라우저로 URL을 검사하고 이러한 확인 :

  1. 이 유효이 URL인가?
  2. 이 URL은 공개 되었습니까?
  3. 이 URL 브라우저가 제한되어 있습니까?
  4. 로그인으로이 URL을 보호합니까?
  5. 정상적인 조건에서이 URL에 어떤 매개 변수가 필요합니까? 액세스중인 URL가 제한됩니다

디버그 이러한 점 때문에 될 수있다

  • 공공 사용
  • 있을 수 있습니다 그 것이다 인덱싱
  • 는 서버가 될 수 있습니다 허용되지 않습니다 디렉토리 경로, 일부 사용자 에이전트에 대해 제한했습니다.
  • 요청을 완전히 복제하지 않을 수 있습니다.

나는 너무 많이 "사용하고 있을지도 모른다"고 생각하지만 내 포인트는 공개적으로 링크를 게시 할 수 없다는 것입니다. 귀하의 링크가 디렉토리에 직접 닿아 색인 생성이 해제 된 경우 오류를 추측 할 수 있습니다. 당신도 몇 가지 중요한 매개 변수가 누락 요청을 복제하지 않는 다른 경우

browser = Mechanize.new 
browser.user_agent_alias = 'Windows IE 7' 

: 그것은 다음과 같은 특정 사용자 에이전트와 기계화를 초기화 할 필요가 특정 사용자 에이전트가 '는 t은 어느 기계화에 찾아 또는 잘못된 요청 유형을 보내면 헤더가 누락되었을 수 있습니다.

편집 : 이제 당신이 여기 링크를 제공 한 것을 나는이 조금 청소기 만들 거라고 생각 HTTPS

Mechanize.new{|a| a.ssl_version, a.verify_mode = 'SSLv3', OpenSSL::SSL::VERIFY_NONE}; 
+0

예제 링크는 다음과 같습니다. https://sfbay.craigslist.org/search/sfc/apa?bedrooms=1&maxAsk=2600&minAsk=1400&nh=10&nh=11&nh=12&nh=149&nh=17&nh=18&nh=20&nh=21&nh=22&nh=23&nh= 27 & nh = 30 & sale_date = - & sort = 브라우저에서 정상적으로 작동하는 날짜입니다. 회전하는 사용자 에이전트도 시도해 보았지만 여전히 문제가 발생했습니다. – barnett

+0

내 대답 편집 ... –

+0

을 참조하십시오. 이렇게 설정했습니다 : 'Mechanize.new {| agent | agent.log = logger; agent.user_agent_alias = 'Mac Safari'; agent.robots = false; agent.ssl_version; agent.verify_mode = 'SSLv3'; OpenSSL :: SSL :: VERIFY_NONE}' 아직'ssl_version'과'OpenSSL :: SSL :: VERIFY_NONE'을 설정하지 않은 이유를 모르겠습니까? 위와 함께 Mechanize를 사용하려고했을 때 'TypeError : String을 Integer로 암묵적으로 변환하지 않았습니다. ' 아이디어가 있으십니까? – barnett

3

을 처리하는 동안해야 할 일이다. 새로운 헤더를 요청하여 해결할 수 있었던 동일한 문제가 발생했습니다.

@agent = Mechanize.new { |agent| 
         agent.user_agent_alias = 'Windows Chrome'} 


@agent.request_headers 

아직 처리하지 않은 오류 처리 기능도 포함시켜야합니다.

begin #beginning of block for handling rescue 
       @results_page = #getting some page and doing cool stuff 
     #The following line puts mechanize to sleep when a new page is reached for 1/10 second. This keeps you from overloading the site you're scraping and minimizing the chance of getting errors. If you start to get '503' errors you should increase this number a little! 
       @agent.history_added = Proc.new {sleep 0.1} 

      rescue Mechanize::ResponseCodeError => exception 
       if exception.response_code == "503" 
       @agent.history_added = Proc.new {sleep .2} 
       #the following line closes all active connections 
       @agent.shutdown 
       @agent = Mechanize.new { |agent| 
        agent.user_agent_alias = 'Windows Chrome'} 
       @agent.request_headers 
       @page = @agent.get('the-webpage-i-wanted.com') 
       @form = @page.#GettingBackToWhereIWas 
       redo 
       else 
       #more error handling if needed 
       end 

는 *** 참고 : 그들은 단지 15-30 두 번째 요청 - 응답주기를 할 수 있기 때문에 Heroku가에 시간 초과 오류를 방지하기 위해 백그라운드 프로세스로이 실행 고려 나는 아이디어를 제공하려면 다음을 썼다. 이미 redisToGo (heroku addon)와 sidekiq (dl gem)을 사용하고 있습니다.

+0

예제를 게시 할 수 있습니까? – barnett

+0

별명을 설정 한 후 @ agent.request_headers를 추가하는 것을 잊어 버렸습니다. 또한받을 오류에 대한 구조를 추가하십시오 : 구조기구 : ResponseCodeError => 예외 if exception.response_code == "413" –