辅助流程与主流程实战例子

biubiu 2022-1-23 1616

为了便于大家理解辅助流程和主流程的数据交互过程,这里给各位写下经典的生产消费模型,这里给各位给各位介绍的是单个生产者对单个消费者的模型,当然也可以写单个生产者多个消费者,以及多个生产者多个消费者,这需要用到外部缓存技术的支持


众所周知,我们爬取数据的时候有一半的时间会在等待网页加载,我们可以用辅助流程把这些时间用于获取下载的数据进行保存


下面以爬取百度白丝图片为例,讲解下辅助流程的妙用


1、创建主流程,代码如下

Dim arrayData,arrElement,sRet
Rem 生产者
count = 0
url = "https://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&dyTabStr=MCwzLDgsMiw2LDQsMSw1LDcsOQ%3D%3D&word=%E7%99%BD%E4%B8%9D"
hWeb = WebBrowser.Create("chrome",url,30000,{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200,"sBrowserPath":"","sStartArgs":""})
Try
    File.CreateFolder('''C:\白丝''')
Catch 变量名

End Try

Do While True
    Try
        sRet = WebBrowser.RunJS(hWeb,'''function(){return document.querySelectorAll("#imgid > div > ul > li > div > div.imgbox-border > a > img")['''&count&'''].getAttribute("data-imgurl")}''',true,{"bContinueOnError":false,"iDelayAfter":0,"iDelayBefore":0})
        MeCache.put(count,sRet,0)
        count =count + 1
        TracePrint(sRet)
    Catch 变量名
        Delay(5000)
    End Try 
Loop


2、创建辅助流程,代码如下

Rem 消费者1
Do While True
    mSize = MeCache.size()
    If mSize>0 
        Delay(1000)
        mPopitem = MeCache.popitem()

        TracePrint("消费"&mPopitem["value"])
        sRet = HTTP.GetFile(mPopitem["value"], '''C:\\白丝\\'''&mPopitem["key"]&'''.jpg''', {}, 60000)
    Else 
        Delay(1000)
        TracePrint("等待生产者生产")
    End If
Loop


3、拓展可用于多消费者

Rem 消费者2
Do While True
    mSize = MeCache.size()
    If mSize>0 
        Delay(1000)
        mPopitem = MeCache.popitem()

        TracePrint("消费"&mPopitem["value"])
        sRet = HTTP.GetFile(mPopitem["value"], '''C:\\白丝\\'''&mPopitem["key"]&'''.jpg''', {}, 60000)
    Else 
        Delay(1000)
        TracePrint("等待生产者生产")
    End If
Loop

上传的附件:
最新回复 (2)
返回
发新帖