Python Urllib3 وكيفية التعامل مع دعم ملفات تعريف الارتباط؟

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

  •  19-09-2019
  •  | 
  •  

سؤال

لذلك أنا أبحث في Urllib3. لأنه يحتوي على تجمع اتصالات وهو مؤمن للخيط (حتى الأداء أفضل، خاصة للزحف)، ولكن الوثائق هي ... الحد الأدنى ليقول أقل. Urllib2 لديه بناء_Opener لذلك مثل:

#!/usr/bin/python
import cookielib, urllib2
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")

لكن Urllib3 لا يوجد لديه طريقة للبناء، وبالتالي فإن الطريقة الوحيدة التي أحظت بها حتى الآن هي وضعها يدويا في الرأس:

#!/usr/bin/python
import urllib3
http_pool = urllib3.connection_from_url("http://example.com")
myheaders = {'Cookie':'some cookie data'}
r = http_pool.get_url("http://example.org/", headers=myheaders)

لكنني آمل أن تكون هناك طريقة أفضل وأن أحدكم يمكن أن تخبرني بما هو عليه. أيضا يمكن لشخص ما علامة هذا مع "Urllib3" من فضلك.

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

المحلول

أنت صحيح، ليس هناك طريقة أفضل على الفور للقيام بذلك الآن. سأكون أكثر من سعيد بقبول التصحيح إذا كان لديك تحسن متطابق.

شيء واحد يجب وضعه في الاعتبار، يهدف HttpConnectionPool في Orllib3 إلى أن يكون "مجموعة من الاتصالات" لمضيف معين، بدلا من عميل دعوة. في هذا السياق، من المنطقي الحفاظ على تتبع ملفات تعريف الارتباط خارج المجمع الفعلي.

  • شازو (مؤلف Urllib3)

نصائح أخرى

هل لا توجد مشكلة مع ملفات تعريف الارتباط المتعددة؟

تقوم بعض الخوادم بإرجاع رؤوس ملفات تعريف الارتباط متعددة، لكن Urllib3 يخزن الرؤوس في Dict و Dict لا يسمح بإدخال متعدد مع نفس المفتاح.

httplib2 لديه مشكلة مماثلة.

أو ربما لا: اتضح أن طريقة Read Headers من فئة HTTTPMESSAGE في حزمة HTTPLIB - والتي يستخدم كل من Urllib3 و httplib2 - التعليق التالي:

في حالة حدوث حقول رأس متعددة مع نفس الاسم، يتم دمجها وفقا للقواعد في RFC 2616 SEC 4.2:

    Appending each subsequent field-value to the first, each separated
    by a comma. The order in which header fields with the same field-name
    are received is significant to the interpretation of the combined
    field value.

لذلك لا يتم فقد رؤوس.

ومع ذلك، هناك مشكلة إذا كانت هناك فواصل ضمن قيمة رأس. أنا لم أحسب بعد ما يحدث هنا، ولكن من قشط RFC 2616 ("بروتوكول نقل النص التشعبي - HTTP / 1.1") و RFC 2965 ("آلية إدارة الدولة HTTP") أحصل على الانطباع بأن أي فواصل داخل رأس من المفترض أن يتم نقل القيمة.

تحتاج إلى تعيين 'Cookie' ليس 'Set-Cookie', 'Set-Cookie' تعيين بواسطة خادم الويب.

وملفات تعريف الارتباط هي واحدة من الرؤوس، لذلك لا شيء خاطئ في القيام بهذه الطريقة.

يجب عليك استخدام مكتبة الطلبات. يستخدم Urllib3 ولكن يجعل أشياء مثل إضافة ملفات تعريف الارتباط تافهة.

https://github.com/kennethreitz/Requests.

import requests
r1 = requests.get(url, cookies={'somename':'somevalue'})
print(r1.content)

يمكنك استخدام رمز مثل هذا:

def getHtml(url):
    http = urllib3.PoolManager()
    r = http.request('GET', url, headers={'User-agent':'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36','Cookie':'cookie_name=cookie_value'})
    return r.data #HTML

يجب أن تحل محل cookie_name و cookie_value

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