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

手写Scrapy系列(二)

计划表:

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

在第一节中我们引入了Request和Response,但是这是一个明显的阻塞型访问(requests)。
Scrapy是基于Twisted实现的异步网络访问,在这里,我们暂时使用aiohttp和asyncio来替代,以实现基础的异步访问。

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)

以上代码我们看到,和第一节基本是一样的,不同的是,我们在start_urls加入了4个入口,然后在start_requests中,改为yield from来循环遍历所有Request对象。

最重要的还是如何异步启动了

if __name__ == '__main__':
    spider = MySpider()
    import aiohttp
    import asyncio
    async def _download(request):  # scrapy是基于Twisted实现的异步下载,此处aiohttp也是凑凑
        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(request) for request in spider.start_requests()]
    loop.run_until_complete(asyncio.wait(tasks))

虽然代码比较短,但是其基本流程与Scrapy类似:

  1. 从入口函数start_requests获取请求对象Request
  2. 通过某种异步的方式,获取目标的网页内容并返回结果,用来构造Response,也就是返回对象
  3. 再调用Request请求对象中,定义好的回调函数,执行Response对象

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

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

「点点赞赏,手留余香」

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