scrapy结构图:
start_urls通常被实现成一个列表,其中放入所有起始爬取点的url(例子中只有一个起始点)。看到这里,大家可能会想,请求页面下载不是一定要提交Request对象么?而我们仅定义了url列表,是谁
暗中构造并提交了相应的Request对象呢?
1.我们将起始URL提交给ENGINE。
2.ENGINE调用start_requests方法,我们没有实现整个方法,所以调用了基类的start_requests方法。
3.通过阅读Spider基类的源码可以看到如下内容:
4.基类的start_requests将我们的URL封装成Request对象。
由此我们知道Request对象是调用基类start_requests方法产生的,因此我们也可以自己定义start_requests方法(覆盖基类Spider的start_requests方法),直接构造并提交起始爬取点的Request对象。在某些场景下使用这种方式更加灵活,例如有时想为Request添加特定的HTTP请求头部,或想为Request指定特定的页面解析函数。
页面解析函数parse:
页面解析函数也就是构造Request对象时通过callback参数指定的回调函数(或默认的parse方法)。页面解析函数是实现Spider中最核心的部分,它需要完成以下两项工作:
(1)使用选择器提取页面中的数据,将数据封装后(Item或字典)提交给Scrapy引擎。
(2)使用选择器或LinkExtractor提取页面中的链接,用其构造新的Request对象并提交给Scrapy引擎(下载链接页面)。
一个页面中可能包含多项数据以及多个链接,因此页面解析函数被要求返回一个可迭代对象(通常被实现成一个生成器函数),每次迭代返回一项数据(Item或字典)或一个Request对象。
内容小结:
(1)了解scrapy的六个组件的功能。
(2)理解scrapy工作流程。
本文链接:http://so.lmcjl.com/news/7824/