风萧萧兮易水寒

Python一键珍藏我的动漫妹子们

前言

获取点动漫图片,还要一张一张保存,这多难受.
话不多说,练练手

分析

获取图片步骤:

  1. 找到图片来源网站
  2. 分析网站页面数据结构
  3. 分析下一页结果
  4. 分析数据处理
  5. 保存

本次找到的图片来源是http://pic.netbian.com/4kdongman/index.html
都是高清4k动漫大妹子

然后F12找到图片位置的标签等,然后使用正则匹配

点击下一个看到,后缀 index_2 index_3 所以,下一页数据只需要下划线加本页页数即可

开鲁代码

展示真正的技术

# -*- coding=gbk -*-
# @Author: GMaya
# 爬取动漫图片,嘎嘎

import requests, time, re

# 1.创建会话对象
session = requests.session()


# 获取目标网页结果
def get_result(url):
    # 请求接口
    result = session.get(url)
    # 编码格式
    result.encoding = 'gbk'
    """ 正则表达式,匹配对应数据
        注意:href="(.*?)" , 如果 .*? 被括号包裹, 则输出括号内的内容
            如果没有括号, 则输出整个匹配的内容
        """
    res = """<a href="(.*?)" target="_blank"><img src=".*?" alt=".*?" /><b>.*?</b></a>"""
    # 匹配符合正则内容
    return re.findall(res, result.text)


# 解析详情页数据
def two_result(contents):
    for con in contents:
        # 去第详情页,获取清晰度比较高的图片
        result2 = session.get('http://pic.netbian.com/' + con)
        result2.encoding = 'gbk'
        res2 = """<a href="" id="img"><img src="(.*?)" data-pic=".*?" alt="(.*?)" title=".*?"></a>"""
        # 匹配符合正则内容
        contents2 = re.findall(res2, result2.text)
        # 真正处理数据并保存
        save_result(contents2)


# 真正处理数据并保存
def save_result(contents2):
    for con2 in contents2:
        path = con2[0]  # 图片真正的高清图片地址
        name = con2[1]  # 图片名称
        # 拼接最后的图片地址,然后保存
        result3 = session.get('http://pic.netbian.com/' + path)
        file = 'D:\download\dongmanImg\%s.jpg' % name
        # wb : 以二进制格式打开一个文件只用于写入。一般用于非文本文件如图片等。
        with open(file, 'wb') as f:
            f.write(result3.content)
        # 安全点就等待0.5秒再次爬取
        time.sleep(0.5)


if __name__ == '__main__':
    print('下载动漫图片开始--------------')
    # 爬取前一百页内容
    pageno = 100
    # 1.请求网页,获取结果
    for i in range(1, pageno):
        print('解析处理第%d页数据 请稍等...' % i)
        # 第一个和其他页有点不同,所以分开处理
        url = ''
        if i == 1:
            url = "http://pic.netbian.com/4kdongman/index.html"
        else:
            url = "http://pic.netbian.com/4kdongman/index_%d.html" % i

        # 得到网页响应结果
        result = get_result(url)
        # 处理详情页数据
        two_result(result)
        print('第%d页数据共%d个,处理完毕.' % (i, len(result)))
        # 每次请求间隔0.5秒
        time.sleep(0.5)

    print('下载动漫图片结束--------------')

喝陪咖啡,静等一会

说明: 只是用作技术练习.请勿恶意使用

多线程爬取

上面单线程爬取了两杯咖啡时间, 到30页的时候,我停止了,太慢了,咋办,多线程搞上!

# -*- coding=gbk -*-
# @Author: GMaya
# 爬取动漫图片,多线程例子

import requests, time, re
import threading

# 1.创建会话对象
session = requests.session()


# 获取目标网页结果
def get_result(url):
    # 请求接口
    result = session.get(url)
    # 编码格式
    result.encoding = 'gbk'
    """ 正则表达式,匹配对应数据
        注意:href="(.*?)" , 如果 .*? 被括号包裹, 则输出括号内的内容
            如果没有括号, 则输出整个匹配的内容
        """
    res = """<a href="(.*?)" target="_blank"><img src=".*?" alt=".*?" /><b>.*?</b></a>"""
    # 匹配符合正则内容
    return re.findall(res, result.text)


# 解析详情页数据
def two_result(contents):
    for con in contents:
        # 去第详情页,获取清晰度比较高的图片
        result2 = session.get('http://pic.netbian.com/' + con)
        result2.encoding = 'gbk'
        res2 = """<a href="" id="img"><img src="(.*?)" data-pic=".*?" alt="(.*?)" title=".*?"></a>"""
        # 匹配符合正则内容
        contents2 = re.findall(res2, result2.text)
        # 真正处理数据并保存
        save_result(contents2)


# 真正处理数据并保存
def save_result(contents2):
    for con2 in contents2:
        path = con2[0]  # 图片真正的高清图片地址
        name = con2[1]  # 图片名称
        # 拼接最后的图片地址,然后保存
        result3 = session.get('http://pic.netbian.com/' + path)
        file = 'D:\download\dongmanThreadImg\%s.jpg' % name
        # wb : 以二进制格式打开一个文件只用于写入。一般用于非文本文件如图片等。
        with open(file, 'wb') as f:
            f.write(result3.content)
        # 安全点就等待0.5秒再次爬取
        time.sleep(0.5)


# 创建线程类
class myThread(threading.Thread):
    def __init__(self, threadID, name, url):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.url = url

    def run(self):
        print("开始线程:" + self.name)

        try:
            # 得到网页响应结果
            result = get_result(self.url)
            # 处理详情页数据
            two_result(result)
        except Exception:
            print('线程出现意外....' + self.name)
        print("退出线程:" + self.name)


if __name__ == '__main__':
    print('下载动漫图片开始--------------')
    # 爬取前一百页内容
    pageno = 100
    # 1.请求网页,获取结果
    for i in range(1, pageno):
        print('解析处理第%d页数据 请稍等...' % i)
        # 第一个和其他页有点不同,所以分开处理
        url = ''
        if i == 1:
            url = "http://pic.netbian.com/4kdongman/index.html"
        else:
            url = "http://pic.netbian.com/4kdongman/index_%d.html" % i
        # 开启线程,爬取几页就开启几个线程,量力而行
        myThread(i, "thread-" + str(i), url).start()
    # 每次请求间隔0.5秒
    time.sleep(0.5)

print('下载动漫图片结束--------------')

秒开100线程,每个线程独自爬取,这还没反应过来, 就结束了,
我只能说好快

提示:最好还是把代码try 一下, 如果中间有意外,可以忽略,

坚持原创技术分享,您的支持将鼓励我继续创作!