scrapy的数据解析数据库
在scrapy中咱们使用xpath解析到的数据都被封装到了一个selector对象中,咱们须要的字符串数据也都封装到这个对象中了
若是咱们能够肯定xpath返回的列表中只有一个对象,用extract_first(),若是不是一个值,则用extract()便可.
scrapy的持久化存储框架
scrapy的持久化存储分为两种: 一种是基于终端指令的,另外一种是基于管道的 基于终端指令: 能够将parse方法的返回值对应的数据进行本地磁盘的持久化存储 scrapy crawl pcName -o fliePath 缺点: 局限性较强(只能是特定的文件格式,而且数据不能存储到数据库中) 优势: 便捷,简单
基于管道:
1.数据解析
2.在item类中进行相关属性的封装
3.实例化一个item类型的对象
4.将解析到的数据存储到item对象中
5.将item交给管道
6.在配置文件中开启管道
注意事项:
爬虫文件提交的item只会提交到第一个被执行的管道中
在管道类中的process_item方法中return item,是将item传递给下一个即将被执行的管道类
习惯: 在每一个process_item方法执行后都须要写return item
进行全站数据爬取异步
手动发起get请求 yield scrapy.Request(url,callback) 手动发起post请求 yield scrapy.FormRequest(url,callback,formdata) url : 向哪一个网站发起请求 callback : 回调函数 formdata: 请求时发送的参数 若是想要将起始列表中的url进行post请求的发送,须要重写父类中的方法 def start_requests(self): for url in self.start_urls: data={ 'name':'xixi' } yield scrapy.FormRequest(url,callback=self.parse,formdata=data)
scrapy的五大核心组件scrapy
爬虫程序(Spider)
爬虫是主要干活的, 用于从特定的网页中提取本身须要的信息, 即所谓的实体(Item)。用户也能够从中提取出连接,让Scrapy继续抓取下一个页面
引擎(scrapy)
用来处理整个系统的数据流处理, 触发事务(框架核心)
调度器(Scheduler)
用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 能够想像成一个URL(抓取网页的网址或者说是连接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
下载器(Downloader)
用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是创建在twisted这个高效的异步模型上的)
项目管道(Pipeline)
负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证明体的有效性、清除不须要的信息。当页面被爬虫解析后,将被发送到项目管道,并通过几个特定的次序处理数据。
执行流程:ide
1.爬虫对象将url封装成请求对象发送给引擎(可能有不少个请求对象) 2.引擎拿到请求对象以后,会把他传递给调度器,调度器中会先通过过滤器过滤掉重复的请求对象,而后将这些对象存放在队列中 3.将队列中的一个对象传递给引擎 4.引擎将对象传递给下载器 5.下载器经过发送请求向互联网发送请求 6.互联网返回给下载器数据 7.下载器将数据传递给引擎 8.引擎将数据传递给爬虫数据,而后进行数据解析等操做 9.解析完成后,爬虫程序将解析的数据发送给引擎. 10.引擎将数据传递给管道,进行数据的持久化存储
请求传参:函数
使用场景: 爬取的数据没有在用一个页面上 如何实现: 在手动发送请求时,能够将一个字典传递给回调函数 yield scrapy.Resquest(url,callback,meta) callback取值meta字典值: response.meta['xxx']