Frage

Also habe ich mich in urllib3 weil es Connection Pooling und ist die Threadsicherheit ( so Leistung ist besser, vor allem für das Crawling), aber die Dokumentation ist ... minimal, gelinde gesagt. urllib2 hat build_opener so etwas wie:

#!/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 hoffe, es gibt einen besseren Weg, und dass einer von euch kann mir sagen, was es ist. Auch kann jemand markieren diese mit „urllib3“ bitte.

War es hilfreich?

Lösung

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

Eine Sache im Auge zu behalten, urllib3 der HTTPConnectionPool sollte an einen bestimmten Host ein „Pool von Verbindungen“ sein, wie an einen Stateful-Client gegenüber. In diesem Zusammenhang macht es Sinn, die Verfolgung von Cookies außerhalb des eigentlichen Pools zu halten.

  • shazow (der Autor von urllib3)

Andere Tipps

Gibt es kein Problem mit mehreren Cookies?

Einige Server mehrere Set-Cookie-Header zurück, aber urllib3 speichert die Header in einem dict und ein dict nicht erlaubt mehrere Einträge mit dem gleichen Schlüssel.

httplib2 hat ein ähnliches Problem.

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

  

Wenn mehrere Header-Felder mit dem 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 es Kommas innerhalb eines Header-Wert. Ich habe noch nicht herausgefunden, was hier vor sich geht, aber von Skimming-RFC 2616 ( „Hypertext Transfer Protocol - HTTP / 1.1“) und RFC 2965 ( „HTTP State Management Mechanism“) Ich habe den Eindruck bekommen, dass alle Kommas innerhalb eines Kopf Wert soll zitiert werden.

Sie müssen gesetzt 'Cookie' nicht 'Set-Cookie', setzen 'Set-Cookie' durch Web-Server.

Und Plätzchen sind eine der Header, so dass ich nichts falsch mit, dass Art und Weise zu tun.

Sie sollten die Anfragen Bibliothek verwenden. Es nutzt urllib3 aber macht die 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)

Sie können einen Code 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 sollten ersetzen cookie_name und cookie_value

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top