2021-03-10 Python多线程爬虫快速批量下载图片
Python多線程爬蟲快速批量下載圖片
1、完成這個需要導入的模塊
urllib,random,queue(隊列),threading,time,os,json第三方模塊的安裝
鍵盤win+R,輸入cmd,來到命令窗口
對于urllib模塊,安裝代碼pip install urllib3
?
2、怎樣多線程爬取圖片
首先,我們需要來到這個網址
https://www.quanjing.com/
然后輸入關鍵字,來到另外一個界面,如 我輸入 風景
查看一下源代碼,可以發現,這些圖片的下載鏈接應該不是直接寫在網址內的,我們點擊鼠標右鍵,點擊檢查,點擊Network,點擊XHR,按F5刷新,可以發現XHR下面有這些圖片的下載鏈接。
這樣我們就只需要這個網址就可以得到這一頁所以圖片的下載鏈接了。
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
通過多個這樣的網址進行分析可以發現,‘t=’后面的參數應該是一個四位的隨機數,‘q=’后面的參數應該是自己輸入圖片的類型,也就是 風景,只不過這里對于它進行編碼罷了,‘pagnum=’后面的參數是第幾頁的意思,網址中**‘pagesize=100’**標明每頁應該一百張圖片,而總的頁碼數在這上有
?
最后面的那個參數值應該是一個時間戳,通過處理得到的。
這樣我們就可以得到爬取多頁的圖片了。不過,進行爬取的時候,可以發現,就算得到了這個網址,也得不到這些數據,這個時候,我們可以來到這個網址的請求頭那里,通過多次實驗可以發現只需在請求頭中加上:Referer:即可
這里為了讓服務器認為我們是瀏覽器訪問的,我們可以在請求頭上添加:User-Agent
代碼如下:
def get_time(): # 時間戳處理 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) # 沒得到一個時間戳,休眠1.25秒 return str_time ?????? def get_url(): keyword = input('請輸入你想下載的圖片類型:') key_word = parse.urlencode({'q': keyword}) num=int(input('請輸入你想下載的圖片數量:'))//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?
通過這樣我們就可以得到圖片的下載鏈接了,后面只需多線程下載即可。不過,在多線程下載過程,發現下載的圖片的數量遠遠低于自己輸入的圖片數量,其實這是因為圖片同名的原因,我們可以在圖片名稱前面添加一個隨機隨機數即可;
運行:
也許輸入完成之后,會達不到自己輸入的圖片數量程序就自動結束了,建議多試幾次。
完成之后,我們可以查看一下當前文件夾下面會多了一個文件夾,所下載的圖片就在里面
為了知道我們下載的圖片的數量,我們可以這樣:
???????
import oslist_1=os.listdir('E:\Pycharm_1\爬蟲\中國')for i in range(len(list_1)): print(i+1,list_1[i])?
運行結果:
這樣就發現這里有400張圖片。
3、完整代碼如下
import urllib.parse as parse
from urllib import requestimport randomfrom queue import Queueimport threadingimport timeimport jsonimport osdef get_time(): # 時間戳處理 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) # 沒得到一個時間戳,休眠1.25秒 return str_time def get_url(): keyword = input('請輸入你想下載的圖片類型:') key_word = parse.urlencode({'q': keyword}) num=int(input('請輸入你想下載的圖片數量:'))//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: # 防止因為沒有該圖片類型而報錯 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') # 得到的數據字符串類型 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)) # 下載圖片 # 為了防止出現圖片名相同的情況,對于圖片命名添加一個隨機數 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): # 根據用戶的輸入創建相應多的線程 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('------------------------下載完畢!當前線程為', threading.current_thread().getName())except Exception as e:????print(e,'沒有搜到該圖片或者今日訪問次數過多!')?
總結
以上是生活随笔為你收集整理的2021-03-10 Python多线程爬虫快速批量下载图片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021-03-09 Matlab RB
- 下一篇: 2021-03-12 Python基础核