今天有點難過——20200528(模仿scrapy)

由於之前用scrapy寫過爬蟲,很喜歡用裏面的callback與Pipeline,特別是callback,讓方法調用路徑看起來非常直觀。於是突發奇想,模仿scrapy中的callback寫一個demo。

# 模擬scrapy中的回調函數
# @File:模擬scrapy中的回調函數.py
# @Author:王星球
# @E-mail:[email protected]
# Created_date:20200528
#
#
#
#
# 今天突然想到她沒有和我分享過生活中的事。不知道爲啥,有點難過。
#
#
#
#
#
#
#
# Demo 1
class FormRequest(object):
    def __init__(self, callback, args):
        self.callback = callback
        self.args = args

    def __call__(self, *args, **kwargs):
        return self.callback(self.args)


class Pipeline(object):
    def __init__(self, return_or_yield):
        self.file = open("20200528回調函數_%s.txt" % return_or_yield, encoding='utf-8', mode='a')

    def write_csv(self, obj):
        self.file.write(str(obj) + "\n")
        print("已經寫入文件")

    def __del__(self):
        self.file.close()


class Spider1(object):
    def __init__(self):
        self.start_url()()()

    def start_url(self):
        print("return FormRequest 1")
        return FormRequest(callback=self.parse,
                           args=({
                               "url": "baidu.com",
                               "text": "回調函數測試",
                               "Author": "王星球",
                               "E-mail": "[email protected]"
                           }))

    def parse(self, response):
        print("return FormRequest 1")
        return FormRequest(callback=Pipeline("return").write_csv, args=(response,))


class Spider2(object):
    def __init__(self):
        level2_status = True
        level1 = self.start_url()
        while level2_status:
            try:
                level2 = level1.__next__()
                level2().__next__()()
            except StopIteration:
                level2_status = False

    def start_url(self):
        print("yield FormRequest 1")
        yield FormRequest(callback=self.parse,
                          args=({
                               "url": "baidu.com",
                               "text": "回調函數測試",
                               "Author": "王星球",
                               "E-mail": "[email protected]"
                           }))

    def parse(self, response):
        print("yield FormRequest 2")
        yield FormRequest(callback=Pipeline("yield").write_csv, args=(response,))


if __name__ == '__main__':
    Spider1()
    Spider2()

說明

1.demo版本的代碼
2.核心代碼:__call__方法
3.生成器方式或者直接return都可以

運行結果截圖

在這裏插入圖片描述

生成的文件截圖
在這裏插入圖片描述

文件1內容截圖
在這裏插入圖片描述

文件2內容截圖

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章