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)
如果这篇文章对你有帮助,不妨点个赞哦
(˙˘˙)ᓂ--♡