爬蟲,爬bing圖片搜索,給定關鍵詞,多線程爬蟲,圖片

後續技術類文檔更新到微信公衆號-------->>喜歡的掃碼關注

在這裏插入圖片描述

爬蟲,爬bing圖片搜索,給定關鍵詞,多線程爬蟲,圖片嘩啦啦的來

在這裏插入圖片描述

#####utf-8
import urllib.request
import urllib.parse
import os
import re
import sys,threading,time
import socket
class Bing:
    def openurl(self,url):
        tml=urllib.request.Request(url)
        tml.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36')
        try:
            response = urllib.request.urlopen(tml)
            html = response.read()
            return html
        except:
            print(sys.exc_info())
            return None
        
    def analysis(self,html):
        jpg=[]
        if html!=True:
            ss=re.findall(r',imgurl:"(http://[^"]+?\.[jpeg]{3,4})&',html)

        return (ss,len(ss))
        
    def savejpg(self,jpglits):
        for x in jpglits:
            tie=x.split("/")
            if not os.path.exists(self.關鍵詞+'//'+tie[-1]):  
                self.下載+=1
                threading.Thread(target=self.save,args=(x,tie[-1])).start()#建立線程 執行下載X鏈接內的圖片任務
            else:
                self.跳過+=1
            
    def save(self,http,tie):
        try:
            socket.setdefaulttimeout(50)#########設置50秒鏈接超時
            urllib.request.urlretrieve(http,self.關鍵詞+'\\'+tie)#下載網頁圖片
            self.完成+=1
        except:
            if  os.path.exists(self.關鍵詞+'\\'+tie):
                os.remove(self.關鍵詞+'\\'+tie)
            print (sys.exc_info()[0],sys.exc_info()[1],http)
            self.跳過+=1
        self.結束+=1

        if self.stop:
            print('還有%d個圖片正在下載!!!!!!\r\n這次共下載 %d張圖片!'%((int(self.下載)-int(self.結束),self.完成)))
            
    def getopen(self):
        self.關鍵詞=input('請輸入關鍵詞')
        self.頁面上限=input('請輸入爬取的頁數')
        self.頁面=0
        self.結束=0
        self.跳過=0
        self.下載=0
        self.完成=0
        jpg=[0,0]
        self.stop=False

        if not os.path.exists(os.getcwd()+'\\'+self.關鍵詞):
            os.makedirs(os.getcwd()+'\\'+self.關鍵詞)
        for each in range(int(self.頁面上限)):
            print('正在爬取第%d頁上一頁%d張圖片'%(each+1,jpg[1]))
            url2 = 'http://cn.bing.com/images/search?&q=%s&FORM=R5IR3&first=%d'%(urllib.parse.quote(self.關鍵詞.encode('utf-8')),self.頁面+1)
            html = self.openurl(url2)
            
            html = html.decode('UTF-8')
           
            jpg=self.analysis(html)
            
            self.savejpg(jpg[0])

            if (int(self.頁面上限)-1)!=each:
            
                self.頁面=self.頁面+jpg[1]
            else:
                self.stop=True
        
        print('總共爬取%d張圖片 些許數量不許 多是網絡等緣由致使下載不成功 爬取結束%d張,還有%d個線程正在運行,共錯誤跳過%d張'%(self.下載,self.結束,self.下載-self.結束,self.跳過))
        print('注意!此時可能有的圖片單個線程還在下載,')

if __name__=='__main__':
    jpgg=Bing()
    jpgg.getopen()