1.、什么是框架?
就是一个集成了很多功能,并且具有很强通用性的一个项目模版。
2.、如何学习框架?
专门学习框架封装的各种功能的详细用法。
3.、什么是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
xpath返回的是列表,但是列表元素一定是Selector类型的对象。
extract可以将Selector对象中的data参数存储的字符串提取出来。
列表调用了extract之后,则表示将列表中每一个Selector对象中data对应的字符串提取了出来。
方式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、优点:通用性强
就是将网站中某板块下的全部页码对应页码数据进行爬取
实现方式:
—将所有页面的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):持久化存储
负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
使用场景:如果爬取解析的数据不在同一张页面中。(深度爬取)
基于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 # 该返回值会传递给下一个即将被执行的管道类