爬取斗图网图片
import os
import requests
import re
from urllib import request
import queue
from threading import Thread
# 创建一个先进先出的队列
url_queue = queue.Queue()
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'
}
def get_img():
# 不断去监听 url_queue 队列里面有没有值,如果有值就拿出来进行获取
# 如果 url_queue 为空,那么就不再执行下面的代码
while True:
# 为空,不再执行代码
if url_queue.empty():
return
# 不为空,就获取 url
data = url_queue.get()
req = requests.get(data[0], headers=headers)
con = req.text
# 非贪懒的 ?一定要加在 量词的后面
# * + ? {n} {n,m} {n,}
# 1,用正则匹配到 左边所有的图片区域
img_area = re.search(r'<div class="page-content text-center">(.+?)<div class="text-center">', con, re.DOTALL)
# 2,在 图片区域中 找到所有的 图片链接
srcs = re.findall(r'<img.+?data-original="(.+?)".+?>', img_area.group(1), re.S)
alts = re.findall(r'<img.+?alt="(.+?)".+?>', img_area.group(1), re.S)
# 把每一页的图片 保存 以页码为值的 目录中
# 判读目录是否存在,如果不存在就创建目录
base_dir = os.path.dirname(os.path.abspath(__file__))
dir_path = os.path.join(base_dir, str(data[1]))
if not os.path.exists(dir_path):
os.mkdir(dir_path)
for src, alt in zip(srcs, alts):
try:
filename = alt + os.path.splitext(src)[1]
file_path = os.path.join(dir_path, filename)
request.urlretrieve(src, file_path)
except:
pass
if __name__ == '__main__':
# 1,初始化把 6个页面地址 加入到 队列中
for i in range(1, 7):
url_queue.put([f'https://www.doutula.com/photo/list/?page={i}', i])
# 2,创建3个线程,每个线程去队列中拿地址,知道队列为空
t_list = []
for i in range(0,3):
t = Thread(target=get_img)
t.start()
t_list.append(t)
for i in t_list:
i.join()
优化:将获取网络资源和下载图片分开进行
import os
import requests
import re
from urllib import request
import queue
from threading import Thread
# 创建一个先进先出的队列
url_queue = queue.Queue()
# 创建一个保存图片信息的队列
img_queue = queue.Queue()
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'
}
def get_img():
# 不断去监听 url_queue 队列里面有没有值,如果有值就拿出来进行获取
# 如果 url_queue 为空,那么就不再执行下面的代码
while True:
# 为空,不再执行代码
if url_queue.empty():
return
# 不为空,就获取 url
data = url_queue.get()
req = requests.get(data[0], headers=headers)
con = req.text
# 非贪懒的 ?一定要加在 量词的后面
# * + ? {n} {n,m} {n,}
# 1,用正则匹配到 左边所有的图片区域
img_area = re.search(r'<div class="page-content text-center">(.+?)<div class="text-center">', con, re.DOTALL)
# 2,在 图片区域中 找到所有的 图片链接
srcs = re.findall(r'<img.+?data-original="(.+?)".+?>', img_area.group(1), re.S)
alts = re.findall(r'<img.+?alt="(.+?)".+?>', img_area.group(1), re.S)
# 把每一页的图片 保存 以页码为值的 目录中
# 判读目录是否存在,如果不存在就创建目录
base_dir = os.path.dirname(os.path.abspath(__file__))
dir_path = os.path.join(base_dir, str(data[1]))
if not os.path.exists(dir_path):
os.mkdir(dir_path)
# 把获取到的图片信息保存在 图片队列中
for src, alt in zip(srcs, alts):
img_queue.put([src, alt, dir_path])
# 创建下载图片的函数
def download_img():
# 不断的监听 图片队列中有没有数据,如果有数据,就取出来下载
# 如果没有数据,那就不执行代码
while True:
if url_queue.empty() and img_queue.empty():
return
data = img_queue.get()
try:
filename = data[1] + os.path.splitext(data[0])[1]
file_path = os.path.join(data[2], filename)
request.urlretrieve(data[0], file_path)
except:
pass
if __name__ == '__main__':
# 1,初始化把 6个页面地址 加入到 队列中
for i in range(1, 7):
url_queue.put([f'https://www.doutula.com/photo/list/?page={i}', i])
# 2,创建3个线程,每个线程去队列中拿地址,知道队列为空
t_list = []
for i in range(0,1):
t = Thread(target=get_img)
t.start()
t_list.append(t)
for i in range(0,1):
t = Thread(target=download_img)
t.start()
t_list.append(t)
for i in t_list:
i.join()
print('main')