Python利用yield?form實(shí)現(xiàn)異步協(xié)程爬蟲(chóng)
很古老的用法了,現(xiàn)在大多用的aiohttp庫(kù)實(shí)現(xiàn),這篇記錄僅僅用做個(gè)人的協(xié)程底層實(shí)現(xiàn)的學(xué)習(xí)。
爭(zhēng)取用看得懂的字來(lái)描述問(wèn)題。
1.什么是yield
如果還沒(méi)有怎么用過(guò)的話,直接把yield看做成一種特殊的return(PS:本質(zhì) generator(生成器))
return是返回一個(gè)值然后就終斷函數(shù)了,而yield返回的是一個(gè)生成器(PS:不知道的直接看作特殊列表,看下面的代碼案例)
# -*- coding: utf-8 -*- # @Time : 2022/11/10 16:17 # @Author : 紅后 # @Email : not_enabled@163.com # @blog : https://www.cnblogs.com/Red-Sun # @File : 實(shí)例1.py # @Software: PyCharm def main(): ''' 遍歷0到4,這五個(gè)數(shù),并分別打印 ''' for num in range(5): yield num if __name__ == '__main__': for num in main(): print(num) print('-'*50) for num in [0, 1, 2, 3, 4]: print(num)
將它看作列表用for循環(huán)遍歷,就能取出其中的值。
2.yield于列表的區(qū)別
它與原來(lái)列表的區(qū)別就在于,自帶的列表是固定的,而把yield看作列表的話是動(dòng)態(tài)的。
具體案例描述請(qǐng)看代碼及備注(PS:個(gè)人自己描述的,有不對(duì)的地方望各位指點(diǎn))
# -*- coding: utf-8 -*- # @Time : 2022/11/14 13:24 # @Author : 紅后 # @Email : not_enabled@163.com # @blog : https://www.cnblogs.com/Red-Sun # @File : 實(shí)例2.py # @Software: PyCharm def main(): ''' 將yield看作一個(gè)動(dòng)態(tài)列表,從yield左往右為傳出數(shù)據(jù),從又往左為傳入數(shù)據(jù)。 PS:有yield存在的那一行,需要從左往右傳出數(shù)據(jù)跑一遍,數(shù)據(jù)出去以后又要從又往左帶接收的數(shù)據(jù)跑一遍,一共一行跑兩邊(僅作者個(gè)人記憶方法) ''' num1 = yield num2 = yield print(num1, num2) yield num1 + num2 if __name__ == '__main__': a = main() # 第一個(gè)next對(duì)應(yīng)第一個(gè)yield的右邊為空即None,所以動(dòng)態(tài)列表中加入一個(gè)參數(shù)為None,返回值為列表的-1位是None print(next(a)) # [None] # 第二個(gè)通過(guò)send方法傳入一個(gè)數(shù)1,即在上一次停止的地方從右往左傳入?yún)?shù),所以給num1賦值為1.然后繼續(xù)找下一個(gè)yield,其右邊的值依舊為None,加入動(dòng)態(tài)列表,此時(shí)返回值-1位依舊是None print(a.send(1)) # [None, None] # 第三通過(guò)send方法傳入一個(gè)數(shù)2,即在上一次停止的地方從右往左傳入?yún)?shù),所以給num2賦值為2.然后繼續(xù)找下一個(gè)yield,其右邊的值為num1 + num2,此時(shí)num1為1,num2為2,計(jì)算得返回值-1位為3 print(a.send(2)) # [None, None, num1 + num2]
3.yield from 實(shí)現(xiàn)協(xié)程
yield from 后面需要加可迭代對(duì)象
當(dāng)它后面加上生成器(上述所說(shuō)的yield這種)便可以實(shí)現(xiàn)生成的嵌套
- 老板(主程序):調(diào)用委派生成器
- 包工頭(委派生成器):包含yield from表達(dá)式的生成器
- 打工仔(子生成器):生成器函數(shù)
其中委派生成器的作用:在主程序與子生成器之間建立一個(gè)雙向通道。
所謂雙向通道是指,主程序可以將參數(shù)通過(guò)send傳遞給子生成器,子生成器的yield的值也可以直接返回給主函數(shù)。(PS:委派生成器只有創(chuàng)建通道的作用,沒(méi)有攔截?cái)?shù)據(jù)這種功能)
也許有人會(huì)想直接用主程序調(diào)用子生成器不就行了,而對(duì)這的解釋是,使用yield from作為中間過(guò)渡是為了讓它幫我們進(jìn)行異常處理(PS:類似寫(xiě)程序?yàn)榱苏_\(yùn)行加上try一個(gè)道理)
# -*- coding: utf-8 -*- # @Time : 2022/11/10 15:13 # @Author : 紅后 # @Email : not_enabled@163.com # @blog : https://www.cnblogs.com/Red-Sun # @File : coroutines.py # @Software: PyCharm import requests def coroutines_spider(): ''' 子生成器(PS: 打工仔,真正干活的) ''' response = None # 首次激活返回None,后期網(wǎng)頁(yè)響應(yīng)覆蓋 while True: url = yield response response = requests.get(url) def appoint(): ''' 委派生成器,委托子生成器完成具體任務(wù) (PS: 類似包工頭負(fù)責(zé)勞務(wù)派遣) ''' while True: yield from coroutines_spider() # 建立子生成器和主函數(shù)的雙通道 def main(url_list: list): ''' 主函數(shù)(PS: 相當(dāng)于老板,張貼招人啟示) ''' ul = appoint() # 創(chuàng)建委派生成器 next(ul) # 激活它 for url in url_list: response = ul.send(url) # 將url作為參數(shù)傳遞進(jìn)入子生成器中,返回子生成器yield出來(lái)的response print(response.url, response.status_code) # 打印出response中的鏈接和狀態(tài)碼 if __name__ == '__main__': url_list = ['https://www.baidu.com/', 'https://www.4399.com/', 'https://cn.bing.com/', ] main(url_list=url_list)
到此這篇關(guān)于Python利用yield form實(shí)現(xiàn)異步協(xié)程爬蟲(chóng)的文章就介紹到這了,更多相關(guān)Python yield form異步協(xié)程爬蟲(chóng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python7個(gè)爬蟲(chóng)小案例詳解(附源碼)中篇
- Python7個(gè)爬蟲(chóng)小案例詳解(附源碼)上篇
- Python爬蟲(chóng)程序中使用生產(chǎn)者與消費(fèi)者模式時(shí)進(jìn)程過(guò)早退出的問(wèn)題
- Python爬蟲(chóng)庫(kù)urllib的使用教程詳解
- python爬蟲(chóng)之requests庫(kù)使用代理方式
- python?基于aiohttp的異步爬蟲(chóng)實(shí)戰(zhàn)詳解
- Python爬蟲(chóng)框架NewSpaper使用詳解
- 通過(guò)python爬蟲(chóng)mechanize庫(kù)爬取本機(jī)ip地址的方法
- Python爬蟲(chóng)學(xué)習(xí)之requests的使用教程
- python爬蟲(chóng)beautiful?soup的使用方式
- Python爬蟲(chóng)之超級(jí)鷹驗(yàn)證碼應(yīng)用
- Python爬蟲(chóng)Requests庫(kù)的使用詳情
- python爬蟲(chóng)模擬登錄之圖片驗(yàn)證碼實(shí)現(xiàn)詳解
- Python爬蟲(chóng)eval實(shí)現(xiàn)看漫畫(huà)漫畫(huà)柜mhgui實(shí)戰(zhàn)分析
- python爬蟲(chóng)實(shí)戰(zhàn)項(xiàng)目之爬取pixiv圖片
- 使用python爬蟲(chóng)實(shí)現(xiàn)子域名探測(cè)問(wèn)題
- python爬蟲(chóng)之代理ip正確使用方法實(shí)例
- Python7個(gè)爬蟲(chóng)小案例詳解(附源碼)下篇
相關(guān)文章
使用Python3?Boto3包刪除AWS?CloudFormation的棧(Stacks)
這篇文章主要介紹了如何使用Python3?Boto3刪除AWS?CloudFormation的棧(Stacks),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01使用Python?matplotlib繪制簡(jiǎn)單的柱形圖、折線圖和直線圖
Matplotlib是Python的繪圖庫(kù), 它可與NumPy一起使用,提供了一種有效的MatLab開(kāi)源替代方案,下面這篇文章主要給大家介紹了關(guān)于使用Python?matplotlib繪制簡(jiǎn)單的柱形圖、折線圖和直線圖的相關(guān)資料,需要的朋友可以參考下2022-08-08Python利用正則表達(dá)式實(shí)現(xiàn)計(jì)算器算法思路解析
這篇文章主要介紹了Python利用正則表達(dá)式實(shí)現(xiàn)計(jì)算器算法思路解析,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-04-04libreoffice python 操作word及excel文檔的方法
這篇文章主要介紹了libreoffice python 操作word及excel文檔的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07pandas中DataFrame新增行及global變量的使用方式
這篇文章主要介紹了pandas中DataFrame新增行及global變量的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02淺談Python numpy創(chuàng)建空數(shù)組的問(wèn)題
今天遇到一個(gè)小小的問(wèn)題,是關(guān)于numpy創(chuàng)建空數(shù)組,今天特地整理了這篇文章,文中作出了非常詳細(xì)的介紹,對(duì)正在學(xué)習(xí)python的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05