2010-03-11 14 views
7

So bin ich in urllib3 suchen, weil es Verbindungspooling hat und threadsicher ist (so ist die Leistung besser, vor allem für das Crawlen), aber die Dokumentation ist ... minimal, um es gelinde auszudrücken. urllib2 hat build_opener so etwas wie:Python urllib3 und wie wird mit Cookie-Unterstützung umgegangen?

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

Aber urllib3 hat keine build_opener Methode, so dass der einzige Weg, ich habe, ist so weit herausgefunden, um es manuell in den Header zu setzen:

#!/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) 

Aber ich bin Ich hoffe, dass es einen besseren Weg gibt und dass einer von euch mir sagen kann, was es ist. Auch kann jemand dies mit "urllib3" bitte markieren.

+0

@bigredbob cookie_value, markiert als Sie gefragt. Ich habe mir die Quellen von urllib3 angeschaut und es scheint keine der Twills und Turns von urllib2 zu haben, einschließlich 'Opener'-Objekten, also bezweifle ich, dass es einen Zauberstab für dich gibt. Hoffen wir, dass es mit der Zeit reift, denn es ist im Moment ziemlich unreif! -) –

Antwort

9

Sie haben Recht, es gibt keinen sofort besseren Weg, dies jetzt zu tun. Ich wäre mehr als glücklich, einen Patch zu akzeptieren, wenn Sie eine kongruente Verbesserung haben.

Eine Sache zu beachten, urlib3 HTTPConnectionPool soll ein "Pool von Verbindungen" zu einem bestimmten Host sein, im Gegensatz zu einem statusbehafteten Client. In diesem Zusammenhang ist es sinnvoll, das Tracking von Cookies außerhalb des eigentlichen Pools zu halten.

  • shazow (der Autor von urllib3)
+0

Wenn ich wüsste, wie ich das reparieren könnte, würde ich gerne, aber ich bin nicht so gut. Es ist gut zu wissen, dass ich es zumindest nicht falsch mache. – bigredbob

1

Sie müssen 'Cookie' nicht 'Set-Cookie', 'Set-Cookie' festgelegt von Webserver festlegen.

Und Cookies sind einer der Header, so ist es nichts falsch daran, so zu tun.

+0

Ja, das war ein Tippfehler, aber meine Frage steht immer noch, ich hätte gerne einen besseren Weg (d. H. Mit eingebauten). – bigredbob

2

Gibt es kein Problem mit mehreren Cookies?

Einige Server geben mehrere Set-Cookie-Header zurück, aber urllib3 speichert die Header in einem Dict, und ein Dict lässt mehrere Einträge mit demselben Schlüssel nicht zu.

httplib2 hat ein ähnliches Problem.

Oder vielleicht auch nicht: es stellt sich heraus, dass die readheaders Methode der HTTPMessage Klasse im httplib Paket - die sowohl urllib3 und httplib2 Gebrauch - den folgenden Kommentar hat:

Wenn mehrere Header-Felder mit der gleichen Namen auftreten, werden sie kombiniert nach den Regeln in 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. 

So werden keine Header verloren.

Es gibt jedoch ein Problem, wenn Kommas in einem Header-Wert sind. Ich habe noch nicht herausgefunden, was hier vor sich geht, aber durch das Überfliegen von RFC 2616 ("Hypertext Transfer Protocol - HTTP/1.1") und RFC 2965 ("HTTP State Management Mechanism") habe ich den Eindruck, dass jedes Komma in einem Header steht Wert soll zitiert werden.

+0

RFC6265 sagt, Set-Cookie muss speziell dafür eingerichtet sein. httplib tut das nicht in Python 2 ... siehe http://bugs.python.org/issue1660009 – reteptilian

2

Sie sollten die Anforderungsbibliothek verwenden. Es verwendet urllib3, macht aber Dinge wie das Hinzufügen von Cookies trivial.

https://github.com/kennethreitz/requests

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

Soll das meinem Browser einen Cookie hinzufügen? Wenn ja, aus welchen Gründen würde es nicht funktionieren? Ich habe das auf meiner lokalen Website getestet, die auf Apache-Server, Windows 10, Python 2.75 läuft. –

1

können Sie einen Code wie folgt verwenden:

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 

Sie cookie_name ersetzen sollte und

Verwandte Themen