标签:其他 导包 rap desc 正则 meta pat tps 属性
是Spider的一个子类。自己派生出独有的方法和属性。
功能:作用全站数据爬取场景
使用:
- 创建工程
- cd 工程
- 创建爬虫文件:
- 创建一个基于CrawlSpider的爬虫文件
- 指令:scrapy genspider -t crawl spiderName www.xxx.com
- 执行工程
import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule class CrawlModelSpider(CrawlSpider): name = ‘crawl_model‘ # allowed_domains = [‘www.xxx.com‘] start_urls = [‘https://www.4567kan.com/index.php/vod/show/class/动作/id/1.html‘] # LinkExtractor叫做链接提取器 # 作用:根据指定的规则(allow=‘正则‘)在页面中进行相关链接(url)的提取 link = LinkExtractor(allow=r‘/id/1/page/\d+\.html‘) rules = ( # Rule叫做规则解析器,链接提取器是被作用在规则解析器 # 作用:可以接受link提取到的链接,且对链接进行请求发送,根据指定规则(callback)对请求到的数据进行数据解析 # follow=True:可以将 链接提取器 继续作用到 链接提取器 提取到的页码 所对应的页面源码中 Rule(link, callback=‘parse_item‘, follow=True), ) def parse_item(self, response): print(response)
import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule import scrapy from moviePro.items import MovieproItem class MovieSpider(CrawlSpider): name = ‘movie‘ # allowed_domains = [‘www.xxx.com‘] start_urls = [‘https://www.4567kan.com/index.php/vod/show/class/动作/id/1/page/1.html‘] rules = ( # 提取页码链接 Rule(LinkExtractor(allow=r‘/id/1/page/\d+\.html‘), callback=‘parse_item‘, follow=False), # 提取详情页链接 # Rule(LinkExtractor(allow=r‘/movie/index\d+\.html‘),callback=‘parse_detail‘,follow=False) ) def parse_item(self, response): # 解析电影的名称 li_list = response.xpath(‘/html/body/div[1]/div/div/div/div[2]/ul/li‘) for li in li_list: title = li.xpath(‘./div/a/@title‘).extract_first() detail_url = ‘https://www.4567kan.com‘ + li.xpath(‘./div/a/@href‘).extract_first() item = MovieproItem() item[‘title‘] = title yield scrapy.Request(url=detail_url, callback=self.parse_detail, meta={‘item‘: item}) def parse_detail(self, response): desc = response.xpath(‘/html/body/div[1]/div/div/div/div[2]/p[5]/span[2]/text()‘).extract_first() item = response.meta[‘item‘] item[‘desc‘] = desc yield item
概念:搭建一个分布式机群,然后让每一台电脑进行联合且分布的数据爬取。
原生的scrapy框架是无法实现分布式
- 调度器无法被机群共享
- 管道无法被共享
必须要要scrapy结合scrapy-redis组件一起实现分布式
- scrapy-redis组件的作用:
- 可以给scrapy提供可以被共享的管道和调度器
- 为什么组件的名称叫做scrapy-redis
- 爬取到的数据只能存储到redis中
环境安装:
- pip install scrapy-redis
实现流程:
- 1.新建工程(基于CrawlSpider)
- 2.修改爬虫文件
- 导包:from scrapy_redis.spiders import RedisCrawlSpider
- 修改当前爬虫类的父类为RedisCrawlSpider
- 将start_urls替换成redis_key属性,属性值为字符串,表示可以被共享的调度器队列的名称
- 编写后序的爬虫文件相关操作
- 3.进行setting配置文件的配置
- 指定管道
- 指定调度器
- 指定redis
- 4.对redis的配置文件进行配置
- 56行:关闭默认绑定,#bind 127.0.0.1
- 75行:关闭保护模式,允许其他设备有redis写入的权限,protected-mode no
- 5.启动redis的服务端和客户端
- 6.执行工程
- 7.向调度器队列中扔入一个起始的url:调度器的队列是存在于redis中
- 在redis的客户端执行如下指令:
- lpush 调度器队列的名称 起始的url
- 该指令一旦执行成功,则分布式机群就可以进行数据的爬取
- 8.可以在redis中查看爬取到的数据
- xxx:items:存储的是爬取到的数据
标签:其他 导包 rap desc 正则 meta pat tps 属性
原文地址:https://www.cnblogs.com/wgwg/p/13279877.html