一.分析代码
作者试着直接用正则匹配需要的图片地址并没有成功,多次尝试和查阅资料后选择先匹配含有图片的div中所有内容,然后在匹配图片地址可以成功。
二.代码展示
import urllib.request
import urllib.parse
import re
import os
def handle_request(url, page):
url = url+str(page)
# print(url)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36',
}
request = urllib.request.Request(url=url, headers=headers)
return request
def download_image(content):
pattern1 = re.compile(r'<div class="j-r-list-c-img">(.*?)</div>', re.S) # 先把带有图片的div中所有内容匹配出来
lt = pattern1.findall(content)
# print(lt)
# 遍历列表,继续匹配图片的url地址,依次下载图片
for image_src in lt:
# print(image_src)
url_pattern = re.compile(r'data-original="(.*?)".*?', re.S)
image_url = url_pattern.findall(image_src)[0] # image_url是一个元素的列表格式必须要str格式才行,所以取巧用切片
print(image_url)
# 判断/创建文件夹
dirname = 'imagedir'
if not os.path.exists(dirname):
os.mkdir(dirname)
# 保存的图片名
filename = image_url.split('/')[-1]
filepath = dirname + '/' + filename
print("图片%s正在下载···" % filename)
urllib.request.urlretrieve(image_url, filepath)
print("图片%s下载完毕···" % filename)
def main():
url = 'http://www.budejie.com/pic/'
start_page = int(input("起始页码:"))
end_page = int(input("结束页码:"))
for page in range(start_page, end_page+1):
print("第 %s 页开始下载······" % page)
# 生成请求对象
request = handle_request(url, page)
# 发送请求获取响应内容
content=urllib.request.urlopen(request).read().decode()
# 解析内容,提取所有的图片链接,下载图片
download_image(content)
print("第 %s 页下载完毕······" % page)
print()
print()
print()
if __name__ == '__main__':
main()