爬虫之Scrapy框架 (3)

父类中start_requests请求发送的原理

# 简单模拟父类的方法,主要看yield def start_requests(self): for url in self.start_urls: # 发起get请求 yield scrapy.Request(url=url,callback=self.parse) # 发起post请求,formdata存放请求参数 yield scrapy.FormRequest(url=url,callback=self.parse,formdata={}) 代码实现

主要是在spiderName .py中使用递归方法,且明确递归结束的条件;

使用父类yield实现全站爬取

# -*- coding: utf-8 -*- import scrapy from duanziPro.items import DuanziproItem class DuanziSpider(scrapy.Spider): name = \'duanzi\' # allowed_domains = [\'www.xx.com\'] start_urls = [\'https://duanziwang.com/\'] # 手动请求的发送,对其他页码的数据进行请求操作 # 定义通用url模板 url = "https://duanziwang.com/page/%d/" pageNum = 2 def parse(self, response): article_list = response.xpath(\'/html/body/section/div/div/main/article\') # 基于xpath表达式解析 all_data = [] for article in article_list: title = article.xpath(\'./div[1]/h1/a/text()\').extract_first() content = article.xpath(\'./div[2]/pre/code//text()\').extract() content = \'\'.join(content) # 实例化item对象 item = DuanziproItem() # 通过中括号的形式访问属性给其赋值 item[\'title\'] = title item[\'content\'] = content # 向管道提交item yield item if self.pageNum < 5: new_url = format(self.url%self.pageNum) self.pageNum += 1 # 递归实现全站数据爬取,callback指定解析的方法 yield scrapy.Request(url=new_url, callback=self.parse)

在pipelines.py中实现数据持久化存储

class DuanziproPipeline(object): # 重写父类的该方法:该方法只会在爬虫开始的时候执行一次 fp = None def open_spider(self, spider): print(\'open spider\') self.fp = open(\'./duanzi.txt\', \'w\', encoding=\'utf-8\') # 关闭fp def close_spider(self, spider): print(\'close spider\') self.fp.close() # 接收爬虫文件返回item对象,process_item方法每调用一次可接收一个item对象 # item参数:接收到的某一个item对象 def process_item(self, item, spider): # 取值 title = item[\'title\'] content = item[\'content\'] self.fp.write(title + ":" + content + "\n") # 将item转交给下一个即将被执行的管道类 return item

在settings.py中开启管道类

ITEM_PIPELINES = { # 300表示的是优先级,数值越小,优先级越高 \'duanziPro.pipelines.DuanziproPipeline\': 300, } yield在scrapy中的使用

向管道中提交item对象

yield item

手动请求发送

yield scrapy.Request(url,callback)

五大核心组件

引擎(Scrapy Engine)

处理整个系统的数据流,触发事物(框架核心)。

调度器(Scheduer)

用来接收引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回。

下载器(Downloader)

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

爬虫(Spiders)

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

管道(item Pipeline)

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

五大核心组件的工作流程

爬虫之Scrapy框架


当执行爬虫文件时,5大核心组件就在工作了

首先执行爬虫文件spider,spider的作用是
(1)解析(2)发请求,原始的url存储在于spider中
1:当spider执行的时候,首先对起始的url发送请求,将起始url封装成请求对象
2:将请求对象传递给引擎
3:引擎将请求对象传递给调度器(内部含有队列和过滤器两个机制),调度器将请求存储在队列(先进先出)中
4:调度器从队列中调度出url的相应对象再将请求传递给引擎
5:引擎将请求对象通过下载中间件发送给下载器
6:下载器拿到请求到互联网上去下载
7:互联网将下载好的数据封装到响应对象给到下载器
8:下载器将响应对象通过下载中间件发送给引擎
9:引擎将封装了数据的响应对象回传给spider类parse方法中的response对象
10:spider中的parse方法被调用,response就有了响应值
11:在spider的parse方法中进行解析代码的编写;
(1)会解析出另外一批url,(2)会解析出相关的文本数据
12: 将解析拿到的数据封装到item中
13:item将封装的文本数据提交给引擎
14:引擎将数据提交给管道进行持久化存储(一次完整的请求数据)
15:如果parder方法中解析到的另外一批url想继续提交可以继续手动进行发请求
16:spider将这批请求对象封装提交给引擎
17:引擎将这批请求对象发配给调度器
16:这批url通过调度器中过滤器过滤掉重复的url存储在调度器的队列中
17:调度器再将这批请求对象进行请求的调度发送给引擎

引擎作用:
1:处理流数据 2:触发事物
引擎根据相互的数据流做判断,根据拿到的流数据进行下一步组件中方法的调用

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzpzyg.html