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

手写Scrapy系列(三)

计划表:

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

上一节我们实现了异步下载,这节我们维护一个Queue,为后期加入调度器做准备,先来看代码。

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:
    start_urls = ['http://www.czasg.xyz', 'http://www.czasg.xyz',
                  'http://www.czasg.xyz', 'http://www.czasg.xyz']
    def start_requests(self):
        yield from (Request(url, self.parse) for url in self.start_urls)
    def parse(self, response):
        print(response.url)

代码和上一节完全一样….主要是启动部分有点不同,

if __name__ == '__main__':
    spider = MySpider()
    from queue import Queue
    q = Queue()
    for request in spider.start_requests():
        q.put(request)
    import aiohttp
    import asyncio
    async def _download():  # scrapy是基于Twisted实现的异步下载,此处aiohttp也是凑凑
        request = q.get(block=False)                          # 唯一不同点,就是这里来了个q.get
        async with aiohttp.ClientSession() as session:
            async with session.get(request.url) as response:
                byte_content = await response.content.read()  # 用aiohttp模拟异步下载, 获取DOM
                response = Response(byte_content, request)    # 构建Response对象
                request.callback(response)                    # 执行回调
    loop = asyncio.get_event_loop()
    tasks = [_download() for _ in range(q.qsize())]
    loop.run_until_complete(asyncio.wait(tasks))

在代码中我们可以看出,维护一个Queue,初始化时将Request全部推到队列中,下载的时候从队列中非阻塞的获取Request对象。

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

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

「点点赞赏,手留余香」

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