url请求下载文件的几种方法

1. 一般页面

比如 url = 'http://www.baidu.com/'

下载页面

import urllib.request
url = 'http://www.baidu.com/'
response = urllib.request.urlopen(url=url)

print(response)  # <http.client.HTTPResponse object at 0x0000021C8D0A89E8>
print(type(response))  # <class 'http.client.HTTPResponse'>

# 将响应的页面下载到文件中
# 第二个参数 'w' 表示写入文件中的内容是字符串格式,所以要有第3个参数,指定写入字符串的编码。默认值是'gbk',网页编码在<meta>标签中查看
with open('baidu_index.html', 'w', encoding='utf8') as fp:
    # 写入文件的要对response对象进行二进制读取,之后再以对应编码进行解码
    fp.write(response.read().decode('utf8'))

如果是要下载图片这样的二进制,不能utf8编码,直接以二进制写入文件
比如 url = 'https://wt4u.top/Upload/img/7.jpg'

import urllib.request
url = 'https://wt4u.top/Upload/img/7.jpg'
response = urllib.request.urlopen(url=url)

# 将响应的页面下载到文件中
# 第二个参数 'wb' 不需要第3个参数
with open('mz7.jpg', 'wb') as fp:
    # 写入的文件是响应的二进制读取内容
    fp.write(response.read())

# 这样就在当前目录下生成一个mz7.jpg的文件了

2. 有防盗链的图片

有一些网站的图片有防盗链的机制,比如妹子图
这样下载会报 403 Forbidden 的错误
防盗链是网站检测请求是否来自于我自己的网站,请求头中有一个 Referer 参数
如果要下载,需要在发起请求的时候,带上有 Referer 的请求头,而 urllib.request.urlopen(url=url) 没有 headers 参数
要换成 response = urllib.request.Request(url=url, headers=headers) 创建请求,再 urllib.request.urlopen(response) 发起请求,最后 fp.write(content.read()) 写入二进制文件

import urllib.request

url = 'https://wt4u.top/Upload/img/7.jpg'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36',
    'Referer': 'http://www.meizitu.com'
}

# 创建请求
response = urllib.request.Request(url=url, headers=headers)
# 发起请求
content = urllib.request.urlopen(response)
# 下载图片
with open('01mz71.jpg', 'wb') as fp:
    # 写入的文件是响应的二进制读取内容
    fp.write(content.read())

或者换成 requests 模块的 requests.get(url=url, headers=headers) 方法发起请求,获取响应

import requests
url = 'http://mm.chinasareview.com/wp-content/uploads/2017a/08/01/01.jpg'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36',
    'Referer': 'http://www.meizitu.com'
}
response = requests.get(url=url, headers=headers)
with open('mzt.jpg', 'wb') as fp:
    fp.write(response.content)

# 这样就会在当前目录下生成一个mzt.jpg,即为要下载的图片

3. urllib.request.urlretrieve

此外,urllib.request 有一个更加简单的下载文件的方法叫
urllib.request.urlretrieve(url,filepath)

import urllib.request
# 下载图片
url = 'https://wt4u.top/Upload/img/7.jpg'
filepath = './mz70.jpg'
urllib.request.urlretrieve(url,filepath)

# 下载网页
baidu_url = 'http://www.baidu.com/'
filepath_baidu = './baidu.html'
urllib.request.urlretrieve(baidu_url, filepath_baidu)

4. 【注意】

urlretrieve 方法,因为没有 headers 参数,无法携带Referer,所以同样不能用于下载有防盗链的图片。
下载防盗链的图片,只能用 requests.get(url=url, headers=headers),或者

response = urllib.request.Request(url=url, headers=headers) 
content = urllib.request.urlopen(response)

如果这篇文章对你有帮助,不妨点个赞哦 (˙˘˙)ᓂ--♡

    原文作者:db923c979487
    原文地址: https://www.jianshu.com/p/a865199e8839
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞