一、介绍CrawlSpider

   CrawlSpider其实是Spider的一个子类,除了继承到Spider的特性和功能外,还派生除了其自己独有的更加强大的特性和功能。其中最显著的功能就是”LinkExtractors链接提取器“。Spider是所有爬虫的基类,其设计原则只是为了爬取start_url列表中网页,而从爬取到的网页中提取出的url进行继续的爬取工作使用CrawlSpider更合适。

源码:

class CrawlSpider(Spider):rules = ()def __init__(self, *a, **kw):super(CrawlSpider, self).__init__(*a, **kw)self._compile_rules()#首先调用parse()来处理start_urls中返回的response对象#parse()则将这些response对象传递给了_parse_response()函数处理,并设置回调函数为parse_start_url()#设置了跟进标志位True#parse将返回item和跟进了的Request对象    def parse(self, response):return self._parse_response(response, self.parse_start_url, cb_kwargs={}, follow=True)#处理start_url中返回的response,需要重写def parse_start_url(self, response):return []def process_results(self, response, results):return results#从response中抽取符合任一用户定义'规则'的链接,并构造成Resquest对象返回def _requests_to_follow(self, response):if not isinstance(response, HtmlResponse):returnseen = set()#抽取之内的所有链接,只要通过任意一个'规则',即表示合法for n, rule in enumerate(self._rules):links = [l for l in rule.link_extractor.extract_links(response) if l not in seen]#使用用户指定的process_links处理每个连接if links and rule.process_links:links = rule.process_links(links)#将链接加入seen集合,为每个链接生成Request对象,并设置回调函数为_repsonse_downloaded()for link in links:seen.add(link)#构造Request对象,并将Rule规则中定义的回调函数作为这个Request对象的回调函数r = Request(url=link.url, callback=self._response_downloaded)r.meta.update(rule=n, link_text=link.text)#对每个Request调用process_request()函数。该函数默认为indentify,即不做任何处理,直接返回该Request.yield rule.process_request(r)#处理通过rule提取出的连接,并返回item以及requestdef _response_downloaded(self, response):rule = self._rules[response.meta['rule']]return self._parse_response(response, rule.callback, rule.cb_kwargs, rule.follow)#解析response对象,会用callback解析处理他,并返回request或Item对象def _parse_response(self, response, callback, cb_kwargs, follow=True):#首先判断是否设置了回调函数。(该回调函数可能是rule中的解析函数,也可能是 parse_start_url函数)#如果设置了回调函数(parse_start_url()),那么首先用parse_start_url()处理response对象,#然后再交给process_results处理。返回cb_res的一个列表if callback:#如果是parse调用的,则会解析成Request对象#如果是rule callback,则会解析成Itemcb_res = callback(response, **cb_kwargs) or ()cb_res = self.process_results(response, cb_res)for requests_or_item in iterate_spider_output(cb_res):yield requests_or_item#如果需要跟进,那么使用定义的Rule规则提取并返回这些Request对象if follow and self._follow_links:#返回每个Request对象for request_or_item in self._requests_to_follow(response):yield request_or_itemdef _compile_rules(self):def get_method(method):if callable(method):return methodelif isinstance(method, basestring):return getattr(self, method, None)self._rules = [copy.copy(r) for r in self.rules]for rule in self._rules:rule.callback = get_method(rule.callback)rule.process_links = get_method(rule.process_links)rule.process_request = get_method(rule.process_request)def set_crawler(self, crawler):super(CrawlSpider, self).set_crawler(crawler)self._follow_links = crawler.settings.getbool('CRAWLSPIDER_FOLLOW_LINKS', True)

文档:Spiders — Scrapy 2.9.0 documentation

二、框架搭建

1.创建scrapy框架工程scrapy startproject Meitou2.进入工程目录cd Meitou3.创建爬虫文件scrapy genspider -t crawl 爬虫任务名称 爬取的范围域 scrapy genspider -t crawl crawl_yjin xx.com此指令对比以前指令多了"-t crawl",表示创建的爬虫文件是基于CrawlSpider这个类的,而不再是Spider这个基类。4.启动爬虫文件scrapy crawl crawl_yjin --nolog

(一)、查看生成的爬虫文件 :

Rule(规则): 规范url构造请求对象的规则

LinkExtractor(链接提取器):规范url的提取范围

CrawlSpider:是一个类模板,继承自Spider,功能就更加的强大

(二)、查看LinkExtractor源码: 

  LinkExtractor 链接提取器

作用:提取response中符合规则的链接。

 主要参数含义:

LinkExtractor:规范url提取可用的部分
allow=(): 满足括号中“正则表达式”的值会被提取,如果为空,则全部匹配。
deny=(): 与这个正则表达式(或正则表达式列表)不匹配的URL一定不提取。
allow_domains=():允许的范围域
deny_domains=(): 不允许的范围域
restrict_xpaths=(): 使用xpath表达式,和allow共同作用过滤链接(只选到节点,不选到属性)
tags=('a', 'area'): 指定标签
attrs=('href',): 指定属性

(三)、查看Rule源码: 

     Rule : 规则解析器。根据链接提取器中提取到的链接,根据指定规则提取解析器链接网页中的内容

Rule (LinkExtractor(allow=r"Items/"), callback="parse_item", follow=True)

  主要参数含义:

  • - link_extractor为LinkExtractor,用于定义需要提取的链接
  • - callback参数:当link_extractor获取到链接时参数所指定的值作为回调函数
  • - callback参数使用注意:  当编写爬虫规则时,请避免使用parse作为回调函数。于CrawlSpider使用parse方法来实现其逻辑,如果您覆盖了parse方法,crawlspider将会运行失败
  • - follow:指定了根据该规则从response提取的链接是否需要跟进。 当callback为None,默认值为True
  • - process_links:主要用来过滤由link_extractor获取到的链接
  • - process_request:主要用来过滤在rule中提取到的request

rules=( ):指定不同规则解析器。一个Rule对象表示一种提取规则。

(四)、CrawlSpider整体爬取流程:

 (a) 爬虫文件首先根据起始url,获取该url的网页内容

 (b) 链接提取器会根据指定提取规则将步骤a中网页内容中的链接进行提取

 (c) 规则解析器会根据指定解析规则将链接提取器中提取到的链接中的网页内容根据指定的规则进行解析

 (d) 将解析数据封装到item中,然后提交给管道进行持久化存储

三、基于CrawlSpider使用

(1)spider爬虫文件代码

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Ruleclass CrawlYjinSpider(CrawlSpider):name = "crawl_yjin"allowed_domains = ["xiachufang.com"]start_urls = ["https://www.xiachufang.com/category/40073/"]  # 起始url (分类列表的小吃)# 创建一个Rule对象(也创建一个LinkExtractor对象)rules = (# 菜单详情地址# https://www.xiachufang.com/recipe/106909278/# https://www.xiachufang.com/recipe/1055105/Rule(LinkExtractor(allow=r".*?/recipe/\d+/$"), callback="parse_item", follow=False),)# 解析菜单详情def parse_item(self, response):# 不需要手动构造item对象item = {}# print(response.url)# 图片链接,名称,评分,多少人做过,发布人item['imgs'] = response.xpath('//div/img/@src').get()#去除空格和\nitem['title']=''.join(response.xpath('//div/h1/text()').get()).replace(' ','').replace('\n','')item['score']=response.xpath('//div[@class="score float-left"]/span[@class="number"]/text()').extract_first()item['number']=response.xpath('//div[@class="cooked float-left"]/span[@class="number"]/text()').get()item['author']=''.join(response.xpath('//div[@class="author"]/a/img/@alt').get()).replace('的厨房','')# print(item)return item

(2)数据保存>>pipelines管道文件

import jsonfrom itemadapter import ItemAdapterclass MeitouPipeline:"""处理items对象的数据"""def __init__(self):self.file_=open('xcf-1.json','w',encoding='utf-8')print('文件打开了。。。')def process_item(self, item, spider):"""item接收爬虫器丢过来的items对象"""py_dict=dict(item) # 先把携带键值对数据items对象转成字典#dict转换成json数据json_data=json.dumps(py_dict,ensure_ascii=False)+",\n"#写入self.file_.write(json_data)print("写入数据...")return itemdef __del__(self):self.file_.close()  #关闭print('文件关闭了....')

(3) settings相关设置 >>settings.py设置文件

# 全局用户代理,默认是被注释了,不生效
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'# Obey robots.txt rules
ROBOTSTXT_OBEY = False# 设置下载延时
DOWNLOAD_DELAY = 1#开启管道
ITEM_PIPELINES = {"Meitou.pipelines.MeitouPipeline": 300,
}

(4)运行程序 >>scrapy crawl crawl_yjin  --nolog
   

查看保存的json文件

Scrapy CrawlSpider介绍和使用相关推荐

  1. Scrapy安装介绍

    Scrapy安装介绍 一. Scrapy简介 Scrapy is a fast high-level screen scraping and web crawling framework, used ...

  2. 1. Scrapy 框架介绍

    1. Scrapy 框架介绍 Scrapy是Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy = Scrach+Python S ...

  3. 第三百二十四节,web爬虫,scrapy模块介绍与使用

    第三百二十四节,web爬虫,scrapy模块介绍与使用 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为 ...

  4. 爬虫-windows下安装Scrapy及scrapy模块介绍

    一:安装wheel  wheel介绍 二:安装twisted twisted是由python编写的一款基于事件驱动的网络引擎,使用twisted模块将python的异步请求(异步模型介绍)成为可能且简 ...

  5. scrapy crawlspider

    crawlspider就可以实现上述需求,能够匹配满足条件的url地址,组装成Reuqest对象后自动发送给引擎,同时能够指定callback函数 1.从response中提取所有的满足规则的url地 ...

  6. 爬虫学习笔记-scrapy框架介绍

    优势 批量爬取数据 高效率 架构图 各模块的功能 1,Scrapy Engine(引擎):Scrapy框架的核心部分.负责在Spider和ItemPipeline.Downloader.Schedul ...

  7. 13 Scrapy框架介绍

    # Author:Nimo_Ding''' 练习 - 当当图书榜单爬虫 前两关,我们学习了能提升爬虫速度的进阶知识--协程,并且通过项目实操,将协程运用于抓取薄荷网的食物数据. 可能你在体验开发一个爬 ...

  8. scrapy+crawlspider+增量式爬取电影

    如果我们要爬去一个网站,而网站的数据又是经常更新的,但是对于爬虫来说,启动爬虫的时候他会认为他爬取的数据是新的,因此,我们需要一个凭证来告诉爬虫这个数据已经存在 movie.py # -*- codi ...

  9. 爬取汽车之家图片 - scrapy - crawlspider - python爬虫案例

    爬取汽车之家图片 需求:爬取汽车之家某一个汽车的图片 ​ 一. 普通scrapy 第一步 页面分析 目标url: https://car.autohome.com.cn/photolist/serie ...

最新文章

  1. TypeScript 基础类型
  2. 比特币现金的第四次战役
  3. Openstack_通用模块_Oslo_vmware 创建/删除 vCenter 虚拟机
  4. 有弹性的ListView
  5. Python面向对象反射,双下方法
  6. 每日阅读(产品) 汤道QQ与微信
  7. Sticks UVA - 307(切木棍 线性区间dp,线性dp,区间思想。)
  8. 开启协程_软件特攻队|GCC10发布,GCC 11将支持C++20协程功能?
  9. 未来计算机的两个发展方向是巨型化和,【填空题】未来的计算机将以超大规模集成电路为基础,向巨型化、( )、多媒体化、网络化和智能化的方向发展。...
  10. PHP设计模式——职责链模式
  11. PAIP.通过公共网络传递秘密信息.txt (包括语音和文字)
  12. 虚拟化技术在企业中的实际应用
  13. 如何区分冲突域和广播域?
  14. DDR123信号完整性测试分析技术探析
  15. 洛谷 P2906 [USACO08OPEN]牛的街区Cow Neighborhoods | Set+并查集
  16. java生成密码生成
  17. Oracle数据库启动过程详解
  18. Tomcat文件包含漏洞:CNVD-2020-10487(简介/验证/利用/修复)
  19. android音频焦点Audio Focus
  20. 灭了珊瑚虫,OOXX了SOFF,下一个是谁?

热门文章

  1. 服务器开机提示系统初始化失败,Win7开机提示交互式登录进程初始化失败怎么解决...
  2. ‍swf文件格式解析入门(tag解析)
  3. RoseHA9.0 for WindowsServer2008R2 配合sqlserver安装配置
  4. 关于日期格式的书写及对应含义(便于查找)
  5. vue-barcode生成条形码
  6. 创造天赋:达·芬奇的7种天才特质
  7. xshell6 和 xftp6 官网免费下载
  8. Python菜鸟入门基础篇,零基础小白必看
  9. android的rtmp直播推流(一) nginx服务器的搭建
  10. 点对点通讯的好处和坏处?能否实现及时通讯?