Webkit学习 ----网页资源的构建加载流程

本文深入分析WebKit加载网页的过程,从输入URL开始,介绍如何通过ResourceRequest和DocumentLoader类完成资源加载,再到HTML内容的解析与展示。

分类: C/C++

      Webkit的作用在这就不多做介绍了,本篇主要还是个人在源码分析了webkit之后的心得总结!

      webkit有上千个类,在这么错综复杂的结构里看流程无疑找死,好吧,用GDB调试看吧!

      环境:webkit + Qt4.8.4 + gdb

      调试之前,当然先要生成调试版本的程序了,关于调试环境的搭建后续文章会阐述。。。。。。。

      现在就开始总结加载流程吧!

      当我们在浏览器中输入网站地址后,会通过把url赋给ResourceRequest这个类,并将ResourceRequest作为类参数传给Frameloader的load方法,ResourceRequest从头文件看貌似是关于网络协议的一系列接口封装(以后再深入了解这个类,应该可以提取出来做自己为用。之后通过CreateDocumentLoader创建出documentloader对象(该对象负责对于请求资源动作的一系列封装,eg.请求数据,数据请求完成等动作的响应,其实就是对于下载接口的一层封装),并作为参数传给frameloader的load方法。

   在该方法中,获取之前得到的ResourceRequest对象,通过addExtraFieldsToMainResourceRequest对于ResourceRequest对象中的一些关于http的头信息的内如注册,比如Agent字段和Accept字段等(其实就是填充HTTP协议头),接着通过调用loadwithDocumentloader进行正式的下载流程。

   先来看下之前操作流程的栈信息:

    

注:frameloader doucmentloader 和resourceRequest这几个类之间都是你中有我我中有你的好基友,所以都可以在各自的类中分别调用到

   接着往下看,进入loadwithDocumentloader之后,获取之前的resourceRequest对象的url,并将该url对象给到KURL类中(该类又是一个对于URL的功能封装),之后通过Documentloader的startloadingMainResource方法开始加载主页面数据(一般网页就是html文件),接着创建mainresourceloader类对象(这个类看名字就知道是做什么的了)

通过调用loadnow开始进行下载工作。

   先来看下之前操作流程的栈信息:

   

   因为我用的是Qt的port,所以具体的下载动作由Qt来做了,接着看数据接收的操作。

   当数据下载完之后,mainresourceloader的didreceivedata负责接收下载下来的数据,把接收的数据给到Documentloader,再由Documentloader的方法commitload发布加载的内容(在这一步中,浏览器先将旧的页面清除掉在加载新的页面),之后进过很多步的转发,给到了DOM文件夹中的DecodeDataDocumentParse的appendBytes。从这开始正式进入HTML的解压和词法解析流程,这之后将对HTML内容解析工作。

   先来看下之前操作流程的栈信息:

   

   总结下主要流程:

1.        DocumentLoader 调用 MainResourceLoader::load  loader 发起请求

2.        调用 MainResourceLoader::loadNow

3.        调用 MainResourceLoader::willSendRequest

4.        调用 ResourceLoader::willSendRequest,  callback 通过 ResourceNotifier 传导给 FrameLoaderClient  Client 可以在回调中操作 ResourceRequest ,比如设置请求头部。

5.        调用 PolicyChecker::checkNavigationPolicy 过滤掉重复请求等

6.        loader 调用 ResourceHandle::create  Network 发起加载请求

7.        收到第一个 HTTP 响应数据包 ,Network 回调MainResourceLoader::didReceiveResponse ,主要处理 HTTP 头部。

8.        调用 PolicyChecker:: checkContentPolicy, 并最终通过 FrameLoaderClient dispatchDecidePolicyForMIMEType 判断是否为下载请求(存在 "Content-Disposition"http 头部)

9.        调用 MainResourceLoader::continueAfterContentPolicy ,根据ResourceResponse 检测是否发生错误。

10.   调用 ResourceLoader::didReceiveResponse ,将 callback 通过 ResourceNotifier传导给 FrameLoaderClient 

11.   收到 HTTP 体部数据,调用 MainResourceLoader::didReceiveData

12.   调用 ResourceLoader::didReceiveData ,将 callback 通过 ResourceNotifier 传导给 FrameLoaderClient

13.   调用 MainResourceLoader::addData

14.   调用 DocumentLoader::receivedData

15.   调用 DocumentLoader::commitLoad

16.   调用 FrameLoader::commitProvisionalLoad  FrameLoader  provisional 状态跃迁到 Committed 状态

17.   调用 FrameLoaderClientQt::committedLoad

18.   调用 DocumentLoader::commitData ,启动 Writer 对象来处理数据(DocumentWriter::setEncoding  DocumentWriter::addData 

19.   调用 DocumentWriter::addData

20.   调用 DocumentParser::appendByte

21.   调用 DecodedDataDocumentParser::appendBytes 对文本编码进行解码

22.   调用 HTMLDocumentParser::append ,进行 HTML 解析


  好了,下载加载流程就到这,下篇会带来详细的HTML词法解析和压缩流程


这个是完整源码 python实现 Django 【python毕业设计】基于Python的天气预报(天气预测分析)(Django+sklearn机器学习+selenium爬虫)可视化系统.zip 源码+论文+sql脚本 完整版 数据库是mysql 本研究旨在开发一个基于Python的天气预报可视化系统,该系统结合了Django框架、sklearn机器学习库和Selenium爬虫技术,实现对天气数据的收集、分析和可视化。首先,我们使用Selenium爬虫技术从多个天气数据网站实时抓取气象数据,包括温度、湿度、气压、风速等多项指标。这些数据经过清洗和预处理后本研究旨在开发一个基于Python的天气预报可视化系统,该系统结合了Django框架、sklearn机器学习库和Selenium爬虫技术,实现对天气数据的收集、分析和可视化。首先,我们使用Selenium爬虫技术从多个天气数据网站实时抓取气象数据,包括温度、湿度、气压、风速等多项指标。这些数据经过清洗和预处理后,将其存储在后端数据库中,以供后续分析。 其次,采用s,将其存储在后端数据库中,以供后续分析。 其次,采用sklearn机器学习构建预测模型,通过时间序列分析和回归方法,对未来天气情况进行预测。我们利用以往的数据训练模型,以提高预测的准确性。通过交叉验证和超参数优化等技术手段,我们优化了模型性能,确保其在实际应用中的有效性和可靠性。 最后,基于Django框架开发前端展示系统,实现天气预报的可视化。用户可以通过友好的界面查询实时天气信息和未来几天内的天气预测。系统还提供多种图表类型,包括折线图和柱状图,帮助用户直观理解天气变化趋势。 本研究的成果为天气预报领域提供了一种新的技术解决方案,不仅增强了数据获取和处理的效率,还提升了用户体验。未来,该系统能够扩展至其他气象相关的应用场景,为大众提供更加准确和及时的气象服务。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值