2012-11-20 4 views
8

मेरा मतलब यह है कि, यदि मैं "www.yahoo.com/thispage" पर जाता हूं, और याहू ने रीडायरेक्ट/इस पृष्ठ को/उस पृष्ठ पर रीडायरेक्ट करने के लिए एक फ़िल्टर सेट अप किया है। तो जब भी कोई/इस पृष्ठ पर जाता है, तो वह/उस पृष्ठ पर उतरेगा।जब मैं साइट की जांच करने के लिए पाइथन अनुरोधों का उपयोग करता हूं, यदि साइट मुझे किसी अन्य पृष्ठ पर रीडायरेक्ट करती है, तो क्या मुझे पता चलेगा?

यदि मैं प्रेजेंटप्लिब/अनुरोध/urllib का उपयोग करता हूं, तो क्या यह पता चलेगा कि एक पुनर्निर्देशन था? क्या त्रुटि पेज? कुछ साइटें जब भी पृष्ठ नहीं मिल पाती हैं तो उपयोगकर्ता को/errorpage पर रीडायरेक्ट करते हैं।

+2

आप जिस समस्या को हल करने की कोशिश कर रहे हैं? आपका कोड सही काम क्यों नहीं कर रहा है? यदि आप केवल त्रुटि मोड के बारे में जानना चाहते हैं, तो इस व्यवहार का परीक्षण करें। – Marcin

+1

जांचें http://stackoverflow.com/questions/554446/how-do-i-prevent-pythons-urllib2-from-following-a-redirect – OneOfOne

+0

@ मार्सिन मेरे पास परीक्षण करने के लिए यूआरएल की एक बड़ी सूची (1k +) है या नहीं ऊपर हैं या नहीं। मैन्युअल रूप से परीक्षण करने के लिए मैंने यादृच्छिक रूप से उनमें से 40-50 का चयन किया, मुझे लगता है कि जब भी कोई पृष्ठ नहीं मिल पाता है तो कुछ किसी त्रुटि पृष्ठ पर रीडायरेक्ट हो रहे हैं। इसके अलावा मुझे लगता है कि कई यूआरएल भी रीडायरेक्ट किए गए हैं क्योंकि यूआरएल पैटर्न बदल गया है, वही नाम अलग-अलग लिखे गए हैं। – iCodeLikeImDrunk

उत्तर

13

requests के साथ, आपको प्रतिक्रिया वस्तु के .history विशेषता में किसी भी रीडायरेक्ट की एक सूची मिलती है। यह एक पायथन सूची देता है। अधिक के लिए documentation देखें।

1

यह इस बात पर निर्भर करता है कि वे पुनर्निर्देशन कैसे कर रहे हैं। "दाएं" तरीका एक पुनर्निर्देशित HTTP स्थिति कोड (301/302/303) वापस करना है। HTML में रीफ्रेश मेटा टैग डालने का "गलत" तरीका है।

यदि वे पूर्व करते हैं, तो requests इसे पारदर्शी रूप से संभाल लेंगे। ध्यान दें कि किसी भी त्रुटि त्रुटि पृष्ठ रीडायरेक्ट में अभी भी एक त्रुटि स्थिति कोड (उदा। 404) होगा जिसे आप response.status_code के रूप में देख सकते हैं।

9

निम्नलिखित रीडायरेक्ट से अनुरोध को रोकने के लिए उपयोग करें:

r = requests.get('http://www.yahoo.com/thispage', allow_redirects=False)

यदि यह वास्तव में एक रीडायरेक्ट में है, तो आप [ 'स्थान'] r.headers में पुन: निर्देशन लक्ष्य स्थान देख सकते हैं।

1

स्वीकार्य उत्तर सही पहला विकल्प है, लेकिन कुछ मामलों में यदि साइट मेटा टैग के साथ रीडायरेक्ट करती है तो उनके पास रीडायरेक्ट होने के बाद निर्दिष्ट एक कैनोनिकल लिंक भी होता है। इस उदाहरण में मुझे विकिपीडिया से http://en.wikipedia.org/wiki/Google_Inc_Class_A का अनुरोध करने का प्रयास करें, जो एक यूआरएल है जो रीडायरेक्ट करता है।

>> request = requests.get('http://en.wikipedia.org/wiki/Google_Inc_Class_A') 

मैं जाँच करें और:

>> request.history 
[] 

एक वैकल्पिक कोशिश करते हैं और विहित यूआरएल जो उम्मीद है कि तुम क्या करने के लिए पुनः निर्देशित किया गया रहे हैं होना चाहिए खींचने के लिए है। (ध्यान दें मैं यहाँ BeautifulSoup उपयोग कर रहा हूँ के रूप में अच्छी तरह से)

>> soup = BeautifulSoup(request._content) 
>> canonical = soup.find('link', {'rel': 'canonical'}) 
>> canonical['href'] 
'http://en.wikipedia.org/wiki/Google' 

कौन सा यूआरएल आप इस विशेष मामले में करने के लिए रीडायरेक्ट से मेल खाता है। तो स्पष्ट होने के लिए, यह एक बदसूरत दूसरा विकल्प है, लेकिन अगर सब कुछ विफल रहता है तो कोशिश करने लायक है।

+0

भविष्य के पाठकों के लिए: मैंने अभी इस उदाहरण की जांच की है और इतिहास सही ढंग से आबादी वाला है: 'request.get ('http://en.wikipedia.org/wiki/Google_Inc_Class_A', allow_redirects = True)'। मुझे नहीं पता कि यह "allow_redirects" पैरामीटर या अनुरोध पैकेज के नए संस्करण के कारण है या नहीं। – boh

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

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