五大核心组件 : spider : 从这里开始 ---> 做用 : 产生一个或者一批url / parse()对数据进行解析 url-->封装成请求对象-->引擎(接收spider提供的请求对象,可是尚未请求到数据) 引擎-->(请求对象)-->调度器(调度请求): 过滤器的类->去重(有可能会出现相同的请求对象)-->队列(数据类型,存的就是请求对象) 而后调度器从队列中调度出来一个请求对象给-->引擎-->给下载器-->请求对象-->互联网进行下载 互联网-->响应对象-->给下载器-->引擎(响应对象)-->给spider中的回调方法,进行解析 解析到的对象封装到item对象中-->引擎-->管道,持久化存储 而后 调度器再次从队列中调出来一个url,在......... 核心问题 : 引擎是用来触发事物的,可是引擎怎么知道在何时什么节点去触发那些事物? 解答 : 在工做过程当中,全部的数据流都会通过'引擎',也就是说 '引擎'是根据接收到的数据流来断定应该去触发那个事物 好比 : 当 spider 给'引擎'提交了个item,引擎一旦接收了个数据类型是item的时候, 引擎立刻就会知道下一步应该实例化管道,在掉管道中process_item方法 全部实例化的操做,事物的触发都是由引擎执行的
- 在以前的代码中,我么你历来没有过手动的对start_urls列表中存储的起始url进行过请求的发送,可是起始url的确进行了请求的发送,这是怎么实现的呢?
框架
- 解答 : 实际上是爬虫文件中的爬虫类继承了Spider父类中的start_urls(self)这个方法,该方法就能够对start_urls列表中的url发起请求 : 异步
def start_requests(self): for u in self.start_urls: yield scrapy.Request(url=u,callback=self.parse)
注意 : 该方法默认的是进行get请求的发送,若是想要进行post请求,就要重写该方法 : scrapy
def start_requests(self): #请求的url post_url = 'http://fanyi.baidu.com/sug' #post请求的参数,是个字典的形式 data = { 'kw':'dog' } #发送post请求 yield scrapy.FormRequest(url=post_url,formdata=data,callback=self.parse)