後續技術類文檔更新到微信公衆號-------->>喜歡的掃碼關注
爬蟲,爬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()