一, 五大核心组件工作流程

- 引擎(Scrapy)
 
用来处理整个系统的数据流处理, 触发事务(框架核心)
- 调度器(Scheduler)
 
用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个 URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什 么, 同时去除重复的网址
- 下载器(Downloader)
 
用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异 步模型上的)
- 爬虫(Spiders)
 
爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户 也可以从中提取出链接,让Scrapy继续抓取下一个页面
- 项目管道(Pipeline)
 
负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除 不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理 数据。
首先执行爬虫文件spider,spider的作用是: 解析、发请求,原始的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)会解析出相关的文本数据 (2)会解析出另外一批url 12、将解析拿到的数据封装到item中 13、item将封装的文本数据提交给引擎 14、引擎将数据提交给管道进行持久化存储 ----------------------------------------------------------------------------------------- 15、如果parder方法中解析到的另一批url想继续提交,可以继续手动进行发请求 然后进行新一轮的操作
下载中间件:批量拦截请求(代理ip和UA)和响应(处理页面数据)
位于引擎和下载器之间,可以拦截请求和响应对象,拦截到请求和响应对象后可以篡改页面内容和请求头响应头信息
爬虫中间件:
位于spider和引擎之间,也可以拦截请求和响应对象,不常用
二、 post请求
在之前的代码中,我们可以看到,从来没有手动对start_urls列表中存储的起始url进行过请求发送,但是我们明明收到了响应内容啊,这是因为爬虫文件中的爬虫类继承了spider父类中的start_request(self)这个方法,该方法可以对start_urls列表中的url发送请求:
def start_requests(self): for u in self.start_urls: yield scrapy.Request(url=u,callback=self.parse)
但是这个方法是默认实现的,发起的是get请求,如果想发起post请求,则需要子类重写这个方法
示例 : 重写start_request方法,让其发送post请求
1 import scrapy 2 3 4 class PostSpider(scrapy.Spider): 5 name = 'post' 6 # allowed_domains = ['www.xxx.com'] 7 start_urls = ['https://fanyi.baidu.com/sug'] 8 9 def start_requests(self): 10 # post请求携带的参数 11 data = { 12 'kw':'dog' 13 } 14 for url in self.start_urls: 15 # 使用FormRequest方法手动发送post请求 16 yield scrapy.FormRequest(url=url,formdata=data,callback=self.parse)
                    
                
                
            
        
浙公网安备 33010602011771号