2013-07-27 3 views
0

urlparse 명령에 헤더를 추가하는 방법이없는 것 같습니다. 이것은 기본적으로 파이썬이 여러 웹 페이지에 의해 차단되는 기본 사용자 에이전트를 사용하도록합니다. 내가 뭘하려고 기본적으로이에 해당 할 수 있습니다 :Python urlparse에 헤더 추가

req = Request(INPUT_URL,headers={'User-Agent':'Browser Agent'}) 

그러나 사용 urlparse :

나는 그것이 헤더를 적용하려면이 urlparse을 수정하거나 사용할 수있는 방법 그래서
parsed = list(urlparse(INPUT_URL)) 

내가 만든 나의 요청과 함께? 감사합니다. 감사합니다. 내가 무엇입니까 정확한 오류 궁금 사람을위한 또한

:

urllib.error.HTTPError: HTTP Error 403: Forbidden 

이에서 :

urlretrieve(urlunparse(parsed),outpath) 
+1

urlopen urllib.request 수입에서

import contextlib import tempfile from urllib.error import ContentTooShortError 

? 헤더는 요청이 아니라 URL에 추가됩니다. –

+0

내가 여기서 잘못 본 것을 볼 수 있다고 생각합니다. 코드를 다시 작성하고 다시보고하겠습니다. 처음에는 명령에 대한 문서를 읽을 때 크게 혼란에 빠졌다고 생각합니다. –

답변

1

헤더는 URL이 한 부분 인의 요청의 일부입니다. 파이썬은 URL을 urllib.request 함수로 전달할 때 요청을 생성합니다.

Request object을 만드는 것이 목적 및 사용에 헤더를 추가하는 대신 문자열 URL의 :

request = Request(urlunparse(parsed), headers={'User-Agent': 'My own agent string'}) 

그러나, urlretrieve() 코드에서 '레거시 API'로 표시되고 사용을 지원하지 않습니다 Request 개체. 지원하는 몇 줄 제거 '파일 : //'URL을 충분히 쉽게 :

당신이 헤더 URL 파싱과 아무 상관이 생각하는 무슨
_url_tempfiles = [] 
def urlretrieve(url, filename=None, reporthook=None, data=None): 
    with contextlib.closing(urlopen(url, data)) as fp: 
     headers = fp.info() 

     # Handle temporary file setup. 
     if filename: 
      tfp = open(filename, 'wb') 
     else: 
      tfp = tempfile.NamedTemporaryFile(delete=False) 
      filename = tfp.name 
      _url_tempfiles.append(filename) 

     with tfp: 
      result = filename, headers 
      bs = 1024*8 
      size = -1 
      read = 0 
      blocknum = 0 
      if "content-length" in headers: 
       size = int(headers["Content-Length"]) 

      if reporthook: 
       reporthook(blocknum, bs, size) 

      while True: 
       block = fp.read(bs) 
       if not block: 
        break 
       read += len(block) 
       tfp.write(block) 
       blocknum += 1 
       if reporthook: 
        reporthook(blocknum, bs, size) 

    if size >= 0 and read < size: 
     raise ContentTooShortError(
      "retrieval incomplete: got only %i out of %i bytes" 
      % (read, size), result) 

    return result 
+0

@ Rybo : 죄송합니다. 이 모듈이'Request' 객체에서도 작동하도록하기 위해 코드의 포트 마이너스'file : //'지원으로 업데이트되었습니다. –

+0

감사합니다. 제대로 작동 한 것 같습니다. –