這里我照著生產者和消費者模板自己寫的一個獲取電腦壁紙的demo,
這個demo的消費者的while True 中的判斷那一行
我如果判斷的話,那么他不會執行下面保存圖片的代碼,
如果沒有加這個判斷,那么他就會下載,但是操作臺上不會自動結束,
哪位大佬能幫我解決一下這個自動結束啊,
import requests
from lxml import etree
from urllib import request
from queue import Queue
import os
import threading
HEASERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
}
# 生產者
class Producer(threading.Thread):
domain_name = 'http://www.netbian.com'
def __init__(self,page_queue,img_queue,*args,**kwargs):
super(Producer,self).__init__(*args,**kwargs)
self.page_queue = page_queue
self.img_queue = img_queue
def run(self):
while True:
if self.page_queue.empty():
break
url = self.page_queue.get()
self.get_detail_urls(url)
# 獲取第一個頁面下的圖片地址
def get_detail_urls(self,url):
response = requests.get(url=url, headers=HEASERS)
text = response.text
html = etree.HTML(text)
lis = html.xpath('//div[@class="list"]//li//a[@href]')
for li in lis:
href = li.get('href')
# self.img_queue.put(self.domain_name + href)
self.set_detail_urls(self.domain_name+href)
# 獲取第二個頁面下高清圖片地址
def set_detail_urls(self,url):
response = requests.get(url=url, headers=HEASERS)
text = response.content.decode('gbk')
html = etree.HTML(text)
lis = html.xpath('//div[@class="pic"]//img[@src]')
for li in lis:
src = li.get('src')
alt = li.get('alt')
suffix = os.path.splitext(src)[1]
self.img_queue.put((src,alt+suffix))
# print(self.page_queue.qsize())
# print(self.img_queue.qsize())
# 消費者下載
class Consumer(threading.Thread):
def __init__(self,page_queue,img_queue,*args,**kwargs):
super(Consumer,self).__init__(*args,**kwargs)
self.page_queue = page_queue
self.img_queue = img_queue
# 獲取img_queue佇列里的資料
def run(self):
while True:
if self.page_queue.empty() and self.img_queue.empty():
break
url, alt = self.img_queue.get()
request.urlretrieve(url, 'imgs/' + alt)
print(alt + ' 下載完成!')
def main():
# 創建兩個佇列 一個生產,一個消費
page_queue = Queue(100)
img_queue = Queue(1000)
base_url = 'http://www.netbian.com/e/sch/index.php?page={}&keyboard=%B6%AF%C2%FE&totalnum=1062'
for x in range(0,1):
url = base_url.format(x)
page_queue.put(url)
for x in range(5):
t = Producer(page_queue,img_queue)
t.start()
for x in range(5):
t = Consumer(page_queue,img_queue)
t.start()
if __name__ == '__main__':
main()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/132431.html
上一篇:python sklearn
