script
-
创建工程: scrapy startproject XXX(工程名称)
-
目录:
- spiders 放置爬虫文件
- settings.py 配置文件
- pipelines.py文件: 管道
-
在spiders子目录中创建一个爬虫文件
-
cd XXX(进入到创建的工程内)
-
scrapy genspider name(爬虫文件名称) www.xxx.com(url创建后可以修改)
-
爬虫文件 XXXSpider类(父类:scrapy.Spider)
-
属性:
- name 爬虫文件的名称,就是爬虫源文件的一个唯一标识
- allowed_domains 允许的域名: 用来限制start_urls 列表中哪些url可以进行请求发送(此列表中有的则是允许的,此列表也可以注释掉)
- start_urls 起始的url列表: 该列表中存放的url会被scrapy自动进行请求(可以有多个url)
-
函数:
- parse函数用作与数据解析: response参数表示的是请求成功后对应的响应对象
-
-
-
XXX => settings.py 配置文件
-
属性: ROBOTSTXT_OBEY robots.txt协议(为true则遵从)
-
LOG_LEVEL=‘ERROR’ 显示指定类型的日志信息(此为只显示错误信息)
-
ITEM_PIPELINES 是否开启管道(默认为不开启,要则取消注释),其是一个字典,key则是管道类,value则是优先级,数值越小优先级越高(优先级高则表示这个管道类要先执行)
-
USER_AGENT 游览器头部
-
IMAGES_STORE 要下载图片的路径
-
-
pipelines.py文件: 管道
- QiubaiproPipeline类中process_item(): 用于专门处理item类型对象,该方法可以接受爬虫文件提交过来的item对象,且该方法每接受到一个item对象就会被调用一次
-
执行工程:
- scrapy crawl name(爬虫文件名称) 输出显示日志(可在settings配置文件设置只显示错误日志)
- scrapy crawl name(爬虫文件名称) --nolog 执行工程,且不打印日志(不输出错误信息)
-
scrapy数据解析
在scrapy中使用xpath解析,则返回的一定是一个列表,但列表元素一定是Selector类型的对象,如想获取元素的data参数的字符串则需加 .extract() 方法,(列表调用 .extract() 之后.则表示将列表中每一个Selector对象中data对应的字符串提取出来,且也会返回一个列表)
.extract_first() 将列表中第0个Selector对象的data参数对应的字符串提取取并返回(不是列表)
-
scrapy持久化存储
- 基于终端指令:
- 要求: 只可以将parse方法的返回值存储到本地的文本文件中
- 执行: scrapy crawl name(爬虫文件名称) -o 路径+存储文件的名字 将parse方法返回的数据保存到指定的文件中(只能存:“json”,“jsonlines”,“jl”,“csv”,“xml”,“marshal”,“pickie”)
- 好处: 简洁高效便捷
- 缺点: 局限性比较强 (数据只可以存储到指定后缀的文本文件中)
- 基于管道:
- 好处: 通用性强
- 基于终端指令:
-
基于管道:
- 编码流程:
- 数据解析
- 在item类中定义相关的属性 (XXX = scrapy.Field() 每一个变量就是一个字段)
- 将解析的数据封装存储到item类型的对象
- item = QiubaiproItem() # 先在爬虫文件中实例化item类型对象
- item[“XXX”] = XXX # [“XXX”]是在item类中定义的属性,XXX是要存储的值
- 将item类型的对象提交给管道进行持久化存储的操作
- yield item # 将item提交给管道process_item
- 在管道类process_item中要将其接收接收到的item对象中存储的数据进行持久化存储的操作
- process_item # 该方法每接收到一个item就会被调用一次(专门用于处理item类型对象)
- open_spider(self,spider) # 重写父类的一个方法,该方法只在开始爬虫的时候调用一次(此方法一般用于打开文件)
- close_spider(self,spider) # 重写父类的一个方法,该方法只在结束爬虫的时候调用一次(此方法一般用于关闭文件)
- 在配置文件中开启管道
- 自定义管道类
- 需要在pipelines.py文件中新建一个管道类
- 需要在配置文件中添加新加的管道类配置
- 每次提交item类型对象,每个管道类都会执行,但是执行的先后顺序不同
- 管道文件中,一个管道类对应将一组数据存储到一个平台或载体中
- 在管道文件中先执行的管道类会接收item对象,之后 return item 则会把item对象传给下一个管道类
- 编码流程:
-
基于Spider的全站数据爬取
- 实现方式:
- 将所有页面的url添加到start_urls列表中 (不推荐)
- 自行手动进行请求发送 (推荐)
- yield scrapy.Request(url=new_url,callback=self.parse)
- 手动发起请求
- url参数是要请求的网页链接
- callback参数是回调函数,专门用于数据解析,这个是调用了parse()方法(也可自己定义一个数据解析的方法)
- meta 也可加meta参数(字典),此参数会传递给对应的回调函数 (response.meta[‘XXX’] 则可以取出传递meta字典中对应的value)
- yield scrapy.Request(url=new_url,callback=self.parse)
- 实现方式:
-
图片数据爬取之 ImagesPipeline
- 只需将图片的url进行解析,提交到管道,管道就会对图片的url进行请求发送获取图片的二进制类型的数据,且还会帮我们进行持久化存储
- 使用流程:
-
数据解析(图片的url)
-
将存储图片url的item提交到制定的管道类
-
在管道文件中自定义一个 XXX(ImagesPipeline) 类(父类:ImagesPipeline) 需要导入:from scrapy.pipelines.images import ImagesPipeline
- get_media_requests # 根据url请求图片数据(如:
def get_media_requests(self, item, info):
yield scrapy.Request(item[‘img_url’])) - file_path # 指定图片存储的名字(方法的返回值就是图片的名字: 如
def file_path(self, request, response=None, info=None, *, item=None):
return img_name) - item_completed # 将item返回给下一个即将执行的管道类(如:
def item_completed(self, results, item, info):
return item)
- get_media_requests # 根据url请求图片数据(如:
-
在配置文件中:
- IMAGES_STORE = ‘XXX’ # XXX是图片存储路径
-
开启制定的管道类: 自定制的管道类
-
-
scrapy五大核心组件
-
调度器(Scheduler)
- 调度器,说白了可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列,由它来决定下一个要抓取的网址是什么,同时去除重复的网址(不做无用功)。用户可以跟据自己的需求定制调度器。
-
下载器(Downloader)
- 下载器,是所有组件中负担最大的,它用于高速地下载网络上的资源。Scrapy的下载器代码不会太复杂,但效率高,主要的原因是Scrapy下载器是建立在twisted这个高效的异步模型上的
-
爬虫(spiders)
- 爬虫,是用户最关心的部份。用户定制自己的爬虫,用于从特定的网页中提取自己需要的信息,即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面。
-
实体管道(Pipeline)
- 实体管道,用于处理爬虫提取的实体。主要的功能是持久化存储
-
Scrapy引擎
- Scrapy引擎是整个框架的核心。它用来控制调试器、下载器、爬虫。实际上,引擎相当于计算机的CPU,它控制着整个流程。
-