Python爬虫—scrapy框架

一、预备知识

1.、什么是框架?

        就是一个集成了很多功能,并且具有很强通用性的一个项目模版。

2.、如何学习框架?

        专门学习框架封装的各种功能的详细用法。

3.、什么是scrapy?

        爬虫中封装好的明星框架。功能:高性能的持久化存储,异步的数据下载,高性能的数据解析,分布式。

二、scrapy框架的基本使用

        —环境的安装:—mac or linux:pip install scrapy

步骤1:创建一个工程scrapy startproject xxxPro

步骤2:cd xxxPro

步骤2:在spiders子目录中创建一个爬虫文件

scrapy genspider spiderName  www.xxx.com

步骤3:执行工程scrapy crawl spiderName 

三、scrapy数据解析

xpath返回的是列表,但是列表元素一定是Selector类型的对象。

extract可以将Selector对象中的data参数存储的字符串提取出来。

列表调用了extract之后,则表示将列表中每一个Selector对象中data对应的字符串提取了出来。

四、scrapy持久化存储

方式1:基于终端指令:

        —要求:只可以将parse方法的返回值存储到本地的文本文件中

        —终端输入指令:scrapy crawl 文件名 -o ./持久化存储的文件名.csv  

        —注意:基于终端持久化存储对应的文本文件的类型只可以为:‘json’,‘jsonlines’,‘jl’,‘csv’,‘xml’,‘marshal’,‘pickle’).

        —优点:简洁高效便捷

        —缺点:局限性较强(数据只可以存储到指定后缀的文本文件中)

方式2:基于管道:(pipelines)

1、编码流程:

        -步骤1:数据解析

        -步骤2:在item类中定义相关属性

        -步骤3:将解析的数据封装存储到item类型的对象中

        -步骤4:将item类型的对象提交给管道进行持久化存储操作(yield item)

        -步骤5:在管道类的process_item中要将其接收到的item对象中存储的数据进行持久化存储

        -步骤6:在配置文件中开启管道(ITEM_PINELINES = {‘管道文件中的管道类’:300 , })#300表示的是优先级,数值越小,优先级越高。

2、优点:通用性强

五、基于Spider的全站数据爬取

        就是将网站中某板块下的全部页码对应页码数据进行爬取

实现方式:

        —将所有页面的url添加到start_urls列表中(不推荐)

        —自行手动进行请求发送(推荐)

                yield scrapy.Request(url,callback)     callback专门用做数据解析

六、五大核心组件

        引擎、spider、下载器、调度器、管道

        Spider->引擎->调度器->引擎->下载器—>互联网->下载器->引擎->spider(parse方法)->item给引擎->管道持久化存储

1、引擎(Scrapy):

         用来处理整个系统的数据流处理触发事务(框架核心)

2、调度器(Scheduler):

        调度器由过滤器和队列两部分组成。过滤器会将重复的对象进行过滤,进而存储到队列中。

        用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回,可以想象成一个url(抓取页面的网址或者说是链接)的优先队列,由它来决定下一个要抓取的网址是什么,同时去除重复的网址。

3、下载器(Downloader):

        用于下载页面内容,并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)

4、爬虫(Spiders):产生url对url进行手动发送进行数据解析

        爬虫是主要干活的,用于从特定的网页中提取自己需要的信息,即所谓的实体(Item)。用户也可以让Scrapy继续抓取下一个页面。

5、项目管道(Pipeline):持久化存储

        负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。

七、请求传参

使用场景:如果爬取解析的数据不在同一张页面中。(深度爬取)

八、图片数据爬取之ImagesPipeline

基于scrapy爬取字符串类型的数据和爬取图片类型的数据区别?

        —字符串:只需要基于xpath进行解析且提交管道进行持久化存储

        —图片:xpath解析出图片src的属性值。单独的对图片地址发起请求获取图片二进制类型的数据

ImagePipeline:

        只需要将img的src的属性值进行解析,提交到管道,管道就会对图片的src进行请求发送获取图片的二进制类型的数据,且还会帮我们进行持久化存储。

使用流程:

        —数据解析(图片的地址)

        —将存储图片地址的item提交到指定的管道类

        —在管道文件中自定制一个基于ImagesPipeLine的一个管道类

                def get_media_requests(self,item,info):

                def file_path(self,request,response=None,info=None)

                def item_completed(self,results,item,info):

        —在配置文件中:

                指定图片存储的目录:IMAGES_STORE = ‘./imgs_bobo’

                指定开启的管道类:自定制的管道类

        —在配置文件中进行如下配置

               

 IMAGES_STORE = ‘√imgs’:表示最终图片存储的目录

        —管道类的编写

from scapy.piplelines.images import ImagesPipeline

import scrapy

class ImgproPipeline(object):

Item = None

def process_item(self,item,spider):

return item 

#ImagesPipeline专门用于文件下载的管道类,下载过程支持异步和多线程

class ImgPipeLine(ImagesPipeline):

# 对item中的图片进行请求操作

def get_media_requests(self,item,info):

yield scrapy.Request(item[ ‘src’ ])



# 定制图片的名称

def file_path(self,request,response=None,info=None)

url = request.url

file_name = url.split(‘/’)[-1]

return file_name



def item_completed(self,results,item,info):

return item # 该返回值会传递给下一个即将被执行的管道类

猜你喜欢

转载自blog.csdn.net/beiye_/article/details/126625050