import multiprocessing as mp
import requests,os,re,time,cv2,traceback
from bs4 import BeautifulSoup as Bs
# ฟังก์ชันสำหรับค้นหาใบหน้าภายในรูป
def hana(chuefilerup,idrup):
rup = cv2.imread(chuefilerup,cv2.IMREAD_COLOR)
raisi = cv2.equalizeHist(cv2.cvtColor(rup,cv2.COLOR_BGR2GRAY))
hachoe = cascade.detectMultiScale(raisi,1.1,minSize=(leksut,leksut))
for j,(x,y,w,h) in enumerate(hachoe,1):
baina = rup[y:y+h,x:x+w,:]
chuetem = os.path.join(folderrup,idrup+'_%d.jpg'%j)
if(not os.path.exists(chuetem)):
cv2.imwrite(chuetem,baina)
# ฟังก์ชันค้นรูป
def khonrup(pid):
t0 = time.time()
nathi = int(pid/40)+1
# เปิดไฟล์เพื่อดูว่าภาพไหนมีแล้ว
with open(filemilaeo) as f:
milaeo = [s.split(' ')[0] for s in f.readlines()]
html_nalist = requests.get(url_nalist+'%d'%pid).text
sup_nalist = Bs(html_nalist, 'lxml')
# ค้นหาภาพเล็กในแต่ละหน้า
for thumb in sup_nalist.find_all('span',class_='thumb'):
idrup = thumb['id'][1:] # ไอดีรูป
if(idrup in milaeo):
print('%s มีแล้ว'%idrup)
continue
href = chueweb+thumb.find('a')['href']
html_narup = requests.get(href).text # อ่านหน้าเว็บของรูปนั้น
sup_narup = Bs(html_narup, 'lxml')
url_rup = sup_narup.find('img',id='image')
# ถ้ามีข้อผิดพลาดก็ขึ้นเตือนแล้วข้ามไป
if(not url_rup):
print('หน้า %d รูป %s มีข้อผิดพลาด'%(nathi,idrup))
with open(filephitphlat,'a') as f: # บันทึกไอดีรูปที่มีข้อผิดพลาด
f.write(idrup+'\n')
continue
url_rup = 'https:'+url_rup['src']
tag = sup_narup.find('img',id='image')['alt'] # แท็กทั้งหมดของภาพ
sakunrup = re.findall(r'.(\.\w+)\?',url_rup)[0] # สกุลภาพ
if(sakunrup=='gif'): # ไม่เอาภาพ gif
print('หน้า %d รูป %s เป็น gif'%(nathi,idrup))
continue
chuefilerup = idrup+sakunrup
try:
# อ่านข้อมูลไฟล์ภาพแล้วบันทึก
r = requests.get(url_rup,stream=True,timeout=60)
r.raise_for_status()
with open(chuefilerup,'wb') as f:
for c in r.iter_content(1024):
if c:
f.write(c)
hana(chuefilerup,idrup) # ค้นหาใบหน้าจากในรูป
os.remove(chuefilerup) # หาเจอเสร็จก็ลบทิ้ง
# บันทึกไอดีภาพพร้อมแท็กลงไฟล์
with open(filemilaeo,'a') as f:
f.write(idrup +' '+tag+'\n')
print('หน้า %d รูป %s ผ่านไปแล้ว %.3f นาที'%(nathi,idrup,(time.time()-t0)/60))
except KeyboardInterrupt: # กรณีที่กด ctrl+c เพื่อหยุด ก็ให้หยุด
if os.path.exists(chuefilerup):
os.remove(chuefilerup)
raise KeyboardInterrupt
except Exception: # กรณีที่เกิดข้อผิดพลาดเหนือความคาดหมาย ก็ให้ขึ้นเตือนแต่ก็ยังทำต่อไป
traceback.print_exc()
if os.path.exists(chuefilerup):
os.remove(chuefilerup)
print('หน้า %d รูป %s มีข้อผิดพลาด'%(nathi,idrup))
with open(filephitphlat,'a') as f: # บันทึกไอดีรูปที่มีข้อผิดพลาด
f.write(idrup+'\n')
if(__name__=='__main__'):
cascade_file = 'lbpcascade_animeface.xml'
folderrup = 'rupsaophomfa' # โฟลเดอร์ที่จะบันทึกรูปที่ได้
filemilaeo = 'milaeo.txt' # ไฟล์ที่จะบันทึกไอดีและแท็กของรูปที่มีแล้ว
filephitphlat = 'phitphlat.txt' # ไฟล์ที่เก็บไอดีของรูปที่มีข้อผิดพลาดเอาไว้เพื่อจะลองใหม่
tag_ao = '1girl blue_hair looking_at_viewer' # แท็กที่จะเอา
tag_maiao = '1boy multiple_boys multicolored_hair looking_back chibi hood hat red_hair' # แท็กที่จะกรองออก
leksut = 48 # ขนาดเล็กสุดของรูปใบหน้าที่จะเอา
thila = 4 # จำนวนหน้าที่จะโหลดพร้อมกัน
sutthai = 10000 # จำนวนรูปที่ต้องการ
cascade = cv2.CascadeClassifier(cascade_file)
# ไฟล์หรือโฟลเดอร์ที่ยังไม่มีก็สร้างไว้ก่อน
if not os.path.exists(folderrup):
os.makedirs(folderrup)
if not os.path.exists(filemilaeo):
with open(filemilaeo,'w') as f: 0
if not os.path.exists(filephitphlat):
with open(filephitphlat,'w') as f: 0
chueweb = 'https://safebooru.org/'
url_nalist = chueweb+'index.php?page=post&s=list&tags='
url_nalist += ''.join(['+'+s for s in tag_ao.split()] + ['+-'+s for s in tag_maiao.split()])
url_nalist += '&pid='
p = mp.Pool(processes=thila)
for i in range(0,sutthai+1,thila*40):
p.map(khonrup,range(i,i+thila*40,40))
ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ