Ssrapy框架

Scrapy框架的使用

  1. - pySpider
  2. - 什么是框架?
  3. - 就是一个具有很强通用性且集成了很多功能的项目模板(可以被应用在各种需求中)
  4. - scrapy集成好的功能:
  5. - 高性能的数据解析操作(xpath)
  6. - 高性能的数据下载
  7. - 高性能的持久化存储
  8. - 中间件
  9. - 全栈数据爬取操作
  10. - 分布式:redis
  11. - 请求传参的机制(深度爬取)
  12. - scrapy中合理的应用selenium

- 环境的安装

a. pip3 install wheel

b. 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

c. 进入下载目录,执行 pip3 install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl

d. pip3 install pywin32

e. pip3 install scrapy

- 创建工程

- scrapy startproject ProName
- cd ProName
- scrapy genspider spiderName www.xxx.com :创建爬虫文件
- 执行:scrapy crawl spiderName
- settings:
- 不遵从robots协议
- UA伪装
- LOG_LEVEL = 'ERROR'

- scrapy的数据解析
- extract():列表是有多个列表元素
- extract_first():列表元素只有单个
- scrapy的持久化存储
- 基于终端指令:
- 只可以将parse方法的返回值存储到磁盘文件中
- scrapy crawl first -o file.csv
- 基于管道:pipelines.py

- 编码流程:

- 1.数据解析
- 2.在item的类中定义相关的属性
- 3.将解析的数据存储封装到item类型的对象中.item['p']
- 4.将item对象提交给管道
- 5.在管道类中的process_item方法负责接收item对象,然后对item进行任意形式的持久化存储
- 6.在配置文件中开启管道
- 细节补充:
- 管道文件中的一个管道类表示将数据存储到某一种形式的平台中。
- 如果管道文件中定义了多个管道类,爬虫类提交的item会给到优先级最高的管道类。
- process_item方法的实现中的return item的操作表示将item传递给下一个即将被执行的管道类

- 管道的持久化存储:

- 数据解析(爬虫类)
- 将解析的数据封装到item类型的对象中(爬虫类)
- 将item提交给管道:yield item(爬虫类)
- 在官大类的process_item中接收item对象并且进行任意形式的持久化存储操作(管道类)
- 在配置文件中开启管道
- 细节:
- 将爬取的数据进行备份?
- 一个管道类对应一种平台的持久化存储
- 有多个管道类是否意味着多个管道类都可以接受到爬虫文件提交的item?
- 只有优先级最高的管道才可以接受到item,剩下的管道类是需要从优先级最高的管道类中接收item

- 基于Spider父类进行全站数据的爬取
- 全站数据的爬取:将所有页码对应的页面数据进行爬取
- 手动请求的发送(get):
yield scrapy.Request(url,callback)
- 对yield的总结:
- 向管道提交item的时候:yield item
- 手动请求发送:yield scrapy.Request(url,callback)
- 手动发起post请求:
yield scrapy.FormRequest(url,formdata,callback):formdata是一个字典表示的是请求参数

- scrapy五大核心组件

1.引擎(Scrapy)
             用来处理整个系统的数据流处理, 触发事务(框架核心)


2.调度器(Scheduler)
            用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址

 

3.下载器(Downloader)
            用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)


4.爬虫(Spiders)
            爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面


5.项目管道(Pipeline)
            负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。

- scrapy的请求传参
- 作用:实现深度爬取。
- 使用场景:如果使用scrapy爬取的数据没有存在同一张页面中
- 传递item:yield scrapy.Request(url,callback,meta)
- 接收item:response.meta

- 提升scrapy爬取数据的效率
- 在配置文件中进行相关的配置即可:


增加并发:默认scrapy开启的并发线程为32个,可以适当进行增加。在settings配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100。

降低日志级别:在运行scrapy时,会有大量日志信息的输出,为了减少CPU的使用率。可以设置log输出信息为INFO或者ERROR即可。在配置文件中编写:LOG_LEVEL = ‘INFO’

禁止cookie:如果不是真的需要cookie,则在scrapy爬取数据时可以禁止cookie从而减少CPU的使用率,提升爬取效率。在配置文件中编写:COOKIES_ENABLED = False

禁止重试:对失败的HTTP进行重新请求(重试)会减慢爬取速度,因此可以禁止重试。在配置文件中编写:RETRY_ENABLED = False

减少下载超时:如果对一个非常慢的链接进行爬取,减少下载超时可以能让卡住的链接快速被放弃,从而提升效率。在配置文件中进行编写:DOWNLOAD_TIMEOUT = 10 超时时间为10s


- scrapy的中间件

- 爬虫中间件
- 下载中间件(***):处于引擎和下载器之间
- 作用:批量拦截所有的请求和响应
- 为什么拦截请求
- 篡改请求的头信息(UA伪装)
- 修改请求对应的ip(代理)
- 为什么拦截响应
- 篡改响应数据,篡改响应对象
- 爬取网易新闻的新闻标题和内容

- selenium在scrapy中的使用流程

- 在爬虫类中定义一个bro的属性,就是实例化的浏览器对象
- 在爬虫类重写父类的一个closed(self,spider),在方法中关闭bro
- 在中间件中进行浏览器自动化的操作

 --------------------------------------------------------------------------------------------------------------------------

 --------------------------------------------------------------------------------------------------------------------------

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'

- 图片懒加载
- 应用到标签的伪属性,数据捕获的时候一定是基于伪属性进行!!!
- ImagePileline:专门用作于二进制数据下载和持久化存储的管道类

- CrawlSpider
- 一种基于scrapy进行全站数据爬取的一种新的技术手段。
- CrawlSpider就是Spider的一个子类
- 连接提取器:LinkExtractor
- 规则解析器:Rule
- 使用流程:
- 新建一个工程
- cd 工程中
- 新建一个爬虫文件:scrapy genspider -t crawl spiderName www.xxx.com

- 分布式
- 概念:需要搭建一个分布式的机群,然后在机群的每一台电脑中执行同一组程序,让其对某一个网站的数据进行联合分布爬取。
- 原生的scrapy框架是不可以实现分布式?
- 因为调度器不可以被共享
- 管道不可以被共享
- 如何实现分布式?
- scrapy+scrapy_redis实现分布式
- scrapy-redis组件的作用是什么?
- 可以提供可被共享的调度器和管道
- 特性:数据只可以存储到redis数据库。
- 分布式的实现流程:
- 1.pip install scrapy-redis
- 2.创建工程
- 3. cd 工程目录中
- 4.创建爬虫文件(a.创建基于Spider的爬虫文件 b.创建CrawlSpider的爬虫文件)
- 5.修改爬虫类:
- 导报:from scrapy_redis.spiders import RedisCrawlSpider
- 修改当前爬虫类的父类为RedisCrawlSpider
- allowed_domains和start_urls删除
- 添加一个新属性:redis_key = 'fbsQueue',表示的是可以被共享的调度器队列的名称
- 编写爬虫类的其他操作(常规操作)
- 6.settings配置文件的配置
- UA伪装
- Robots
- 管道的指定:
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 400
}
- 指定调度器:
# 增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis组件自己的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 配置调度器是否要持久化, 也就是当爬虫结束了, 要不要清空Redis中请求队列和去重指纹的set。如果是True, 就表示要持久化存储, 就不清空数据, 否则清空数据
SCHEDULER_PERSIST = True

- 指定redis数据库
REDIS_HOST = 'redis服务的ip地址'
REDIS_PORT = 6379

- redis的配置文件进行配置redis.windows.conf:
- 关闭默认绑定:56Line:#bind 127.0.0.1
- 关闭保护模式:75Line:protected-mode no
- 启动redis的服务端和客户端:
- redis-server.exe redis.windows.conf
- redis-cli

- 启动程序:
scrapy runspider xxx.py
- 向调度器的队列中仍入一个起始的url:
- 队列是存在于redis中
- 开启redis的客户端: lpush fbsQueue http://wz.sun0769.com/index.php/question/questionType?type=4&page=

- 增量式
- 概念:用于监测网站数据更新的情况。
- 核心机制:去重。redis的set实现去重


- 总结反爬机制:
- robots
- UA伪装
- 验证码
- 代理
- cookie
- 动态变化的请求参数
- js加密
- js混淆
- 图片懒加载
- 动态数据的捕获
- seleium:规避检测

原文地址:https://www.cnblogs.com/xied/p/12558216.html