怎样实现scrapy爬取新浪微博实时爬取并将结果返回

Scrapy爬取原理_尼克劳斯_Niklaus_新浪博客
Scrapy爬取原理
网络爬虫:在网上进行数据抓取的程序,用来抓取特定网页的HTML数据.虽然我们利用一些库开发一个爬虫程序,但是使用框架可以大大提高效率,缩短开发时间.Scrapy是一个使用Python编写的,轻量级的,简单轻巧,并且使用起来非常的方便.Scrapy
是一套基于Twisted的一步处理框架,是纯python实现的爬取框架,用户只需要定制开发几个模块就可以轻松实现一个爬虫,用来抓取网页内容或者各
种图片,下图展示了Scrapy的大致框架,其中包含Scheduler item pipeline downloader
spider以及engine这几个组件模块,绿色箭头则说明数据处理流程.
scrapy原理图
1.Scrap​y Engine(Scrapy
Scrapy 引擎用来控制整个系统数据处理流程,并进行事物处理的触发.
2.Scheduler
调度程序从Scrapy引擎接受并排序列入队列,并在Scrapy引擎发出请求后返还给他们.3.Downloader
(下载器)下载器的主要职责是抓取网页并将网页内容返还给蜘蛛(Spiders).
4.Spiders (蜘蛛)
蜘蛛是主要的干活,用它来定制特定的域名或网页解析规则.
蜘蛛抓取流程:
(1)首先获取第一个url的初始请求,第一个请求是通过调用start_request()函数,该方法默认从start_urls中的url生成请求,并执行解析调用回调函数.
(2)在回调函数中,可以解析网页响应并返回项目对象和请求对象或两者的迭代.
(3)在回调函数中,解析网站的内容,使用的是Xpath选择器(或其他任意自己喜欢的程序),并生成解析内容.
(4)最后从蜘蛛返回的项目通常进驻到项目管道.
5.Item Pipeline(项目管道)
项目管道主要是负责处理蜘蛛从网页中抽取的项目,主要任务是清洗,验证和存储数据.当页面被蜘蛛解析后,并被发送到项目管道,并经过几个特定次序处理数据.
6.Downloader middlewares (下载器中间件)
下载中间件是位于Scrapy引擎和下载器之间的钩子框架,主要处理Scrapy引擎与下载器之间的请求及响应.它提供了一个自定义的代码方式来拓展Scrapy的功能.
7.Downloader middlewares(下载器中间件)
蜘蛛中间件是介于Scrapy引擎和蜘蛛之间的钩子框架,主要处理蜘蛛的响应输入和请求输出.它提供了一个自定义代码方式来拓展Scrapy功能.
蛛中间件是一个挂接到Scrapy的蜘蛛处理机制的框架,你可以插入自定义的代码来处理发送给蜘蛛的请求和返回蜘蛛获取的响应内容和项目.
8. Scheduler middlewares
(调度中间件)
调度中间件是介于Scrapy引擎和调度之间的钩子框架,主要处理Scrapy引擎发送到调度的请求和响应,它也提供了一个自定义代码来拓展Scrapy功能.
Scrapy处理流程:
1.引擎打开一个域名,蜘蛛处理该域名,并让蜘蛛获取第一个爬取的url.
2.引擎从蜘蛛那获取第一个需要爬取的url,然后作为请求在调度中进行调度.
3.引擎从调度中获取即将进行爬取的页面.
4.调度将下一爬取的url返回给引擎,引擎通过下载中间件发送到下载器.
5.当网页被下载器完成后,响应内容通过下载中间件被发送到引擎.
6.引擎收到下载器的响应并将它通过蜘蛛中间件发送到蜘蛛进行处理.
7.蜘蛛处理响应并返回爬取到的项目,然后给引擎发送新的请求.
8.引擎将抓取到的项目传入项目管道,并向调度发送请求.
9.系统重复第2后面的操作,直到调度中无请求为止,然后断开引擎与域之间的联系.
(以上资料大部分从网上来的,下篇我将写一个自己第一次用Scrapy爬取的例子,由于python现在学得也不怎么精通,所以水平有限,望观者见谅&(&
尼克劳斯_Niklaus
博客等级:
博客积分:0
博客访问:58
关注人气:0
荣誉徽章:scrapy实现递归爬取
scrapy实现递归爬取
使用scrapy踩的坑之如何使用scrapy实现递归爬取
因为对scrapy并不了解,所以在做时,并不知道如何能够不断的循环爬取,在网上找到一篇文章:
,文章中提到:
不断的抓取下一个链接如何实现,items如何保存?
这里需要解释一下parse()方法,parse可以返回Request列表,或者items列表,如果返回的是Request,则这个Request会放到下一次需要抓取的队列,如果返回items,则对应的items才能传到pipelines处理(或者直接保存,如果使用默认FEED exporter)。那么如果由parse()方法返回下一个链接,那么items怎么返回保存? Request对象接受一个参数callback指定这个Request返回的网页内容的解析函数(实际上start_urls对应的callback默认是parse方法),所以可以指定parse返回Request,然后指定另一个parse_item方法返回items:
def parse(self, response):
return [Request(url, callback=self.parse_item)]
def parse_item(self, response):
return [item]
关于解析函数的返回值,除了返回列表,其实还可以使用生成器,是等价的:
def parse(self, response):
yield Request(url, callback=self.parse_item)
def parse_item(self, response):
yield item
但是自己在实践的过程中发现上面提到的方法好像并不可行。第一个代码片段,因为Request 的callback 为parse_item 所以并没有新的请求提交到parse方法中,那就是没有实现所谓的递归爬取了?第二个代码片段也是如此。而且个人觉得return和yield在案例中能算是等价的吗?此处存疑,因为作者觉得例子中的parse_item方法中没有出现for循环,如果使用return,就只能执行一个整个方法就返回(return)了,跟yield并不一样。
后来又找到了有一个人在segmentfault问的问题 第二个答案里答主给了一个爬取汽车数据的DEMO,看到他的一个方法里面有两个yield,才明白yield和return是不同的,之前被网上的一些DEMO给忽悠住了,以为yield和return差不多(都怪自己的python太菜o(╥﹏╥)o),所以先来了解一下yield:
弄明白了这个,下面感觉就好办了。
下面重点来了
def parse(self, response):
for item in items
yield item
for url in urls
yield Request(url, callback=self.parse)
感觉上面才是实现递归爬取的正确道路。但是事情到这儿并没有结束,因为一开始我也不是按上面的格式来写的,而是走了个弯路(┳Д┳)
def parse_item(self, response):
for item in items
yield item
def parse(self, response):
self.parse_item(response)
for url in urls
yield Request(url, callback=self.parse)
这里是项目的blog:
完整的代码:
以为这样就完了吗??(?ε`)
个人想,就只是把负责item操作部分的代码提取出来形成新的方法,这样不应该代码结构更清楚吗?so easy↖(^ω^)↗?
但是,却! 不! 行! ,运行起来没有任何的结果,或者说反应,难道是我的代码写错了,还是说上面的理解全是错的?为什么?
这儿找到了一篇相似的问题的文章 作者最后好像也没有弄明白是怎么回事(●?ω`●)。
如果有大神知道原因或上面分析有错误之处,希望可以告知一下(?^?^?)
我的热门文章
即使是一小步也想与你分享Copyright & 2012 - .

我要回帖

更多关于 scrapy 递归爬取 的文章

 

随机推荐