Python多線程批量采集圖片的代碼實(shí)現(xiàn)
前言
本文來(lái)介紹如何多線程采集圖片,多線程效率更快,但是,我們單一IP請(qǐng)求過(guò)于頻繁,可能會(huì)被反爬,被封IP,所以,我們就要用到IP代理池,大家可以自己去網(wǎng)上找。
環(huán)境使用
- python 3.9
- pycharm
模塊使用
- requests
模塊介紹
- requests
requests是一個(gè)很實(shí)用的Python HTTP客戶(hù)端庫(kù),爬蟲(chóng)和測(cè)試服務(wù)器響應(yīng)數(shù)據(jù)時(shí)經(jīng)常會(huì)用到,requests是Python語(yǔ)言的第三方的庫(kù),專(zhuān)門(mén)用于發(fā)送HTTP請(qǐng)求,使用起來(lái)比urllib簡(jiǎn)潔很多。
- parsel
parsel是一個(gè)python的第三方庫(kù),相當(dāng)于css選擇器+xpath+re。
parsel由scrapy團(tuán)隊(duì)開(kāi)發(fā),是將scrapy中的parsel獨(dú)立抽取出來(lái)的,可以輕松解析html,xml內(nèi)容,獲取需要的數(shù)據(jù)。
相比于BeautifulSoup,xpath,parsel效率更高,使用更簡(jiǎn)單。
- re
re模塊是python獨(dú)有的匹配字符串的模塊,該模塊中提供的很多功能是基于正則表達(dá)式實(shí)現(xiàn)的,而正則表達(dá)式是對(duì)字符串進(jìn)行模糊匹配,提取自己需要的字符串部分,他對(duì)所有的語(yǔ)言都通用。
- os
os 就是 “operating system” 的縮寫(xiě),顧名思義,os模塊提供的就是各種 Python 程序與操作系統(tǒng)進(jìn)行交互的接口。通過(guò)使用 os 模塊,一方面可以方便地與操作系統(tǒng)進(jìn)行交互,另一方面也可以極大增強(qiáng)代碼的可移植性。
- csv
它是一種文件格式,一般也被叫做逗號(hào)分隔值文件,可以使用 Excel 軟件或者文本文檔打開(kāi) 。其中數(shù)據(jù)字段用半角逗號(hào)間隔(也可以使用其它字符),使用 Excel 打開(kāi)時(shí),逗號(hào)會(huì)被轉(zhuǎn)換為分隔符。csv 文件是以純文本形式存儲(chǔ)了表格數(shù)據(jù),并且在兼容各個(gè)操作系統(tǒng)。
模塊安裝問(wèn)題:
- 如果安裝python第三方模塊:
win + R 輸入 cmd 點(diǎn)擊確定, 輸入安裝命令 pip install 模塊名 (pip install requests) 回車(chē)
在pycharm中點(diǎn)擊Terminal(終端) 輸入安裝命令
- 安裝失敗原因:
- 失敗一: pip 不是內(nèi)部命令
解決方法: 設(shè)置環(huán)境變量
- 失敗二: 出現(xiàn)大量報(bào)紅 (read time out)
解決方法: 因?yàn)槭蔷W(wǎng)絡(luò)鏈接超時(shí), 需要切換鏡像源
清華:https://pypi.tuna.tsinghua.edu.cn/simple ? ? 阿里云:https://mirrors.aliyun.com/pypi/simple/ ? ? 中國(guó)科技大學(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)安裝過(guò)了, 或者安裝成功了, 但是在pycharm里面還是無(wú)法導(dǎo)入
解決方法: 可能安裝了多個(gè)python版本 (anaconda 或者 python 安裝一個(gè)即可) 卸載一個(gè)就好,或者你pycharm里面python解釋器沒(méi)有設(shè)置好。
代碼實(shí)現(xiàn)
什么是代理ip池?
通俗地比喻一下,它就是一個(gè)池子,里面裝了很多代理ip。它有如下的行為特征:
- 池子里的ip是有生命周期的,它們將被定期驗(yàn)證,其中失效的將被從池子里面剔除。
- 池子里的ip是有補(bǔ)充渠道的,會(huì)有新的代理ip不斷被加入池子中。
- 池子中的代理ip是可以被隨機(jī)取出的。
這樣,代理池中始終有多個(gè)不斷更換的、有效的代理ip,且我們可以隨機(jī)從池子中取出代理ip,然后讓爬蟲(chóng)程序使用代理ip訪問(wèn)目標(biāo)網(wǎng)站,就可以避免爬蟲(chó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保存到了一個(gè)文件里面,我們?cè)谡?qǐng)求的時(shí)候加入proxies參數(shù)即可,這里的url就填我們要請(qǐng)求的網(wǎng)址。
批量采集
接下來(lái),我們就進(jìn)入到我們的正式學(xué)習(xí)中,我們今天請(qǐng)求的是某大學(xué)網(wǎng)站,由于涉及到隱私,網(wǎng)址不發(fā)了,這里教一個(gè)思路,其他網(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ù),我這里用時(shí)28秒,我們看看多線程多快。
多線程
我們這里加上多線程,多線程的數(shù)量取決于你的電腦性能,話不多說(shuō),直接上代碼。
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)
我們這里開(kāi)了10個(gè)線程,下載完80張圖片,只要3s,提升了很快,當(dāng)我們的圖片很多的時(shí)候,我們多線程的優(yōu)勢(shì)越來(lái)越明顯。
總結(jié)
有的網(wǎng)站會(huì)限制IP,所以,我們就要用到IP代理池,本文就到這里了。
到此這篇關(guān)于Python多線程批量采集圖片的代碼實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python多線程采集圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(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)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04Python協(xié)程的實(shí)現(xiàn)方式小結(jié)
協(xié)程是Python中強(qiáng)大的并發(fā)編程工具,允許開(kāi)發(fā)者編寫(xiě)異步代碼以提高程序的性能和效率,在本文中,我們將深入探討Python中協(xié)程的實(shí)現(xiàn)方式,包括生成器、asyncio庫(kù)和async/await關(guān)鍵字,我們還會(huì)提供詳細(xì)的示例代碼,幫助您理解和應(yīng)用協(xié)程,需要的朋友可以參考下2023-11-11Django使用中間鍵實(shí)現(xiàn)csrf認(rèn)證詳解
這篇文章主要介紹了Django使用中間鍵實(shí)現(xiàn)csrf認(rèn)證詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07Python 二進(jìn)制字節(jié)流數(shù)據(jù)的讀取操作(bytes與bitstring)
本文主要介紹了Python 二進(jìn)制字節(jié)流數(shù)據(jù)的讀取操作(bytes與bitstring),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03python使用tkinter實(shí)現(xiàn)透明窗體上繪制隨機(jī)出現(xiàn)的小球(實(shí)例代碼)
今天教大家怎么實(shí)現(xiàn)Tkinter透明窗體,在上篇文章給大家介紹過(guò)透明窗體上繪制小球,今天接著通過(guò)實(shí)例代碼給大家分享python使用tkinter實(shí)現(xiàn)透明窗體上繪制隨機(jī)出現(xiàn)的小球的實(shí)例代碼,感興趣的朋友跟隨小編一起看看吧2021-05-05python爬蟲(chóng)中PhantomJS加載頁(yè)面的實(shí)例方法
在本篇文章里小編給大家整理了關(guān)于python爬蟲(chóng)中PhantomJS加載頁(yè)面的實(shí)例方法,有需要的朋友們可以參考下。2020-11-11Python設(shè)計(jì)實(shí)現(xiàn)的計(jì)算器功能完整實(shí)例
這篇文章主要介紹了Python設(shè)計(jì)實(shí)現(xiàn)的計(jì)算器功能,結(jié)合完整實(shí)例形式分析了Python3.5實(shí)現(xiàn)計(jì)算器功能的正則、字符串及數(shù)值運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下2017-08-08