code: async def _download_web_document(cls, web, file, progress_callback):
          
          if not aiohttp:
              raise ValueError(
                  'Cannot download web documents without the aiohttp '
                  'dependency install it (pip install aiohttp)'
              )
  
          # TODO Better way to get opened handles of files and auto-close
          in_memory = file is bytes
          if in_memory:
              f = io.BytesIO()
          elif isinstance(file, str):
              kind, possible_names = cls._get_kind_and_names(web.attributes)
              file = cls._get_proper_filename(
                  file, kind, utils.get_extension(web),
                  possible_names=possible_names
              )
              f = open(file, 'wb')
          else:
              f = file
  
          try:
              with aiohttp.ClientSession() as session:
                  # TODO Use progress_callback; get content length from response
                  # https://github.com/telegramdesktop/tdesktop/blob/c7e773dd9aeba94e2be48c032edc9a78bb50234e/Telegram/SourceFiles/ui/images.cpp#L1318-L1319
                  async with session.get(web.url) as response:
                      while True:
                          chunk = await response.content.read(128 * 1024)
                          if not chunk:
                              break
                          f.write(chunk)
          finally:
              if isinstance(file, str) or file is bytes:
                  f.close()
  
          return f.getvalue() if in_memory else file
docs: Specialized version of .download_media() for web documents.