【问题标题】:How to implement the equivalent of urllib.urlretrieve in Python 3?如何在 Python 3 中实现 urllib.urlretrieve 的等价物?
【发布时间】:2017-05-19 14:09:06
【问题描述】:

我想使用不同的用户代理从 http://www.apkmirror.com 下载 APK 文件。以下适用于 Python 2:

import urllib

class ApkURLopener(urllib.FancyURLopener):
    version = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36'

urllib._urlopener = ApkURLopener()

download_link = 'https://www.apkmirror.com/wp-content/themes/APKMirror/download.php?id=215041'
download_file = '/tmp/apkmirror_test/youtube.apk'

if __name__ == "__main__":
    urllib.urlretrieve(url=download_link, filename=download_file)

在不使用urllib.request.urlretrieve 的情况下,我很难找到在 Python 3 中执行相同操作的代码,这在未来可能会被弃用。到目前为止,我想出了

#!/usr/bin/python3
import urllib.request

download_link = 'https://www.apkmirror.com/wp-content/themes/APKMirror/download.php?id=215041'
download_file = '/tmp/apkmirror_test/youtube.apk'

USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36'

request = urllib.request.Request(url=download_link, headers={'User-Agent': USER_AGENT})

if __name__ == "__main__":
    response = urllib.request.urlopen(url=request)

我怀疑我应该使用response 对象的write 方法,但我不确定如何使用,或者是否确实是这样做的方法。有什么建议吗?

【问题讨论】:

    标签: python urllib


    【解决方案1】:

    基于Alternative of urllib.urlretrieve in Python 3.5,我完成了Python 3脚本如下:

    #!/usr/bin/python3
    import urllib.request
    import contextlib
    
    download_link = 'https://www.apkmirror.com/wp-content/themes/APKMirror/download.php?id=215041'
    download_file = '/tmp/apkmirror_test/youtube2.apk'
    
    USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36'
    
    request = urllib.request.Request(url=download_link, headers={'User-Agent': USER_AGENT})
    
    if __name__ == "__main__":
        response = urllib.request.urlopen(url=request)
    
        with open(download_file, 'wb') as out_file:
            with contextlib.closing(response) as fp:
                block_size = 1024 * 8
                while True:
                    block = fp.read(block_size)
                    if not block:
                        break
                    out_file.write(block)
    

    【讨论】:

      【解决方案2】:

      这有点老了,但是下面的工作吗?

      import urllib.request as rq, os
      from urllib.parse import urlparse
      
      
      url = "your_url"
      result = urllib.request.urlopen(url)
      result_url = result.url
      result_url_parse = urlparse(result_url)
      result_path = result_url_parse.path
      filename = os.path.basename(result_path)
      download = rq.urlretrieve(url,filename)
      

      【讨论】:

        【解决方案3】:

        您可以使用shutil.copyfileobj() 神奇地从 url 字节流复制到文件。

        import urllib.request
        import shutil
            
        url = "https://www.apkmirror.com/wp-content/themes/APKMirror/download.php?id=215041"    
        output_file = "/tmp/apkmirror_test/youtube.apk"
        user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'
        
        with urllib.request.urlopen(url, headers={'User-Agent': user_agent}) as response, open(output_file, 'wb') as out_file:
          shutil.copyfileobj(response, out_file)
        

        来源:https://stackoverflow.com/a/48691447/1174102

        【讨论】:

          猜你喜欢
          • 2016-05-13
          • 2022-01-24
          • 1970-01-01
          • 2013-12-13
          • 1970-01-01
          • 2011-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多