当前位置: 移动技术网 > IT编程>脚本编程>Python > 自学python一周,初识Scrapy之再续火影情缘!

自学python一周,初识Scrapy之再续火影情缘!

2018年09月18日  | 移动技术网IT编程  | 我要评论

搞笑投票,贝多芬的悲伤伴奏,ca8907

 

自学python一周,初识scrapy之再续火影情缘!

 

运行平台: windows 

python版本: python3.x

ide: sublime text3

  • 前言
  • scrapy框架之初窥门径
  • 1 scrapy简介
  • 2 scrapy安装
  • 3 scrapy基础
  • 31 创建项目
  • 32 shell分析
  • 4 scrapy程序编写
  • 41 spiders程序测试
  • 42 items编写
  • 43 settings编写
  • 44 comic_spider编写
  • 45 pipelines编写
  • 运行结果
  • 总结
自学python一周,初识scrapy之再续火影情缘!

 

1 前言

如果有人问我,你最喜欢的动漫是什么?我会毫不犹豫地告诉他:《火影忍者》。因为,这是唯一的一部贯穿我小学、初中、高中、大学、研究生生活的动漫。小学五年级的时候,家里的电视安装了机顶盒,那时候的动漫频道还不是清一色的《天线宝宝》、《熊出没》这样的国产动漫。大部分都是日本动漫,《火影忍者》、《海贼王》、《浪客剑心》这样的热血动漫充斥着整个动漫频道。就从那时开始,我走上了追《火影忍者》的道路。虽然,这是一个暴露年龄的事情,可是我还是想说,我也算是一个资深的火影迷了。鸣人的火之意志、鸣人和佐助的羁绊的故事,看得我热血沸腾。初中的时候,我还曾傻傻地学习忍术的结印手势,以为只要学会了结印手势就能放出忍术,现在想想,真的是无忧无虑的童年啊!可能,有朋友会问,《火影忍者》不是已经完结了吗?《火影忍者》是完结了,但是鸣人儿子的故事才刚刚开始,《博人传之火影忍者新时代》正在热播中。因此,我又开始追动漫了,虽然现在不会像儿时那样激动到上蹿下跳,但是我依然喜欢看,现在感觉,继续看火影,更多的是一种情怀吧!

自学python一周,初识scrapy之再续火影情缘!

 

今天的闲话有点多,就此打住,回归正题。为了了解动漫的进展,看相应的漫画是个不错的选择。而kuku动漫又是免费的试看平台,满足我的需求。

自学python一周,初识scrapy之再续火影情缘!

 

 

可以看到,这个网站的第一个推荐动漫就是《火影忍者》。这个网站不提供下载功能,但是又很想收藏怎么办?那就用分布式爬虫scrapy搞下来吧!当然,在此之前,不得不说的一句话就是:请勿将程序用于任何商业用途,仅供交流学习。尊重著作权,请购买正版漫画。

2 scrapy框架之初窥门径

2.1 scrapy简介

scrapy engine(scrapy核心) 负责数据流在各个组件之间的流。spiders(爬虫)发出requests请求,经由scrapy engine(scrapy核心) 交给scheduler(调度器),downloader(下载器)scheduler(调度器) 获得requests请求,然后根据requests请求,从网络下载数据。downloader(下载器)的responses响应再传递给spiders进行分析。根据需求提取出items,交给item pipeline进行下载。spiders和item pipeline是需要用户根据响应的需求进行编写的。除此之外,还有两个中间件,downloaders mddlewares和spider middlewares,这两个中间件为用户提供方面,通过插入自定义代码扩展scrapy的功能,例如去重等。因为中间件属于高级应用,本次教程不涉及,因此不做过多讲解。

自学python一周,初识scrapy之再续火影情缘!

 

 

2.2 scrapy安装

关于scrapy的安装,无需多言。

2.3 scrapy基础

安装好scrapy之后,我们就可以开启我们的scrapy之旅了。我这里只讲本次实战用到的知识。

简单流程如下:

  • 创建一个scrapy项目;
  • 定义提取的item;
  • 编写爬取网站的 spider 并提取 item;
  • 编写 item pipeline 来存储提取到的item(即数据)。

2.3.1 创建项目

在开始爬取之前,我们必须创建一个新的scrapy项目。 进入打算存储代码的目录中,运行下列命令:

scrapy startproject cartoon

scrapy startproject是固定命令,后面的cartoon是自己想起的工程名字。这里,我起名为cartoon(漫画)。

该命令将会创建包含下列内容的cartoon目录:

这些文件分别是:

自学python一周,初识scrapy之再续火影情缘!

 

 

  • scrapy.cfg: 项目的配置文件;
  • cartoon/: 该项目的python模块。之后将在此加入spider代码;
  • cartoon/items.py: 项目中的item文件;
  • cartoon/middlewares .py:项目中的中间件;
  • cartoon/pipelines.py: 项目中的pipelines文件;
  • cartoon/settings.py: 项目的设置文件;
  • cartoon/spiders/: 放置spider代码的目录。

2.3.2 shell分析

在编写程序之前,我们可以使用scrapy内置的scrapy shell,分析下目标网页,为后编写梳理思路。先分析下《火影忍者》主界面:

自学python一周,初识scrapy之再续火影情缘!

 

自学python一周,初识scrapy之再续火影情缘!

 

在scrapy shell中,我们可以通过如下指令打印网页的body信息:

response.body

通过返回的内容,我们可以寻找自己想要的链接,但是这种方法,显然有些麻烦,因为内容太多,不好找。这里,我们还是使用审查元素的方式进行分析:

自学python一周,初识scrapy之再续火影情缘!

 

 

可以看到,每个章节的链接和名字都存放在了dd标签下的a标签中。在shell中输入如下指令提取链接:

response.xpath('//dd/a[1]')

xpath之前讲过了,如果忘记了,可翻阅我之前整理的笔记。从输出结果可以看到,每个链接都已经提取出来了,但是没有显示a标签里面的内容。

自学python一周,初识scrapy之再续火影情缘!

 

想要显示全,就需要extract()方法,转换成字符串输出,指令如下:

response.xpath('//dd/a[1]').extract()

从运行结果可以看出,这样就显示完全了。现在开始思考一个问题,如果我想保存每个章节的图片,需要哪些东西?链接必不可少,当然还有每个章节的名字,我们要以文件夹的形式存储每个章节,文件夹的命名就是章节的名字,这样更规整。

自学python一周,初识scrapy之再续火影情缘!

 

我们使用text()获取每个章节的名字,指令如下:

response.xpath('//dd/a[1]/text()').extract()

瞧,每个章节的名字被我们轻松的提取出来了,记住这个指令,在编写程序的时候,需要用到。

自学python一周,初识scrapy之再续火影情缘!

 

 

获取完章节名字,接下来就是获取链接了,使用指令如下:

response.xpath('//dd/a[1]/@href').extract()

scrapy还是蛮好用的嘛~省去了使用beautifulsoup这些工具的使用。当然,它的强大不仅仅于此,让我们慢慢道来。

自学python一周,初识scrapy之再续火影情缘!

 

 

《火影忍者》首页分析完了。接下来,我们分析每个章节里的内容,看看如何获取每个图片的链接。还是使用审查元素的方式,我们可以看到,这个网页提供的信息如下。再思考一个问题,从这个网页我们要获取哪些信息?第一个当然还是图片的链接,第二个呢?将一个章节里的每个图片保存下来,我们如何命名图片?用默认名字下载下来的图片,顺序也就乱了。仔细一点的话,不难发现,第一页的链接第二页的链接第三页的链接依此类推,所以我们可以根据这个规律进行翻页,而为了翻页,首先需要获取的就是每个章节的图片数,也就是页数,随后,我们根据每页的地址就可以为每个图片命名:第1页、第2页、第3页…,这样命名就可以了。不会出现乱序,并且很工整,方便我们阅读。由于有的章节图片的链接不是规律的,所以只能先获取页面地址,再获取图片地址,这样递进爬取。

自学python一周,初识scrapy之再续火影情缘!

 

使用ctrl+c退出之前的shell,分析章节页面,以第一章为例,使用指令如下:

套路已经想好,那就开始测试吧。通过审查元素可以知道,页数存放在valign属性i为top的td标签中。获取的内容由于有好多信息,我们再使用re()方法,通过正则表达式获取页数。获取页数代码如下:

response.xpath('//td[@valign="top"]/text()').re('共(d+)页')[0]

可以看到,通过几次测试就把页数提取出来了。最终的这个指令页要记住,编写程序需要用到。

自学python一周,初识scrapy之再续火影情缘!

 

该网站是使用如下指令加载图片的:

document.write("<img src='"+server+"comic/kuku2comic/naruto/01/01_01.jpg'><span style='d

js脚本放在网页里,没有使用外部js脚本,这就更好办了,直接获取脚本信息,不就能获取图片链接了?使用指令如下:

response.xpath('//script/text()').extract()

通过运行结果可以看出,我们已经获取到了图片链接,server的值是通过运行js外部脚本获得的,但是这里,我们仔细观察server的值其他页面也是一样,因此也就简化了流程。同样,记住这个指令,编写程序的时候会用到。

自学python一周,初识scrapy之再续火影情缘!

 

 

就这样这个思路已经梳理清楚,需要的内容有章节链接、章节名、图片链接、每张页数。shell分析完毕,接下来开始编写程序。

2.4 scrapy程序编写

2.4.1 spiders程序测试

在cortoon/spiders目录下创建文件comic_spider.py,编写内容如下:

自学python一周,初识scrapy之再续火影情缘!

 

  • name:自己定义的内容,在运行工程的时候需要用到的标识;
  • allowed_domains:允许爬虫访问的域名,防止爬虫跑飞。让爬虫只在指定域名下进行爬取,值得注意的一点是,这个域名需要放到列表里;
  • start_urls:开始爬取的url,同样这个url链接也需要放在列表里;
  • def parse(self, response) :请求分析的回调函数,如果不定义start_requests(self),获得的请求直接从这个函数分析;

parse函数中的内容,就是之前我们获取链接的解析内容,在cmd中使用如下指令运行工程:

scrapy crawl comic

打印输出了这个章节的链接

自学python一周,初识scrapy之再续火影情缘!

 

再打印章节名字看看,代码如下:

自学python一周,初识scrapy之再续火影情缘!

 

章节名字打印成功!

自学python一周,初识scrapy之再续火影情缘!

 

 

2.4.2 items编写

刚刚进行了简单的测试,了解下spiders的编写。现在开始进入正题,按步骤编写爬虫。第一步,填写items.py,内容如下:

自学python一周,初识scrapy之再续火影情缘!

 

 

  • dir_name:文件名,也就是章节名;
  • link_url:每个章节的每一页的链接,根据这个链接保存图片名;
  • img_url:图片链接;
  • image_paths:图片保存路径。

2.4.3 settings编写

填写settings.py,内容如下:

自学python一周,初识scrapy之再续火影情缘!

 

 

  • bot_name:自动生成的内容,根名字;
  • spider_modules:自动生成的内容;
  • newspider_module:自动生成的内容;
  • robotstxt_obey:自动生成的内容,是否遵守robots.txt规则,这里选择不遵守;
  • item_pipelines:定义item的pipeline;
  • images_store:图片存储的根路径;
  • cookies_enabled:cookie使能,这里禁止cookie;
  • download_delay:下载延时,这里使用250ms延时。

2.4.4 comic_spider编写

在comic_spider.py文件中,编写代码如下,代码进行了详细的注释:

自学python一周,初识scrapy之再续火影情缘!

 

代码看上去可能不好理解,自己动手尝试一下,一步一步来,最终你就会找到答案的。这部分代码不能一步一步讲解,思路已经讲完,其他的就靠自己尝试与体悟了。关于python的yield,简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,python 解释器会将其视为一个 generator。想要保持代码的整洁,又要想获得 iterable 的效果,就可以使用yield了,这部分内容,可以查看廖雪峰老师的教程。

2.4.5 pipelines编写

pipelines.py主要负责图片的下载,我们根据item保存的信息,进行图片的分类保存,代码如下:

自学python一周,初识scrapy之再续火影情缘!

 

代码依旧进行了注释,自己动手尝试吧

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网