2013-07-27 2 views
0

Невозможно добавить заголовки в команду urlparse. Это по существу заставляет Python использовать свой пользовательский агент по умолчанию, который блокируется несколькими веб-страницами. То, что я пытаюсь сделать, это по существу сделать эквивалент этого:Python Добавление заголовков в urlparse

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

Но использование urlparse:

parsed = list(urlparse(INPUT_URL)) 

Так как я могу изменить это urlparse для того, чтобы принять заголовки, или быть полезной с моим запросом, который я создал? Любая помощь приветствуется, спасибо.

Кроме того, для тех, кто интересно точную ошибку я получаю:

urllib.error.HTTPError: HTTP Error 403: Forbidden 

При этом:

urlretrieve(urlunparse(parsed),outpath) 
+1

Что заставляет вас думать, заголовки имеют ничего общего с URL разбором? Заголовки добавляются к запросу, а не к URL-адресу. –

+0

Думаю, я могу увидеть, где я здесь ошибся, я быстро переработаю свой код и отчитаюсь. Я думаю, что я сильно испортился, когда я первоначально читал документацию для этой команды. –

ответ

1

Заголовки являются частью запроса, из которых URL является одна часть. Python создает запрос для вас, когда вы передаете только URL-адрес urllib.request.

Создать Request object, добавить заголовки к этому объекту и использованию, что вместо строки URL:

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

Однако urlretrieve() обозначенный как «унаследованное API» в коде и не поддерживает использование Request объект. Удаление несколько строк ПОДДЕРЖКИ файла: // 'URL достаточно легко:

import contextlib 
import tempfile 
from urllib.error import ContentTooShortError 

из urllib.request импорта urlopen

_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: Ой, вы правы. Обновлен с портом кода минус поддержка 'file: //', чтобы эта работа работала с объектом 'Request'. –

+0

Кажется, что он работал правильно, спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^