爬虫 第八天
- xpath表达式中可以使用管道符是的xpath表达式更加具有通用性
xpath('./div/p//text() | ./span/a/div//text()')
strip('/ ')
scrapy如何爬取图片数据(ImagePileLine)
- 爬虫文件中将二进制资源的url进行爬取和解析,将其存储到item中向管道提交
- 在管道文件中指定对应的管道类
- 父类:from scrapy.pipelines.images import ImagesPipeline
- 配置文件中:
- #自动创建一个指定的文件夹:IMAGES_STORE = './imgsLib'
- 自定义一个基于ImagesPipeline该父类的管道类,重写如下三个方法:
#发起请求
def get_media_requests(self,item,info):
print(item)
img_src = item['img_src']
#请求传参,将meta字典传递给了file_path这个方法
yield scrapy.Request(url=img_src,meta={'item':item})
#定制get_media_request请求到数据持久化存储的路径(文件夹的路径+文件名称)
def file_path(self,request,response=None,info=None):
#通过request.meta接收请求传参传递过来的meta字典
img_name = request.meta['item']['img_name']
return img_name
#将item传递给下一个即将被执行的管道类
def item_completed(self,request,item,info):
return item
CrawlSpider全站数据爬取
- CrawlSpider就是Spider的一个子类
- 如何创建一个基于CrawlSpider的一个爬虫文件
- scrapy genspider -t crawl spiderName www.xxx.com
- LinkExtractor(Allow="正则表达式"):链接提取器
- 作用:根据指定的规则(Allow)进行url的提取
- 注意:Allow=“”:可以将网站的所有链接都捕获到
- Rule(link,callback,fllow=True):规则解析器
- 作用:
- 1.接受到link提取到的链接,然后对其进行请求发送
- 2.根据指定规则对请求到的数据进行数据解析
- follow=True:将链接提取器 继续作用到 链接提取器 提取到的链接 对应的页面源码中
- 深度爬取:
- 让手动请求发送,请求传参和LinkExtractor,Rule一起使用实现深度爬取
分布式
- 概念:搭建一个分布式机群,共同执行一组代码,联合对同一个资源的数据进行分布且联合爬取
- 实现方式:
- 简称:scrapy+redis
- 全程:Scrapy框架+scrapy-redis组件
- 原生的scrapy框架是无法实现分布式
- 原生scrapy中的调度器和管道无法被共享
- scrapy-redis组件的作用
- 可以给原生的scrapy框架提供可以被共享的管道和调度器
- 环境的安装:
- pip install scrapy-redis
- 实现流程:
- 修改爬虫文件中爬虫类对应的操作
- 1.导包:from scrapy_redis.spiders import RedisCrawlSpider
- 2.将爬虫类的父类修改成RedisCrawlSpider
- 3.将start_url删除,添加一个redis_key=‘可以被共享调度器队列的名称’
- 4.进行常规的请求和解析和向管道提交item的操作即可
- 对settings.py配置
- 配置管道:
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
- 56行:#bind 127.0.0.1
- 75行:protected-mode no
- 启动redis服务和客户端:
- 携带配置文件启动redis服务:
- redis-server.exe redis.windows.conf
- 启动客户:
- redis-cli
- 启动程序:
- 在终端中进入到爬虫文件对应的目录中:
- scrapy runspider fbs.py
- 向调度器的队列中仍入一个起始的url:
- redis-cli:
- lpush redis_key的属性值 www.xxx.com
增量式爬虫
- 监测网站数据更新的情况。以便于爬取到最新更新出来的数据
- 核心:去重
- 记录表:
- 特性:永久性存储 (redis中的set)
- 作用:记录爬取过的数据对应的url
- 可以以明文的形式存储(url数据长度较短)
- 记录的数据对其生成一个【数据指纹】(url数据长度长)
- 数据指纹就是该组数据的唯一标识
- 核心:去重