문제

그래서 나는 조사하고있다 urllib3 연결 풀링이 있고 스레드 안전이기 때문에 (특히 크롤링의 경우 성능이 더 좋습니다) 문서는 ... 최소한의 말은 최소입니다. urllib2에는 build_opener가 있습니다.

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

그러나 urllib3는 build_opener 방법이 없으므로 지금까지 알아 낸 유일한 방법은 수동으로 헤더에 넣는 것입니다.

#!/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"로 이것을 태그 할 수 있습니다.

도움이 되었습니까?

해결책

당신은 맞습니다. 지금 당장이 작업을 수행하는 더 좋은 방법은 없습니다. 일치하는 개선이 있다면 패치를 받아들이는 것이 더 기쁩니다.

명심해야 할 한 가지, Urllib3의 HTTPConnectionPool은 상태 가득한 클라이언트와 달리 특정 호스트에 대한 "연결 풀"입니다. 이러한 맥락에서 실제 수영장 밖에서 쿠키 추적을 유지하는 것이 합리적입니다.

  • Shazow (Urllib3의 저자)

다른 팁

여러 쿠키에 문제가 없습니까?

일부 서버는 여러 Set-Cookie 헤더를 반환하지만 URLLIB3은 헤더를 DICT에 저장하고 DICT는 동일한 키로 여러 항목을 허용하지 않습니다.

httplib2는 비슷한 문제가 있습니다.

또는 그렇지 않을 수도 있습니다 : urllib3 및 httplib2 모두 사용하는 httplib 패키지의 HttpMessage 클래스의 읽기 헤드 메소드는 다음과 같은 주석을 가지고 있음이 밝혀졌습니다.

이름이 동일한 여러 헤더 필드가 발생하면 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