手写Scrapy系列(一) – Python量化投资

手写Scrapy系列(一)

最近看Scrapy源码(脑壳疼==),想尝试一下能否模仿出此框架的大致流程。顺便记录下实现过程。
并非是要重复造轮子,只是想试试而已~

计划实现步骤:

  • 基本的Request/Response (当前进度)
  • 实现异步下载
  • 加入队列Queue,为实现调度器做准备
  • 加入引擎管理
  • 加入调度器管理
  • 加入下载器管理
  • 加入下载器中间件管理
  • 加入爬虫进程管理
  • 加入信号机制管理

用过Scrapy的朋友,应该对以下代码有点熟悉

class MySpider(spider.Spider):
    name = 'spider_name'
    start_urls = ['www.czasg.xyz']
    
    def start_requests(self):
        for url in self.start_urls:
            yield Request(url, self.parse)
    
    def parse(self, response):
        print(response.url)

name指定爬虫,start_urls为入口,而parse则处理start_urls入口返回的DOM数据。
在这里,我们首先就接触到了两个重要的对象:Request和Response

以上代码是Scrapy框架中的爬虫文件,在我个人接触的爬虫中,使用较多的还有pipeline管道、middleware中间件。而调度器和引擎基本没怎么接触。

现在模拟Request 和 Response ,先上代码。

class Request:
    def __init__(self, url, callback=None):
        self.url = url
        self.callback = callback
class Response:
    def __init__(self, byte_content, request):
        self.content = byte_content
        self.request = request
        self.url = request.url
        self.text = str(byte_content, encoding='utf-8')
class MySpider:
    def start_requests(self):
        url = 'http://www.czasg.xyz'
        yield Request(url, self.parse)
    def parse(self, response):
        print(response.url)

在上述代码中,我们定义了Request和Response对象,分别作为请求和返回对象。

  • Request作为请求对象,主要存储入口url和回调函数
  • Response作为返回对象,主要储存DOM相关数据

接下来就是启动:

if __name__ == '__main__':
    spider = MySpider()
    request = next(spider.start_requests())           # 获取一个Request对象,作为入口
    import requests                                   # scrapy是基于Twisted实现的异步下载,此处requests就是凑凑
    byte_content = requests.get(request.url).content  # 假装是通过Twisted获取Request对象,下载目标DOM
    response = Response(byte_content, request)        # 构造Response对象
    request.callback(response)                        # 执行回调函数

在这里,我们使用requests模块,模拟Scrapy下载,当然这是阻塞型访问,本节主要还是实现Request和Response。
这里还有一个重点,就是request.callback(response),调用Request中的对调函数。

github地址:https://github.com/CzaOrz/ioco/blob/t426/open_source_project/scrapy_simulate_tutorial/1.py

https://www.jianshu.com/p/ebfc862df0e1

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论