2012-06-07 15 views
8

başka dize:`open_http ': 403 Forbidden (openURI :: httpError) dizesi 'Steve_Jobs' için değil, ben <a href="http://ruby.bastardsbook.com/">http://ruby.bastardsbook.com/</a> sağlanan Yakut öğreticiler geçiyor ve ben aşağıdaki kodu karşılaştı

require "open-uri" 

remote_base_url = "http://en.wikipedia.org/wiki" 
r1 = "Steve_Wozniak" 
r2 = "Steve_Jobs" 
f1 = "my_copy_of-" + r1 + ".html" 
f2 = "my_copy_of-" + r2 + ".html" 

# read the first url 
remote_full_url = remote_base_url + "/" + r1 
rpage = open(remote_full_url).read 

# write the first file to disk 
file = open(f1, "w") 
file.write(rpage) 
file.close 

# read the first url 
remote_full_url = remote_base_url + "/" + r2 
rpage = open(remote_full_url).read 

# write the second file to disk 
file = open(f2, "w") 
file.write(rpage) 
file.close 

# open a new file: 
compiled_file = open("apple-guys.html", "w") 

# reopen the first and second files again 
k1 = open(f1, "r") 
k2 = open(f2, "r") 

compiled_file.write(k1.read) 
compiled_file.write(k2.read) 

k1.close 
k2.close 
compiled_file.close 

kod aşağıdaki iz başarısız:

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:277:in `open_http': 403 Forbidden (OpenURI::HTTPError) 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:616:in `buffer_open' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:164:in `open_loop' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:162:in `catch' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:162:in `open_loop' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:132:in `open_uri' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:518:in `open' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:30:in `open' 
    from /Users/arkidmitra/tweetfetch/samecode.rb:11 

Benim sorunum kodu başarısız olduğunu değil ama ben Steve_Jobs dışında bir r2 değiştirdiğinizde, bunun işe yaradığını. Burada ne oluyor?

+0

de sonradan belirtilen filtreleme URL'ler olabilecek bir proxy veya şey mi var? Aynı makinede başka bir şeyle 'kötü' url'ye ulaşmayı denediniz, ör. Lynx tarayıcısı? –

+0

Böyle bir şey yok. Bir wget "http://en.wikipedia.org/wiki/Steve_Jobs" ile bile çalışır. Şaşırdım. –

+1

Kullanıcı aracısını "open (remote_full_url", "User-Agent" => "Mozilla/5.0 (Windows NT 6.0; rv: 12.0) Gecko/20100101 Firefox/12.0 FirePHP/0.7.1") gibi ayarlamayı deneyebilir misiniz? senin tarafın? – vstm

cevap

2

Bu "Steve Jobs" gibi kilitli girişleri için olur düşünüyorum, vb Bu kastediyoruz aynı kitapta belirtilen "Al-Gore": Bazı sayfalarda

- gibi Al Gore'un kilitli girişi - Vikipedi, , bir Kullanıcı Aracısı belirtilmemişse, bir web isteğine yanıt vermez. "Kullanıcı Aracısı", genellikle tarayıcınıza başvurur ve bunu tarayıcınızda herhangi bir sayfa isteği için gönderdiğiniz üstbilgileri inceleyerek numaralı telefonu görebilirsiniz. "Kullanıcı Aracısı" anahtar/değer çiftini sağlayarak (temelde "Ruby" kullanın ve çalışıyor gibi görünüyor), bunu bir karma olarak iletebiliriz (örnekte HEADERS_HASH değerini kullanıyorum) yöntemin argümanı çağrısı.

O http://ruby.bastardsbook.com/chapters/web-crawling/

9

Varolan bir wiki sayfası istediğimde kodunuz benim için iyi çalışıyor (Ruby MRI 1.9.3).

Var olmayan bir wiki sayfası istediğimde, bir mediawiki 404 hata kodu alıyorum.

  • Steve_Jobs => başarı
  • Steve_Austin => başarı
  • Steve_Rogers => başarı
  • hata

Vikipedi bir tonluk önbelleğe alma, görürseniz yapar Steve_Foo => "Steve_Jobs" için mevcut olan diğer insanlardan farklı olan yanıtlar, en iyisi bunun en iyi ihtimalle wikipedia'nin Steve Jobs makalesini önbelleğe almasıdır çünkü ünlü ve potansiyel reklamdır makaleyi hızlı değişikliklerden, bozulmalardan vb. korumak için ekstra denetimler/doğrulamalar yapın.

Sizin için çözüm: her zaman URL'yi bir Kullanıcı Aracısı dizesiyle açın. Mediawiki dokümanlardan

rpage = open(remote_full_url, "User-Agent" => "Whatever you want here").read 

Ayrıntılar: MediaWiki web hizmeti API HTTP isteklerini yaptığınızda", düzgün müşteri tanımlayan bir User-Agent belirtmek emin olun varsayılan User-Agent kullanmayın. İstemci kitaplığınız tarafından sağlanan, ancak istemcinizin adını ve sürüm numarasını içeren bir özel başlık oluşturun: "MyCuteBot/0.1" gibi bir şey.

Vikipedi'de, bir User-Agent sağlamazsanız başlık veya boş veya genel bir kaynağı sağlarsanız, isteğiniz bir HTTP 403 hatasıyla başarısız olur. Kullanıcı Aracısı politikamıza bakın. "

+0

Bu yüzden, ilk testlerinizi diğer isimlerle yaptığınız bir tarayıcıyla yaptığımı tahmin ediyorum ve bunlar için önbelleğe alınmış sonuçları görüyorsunuz. "Steve_Jobs" a bastığınızda, önbelleğe alınmaz ve hiçbir UA dizesi kullanmadığınız için 403'ü aldınız. –

+0

Sürekli olarak bunu curl ile yeniden üretebilirim. İşler sayfası, UA ile 403 değerini döndürür. Bir UA sağlanırsa, normal 200 yanıtı döndürür. Birkaç sayfa daha denedim ve hiçbiri bu davranışa sahip değildi. Tuhaf... – alienhard

İlgili konular