第一部分:普通版本
一.os包的用法
先引入import os
# 如果文件夹不存在,创建文件夹
if not os.path.exists(title):
# 创建文件夹
os.makedirs(title)
二.用urlopen发起请求
发起请求,接收响应
response = request.urlopen(req)
将返回的字节数据 转换为str数据
html = response.read().decode('utf-8')
三.
request.urlretrieve直接根据链接,文件名称,下载图片
request.urlretrieve(src, title + '/' + name)
完整代码:
# -*- coding:utf-8 -*-
# 网络请求包
from urllib import request, parse
# 正则
import re
import os
# 准备url地址
url = 'http://www.ivsky.com/tupian/ziranfengguang/'
# 构建请求对象
req = request.Request(url=url, headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0'
})
# 发起请求,接收响应
response = request.urlopen(req)
# 将返回的字节数据 转换为str数据
html = response.read().decode('utf-8')
# print(html)
# 准备正则
pattern = re.compile('div class="il_img.*?<a href="(.*?)" title="(.*?)"')
# findall()函数 查找所有符合正则的数据
# 返回存放分组元组信息的列表
res = re.findall(pattern, html)
print(res)
# for 循环遍历列表,取出每一个图片分类的链接及标题
for info in res:
link = info[0]
title = info[1]
# 如果文件夹不存在,创建文件夹
if not os.path.exists(title):
# 创建文件夹
os.makedirs(title)
# 拼接完整的详情链接
detail_url = 'http://www.ivsky.com' + link
# 发起请求
response = request.urlopen(detail_url)
# 将数据转换为字符串
detail_html = response.read().decode('utf-8')
# 准备正则
det_pat = re.compile('<div class="il_img.*?<img src="(.*?)"')
# findall()
detail_res = re.findall(det_pat, detail_html)
# print(detail_res)
for src in detail_res:
name = src.split('/')[-1]
print('图片名称:{} 图片链接:{}'.format(name, src))
# 直接根据链接,文件名称,下载图片
request.urlretrieve(src, title + '/' + name)
运行结果:
第二部分:函数版本
完整代码:
# -*- coding:utf-8 -*-
# 网络请求包
from urllib import request, parse
# 正则
import re
import os
# 发送请求接收响应数据
def get_html(url):
"""
根据url地址发送请求,接收响应数据,返回响应数据
:param url: 请求地址
:return: str类型的html源代码
"""
# 构建request对象
req = request.Request(
url=url,
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0'
}
)
# 发起请求 接收响应
response = request.urlopen(req)
# 转换数据
html = response.read().decode('utf-8')
# 返回html源代码
return html
# 根据正则提取详情url和分类标题
def get_detail(html):
"""
根据正则提取详情url和分类标题
:param html: 网页源代码
:return:
"""
# 1.准备正则
pattern = re.compile('div class="il_img.*?<a href="(.*?)" title="(.*?)"')
# 2.提取数据
res = re.findall(pattern, html)
# for 循环遍历
for info in res:
link = info[0]
title = info[1]
path = 'images/' + title
if not os.path.exists(path):
os.makedirs(path)
# 拼接详情url地址
detail_url = "http://www.ivsky.com" + link
# 执行获取图片src/下载图片的函数
get_img_src(detail_url, path)
# 根据正则提取图片地址,下载图片
def get_img_src(url, path):
# 获取详情页的html
html = get_html(url)
pattern = re.compile('<div class="il_img.*?<img src="(.*?)"')
res = re.findall(pattern, html)
# 分割图片名称
for src in res:
print(src)
name = src.split('/')[-1]
# 下载图片
request.urlretrieve(src, path + '/' + name)
# 爬虫的主函数
def main():
url = "http://www.ivsky.com/tupian/ziranfengguang/"
html = get_html(url)
get_detail(html)
# 是否在当前文件直接运行
if __name__ == '__main__':
main()
运行结果:
第三部分:类版本
完整代码
# -*- coding:utf-8 -*-
# 网络请求包
from urllib import request, parse
# 正则
import re
import os
# 风景爬虫类
class IvskySpider(object):
def __init__(self):
# 爬虫的初始地址
self.url = "http://www.ivsky.com/tupian/ziranfengguang/"
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0'
}
self.html = ''
def get_html(self):
# 构建请求对象
req = request.Request(self.url, headers=self.headers)
# 发起请求
response = request.urlopen(req)
# 转换html
html = response.read().decode('utf-8')
# 给对象属性赋值
self.html = html
# return html
# 解析详情链接和title
def parse_detail(self):
# 1.准备正则
pattern = re.compile('div class="il_img.*?<a href="(.*?)" title="(.*?)"')
# 2.提取数据
res = re.findall(pattern, self.html)
# for 循环遍历
for info in res:
link = info[0]
title = info[1]
path = 'images/' + title
if not os.path.exists(path):
# # 切换到images
# os.chdir('images/')
# os.makedirs(title)
os.makedirs(path)
# 拼接详情url地址
detail_url = "http://www.ivsky.com" + link
# 赋值
self.url = detail_url
# 添加属性
self.path = path
# 调用解析下载图片函数
self.parse_src_download()
# 解析详情页面每张图片的链接,并下载存储
def parse_src_download(self):
# 获取详情页面的html源代码
self.get_html()
pattern = re.compile('<div class="il_img.*?<img src="(.*?)"')
res = re.findall(pattern, self.html)
# 分割图片名称
for src in res:
print(src)
name = src.split('/')[-1]
# 下载图片
request.urlretrieve(src, self.path + '/' + name)
# 定义启动爬虫的函数
def start(self):
self.get_html()
self.parse_detail()
if __name__ == '__main__':
ivsky = IvskySpider()
ivsky.start()
运行结果: