python爬虫---CrawlSpider实现的全站数据的爬取,分布式,增量式,所有的反爬机制

2023-05-12,,

CrawlSpider实现的全站数据的爬取

新建一个工程
cd 工程
创建爬虫文件:scrapy genspider -t crawl spiderName www.xxx.com
连接提取器LinkExtractor
可以根据指定的规则对指定的连接进行提取

提取的规则就是构造方法中的allow(‘正则表达式’)参数决定
规则解析器Rule
可以将将连接提取器提取到的连接进行请求发送,可以根据指定的规则(callback)对请求到的数据进行解析
follow=True:将连接提取器 继续作用到 连接提取器提取到的连接 所对应的 页面源码中

分布式

实现方式:scrapy+scrapy_redis组件实现的分布式。scrapy+redis

原生的scrapy是不可以实现分布式的!!!

什么是分布式

需要搭建一个由n台电脑组成的机群,然后在每一台电脑中执行同一组程序,让其对同一个网络资源
进行联合且分布的数据爬取。

为什么scrapy不可以实现分布式

调度器不可以被共享
管道不可以被共享

scrapy-reids组件的作用是什么

提供可以被共享的管道和调度器

分布式的实现流程

环境的安装:pip install scrapy-redis

创建工程

cd 工程

创建爬虫文件:

基于Spider
基于CrawlSpider

修改爬虫文件:

导报:
from scrapy_redis.spiders import RedisCrawlSpider#基于crawlSpider爬虫文件
from scrapy_redis.spiders import RedisSpider #基于Spider爬虫文件
将当前爬虫类的父类修改为RedisCrawlSpider
删除allowed_domains和start_urls
添加一个redis_key = ‘xxx’属性,表示的是调度器队列的名称、
根据常规形式编写爬虫文件后续的代码

修改settings配置文件

指定管道
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 = '192.168.13.254'
REDIS_PORT = 6379

修改redis的配置文件redis.windows.conf

关闭默认绑定

56行:#bind 127.0.0.1
关闭保护模式
75行:protected-mode no

启动redis的服务端(携带配置文件)和客户端

启动分布式的程序:

scrapy runspider xxx.py

向调度器的队列中扔入一个起始的url

队列是存在于redis中
redis的客户端中:lpush sun www.xxx.com

在redis中就可以查看爬取到的数据

增量

概念:监测
核心技术:去重
适合使用增量式的网站:
基于深度爬取

对爬取过的页面的url进行一个记录(记录表)
基于非深度爬取
记录表:爬取过的数据对应的数据指纹

数据指纹:就是原始数据的一组唯一标识
所谓的记录表是以怎样的形式存在于哪?
redis的set充当记录表

反爬机制

robots
UA伪装
图片懒加载
验证码
cookie
动态加载的数据
动态变化的请求参数
js加密
js混淆
代理

python爬虫---CrawlSpider实现的全站数据的爬取,分布式,增量式,所有的反爬机制的相关教程结束。

《python爬虫---CrawlSpider实现的全站数据的爬取,分布式,增量式,所有的反爬机制.doc》

下载本文的Word格式文档,以方便收藏与打印。