Python多線程批量采集圖片的代碼實現(xiàn)
前言
本文來介紹如何多線程采集圖片,多線程效率更快,但是,我們單一IP請求過于頻繁,可能會被反爬,被封IP,所以,我們就要用到IP代理池,大家可以自己去網(wǎng)上找。
環(huán)境使用
- python 3.9
- pycharm
模塊使用
- requests
模塊介紹
- requests
requests是一個很實用的Python HTTP客戶端庫,爬蟲和測試服務(wù)器響應(yīng)數(shù)據(jù)時經(jīng)常會用到,requests是Python語言的第三方的庫,專門用于發(fā)送HTTP請求,使用起來比urllib簡潔很多。
- parsel
parsel是一個python的第三方庫,相當于css選擇器+xpath+re。
parsel由scrapy團隊開發(fā),是將scrapy中的parsel獨立抽取出來的,可以輕松解析html,xml內(nèi)容,獲取需要的數(shù)據(jù)。
相比于BeautifulSoup,xpath,parsel效率更高,使用更簡單。
- re
re模塊是python獨有的匹配字符串的模塊,該模塊中提供的很多功能是基于正則表達式實現(xiàn)的,而正則表達式是對字符串進行模糊匹配,提取自己需要的字符串部分,他對所有的語言都通用。
- os
os 就是 “operating system” 的縮寫,顧名思義,os模塊提供的就是各種 Python 程序與操作系統(tǒng)進行交互的接口。通過使用 os 模塊,一方面可以方便地與操作系統(tǒng)進行交互,另一方面也可以極大增強代碼的可移植性。
- csv
它是一種文件格式,一般也被叫做逗號分隔值文件,可以使用 Excel 軟件或者文本文檔打開 。其中數(shù)據(jù)字段用半角逗號間隔(也可以使用其它字符),使用 Excel 打開時,逗號會被轉(zhuǎn)換為分隔符。csv 文件是以純文本形式存儲了表格數(shù)據(jù),并且在兼容各個操作系統(tǒng)。
模塊安裝問題:
- 如果安裝python第三方模塊:
win + R 輸入 cmd 點擊確定, 輸入安裝命令 pip install 模塊名 (pip install requests) 回車
在pycharm中點擊Terminal(終端) 輸入安裝命令
- 安裝失敗原因:
- 失敗一: pip 不是內(nèi)部命令
解決方法: 設(shè)置環(huán)境變量
- 失敗二: 出現(xiàn)大量報紅 (read time out)
解決方法: 因為是網(wǎng)絡(luò)鏈接超時, 需要切換鏡像源
清華:https://pypi.tuna.tsinghua.edu.cn/simple ? ? 阿里云:https://mirrors.aliyun.com/pypi/simple/ ? ? 中國科技大學(xué) https://pypi.mirrors.ustc.edu.cn/simple/ ? ? 華中理工大學(xué):https://pypi.hustunique.com/ ? ? 山東理工大學(xué):https://pypi.sdutlinux.org/ ? ? 豆瓣:https://pypi.douban.com/simple/ ? ? 例如:pip3 install -i https://pypi.doubanio.com/simple/ 模塊名
- 失敗三: cmd里面顯示已經(jīng)安裝過了, 或者安裝成功了, 但是在pycharm里面還是無法導(dǎo)入
解決方法: 可能安裝了多個python版本 (anaconda 或者 python 安裝一個即可) 卸載一個就好,或者你pycharm里面python解釋器沒有設(shè)置好。
代碼實現(xiàn)
什么是代理ip池?
通俗地比喻一下,它就是一個池子,里面裝了很多代理ip。它有如下的行為特征:
- 池子里的ip是有生命周期的,它們將被定期驗證,其中失效的將被從池子里面剔除。
- 池子里的ip是有補充渠道的,會有新的代理ip不斷被加入池子中。
- 池子中的代理ip是可以被隨機取出的。
這樣,代理池中始終有多個不斷更換的、有效的代理ip,且我們可以隨機從池子中取出代理ip,然后讓爬蟲程序使用代理ip訪問目標網(wǎng)站,就可以避免爬蟲被ban的情況。
如何使用呢?
import requests f = open('IP.txt',"r") file = f.readline item = [] for proxies in file: proxies =eval(proxies.replace('','')) item.append(proxies) proxies = random.choice(item) response = requests.get(url=url,headers=headers,proxies=proxies) print(response)
我們這里先是把IP保存到了一個文件里面,我們在請求的時候加入proxies參數(shù)即可,這里的url就填我們要請求的網(wǎng)址。
批量采集
接下來,我們就進入到我們的正式學(xué)習(xí)中,我們今天請求的是某大學(xué)網(wǎng)站,由于涉及到隱私,網(wǎng)址不發(fā)了,這里教一個思路,其他網(wǎng)站也是一樣的。
單線程
我們先試試單線程采集80張圖片需要多少秒?
import re import requests import datetime urls = [] startime = datetime.datetime.now() def download(url): name = re.findall('(\d+).jpg',url)[0] img_content = requests.get(url=url).content with open('img\' +name+'.jpeg', mode='wb') as f: f.write(img_content) for i in range(1,80): url = f"http://**********/student/{i}.jpg" urls.append(url) for url in urls: download(url) endtime = datetime.datetime.now() print((endtime-startime).seconds)
我們這里就是把我們所有要下載的地址遍歷到urls里面去,然后執(zhí)行下載圖片函數(shù),我這里用時28秒,我們看看多線程多快。
多線程
我們這里加上多線程,多線程的數(shù)量取決于你的電腦性能,話不多說,直接上代碼。
from concurrent.futures import ThreadPoolExecutor import re import requests import datetime urls = [] startime = datetime.datetime.now() def download(url): name = re.findall('(\d+).jpg',url)[0] img_content = requests.get(url=url).content with open('img\' +name+'.jpeg', mode='wb') as f: f.write(img_content) for i in range(1,80): url = f"http://**********/student/{i}.jpg" urls.append(url) with ThreadPoolExecutor(max_workers=10) as executor: for url in urls: executor.submit(download,url) endtime = datetime.datetime.now() print((endtime-startime).seconds)
我們這里開了10個線程,下載完80張圖片,只要3s,提升了很快,當我們的圖片很多的時候,我們多線程的優(yōu)勢越來越明顯。
總結(jié)
有的網(wǎng)站會限制IP,所以,我們就要用到IP代理池,本文就到這里了。
到此這篇關(guān)于Python多線程批量采集圖片的代碼實現(xiàn)的文章就介紹到這了,更多相關(guān)Python多線程采集圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python調(diào)用java模塊SmartXLS和jpype修改excel文件的方法
這篇文章主要介紹了python調(diào)用java模塊SmartXLS和jpype修改excel文件的方法,涉及Python調(diào)用java模塊的相關(guān)技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04Python協(xié)程的實現(xiàn)方式小結(jié)
協(xié)程是Python中強大的并發(fā)編程工具,允許開發(fā)者編寫異步代碼以提高程序的性能和效率,在本文中,我們將深入探討Python中協(xié)程的實現(xiàn)方式,包括生成器、asyncio庫和async/await關(guān)鍵字,我們還會提供詳細的示例代碼,幫助您理解和應(yīng)用協(xié)程,需要的朋友可以參考下2023-11-11Python 二進制字節(jié)流數(shù)據(jù)的讀取操作(bytes與bitstring)
本文主要介紹了Python 二進制字節(jié)流數(shù)據(jù)的讀取操作(bytes與bitstring),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03python使用tkinter實現(xiàn)透明窗體上繪制隨機出現(xiàn)的小球(實例代碼)
今天教大家怎么實現(xiàn)Tkinter透明窗體,在上篇文章給大家介紹過透明窗體上繪制小球,今天接著通過實例代碼給大家分享python使用tkinter實現(xiàn)透明窗體上繪制隨機出現(xiàn)的小球的實例代碼,感興趣的朋友跟隨小編一起看看吧2021-05-05Python設(shè)計實現(xiàn)的計算器功能完整實例
這篇文章主要介紹了Python設(shè)計實現(xiàn)的計算器功能,結(jié)合完整實例形式分析了Python3.5實現(xiàn)計算器功能的正則、字符串及數(shù)值運算等相關(guān)操作技巧,需要的朋友可以參考下2017-08-08