كيف يمكنني منع Python Urllib (2) من اتباع إعادة توجيه

StackOverflow https://stackoverflow.com/questions/554446

  •  23-08-2019
  •  | 
  •  

سؤال

أحاول حاليا تسجيل الدخول إلى موقع باستخدام Python ولكن يبدو أن الموقع يرسل ملف تعريف الارتباط وبيان إعادة توجيه في نفس الصفحة. يبدو أن بيثون يتبع ذلك إعادة التوجيه وبالتالي يمنعني من قراءة ملف تعريف الارتباط من خلال صفحة تسجيل الدخول. كيف يمكنني منع Urllib Urllib في Python (أو Urllib2) من متابعة إعادة التوجيه؟

هل كانت مفيدة؟

المحلول

يمكنك القيام بضعة أشياء:

  1. بناء الخاص بك httpredirectherler الخاص بك الذي اعترض كل إعادة توجيه
  2. قم بإنشاء مثيل من httpcookieprocessor وتثبيت ذلك المفتاح بحيث يمكنك الوصول إلى Cookiejar.

هذا هو الشيء القليل السريع الذي يوضح كليهما

import urllib2

#redirect_handler = urllib2.HTTPRedirectHandler()

class MyHTTPRedirectHandler(urllib2.HTTPRedirectHandler):
    def http_error_302(self, req, fp, code, msg, headers):
        print "Cookie Manip Right Here"
        return urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers)

    http_error_301 = http_error_303 = http_error_307 = http_error_302

cookieprocessor = urllib2.HTTPCookieProcessor()

opener = urllib2.build_opener(MyHTTPRedirectHandler, cookieprocessor)
urllib2.install_opener(opener)

response =urllib2.urlopen("WHEREEVER")
print response.read()

print cookieprocessor.cookiejar

نصائح أخرى

إذا كان كل ما تحتاجه هو إيقاف إعادة التوجيه، فهناك طريقة بسيطة للقيام بذلك. على سبيل المثال، أريد فقط الحصول على ملفات تعريف الارتباط ولأداء أفضل لا أريد إعادة توجيهها إلى أي صفحة أخرى. آمل أيضا أن يتم الاحتفاظ الرمز 3xx. دعونا نستخدم 302 على سبيل المثال.

class MyHTTPErrorProcessor(urllib2.HTTPErrorProcessor):

    def http_response(self, request, response):
        code, msg, hdrs = response.code, response.msg, response.info()

        # only add this line to stop 302 redirection.
        if code == 302: return response

        if not (200 <= code < 300):
            response = self.parent.error(
                'http', request, response, code, msg, hdrs)
        return response

    https_response = http_response

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj), MyHTTPErrorProcessor)

وبهذه الطريقة، لا تحتاج حتى إلى الذهاب إلى Urllib2.httpredirecthrectherler.http_error_302 ()

حالة أكثر شيوعا هي أننا نريد ببساطة التوقف عن إعادة التوجيه (كما هو مطلوب):

class NoRedirection(urllib2.HTTPErrorProcessor):

    def http_response(self, request, response):
        return response

    https_response = http_response

وعادة ما تستخدمه بهذه الطريقة:

cj = cookielib.CookieJar()
opener = urllib2.build_opener(NoRedirection, urllib2.HTTPCookieProcessor(cj))
data = {}
response = opener.open('http://www.example.com', urllib.urlencode(data))
if response.code == 302:
    redirection_target = response.headers['Location']

urllib2.urlopen المكالمات build_opener() الذي يستخدم هذه القائمة من فئات المعالج:

handlers = [ProxyHandler, UnknownHandler, HTTPHandler,
HTTPDefaultErrorHandler, HTTPRedirectHandler,
FTPHandler, FileHandler, HTTPErrorProcessor]

يمكنك محاولة الاتصال urllib2.build_opener(handlers) نفسك مع قائمة الأغلب HTTPRedirectHandler, ، ثم اتصل open() طريقة حول النتيجة لفتح عنوان URL الخاص بك. إذا كنت حقا لا تحب إعادة التوجيه، فيمكنك حتى الاتصال urllib2.install_opener(opener) إلى فتاحة عدم إعادة توجيهك.

يبدو وكأنه مشكلتك الحقيقية هو ذلك urllib2 لا تفعل ملفات تعريف الارتباط بالطريقة التي تريدها. أنظر أيضا كيفية استخدام Python لتسجيل الدخول إلى صفحة ويب واسترجاع ملفات تعريف الارتباط للاستخدام لاحقا؟

تم طرح هذا السؤال من قبل هنا.

تعديل: إذا كان عليك التعامل مع تطبيقات الويب Quirky، فمن المحتمل أن تجربها ميكانيكية. وبعد إنها مكتبة رائعة تحاكي متصفح الويب. يمكنك التحكم في إعادة التوجيه، ملفات تعريف الارتباط، بتحديث الصفحة ... إذا لم يعتمد الموقع [بشدة] على جافا سكريبت، فسوف تحصل على طول ميكانيكي للغاية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top