爬虫进阶:框架功能完善-380玩彩网官网入口

未匹配的标注

多爬虫文件

为什么需要优化现有的爬虫结构

当爬虫比较少的时候,我们的项目结构相对合理,但是当要抓取的网站比较多的时候,可以借鉴scrapy的方法,把不同网站的爬虫分别在不同的py文件中编写,之后放在一个目录下;同时,我们很多时候还希望能够有同时启动项目中的所有的爬虫

同时执行多个不同的爬虫

可以将多个爬虫一起启动并执行,传入形式可以使用字典传入多个爬虫

在引擎中用到爬虫对象的地方都要做相应的修改

engine.py

'''引擎
a. 对外提供整个的程序的入口
b. 依次调用其他组件对外提供的接口,实现整个框架的运作(驱动)
'''
......
class engine(object):
    def __init__(self, spiders):    # 接收外部传入的多个爬虫对象
        self.spiders = spiders    # 爬虫对象
        ......
    ......
    def _start_requests(self):
        '''向调度器添加初始请求'''
        # 1. 爬虫模块发出初始请求
        for spider_name, spider in self.spiders.items():
            for start_request in spider.start_requests():
                # 2. 把初始请求添加给调度器
                # 利用爬虫中间件预处理请求对象
                start_request = self.spider_mid.process_request(start_request)
                start_request.spider_name = spider_name    #为请求对象绑定它所属的爬虫的名称
                self.scheduler.add_request(start_request)
    def _execute_request_response_item(self):
        '''根据请求、发起请求获取响应、解析响应、处理响应结果'''
        ......
        spider = self.spiders[request.spider_name]  # 根据请求的spider_name属性,获取对应的爬虫对象
        # 5. 利用爬虫的解析响应的方法,处理响应,得到结果
        parse = getattr(spider, request.parse)    # 获取对应的解析函数
        results = parse(response)    # parse函数的返回值是一个容器,如列表或者生成器对象
        for result in results:
           # 6. 判断结果对象
           # 6.1 如果是请求对象,那么就再交给调度器
           if isinstance(result, request):
               # 利用爬虫中间件预处理请求对象
               result = self.spider_mid.process_request(result)
               result.spider_name = request.spider_name  # 为请求对象绑定它所属的爬虫的名称
               self.scheduler.add_request(result)
           # 6.2 否则,就交给管道处理
           ......
    ......

安装代码,并运行main.py,直到调试成功,最后将每个爬虫的名称直接设置为爬虫类的一个属性

本文章首发在 380玩彩网官网入口 网站上。

上一篇 下一篇
讨论数量: 0



暂无话题~
网站地图