今年过去就在小组待了整整一年了,这一年了收获了很多,自己也拥有的更多的责任,自己成为了python负责人,其实自己并没有那么实力去担任这个职务,我自己也知道自己无论是在技术还有其他方面还有很多的里要走,希望自己能够在今后的日子里可以更加的努力,不断向着自己的目标前进
今年学的技术比较多也比较杂,学了Django、算法、数据结构、爬虫
算法
scrapy框架
-
框架
是一个集成很多功能并且具有很强通用性的一个项目模板 -
如何学习框架
- 专门学习封装各种功能的详细用法
-
什么是scrapy框架
- 爬虫中的一个明星框架,
功能:高性能的的持久性的的储存,异步的数据下载,高性能的数据解析,分布式
- 爬虫中的一个明星框架,
-
scrapy框架基本使用
-
环境的安装
windows:
pycharm 中直接就可以安装 pip install scrapy
创建一个工程:
scrapy startproject xxx
cd xxx
在spiders子目录创建一个爬虫文件- scrapy genspider spiderName www.xxxxx.com
执行工程: - scrapy crawl spiderName
- scrapy genspider spiderName www.xxxxx.com
-
scrapy数据解析
-
scrapy持久化存储:
- 基于终端指令:
- 要求:只可以将parse方法的返回值存储到本地文件中
- 注意:持久化存储对应的文本文件内类型只可以是(‘json’, ‘jsonlines’, ‘jl’, ‘csv’, ‘xml’
, ‘marshal’, ‘pickle’) - 指令:scrapy crawl qiubaipro -o qiuba.csv
scrapy crawl XXX(爬虫文件名) -o xxx. (存储的文件名,及文件格式) - 好处:简介高效,便捷
- 缺点:局限性比较强(数据只可以储存到指定后缀的文件中)
- 基于管道:
- 编码流程:
- 数据解析
- 在item中定义相关属性
- 将解析的数据封装储存到list类型的对象
- 将item类型的对象提交给管道进行持久化存储的操作
- 在管道类的process_item中要将其接受到的item对象中存储的数据进行持久化存储操作
- 在配置文件中开启管道
- 好处:
- 通用性强
- 编码流程:
- 面试题
将爬取到的数据一份存储到本地,一份存储到数据库,如何实现- 管道文件中一个管道类对应的是将数据储存到一个平台
- 爬虫文件提交的item只会给管道文件中第一个被执行的管道类接受
- process_item中的return item 表示将item传递给下一个即将被执行的管道类
- 基于终端指令:
-
-
基于Spider的全站数据爬取
- 就是将网站中某板块下的全部页码对应的页面数据进行爬取
- 需求:
- 实现方式:
- 将所有页面的url添加到start_urls例表中(不推荐,麻烦)
- 自行手动进行请求发送(推荐)
- 手动发送请求:
yield scrapy.Request(url=new_url,callback=self.parse) callback回调函数专门用作于数据解析
- 手动发送请求:
-
scrapy五大核心组件:
- 引擎
- 用来处理整个数据流处理,触发事务(框架的核心)
- 调度器
- 用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回,可以想象成一个URL(抓取网页的地址或者说是链接)
- 的优先队列,由它类决定下一个抓取的网址是什么,可以去除重复的网址
- 下载器:
- 用于下载网页端的内容,并将网页的内容返回给蜘蛛(Scrapy 下载器是建立在twisted这个高效的异步模型)
- 爬虫
- 爬虫主要用来干活,用于从特定的网页中提取自己需要的内容,即所谓的实体item,用户也可以从中提取出链接让Scrapy继续爬取下一个页面
- 项目管道
- 负责处理爬虫从网页中抽取到的实体,主要的功能是持久化实体,验证实体的有效性,清楚不需要的信息,当当页面被爬虫解析后
- 将被发送到项目管道,并经过几个特定的次序处理数据
- 引擎
-
Scrapy请求传参:
- 使用场景:如果要爬取的数据不在同一张页面中,(深度爬取)
- 需求:爬取Boss直聘
-
图片数据爬取之ImagesPipeline
- 基于scrapy爬取字符串类型的数据和爬取图片类型的数据的区别
- 字符串:只需要用xpath进行解析且提交管道类进行数据持久化存储
- 图片:xpath解析出来的图片的src的属性值,单独的对图片地址发起请求获取图片二进制类性的数据
- ImagesPipeline
- 只需要将img的src的属性进行解析,提交到管道,管道就会对图片的src发送请求获取图片的二进制数据据
- 需求:爬取站长素材中的高清图片
- 使用流程:
- 数据解析 (图片的地址)
- 将存储图片地址的item提交到指定的管道类
- 在管道文件中自定制一个基于ImagesPipeline的一个管道类
-
对item中的图片进行请求操作
def get_media_requests(self, item, info):
yield scrapy.Request(item[‘src’])定制土图片的名称 指定图片的储存路径需要在strings文件中指定
def file_path(self, request, response=None, info=None,time=None):
imgName = request.url.split(’/’)[-1]
return imgNamedef item_completed(self, results, item, info):
return item # 返回给下一个即将被执行的管道类 -
在配置文件中:
- 指定图片储存的目录:IMAGES_STORE = ‘./imgs chao’
- 指定开启的管道:自定制的管道类
-
- 基于scrapy爬取字符串类型的数据和爬取图片类型的数据的区别
-
中间件
- 下载中间件
- 位置:引擎和下载器之间
- 作用;批量拦截到整个工程所有的请求和响应
- 拦截请求:
- UA伪装:process_request
- 代理:process_exception return request
- 拦截响应:
- 篡改响应数据,响应对象
- 需求:爬取网易新闻中的新闻数据(标题和内容)
- 通过网易新闻的首页解析出五大板块对应的详情页的url(详情页没有动态加载)
- 每一个板块对应的新闻数据标题都是动态加载出来的
- 通过解析出每一条新闻详情页的url获取详情页的源码,解析出新闻内容
- 下载中间件
CrawlSpider 类 Spider的一个子类
- 全站数据爬取的方式
- 基于Spider:手动请求
- 基于CrawlSpider
- CrawlSpider的使用
- 创建一个工程 scrapy startproject xxx
- cd xxx
- 创建爬虫文件(CrawlSpider):
- scrapy genspider -t crawl xxx www.xxx.com
- 连接提取器
- 作用: 根据指定的规则(allow) 进行指定的链接提取
- 规则解释器:
- 作用: 将链接提取器取到的链接进行指定规则的解析(callback)的解析
需求:爬取sun网站中的编号,新闻标题,新闻内容,标号
- 分析爬取的页面没有在同一张页面中
- 1.可以使用链接提取器提取所有的页码链接
- 2.让链接提取器提取所有的新闻详情页的链接
- 分布式爬虫:
- 安装一个scrapy-redis组件
- 原生的scrapy是不可以实现分布式爬虫,必须要让scrapy结合scrapy-redis组件一起实现分布式爬虫
- 为什么原生的scrapy不可以实现分布式?
- 调度器不可以被分布式集群共享
- 管道不可以被分布式集群共享
- scrapy-redis组件单的作用
- 可以给原生的scrapy框架提供可以被共享的管道和调度器
- 实现流程: