Scrapy爬取图片教程

一、使用爬虫框架scrapy爬取图片

上次我们爬取过文本、文字、的一些普通数据,现在我们就可以学习爬图片了,一些段友就可以爬自己想要的图片了,哈哈哈哈。

首先我们先大概总结一下scrapy爬虫的原理流程,先看图:

首先翻译一下上面的英文:

Scrapy是一种用于抓取Web站点和提取结构化数据的应用程序框架,用于数据挖掘……最初是为Web刮取而设计的,现在可以用来使用API(如Amazon Associates Web服务)提取数据。简单的说当然就是爬取数据啦

我在大概的讲一下scrapy的运行过程:

     首先我们运行爬虫时,爬虫会运行蜘蛛找到定义好的蜘蛛名,蜘蛛会调用默认的start_request()方法里面定义了自动启用我们定义好的url开始读取,会返回一个requests对象给引擎,引擎判断如果是requests就是返回给调度器,调度器就会把他们排列好,来询问引擎任务完成来没,如果完成就会新派一个requests来给引擎,引擎会交给中间件,去internet去下载需要的数据,然后会返回一个response交给引擎,引擎会把response返回给蜘蛛,蜘蛛会调用parse方法来解析返回的response,最后返回两种类型一种是items和requests交给引擎,引擎会把判断类型如果是items就返回给管道,如果是request就返回给调度器就行排队执行,OK!

大家了解完scrapy执行过程后就可以开始快乐的编码过程啦!

二、   代码过程

     1,首先我们创建工程:在dos命令或者终端运行:scrapy startproject imgs(项目名)

     2,在cd到项目目录

     3,运行下面命令:

 scrapy  genspider   imgsdemohttps://www.woyaogexing.com/touxiang/katong/new/index.html

(创建蜘蛛名,绑定要爬取的url这里我爬取的是一个qq动漫头像的网站)

注意(因为我linux上的idea突然打不了中文了就只能大概讲一下)

 我们主要说一下关于爬取图片的部分,我们获取img标签里的src里面的图片url

再用zip拉链的方式把这几个数据拉起了,这样就可以使用索引的方式来获取遍历的数据

但是要注意了:因为这次我获取的是一个没有http协议,他会说我图片的url他们解析不了上网查了查没什么结果,就查了之前我获取课工场的图片,里面都是http协议的url我就索性把获取的url拼接一个’http:’这个在放入定义好的列表中,在导入项目的item,看一下item模块的内容

调用field方法来实现非结构性的数据源提取结构性数据

    用定义好的item就继续回到spider里,把我们解析后的response通过zip拉链的方式遍历出来,再利用item[‘刚才定义item模块里的属性’]=[‘http:’+d[3]]当然这种方式同等于为上面的因为我们解析图片必须以列表的形式来解析,而为加上http:这个字符串是因为为缺少这部分,大家可以看情况添加。在利用yield来返回数据但我们还缺少最关键的一步就是在settings配置模块中,添加这样的内容:

大概简述一下:

1,

这个本身是注释的如果我们想要利用管道保存数据就需要把这行注释解开,大概在67行左右

2,'scrapy.contrib.pipeline.images.ImagesPipeline':1

然后我们在添加这行代码就可以使用他scrapy内置的图片下载器

3, IMAGES_STORE = '/home/zxz/down_imgs'

这是我们图片下载的位置

这样添加后我们的爬虫就大概搭建完成了,图片爬完我会把管道保存的数据也说一下

三;我们要运行我们的程序有两种方法

1, 在命令行敲命令,但很麻烦,每次还要进入项目根目录

2, 编写一个模块专门运行爬虫,如下

点击run,看一下我们的下载图片的目录是否有了图片:

的确是有了,但我们看一下只有一页的图片,然而并满足不了我的需求,所有我们进一步改良:

上面代码是根据网页的情况来编写的:

我们可以看到这个下一页并没有class属性,我们只能把div.page下的a标签里的href属性全部取出因为返回的是一个列表我们可以调用pop()这个方法默认删除最后一个并返回这个删除得数据恰恰和我门预想的一样,成功的获取到最后一个href

在根据判断调用follow()方法来一一获取每页的图片

我们看一下结果:

第一次有30个图片,第二次有450个这样我们以后就不缺QQ头像了,哈哈。

如何看我们获取的图片都获取到了我们开始下一步:把管道用上把一些标题和作者时间爬下来

之前的代码都在上面写着只需要打开pipeline.py敲一下代码:

大概意思就是:

1, 我们在蜘蛛打开时创建一个imgs.csv 文件进行写的操作

2, 把item里定义好的结构化数据写入定义好的文件中

3, 进行返回,关闭文件流

Run一下我们会发现在项目中会多了一个imgs.csv文件打开450没错了