Python利用yield?form實現(xiàn)異步協(xié)程爬蟲
很古老的用法了,現(xiàn)在大多用的aiohttp庫實現(xiàn),這篇記錄僅僅用做個人的協(xié)程底層實現(xiàn)的學習。
爭取用看得懂的字來描述問題。
1.什么是yield
如果還沒有怎么用過的話,直接把yield看做成一種特殊的return(PS:本質 generator(生成器))
return是返回一個值然后就終斷函數(shù)了,而yield返回的是一個生成器(PS:不知道的直接看作特殊列表,看下面的代碼案例)
# -*- coding: utf-8 -*-
# @Time : 2022/11/10 16:17
# @Author : 紅后
# @Email : not_enabled@163.com
# @blog : https://www.cnblogs.com/Red-Sun
# @File : 實例1.py
# @Software: PyCharm
def main():
'''
遍歷0到4,這五個數(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ū)別
它與原來列表的區(qū)別就在于,自帶的列表是固定的,而把yield看作列表的話是動態(tài)的。
具體案例描述請看代碼及備注(PS:個人自己描述的,有不對的地方望各位指點)
# -*- coding: utf-8 -*-
# @Time : 2022/11/14 13:24
# @Author : 紅后
# @Email : not_enabled@163.com
# @blog : https://www.cnblogs.com/Red-Sun
# @File : 實例2.py
# @Software: PyCharm
def main():
'''
將yield看作一個動態(tài)列表,從yield左往右為傳出數(shù)據(jù),從又往左為傳入數(shù)據(jù)。
PS:有yield存在的那一行,需要從左往右傳出數(shù)據(jù)跑一遍,數(shù)據(jù)出去以后又要從又往左帶接收的數(shù)據(jù)跑一遍,一共一行跑兩邊(僅作者個人記憶方法)
'''
num1 = yield
num2 = yield
print(num1, num2)
yield num1 + num2
if __name__ == '__main__':
a = main()
# 第一個next對應第一個yield的右邊為空即None,所以動態(tài)列表中加入一個參數(shù)為None,返回值為列表的-1位是None
print(next(a)) # [None]
# 第二個通過send方法傳入一個數(shù)1,即在上一次停止的地方從右往左傳入?yún)?shù),所以給num1賦值為1.然后繼續(xù)找下一個yield,其右邊的值依舊為None,加入動態(tài)列表,此時返回值-1位依舊是None
print(a.send(1)) # [None, None]
# 第三通過send方法傳入一個數(shù)2,即在上一次停止的地方從右往左傳入?yún)?shù),所以給num2賦值為2.然后繼續(xù)找下一個yield,其右邊的值為num1 + num2,此時num1為1,num2為2,計算得返回值-1位為3
print(a.send(2)) # [None, None, num1 + num2]

3.yield from 實現(xiàn)協(xié)程
yield from 后面需要加可迭代對象
當它后面加上生成器(上述所說的yield這種)便可以實現(xiàn)生成的嵌套
- 老板(主程序):調用委派生成器
- 包工頭(委派生成器):包含yield from表達式的生成器
- 打工仔(子生成器):生成器函數(shù)
其中委派生成器的作用:在主程序與子生成器之間建立一個雙向通道。
所謂雙向通道是指,主程序可以將參數(shù)通過send傳遞給子生成器,子生成器的yield的值也可以直接返回給主函數(shù)。(PS:委派生成器只有創(chuàng)建通道的作用,沒有攔截數(shù)據(jù)這種功能)
也許有人會想直接用主程序調用子生成器不就行了,而對這的解釋是,使用yield from作為中間過渡是為了讓它幫我們進行異常處理(PS:類似寫程序為了正常運行加上try一個道理)
# -*- 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)頁響應覆蓋
while True:
url = yield response
response = requests.get(url)
def appoint():
'''
委派生成器,委托子生成器完成具體任務 (PS: 類似包工頭負責勞務派遣)
'''
while True:
yield from coroutines_spider() # 建立子生成器和主函數(shù)的雙通道
def main(url_list: list):
'''
主函數(shù)(PS: 相當于老板,張貼招人啟示)
'''
ul = appoint() # 創(chuàng)建委派生成器
next(ul) # 激活它
for url in url_list:
response = ul.send(url) # 將url作為參數(shù)傳遞進入子生成器中,返回子生成器yield出來的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)

到此這篇關于Python利用yield form實現(xiàn)異步協(xié)程爬蟲的文章就介紹到這了,更多相關Python yield form異步協(xié)程爬蟲內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- Python7個爬蟲小案例詳解(附源碼)中篇
- Python7個爬蟲小案例詳解(附源碼)上篇
- Python爬蟲程序中使用生產(chǎn)者與消費者模式時進程過早退出的問題
- Python爬蟲庫urllib的使用教程詳解
- python爬蟲之requests庫使用代理方式
- python?基于aiohttp的異步爬蟲實戰(zhàn)詳解
- Python爬蟲框架NewSpaper使用詳解
- 通過python爬蟲mechanize庫爬取本機ip地址的方法
- Python爬蟲學習之requests的使用教程
- python爬蟲beautiful?soup的使用方式
- Python爬蟲之超級鷹驗證碼應用
- Python爬蟲Requests庫的使用詳情
- python爬蟲模擬登錄之圖片驗證碼實現(xiàn)詳解
- Python爬蟲eval實現(xiàn)看漫畫漫畫柜mhgui實戰(zhàn)分析
- python爬蟲實戰(zhàn)項目之爬取pixiv圖片
- 使用python爬蟲實現(xiàn)子域名探測問題
- python爬蟲之代理ip正確使用方法實例
- Python7個爬蟲小案例詳解(附源碼)下篇
相關文章
python 實現(xiàn)將字典dict、列表list中的中文正常顯示方法
今天小編就為大家分享一篇python 實現(xiàn)將字典dict、列表list中的中文正常顯示方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07
Python算法輸出1-9數(shù)組形成的結果為100的所有運算式
這篇文章主要介紹了Python算法輸出1-9數(shù)組形成的結果為100的所有運算式,然后介紹了另外一個相關實例,具體內容請參閱正文,需要的朋友可以參考下。2017-11-11
python中reversed與reverse的區(qū)別解析
reverse()是python中列表的一個內置方法(在字典、字符串和元組中沒有這個內置方法),用于列表中數(shù)據(jù)的反轉,這篇文章主要介紹了python中reversed與reverse的區(qū)別,需要的朋友可以參考下2023-03-03
Pytorch實現(xiàn)將label變成one hot編碼的兩種方式
這篇文章主要介紹了Pytorch實現(xiàn)將label變成one hot編碼的兩種方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
Python腳本實現(xiàn)Mysql數(shù)據(jù)遷移
MySQL數(shù)據(jù)庫遷移是指將MySQL數(shù)據(jù)庫中的數(shù)據(jù)和結構遷移到另一個MySQL實例,下面小編就來為大家介紹一下如何通過Python腳本實現(xiàn)Mysql數(shù)據(jù)遷移吧2025-03-03
python使用numpy實現(xiàn)直方圖反向投影示例
今天小編就為大家分享一篇python使用numpy實現(xiàn)直方圖反向投影示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
使用PyInstaller將Pygame庫編寫的小游戲程序打包為exe文件及出現(xiàn)問題解決方法
這篇文章主要介紹了使用PyInstaller將Pygame庫編寫的小游戲程序打包為exe文件的方法,給大家介紹了通過Pyinstaller打包Pygame庫寫的小游戲程序出現(xiàn)的問題及解決方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09

