ν° XML μλ΅μ μ€νΈλ¦ΌμΌλ‘ μ²λ¦¬ν΄μΌ ν©λλ€. μμΆλμ§ μμ μλ΅μ ν¬κΈ°κ° μλ°± λ©κ°λ°μ΄νΈμΌ μ μμΌλ―λ‘ XML νμμ μ λ¬νκΈ° μ μ μμ ν λ©λͺ¨λ¦¬μ λ‘λνλ κ²μ μ΅μ μ΄ μλλλ€.
lxmlμ μ¬μ©νμ¬ κ΅¬λ¬Έ λΆμνκ³ μμ² λ¬Έμμ μ΄λκ°μ μ€λͺ
λ λλ‘ response.raw
λ₯Ό iterparse()
ν¨μμ μ λ¬ν©λλ€. μ΄κ²μ μμΆλμ§ μμ μλ΅μ λν΄ μ μλν©λλ€.
λΆννλ, λ΄κ° νΈμΆνλ APIλ νΉν μ’μ§ μμ΅λλ€. λ°λΌμ μμΆλμ§ μμ λ°μ΄ν°λ₯Ό λͺ
μμ μΌλ‘ μμ²νλλΌλ Content-Encoding: gzip
λ₯Ό λ°ννλ κ²½μ°κ° μμ΅λλ€. λν μ΄λ¬ν κ·Ήλλ‘ λ°λ³΅μ μ΄κ³ μ₯ν©ν XML νμΌμ μμΆλ₯ μ μ λ§ μ’κΈ° λλ¬Έμ(10x+) μμΆλ μλ΅μ μ¬μ©νκ³ μΆμ΅λλ€.
μμ²μΌλ‘ κ°λ₯νκ°μ? λ¬Έμμμ μ°Ύμ μ μμ΅λλ€. urllib3μ λν΄ μμΈν μ‘°μ¬νλ©΄ HTTPResponse.read() λ©μλκ° decode_content
맀κ°λ³μλ₯Ό μ§μνλ κ²μΌλ‘ 보μ
λλ€. μ€μ λμ§ μμ κ²½μ° urllib3μ μμ±μμ μ€μ λ κ²μΌλ‘ λ체λ©λλ€. μμ²μ΄ requests.adapters.HTTPAdapter.send() μ μμ±μλ₯Ό νΈμΆνλ©΄ decode_content
λ₯Ό False λ‘ λͺ
μμ μΌλ‘ μ€μ ν©λλ€.
μμ²μ΄ κ·Έλ κ² νλ μ΄μ κ° μμ΅λκΉ?
μ΄μνκ²λ iter_content()
μ€μ λ‘ μ½λ λμ decode_content=True
λ₯Ό μ€μ ν©λλ€. μ¬κΈ° μ? κ·Έκ²μ λͺ¨λ μ½κ° μμμ μΌλ‘ λνλ©λλ€. μ¬κΈ° μ κΈ°μ μ΄λ κ² νλ λκΈ°κ° μ λ§ μ΄ν΄κ° λμ§ μμ΅λλ€.
κ°μΈμ μΌλ‘ lxmlμ μν νμΌλ₯ κ°μ²΄κ° νμνκΈ° λλ¬Έμ λ¬Όλ‘ iter_content()
λ₯Ό μ€μ λ‘ μ¬μ©ν μλ μμ΅λλ€.
μ΄μ μ μμ²κ³Ό lxml μ¬μ΄μ μ°κ²°ν μ μλ μ체 νμΌκ³Ό κ°μ κ°μ²΄λ₯Ό μμ±νμ§λ§ λ¬Όλ‘ λ²νΌλ§μ΄ μ΄λ ΅κ³ μ΄μ μ μμ±ν κ²λ³΄λ€ λ λλν μ¬λλ€μ²λΌ λκ»΄μ§λ―λ‘ μ§μ λ‘€λ§ν νμκ° μμ΅λλ€. .
μ΄κ²μ μ²λ¦¬νλ λ°©λ²μ λν λΉμ μ μ‘°μΈμ 무μμ
λκΉ? urllib3μμ decode_content=True
λ₯Ό κΈ°λ³Έκ°μΌλ‘ μ€μ νλλ‘ μμ²μ λ³κ²½ν΄μΌ ν©λκΉ?
μλμ, λ€μν μ΄μ λ‘ κΈ°λ³Έμ μΌλ‘ μ€μ ν΄μλ μ λ©λλ€. λΉμ μ΄ ν΄μΌ ν μΌμ functools.partial
λ₯Ό μ¬μ©νμ¬ μλ΅μμ read
λ©μλλ₯Ό λ°κΎΈλ κ²μ
λλ€.
response.raw.read = functools.partial(response.raw.read, decode_content=True)
κ·Έλ° λ€μ response.raw
λ₯Ό νμμ μ λ¬ν©λλ€.
@sigmavirus24 κ°μ¬ν©λλ€. μμμ μ€λͺ ν λ¬Έμ μ λν νμ€ν ν΄κ²°μ± μ λλ€!
μμ² λ¬Έμ(μ: FAQ: http://docs.python-requests.org/en/latest/community/faq/#encoded -data)μ μΆκ°νλ κ²μ΄ μ’μ΅λλ€.
νμ¬ "Requests automatically decompresses gzip-encoded response"λΌλ 문ꡬλ stream=True
κ²½μ°μ μ¬λ°λ₯΄μ§ μμΌλ©° λλΌμμΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
λ΄ λ¬Έμ μ κ΄ν΄μλ urllib3 λ¬Έμ μμ μ½μλ―μ΄ gzip μμΆ ν΄μ μ urllib3 ꡬνμλ λ΄ μ½λμμ ν΄κ²°ν΄μΌ νλ μ체 μμ λ¨μ μ΄ μμ§λ§ λ μ΄μ μμ²μ λν λ¬Έμ λ μλλλ€.
κ·Έλ¬λ λ μ΄μ μμ²μ λ¬Έμ κ° λμ§ μμ΅λλ€.
μ΄κ²μ΄ λ«ν μ μλ€κ³ λλΌμλκΉ?
@sigmavirus24 νμ¬ λ¬Έμκ° μ¬λ°λ₯΄μ§
κ·Έλ¬λ κ·Έκ²μ λμνμ§ μλλ€λ©΄ μ, λ«μΌμμμ€!
λ¬Έμκ° λ λͺ νν μ μμ΅λλ€. λμκ² (κ·Έλ¦¬κ³ μ΄κ²μ μ μ μΌλ‘ λ΄κ° ν΅μ¬ κ°λ°μμ΄κΈ° λλ¬Έμ) 첫 λ²μ§Έ λ¨λ½μ μμ μλ΅μ μ λ 건λλ¦¬μ§ μμ μ¬μ©μμ 90%μκ² λ§νλ λ°λ©΄, λ λ²μ§Έ λ¨λ½μ "νμ§λ§ μ‘μΈμ€ν΄μΌ νλ κ²½μ° μμ λ°μ΄ν°κ° μμ΅λλ€." λ΄κ° λ§νλ―μ΄, κ·Έκ²μ λμκ² λΆλͺ νμ§λ§ κ·Έκ²μ΄ μ΄λ»κ² λ λͺ νν΄μ§ μ μλμ§ μ μ μμ΅λλ€. μ€λ λ°€μ μμ νκ² μ΅λλ€.
μ μκ²λ "μμ λ°μ΄ν°"λ₯Ό "μμ νμ΄λ‘λ", μ¦ μμΆ ν΄μ λ μ€νΈλ¦ΌμΌλ‘ ν΄μνμ κ²μ
λλ€. νμν λΆλΆλ§ μ½μΌλ©΄ λ©λλ€. μμΆ ν΄μ λ blobμΈ .content
μ λμ‘°μ μΌλ‘(νμ΄λ‘λλ μμ§λ§ λ€λ₯Έ νμμ).
μ€μ μμΆ ν΄μ λ λμκ² HTTP λΌμ΄λΈλ¬λ¦¬μ κ΄μ¬μ¬μ²λΌ λκ»΄μ§λλ€. μμ²μ΄ μΆμνλ κ²μΌλ‘ μμλλ HTTP ꡬν μΈλΆ μ 보μ λλ€. μμ²μμ νμ΄λ‘λλ₯Ό μ€νΈλ¦ΌμΌλ‘ μ½λ 미리 κ°μ Έμ¨ λ°μ΄ν° λ©μ΄λ¦¬λ‘ μ½λ μ°¨μ΄κ° μμ΅λλ€. μ΄λ μͺ½μ΄λ μμ²μ ꡬν μΈλΆ μ 보 'μμΆ'μ μΆμνν©λλ€.
(μ΄ κ°μ μ decode_content
λ₯Ό True
λ‘ κΈ°λ³Έ μ€μ νλΌλ λ΄ μλ μμ²μ ν΅μ¬μ΄κΈ°λ νμ΅λλ€. λ¬Όλ‘ μ΄κ²μ΄ λμΆλ μΆμνλ₯Ό 보μμΌλ―λ‘ λ μ΄μ μ μνμ§ μμ΅λλ€.)
νμ§λ§ λ€, μ¬μ©μμ 99%κ° μ΄ μΈλΆ μ¬νμ μν₯μ λ°μ§ μμ κ²μ΄λΌλ λ° μ λμ μΌλ‘ λμν©λλ€.
μ΄ λ¬Έμ λ₯Ό λ«μΌμμμ€.
κ·Έλμ μ΄κ²μ μ€μ λ‘ νλμ λ΄ λ¨Έλ¦¬ μμμ λ λ€μ©νκ² λ§΄λμμ§λ§ μ€μν API λ³κ²½μ΄ λ κ²μ΄κΈ° λλ¬Έμ μμ§ μ μνμ§ μμ κ²μΌλ‘ μ΄μ΄μ§λλ€.
r.raw
λ λ¬Έμννμ§ μμ κ°μ²΄μ΄κ³ urllib3
μ 곡ν κ°μ²΄μ΄κΈ° λλ¬Έμ μ¬λλ€μκ² r.raw
μ¬μ©νλλ‘ μ μνλ€λ μ¬μ€μ΄ λ§μμ λ€μ§ μμ΅λλ€. ꡬν μΈλΆ μ¬ν). μ΄λ₯Ό μΌλμ λκ³ urllib3
λ©μλμ νλ‘μνλ Response
κ°μ²΄μ λ©μλλ₯Ό μ 곡νλ μμ΄λμ΄λ₯Ό κ°μ§κ³ λμμ΅λλ€( read
λ raw.read
λ±). μ΄κ²μ μ£Όμμ μ°λ¦¬μκ² μΆκ°μ μΈ μ μ°μ±μ μ 곡 urllib3
μ (μ¬μ©μλ₯Ό λμ νμ¬) νΈλ€μ API λ³κ²½ μ°λ¦¬λ₯Ό μ urllib3
κ·Έλμ μ΄λ€μ΄μλ, μμ¬μ μΌλ‘ κ±°μ λ¬Έμ κ°λμ§ μμμ΄μ ( κΈ΄κΈ).
κ·Έλ κΈ΄ νμ§λ§ λ΄ μκ°μλ Response κ°μ²΄μ λν λ©μλκ° μ΄λ―Έ μΆ©λΆνκ³ APIλ₯Ό λ리λ κ²μ μ΄μμ μ΄μ§ μμ΅λλ€. μ΅κ³ μ APIλ μ κ±°ν κ²μ΄ μλ APIμ λλ€. κ·Έλμ λλ μ΄κ²μ λν΄ κ³μ κ²½κ³νκ³ μμ΅λλ€.
μ΄ κ°μ μ λν κΈ°λ³Έ decode_contentλ₯Ό Trueλ‘ μ€μ νλΌλ λ΄ μλ μμ²μ ν΅μ¬μ΄μμ΅λλ€. λ¬Όλ‘ μ΄κ²μ΄ λμΆλ μΆμνλ₯Ό 보μμΌλ―λ‘ λ μ΄μ μ μνμ§ μμ΅λλ€.
μ΄κ²μ λ°κ²¬νκ³ μ΄κ²μ΄ μ μ¬μ€μΈμ§ νμ€νμ§ μμ λ€λ₯Έ μ¬λλ€μ μν΄ μ€λͺ νκ² μ΅λλ€.
μλ΅ κΈΈμ΄λ₯Ό νμΈνκ±°λ μλ΅μΌλ‘ λ€λ₯Έ μ€μν μμ
μ μννκΈ° μν΄ μλ μμΆ ν΄μ λ₯Ό λλ μμ² μ¬μ©μκ° μ¬λ¬ λͺ
μμ΅λλ€. μ μμ μλΉμ μ€ νλλ OpenStackμ
λλ€. λ§μ OpenStack ν΄λΌμ΄μΈνΈλ ν΄λΌμ΄μΈνΈλ‘ μ μ‘λ Content-Length
ν€λμ μμ λ λ³Έλ¬Έμ μ€μ κΈΈμ΄λ₯Ό κ²μ¦ν©λλ€. κ·Έλ€μκ² κ°μ μ²λ¦¬λ μ ν¨ν μλ΅μ μμ νκ³ μ²λ¦¬νκ³ μλμ§ νμΈνκΈ° μν 곡μ ν μ μΆ©μμ
λλ€.
λ λ€λ₯Έ μλΉμλ Betamax(λλ μ€μ λ‘ Response κ°μ²΄λ₯Ό (μ¬)ꡬμ±νλ λͺ¨λ λꡬ)μ λλ€. μμ ν μ ν¨ν μλ΅μ λ§λλ μ 체 νλ‘μΈμ€λ₯Ό μ²λ¦¬ν λ μ½ν μΈ κ° μμΆλ νμμ΄μ΄μΌ νκΈ° λλ¬Έμ λλ€.
@Lukasa λ λ΄κ° μμ§ λͺ»νλ λ€λ₯Έ μ¬λλ€λ μ΄ λμμ ν¬κ² μμ‘΄νλ€κ³ νμ ν©λλ€.
μ€λ κ°μ λ¬Έμ λ₯Ό κ²ͺμκ³ νμ¬λ‘μλ μλ΅μ μ€νΈλ¦¬λ°ν μ μλ λ€λ₯Έ λ°©λ²μ΄ μκΈ° λλ¬Έμ κ°μ κ°μ μ νκ² λμμ΅λλ€.
μ€νλ € μλ΅μμ μ¬λ¬ μλ‘μ΄ λ°©λ²λ³΄λ€ μ μ νλμ μλ‘μ΄ μμ± μλ₯Ό λ€μ΄ response.stream
μ νλ‘μμ κ°μ μν μ°μ£Ό κ²μ΄λ€ .raw
? λν stream=True
μ€μ /맀κ°λ³μλ₯Ό νλ₯νκ² λ―Έλ¬λ§νκ³ νμ¬ .raw
λμμ΄ νμν μ¬μ©μμκ² μν₯μ μ£Όμ§ μμ΅λλ€.
λλ κ³Όκ±°μ μ΄κ²μ νλ€
r = requests.get('url', stream=True)
r.raw.decode_content = True
...
@sigmavirus24μ μν ν΄κ²° λ°©λ² μ μλͺ»λ μ€νμ
μ λ°ννλ tell
λ©μλμ μλ―Έ 체κ³λ₯Ό κΉ¨λ¨ λ¦½λλ€.
tell()
λ₯Ό μ¬μ©νμ¬ λ°©κΈ μ½μ λ°μ΄νΈ μλ₯Ό νμ
νλ Google Cloud Storage APIμ μ¬κ° κ°λ₯ν μ
λ‘λλ‘ μλ΅μ μ€νΈλ¦¬λ°ν λ μ΄ λ¬Έμ κ° λ°μνμ΅λλ€( μ¬κΈ° ).
κ°μ₯ μ μ©ν λκΈ
λλ κ³Όκ±°μ μ΄κ²μ νλ€