Python爬虫框架Scrapy架构和爬取糗事百科段子结果

铁扇公主1 发布于 2017/05/24 13:47
阅读 177
收藏 0

根据上篇文章《Python爬虫框架Scrapy之爬取糗事百科大量段子数据》(传送门:Python爬虫框架Scrapy之爬取糗事百科大量段子数据),写好了糗百段子的爬虫,接下来就是开始运行然后获取结果了。

scrapy架构

这里再描述一下scrapy处理的架构,全网比较流行的scrapy架构处理流程为:

Python爬虫框架Scrapy架构和爬取糗事百科段子结果

scrapy架构

首先,scrapy引擎根据start_urls中的url生成相应的Request,然后把这些Request通过调度器中间件(Scheduler Middlewares)交给调度器(Scheduler)处理。

其次,调度器(Scheduler)接收到Request之后,会调度所有Request,通过下载器中间件(Downloader Middlewares)把其交给下载器(Downloader)处理。

再次,下载器(Downloader)接收到Request之后,发送HTTP请求,获取到相应之后,封装成Response对象,通过爬虫中间件(Spider Middlewares)交给爬虫Spider处理。这个时候的Spider一般是我们自己实现的Spider。

然后,我们自己可以实现Spider,获取到Response之后,我们可以通过scrapy提供的选择器(Selector)和xpath、css等表达式从Response对象中提取我们感兴趣的网页数据,生成Item或者Request。这个时候,我们生成的是Item,Spider会把该Item交给Item Pipeline处理;如果生成的是Request,那么,这个Request又会交给scrapy引擎,然后交给调度器进行调度,也就是再继续执行第二步。

运行scrapy爬虫

来看一看昨天的爬虫处理:

Python爬虫框架Scrapy架构和爬取糗事百科段子结果

糗百爬虫

这里,跟昨天有点不一样,CrawlSpider比Spider更适合爬取规则的网站。我们把继承Spider改成了CrawlSpider,然后parse方法改成了parse_start_url方法。

说明一下,如果我们在继承CrawlSpider,不要去覆盖parse方法,因为CrawlSpider使用了parse进行了其内部的流程处理,开放了parse_start_url方法供我们实现。如果我们实现了parse方法,很可能会造成CrawlSpider不能正常工作。

然后我们在命令行执行:

scrapy crawl qiubai

运行错误汇总

错误1:

Python爬虫框架Scrapy架构和爬取糗事百科段子结果

Request url错误

我们发现,在parse_start_url方法生成Request时,url有错误,request url缺少scheme,也就是说缺少了域名主机。我们来看一下网页结构中的“下一页”:

Python爬虫框架Scrapy架构和爬取糗事百科段子结果

下一页链接

原来是下一页的链接没有域名,那我们给他加上域名,如:

Python爬虫框架Scrapy架构和爬取糗事百科段子结果

下一页链接加上域名

再运行,发现执行正常:

Python爬虫框架Scrapy架构和爬取糗事百科段子结果

执行正常

我们到MongoDB中看一下数据:

Python爬虫框架Scrapy架构和爬取糗事百科段子结果

结果

比较满意,数据都出来了。

不过,我们发现这个id是MongoDB自生成的id,我们分析网页结构后,看到,每个段子其实都有一个id,更改代码如下,加上了从段子链接中提取id的步骤:

Python爬虫框架Scrapy架构和爬取糗事百科段子结果

id提取

再次执行,查看结果:

Python爬虫框架Scrapy架构和爬取糗事百科段子结果

id

段子id不再是MongoDB自生成的id了,是糗百内部的段子的id。大功告成。

下一篇文章使用CrawlSpider和其中的Rule、LinkExtractor全站爬取糗百段子,代码会更简洁,敬请关注。

更多文章

  1. Python爬虫框架Scrapy之爬取糗事百科大量段子数据

  2. Python爬虫框架之Scrapy详解

  3. Java网络爬虫工具,OkHttp完全详细用法

    学好python你需要一个良好的环境,一个优质的开发交流群,群里都是那种相互帮助的人才是可以的,我有建立一个python学习交流群,在群里我们相互帮助,相互关心,相互分享内容,这样出问题帮助你的人就比较多,群号是301,还有056,最后是051,这样就可以找到大神聚合的群,如果你只愿意别人帮助你,不愿意分享或者帮助别人,那就请不要加了,你把你会的告诉别人这是一种分享。如果你看了觉得还可以的麻烦给我点个赞谢谢
      

加载中
返回顶部
顶部