Python一键珍藏我的动漫妹子们
原创大约 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 一下, 如果中间有意外,可以忽略,