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的五大核心组件
爬虫程序(Spider)
爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
引擎(scrapy)
用来处理整个系统的数据流处理, 触发事务(框架核心)
调度器(Scheduler)
用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
下载器(Downloader)
用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
项目管道(Pipeline)
负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
执行流程:
1.爬虫对象将url封装成请求对象发送给引擎(可能有很多个请求对象) 2.引擎拿到请求对象之后,会把他传递给调度器,调度器中会先经过过滤器过滤掉重复的请求对象,然后将这些对象存放在队列中 3.将队列中的一个对象传递给引擎 4.引擎将对象传递给下载器 5.下载器通过发送请求向互联网发送请求 6.互联网返回给下载器数据 7.下载器将数据传递给引擎 8.引擎将数据传递给爬虫数据,然后进行数据解析等操作 9.解析完成后,爬虫程序将解析的数据发送给引擎. 10.引擎将数据传递给管道,进行数据的持久化存储
请求传参:
使用场景: 爬取的数据没有在用一个页面上 如何实现: 在手动发送请求时,可以将一个字典传递给回调函数 yield scrapy.Resquest(url,callback,meta) callback取值meta字典值: response.meta['xxx']