爬虫进阶:框架功能完善-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
,直到调试成功,最后将每个爬虫的名称直接设置为爬虫类的一个属性