|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 eeffve 于 2022-1-29 14:28 编辑
"""
Author:某
Time:2022/1/29 11:09
"""
# 线程池
from concurrent.futures import ThreadPoolExecutor
# 进程和进程队列
from multiprocessing import Queue, Process
from lxml import etree
import requests
import os
def all_p(num):
"""
解析htlm网页,并添加到进程队列中。
:param num: 页数
:return: 无
"""
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}
http = requests.get(f'https://mmzztt.com/photo/page/{num}/', headers=headers)
http.encoding = http.apparent_encoding
# xpath解析
html = etree.HTML(http.text)
# 找到每个标签
all_li = html.xpath('//main/ul/li')
b2s = []
for li in all_li:
# 图片
tu = li.xpath('./div[@class="uk-card"]/div[@class="uk-card-media-top"]/a/img/@data-srcset')[0]
# 名字
name = li.xpath('./div[@class="uk-card"]/div[@class="uk-card-media-top"]/a/img/@alt')[0]
b2s.append([name, (requests.get(tu, headers=headers).content)])
# 添加到进程队列
q.put(b2s)
def writes(q):
"""
写入本地图片
:param q: 进程队列
:return: 无
"""
# 创建文件夹
if not os.path.exists('美女'):
os.mkdir('美女')
# 写入文件
while True:
img = q.get()
# 判断结束
if img == 'end':
break
for i in img:
if len(i) == 2:
# 写入图片到本地
try:
open(f'美女/{i[0]}.jpg', 'wb').write(i[1])
except FileNotFoundError:
s = i[0].replace('/', ',')
open(f'美女/{s}.jpg', 'wb').write(i[1])
# 进程队列
q = Queue()
if __name__ == '__main__':
# 创建20个线程池
pool = ThreadPoolExecutor(20)
pool.map(all_p, range(1, 38))
# 创建一个进程专门写入文件
p = Process(target=writes, args=(q,))
# 开始执行
p.start()
# 结束添加‘end’,用于判断
pool.shutdown()
q.put('end')
|
-
-
改成标题
评分
-
查看全部评分
|