2012-06-07 7 views
8

मैं http://ruby.bastardsbook.com/ पर प्रदान की जाती रूबी ट्यूटोरियल के माध्यम से जा रहा था और मैं निम्नलिखित कोड का सामना करना पड़ा के लिए:`open_http ': 403 निषिद्ध (OpenURI :: HTTPError) स्ट्रिंग" Steve_Jobs "के लिए नहीं बल्कि किसी अन्य स्ट्रिंग

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 

कोड निम्न का पता लगाने के साथ विफल:

/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 

मेरे समस्या यह है कि कोड में विफल रहता है नहीं है, लेकिन कि जब भी मैं Steve_Jobs के अलावा और कुछ करने के लिए r2 बदलने के लिए, यह काम करता है। यहाँ क्या हो रहा है?

+0

पर बाद में निर्दिष्ट किया जाता है एक प्रॉक्सी या कुछ और छानने यूआरएल हो सकता है कि मिल गया? क्या आपने उसी मशीन पर किसी अन्य चीज़ के माध्यम से 'खराब' यूआरएल को मारने का प्रयास किया है, उदा। लिंक्स ब्राउज़र? –

+0

ऐसा कुछ भी नहीं। एक wget "http://en.wikipedia.org/wiki/Steve_Jobs" के साथ भी काम करता है। मैं आश्चर्यचकित हूँ। –

+1

क्या आप उपयोगकर्ता-एजेंट को 'ओपन (remote_full_url, "उपयोगकर्ता-एजेंट" => "मोज़िला/5.0 (विंडोज एनटी 6.0; आरवी: 12.0) गीको/20100101 फ़ायरफ़ॉक्स/12.0 फायरपीएचपी/0.7.1") पर सेट करने का प्रयास कर सकते हैं। तुम्हारी तरफ? – vstm

उत्तर

2

मैं इस "स्टीव जॉब्स" की तरह प्रविष्टियों लॉक के लिए होता है लगता है, "अल गोर" आदि यह वही किताब है कि आप की बात कर रहे में निर्दिष्ट किया जाता:

कुछ पृष्ठों के लिए - जैसे अल गोर की लॉक डाउन एंट्री - विकिपीडिया उपयोगकर्ता अनुरोध को निर्दिष्ट नहीं होने पर वेब अनुरोध का जवाब नहीं देगी। "उपयोगकर्ता-एजेंट" आमतौर पर आपके ब्राउज़र को संदर्भित करता है, और आप इसे द्वारा देख सकते हैं जो आपके ब्राउज़र में किसी भी पृष्ठ अनुरोध के लिए भेजे गए शीर्षलेखों का निरीक्षण करता है। "उपयोगकर्ता-एजेंट" कुंजी-मूल्य जोड़ी प्रदान करके, (मैं मूल रूप से "रूबी" का उपयोग करता हूं और ऐसा लगता है), हम इसे हैश के रूप में पास कर सकते हैं (उदाहरण के लिए मैं निरंतर HEADERS_HASH का उपयोग करता हूं) विधि कॉल का तर्क।

यह http://ruby.bastardsbook.com/chapters/web-crawling/

9

आपका कोड मेरे लिए ठीक है (रूबी एमआरआई 1.9.3) जब मैं मौजूद विकी पेज का अनुरोध करता हूं।

जब मैं एक विकी पेज का अनुरोध करता हूं जो मौजूद नहीं है, तो मुझे मीडियाविकी 404 त्रुटि कोड मिलता है।

  • Steve_Jobs => सफलता
  • Steve_Austin => सफलता
  • Steve_Rogers => सफलता
  • Steve_Foo => त्रुटि

विकिपीडिया टन कैशिंग के, इसलिए यदि आप देख करता है "Steve_Jobs" के लिए reponses जो मौजूद अन्य लोगों की तुलना में अलग हैं, तो सबसे अच्छा अनुमान है क्योंकि विकिपीडिया स्टीव जॉब्स लेख कैश कर रहा है क्योंकि वह प्रसिद्ध है, और संभावित विज्ञापन लेख को तेजी से परिवर्तन, रक्षा, इत्यादि से बचाने के लिए अतिरिक्त चेक/सत्यापन

आपके लिए समाधान: हमेशा उपयोगकर्ता एजेंट स्ट्रिंग के साथ यूआरएल खोलें। MediaWiki डॉक्स से

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

विवरण: "जब आप मीडियाविकि वेब सेवा एपीआई के HTTP अनुरोध बनाने के लिए, एक उपयोगकर्ता-एजेंट हैडर है जो ठीक से अपने ग्राहक की पहचान करता है निर्दिष्ट करना सुनिश्चित करें डिफ़ॉल्ट उपयोगकर्ता-एजेंट का प्रयोग न करें। आपके क्लाइंट लाइब्रेरी द्वारा प्रदान किया गया है, लेकिन एक कस्टम हेडर बनाएं जिसमें आपके क्लाइंट का नाम और संस्करण संख्या शामिल है: "MyCuteBot/0.1" जैसे कुछ।

विकीमीडिया विकीज़ पर, यदि आप उपयोगकर्ता-एजेंट की आपूर्ति नहीं करते हैं हेडर, या आप एक खाली या जेनेरिक एक की आपूर्ति करते हैं, तो आपका अनुरोध HTTP 403 त्रुटि के साथ विफल हो जाएगा। हमारी उपयोगकर्ता-एजेंट नीति देखें। "

+0

इस प्रकार, मैं अपने शुरुआती परीक्षण को सट्टेबाजी कर रहा हूं अन्य ब्राउज़र पर ब्राउज़र के साथ किया गया था, और आप उन लोगों के लिए कैश किए गए परिणाम देख रहे हैं। जब आप "स्टीव_जब्स" दबाते हैं, तो यह कैश नहीं किया जाता है, और चूंकि आप कोई UA स्ट्रिंग का उपयोग नहीं कर रहे थे, तो आपको 403 मिल गया। –

+0

मैं इसे लगातार कर्ल के साथ पुन: उत्पन्न कर सकता हूं। जॉब्स पेज 403 डब्ल्यू/ओ UA देता है। यदि एक UA प्रदान किया जाता है, तो यह सामान्य 200 प्रतिक्रिया देता है। मैंने कुछ अन्य पृष्ठों की कोशिश की और कोई भी यह व्यवहार नहीं था। अजीब... – alienhard

संबंधित मुद्दे