2021-03-10 Python多线程爬虫快速批量下载图片
Python多線程爬蟲快速批量下載圖片
1、完成這個(gè)需要導(dǎo)入的模塊
urllib,random,queue(隊(duì)列),threading,time,os,json第三方模塊的安裝
鍵盤win+R,輸入cmd,來到命令窗口
對(duì)于urllib模塊,安裝代碼pip install urllib3
?
2、怎樣多線程爬取圖片
首先,我們需要來到這個(gè)網(wǎng)址
https://www.quanjing.com/
然后輸入關(guān)鍵字,來到另外一個(gè)界面,如 我輸入 風(fēng)景
查看一下源代碼,可以發(fā)現(xiàn),這些圖片的下載鏈接應(yīng)該不是直接寫在網(wǎng)址內(nèi)的,我們點(diǎn)擊鼠標(biāo)右鍵,點(diǎn)擊檢查,點(diǎn)擊Network,點(diǎn)擊XHR,按F5刷新,可以發(fā)現(xiàn)XHR下面有這些圖片的下載鏈接。
這樣我們就只需要這個(gè)網(wǎng)址就可以得到這一頁所以圖片的下載鏈接了。
https://www.quanjing.com/Handler/SearchUrl.ashx?t=8102&callback=searchresult&q=%E9%A3%8E%E6%99%AF&stype=1&pagesize=100&pagenum=1&imageType=2&imageColor=&brand=&imageSType=&fr=1&sortFlag=1&imageUType=&btype=&authid=&_=1584067448531
通過多個(gè)這樣的網(wǎng)址進(jìn)行分析可以發(fā)現(xiàn),‘t=’后面的參數(shù)應(yīng)該是一個(gè)四位的隨機(jī)數(shù),‘q=’后面的參數(shù)應(yīng)該是自己輸入圖片的類型,也就是 風(fēng)景,只不過這里對(duì)于它進(jìn)行編碼罷了,‘pagnum=’后面的參數(shù)是第幾頁的意思,網(wǎng)址中**‘pagesize=100’**標(biāo)明每頁應(yīng)該一百張圖片,而總的頁碼數(shù)在這上有
?
最后面的那個(gè)參數(shù)值應(yīng)該是一個(gè)時(shí)間戳,通過處理得到的。
這樣我們就可以得到爬取多頁的圖片了。不過,進(jìn)行爬取的時(shí)候,可以發(fā)現(xiàn),就算得到了這個(gè)網(wǎng)址,也得不到這些數(shù)據(jù),這個(gè)時(shí)候,我們可以來到這個(gè)網(wǎng)址的請(qǐng)求頭那里,通過多次實(shí)驗(yàn)可以發(fā)現(xiàn)只需在請(qǐng)求頭中加上:Referer:即可
這里為了讓服務(wù)器認(rèn)為我們是瀏覽器訪問的,我們可以在請(qǐng)求頭上添加:User-Agent
代碼如下:
def get_time(): # 時(shí)間戳處理 str_time = str(time.time()) str_time = str_time[:str_time.find('.')] + str_time[str_time.find('.') + 1:str_time.find('.') + 4] time.sleep(1.25) # 沒得到一個(gè)時(shí)間戳,休眠1.25秒 return str_time ?????? def get_url(): keyword = input('請(qǐng)輸入你想下載的圖片類型:') key_word = parse.urlencode({'q': keyword}) num=int(input('請(qǐng)輸入你想下載的圖片數(shù)量:'))//100 headers = { "Referer": "https://www.quanjing.com/search.aspx?%s" % (key_word), "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400"} url='https://www.quanjing.com/Handler/SearchUrl.ashx?t=%s&callback=searchresult&%s&stype=1&pagesize=100&pagenum=%s&imageType=2&imageColor=&brand=&imageSType=&fr=1&sortFlag=1&imageUType=&btype=&authid=&_=%s' list_url=[] for i in range(1,num+1): str_1 = str(random.random()) random_1 = str_1[str_1.find('.') + 1:str_1.find('.') + 5] time_1=get_time() url_1=url%(random_1,key_word,i,time_1) list_url.append(url_1) return list_url,headers,keyword?
通過這樣我們就可以得到圖片的下載鏈接了,后面只需多線程下載即可。不過,在多線程下載過程,發(fā)現(xiàn)下載的圖片的數(shù)量遠(yuǎn)遠(yuǎn)低于自己輸入的圖片數(shù)量,其實(shí)這是因?yàn)閳D片同名的原因,我們可以在圖片名稱前面添加一個(gè)隨機(jī)隨機(jī)數(shù)即可;
運(yùn)行:
也許輸入完成之后,會(huì)達(dá)不到自己輸入的圖片數(shù)量程序就自動(dòng)結(jié)束了,建議多試幾次。
完成之后,我們可以查看一下當(dāng)前文件夾下面會(huì)多了一個(gè)文件夾,所下載的圖片就在里面
為了知道我們下載的圖片的數(shù)量,我們可以這樣:
???????
import oslist_1=os.listdir('E:\Pycharm_1\爬蟲\中國')for i in range(len(list_1)): print(i+1,list_1[i])?
運(yùn)行結(jié)果:
這樣就發(fā)現(xiàn)這里有400張圖片。
3、完整代碼如下
import urllib.parse as parse
from urllib import requestimport randomfrom queue import Queueimport threadingimport timeimport jsonimport osdef get_time(): # 時(shí)間戳處理 str_time = str(time.time()) str_time = str_time[:str_time.find('.')] + str_time[str_time.find('.') + 1:str_time.find('.') + 4] time.sleep(1.25) # 沒得到一個(gè)時(shí)間戳,休眠1.25秒 return str_time def get_url(): keyword = input('請(qǐng)輸入你想下載的圖片類型:') key_word = parse.urlencode({'q': keyword}) num=int(input('請(qǐng)輸入你想下載的圖片數(shù)量:'))//100 headers = { "Referer": "https://www.quanjing.com/search.aspx?%s" % (key_word), "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400"} url='https://www.quanjing.com/Handler/SearchUrl.ashx?t=%s&callback=searchresult&%s&stype=1&pagesize=100&pagenum=%s&imageType=2&imageColor=&brand=&imageSType=&fr=1&sortFlag=1&imageUType=&btype=&authid=&_=%s' list_url=[] for i in range(1,num+1): str_1 = str(random.random()) random_1 = str_1[str_1.find('.') + 1:str_1.find('.') + 5] time_1=get_time() url_1=url%(random_1,key_word,i,time_1) list_url.append(url_1) return list_url,headers,keywordtuple_1=get_url()list_url,headers,keyword=tuple_1[0],tuple_1[1],tuple_1[2]queue_url = Queue(len(list_url)*100+5)queue_img = Queue(len(list_url)*100+5) try: # 防止因?yàn)闆]有該圖片類型而報(bào)錯(cuò) num=1 for i in range(len(list_url)): request_1=request.Request(url=list_url[i],headers=headers) content=request.urlopen(request_1) str_1 = content.read().decode('utf-8') # 得到的數(shù)據(jù)字符串類型 str_1 = str_1[str_1.find('(') + 1:str_1.rfind(')')] dict_1 = json.loads(str_1) images_list = dict_1['imglist'] for j in range(len(images_list)): print('【{}】-{}'.format(num, images_list[j]['caption'])) queue_url.put(images_list[j]['imgurl']) queue_img.put(images_list[j]['caption']) num+=1 def Downlad(queue_url: Queue, queue_img: Queue): path_1 = './' + keyword try: os.mkdir(path_1) except: pass finally: while True: if queue_url.empty(): break image_name = queue_img.get() request.urlretrieve(url=queue_url.get(), filename=path_1 + '/【{}】-{}.png'.format(random.random()*1000,image_name)) # 下載圖片 # 為了防止出現(xiàn)圖片名相同的情況,對(duì)于圖片命名添加一個(gè)隨機(jī)數(shù) print('線程{}正在下載【{}】'.format(threading.current_thread().getName(), image_name)) time.sleep(0.25) # 每下載一張圖片,休眠0.25秒 threading_list = [] print('開始下載!') time.sleep(5) for i in range(len(list_url)*5): # 根據(jù)用戶的輸入創(chuàng)建相應(yīng)多的線程 threading_1 = threading.Thread(target=Downlad, args=(queue_url, queue_img,)) threading_1.start() threading_list.append(threading_1) for i in threading_list: i.join() print('------------------------下載完畢!當(dāng)前線程為', threading.current_thread().getName())except Exception as e:????print(e,'沒有搜到該圖片或者今日訪問次數(shù)過多!')?
總結(jié)
以上是生活随笔為你收集整理的2021-03-10 Python多线程爬虫快速批量下载图片的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021-03-09 Matlab RB
- 下一篇: 2021-03-12 Python基础核