2017-10-25 3 views
0

Ich analysiere eine Website mit Ruby Nokogiri, aber nach vielen Anfragen blockieren die Seiten mich, also muss ich auf der letzten Seite, die ich analysiert habe, erneut versuchen (der Link wird von der @next_link).Ich kann die Seite nach vielen Anfragen nicht neu laden

Ich habe versucht, mit der sleep Methode, Ausnahmen e viele Dinge. Nichts funktioniert.

Ich habe zum Beispiel 150 Seiten zu analysieren, aber auf Seite 25 werde ich blockiert.

Diese Funktion macht eine Schleife durch meine Seiten:

def final_results(range, link) 
    (range[:start]..range[:finish]).each do |page_number| 
    begin 
     if page_number == 1 
     parse_response(parser('utf-8', 'iso-8859-1')) 
     elsif page_number == 2 
     get_next_link(link) 
     else 
     get_next_link(@next_link) 
     end 
    rescue Exception => e 
     range = {:start => page_number, :finish => range[:finish]} 
     final_results(range, link) 
    end 
    end 
end 

dieser Funktion wird die nächste Seite Link erhält und analysiert die aktuelle Seite:

def get_next_link(link) 
    begin 
    post((BASE_URL + link), request_with_captcha_solution) 
    aux = parser('utf-8', 'iso-8859-1') 
    parse_response(aux) 
    paginator_table = aux.css('table.fonte11')[1].children[1] 
    @next_link = paginator_table.children[3].children[-2]['href'] 
    rescue Exception => e 
    @error_message ="#{$!}" 
    end 
    @next_link 
end 

Antwort

0

Sie wahrscheinlich blockiert werden, weil die Website, die Sie‘ re scraping will nicht, dass Bots seine Seiten mit der hohen Rate konsumieren, die Sie versuchen. Verlangsamen Sie Ihre Scraping ist ein vernünftiger Ansatz, und Sie sollten dies mit einer sleep zwischen jeder Seite erreichen können. Sie müssen versuchen und versuchen, herauszufinden, wie langsam Sie gehen müssen, damit Sie nicht blockiert werden.

So etwas sollte funktionieren:

def final_results(range, link) 
    (range[:start]..range[:finish]).each do |page_number| 
    begin 
     if page_number == 1 
     parse_response(parser('utf-8', 'iso-8859-1')) 
     elsif page_number == 2 
     get_next_link(link) 
     else 
     get_next_link(@next_link) 
     end 
    rescue Exception => e 
     range = {:start => page_number, :finish => range[:finish]} 
     final_results(range, link) 
    end 
    # sleep here! 
    end 
end 
+0

Ich habe versucht, diese vor, sogar mit 1 Minute Schlaf nicht funktioniert hat. – Monique

+0

Es ist also möglich, dass der Mechanismus zur Ratenbegrenzung Sie nach einer Reihe von Anfragen für eine Weile blockiert. Sie könnten versuchen, ein VPN zu verwenden, um es von verschiedenen IP-Adressen zu treffen, aber das ist ein bisschen "zwielichtig". Der Betreiber der Website möchte nicht, dass Sie es so krabbeln. Frage: Wenn die Anforderungen fehlschlagen, welchen Statuscode erhalten Sie in der Antwort? – hoffm

Verwandte Themen