文章采集软件app

文章采集软件app

汇总:如何采集App的数据?

采集交流优采云 发表了文章 • 0 个评论 • 88 次浏览 • 2022-11-27 15:37 • 来自相关话题

  汇总:如何采集App的数据?
  1、本页面内容由
  企业和个人或源网独立上传,本单位不对页面内容(包括但不限于文字、图片、视频)的真实性和知识产权负责。2、我单位不保证或表明本网站内容
  的真实性、准确性和合法性,如因任何原因,因任何原因,对本网站内容或用户依赖本网站内容造成的任何损失或损害,我单位不承担直接责任和连带责任!
  如果您对本页面内容有异议或发现您的网站已显示,不想显示有关您网站的信息,请致电-27896180或QQ(1930338949),我们将立即处理,不收取任何手续费。
  
  相关新闻
  网站数据采集
和抓取?
  UCAYUN采集
AI伪原创工具与优采云
采集器
完美结合
  自媒体爆款征集工具的兴起——中水洲
  
  什么
  是否意味着公众号文章中存在原创
冲突,将以群组分享的方式发送?
  有没有好用的淘宝数据采集
软件?
  自媒体运营必采:一站式文章征集、伪原创工具、一键发布神器
  官方数据:数据治理的数字画像
  加入更敏捷的服务
  前言
  随着全网进入大数据时代,企业越来越注重利用大数据服务精细化营销、精细化运营。各种客户画像、员工画像理论如雨后春笋般涌现,数据应用的底层——数据治理,却鲜有一个整体的理论体系。如何防止治理工作本身“脱靶”,如何量化数据基础设施建设的贡献,需要为数据治理工作绘制一幅“数字画像”。这一命题的内涵和外延非常丰富。这里我们从两个角度来讨论:用户体验和架构质量。
  用户体验的数字肖像
  基于不同的视角,将用户分为外部客户、内部用户、管理人员、技术人员四类,针对具体的业务场景描述四类用户所经历的“技术赋能”。
  1、外部客户
  功能体验指数:功能体验指数用于衡量操作平台的易用性和直观性。可以通过各种埋点追踪用户的点击行为、页面停留时间、页面浏览深度。为了挖掘用户经常使用的功能,挖掘用户的实际需求,对常用功能进行功能改版优化,进行同行业产品对比,用户反馈调查等,重点关注流畅度和主要功能的实用性。
  平台服务指标:
  (1)服务平台一般采用API接口对外提供数据。因此,可以通过计算API调用率来计算其对外服务输出的活跃度。
  (2)数据服务带来的产品升值也是需要衡量的重要指标。将营销、运营等商业活动的价值提升按一定比例分配给相应的数据治理工作,从业务部门的角度评估数据治理工作对营销等活动的赋能。
  2.内部用户
  
  便捷性:以往业务部门向数据管理部门申请使用数据,通常是通过邮寄或行政手续的方式。这种方式无法实时跟踪申请进度,也无法在统一页面集中管理,导致相关人员在查询和沟通中出现混乱。费了很大力气。建立自动化、标准化的流程和在线操作工具,将大大方便流程。因此人工提取工单压降比可以作为衡量内部用户使用程度的指标。
  时效性:在线数据治理意味着资产地图和标准结构存储在用户的指尖,关键操作的全链路交付时间是触达内部用户的另一种直观体验。该指标可以通过统计每个节点的传输时间并计算相应的平均值来获得。
  贡献:不仅是底层的数据管理,数据的应用输出也能为用户带来实际的商业价值。BI工具的使用情况、提供的模型数量等指标表明用户对应用数据结果的满意度。
  3.管理
  质量提升:对于管理来说,保证数据仓库和数据湖的“清”是他们关心的问题。由于监管报送结果是银保监会对银行的重点考核指标,报送要求的数据质量达标率成为管理数据治理有效性最直观的体现。基于DQC的一系列指标也可以作为管理数据清洁度的体现。
  效率提升:除了监管要求,数据运营成本对于全行管理也至关重要。只有建立规范高效的数据结构,减少数据报表,降低存储和运维成本,才能实现精细化运营,保持高效盈利。
  4、技术人员
  数据字典打分:当企业对开发过程实施强管控时,数据字典的作用可以看作是社会法则的作用,其整体逻辑要经得起反复推敲。在数据字典的查找页面设置评分反馈是一种简单但有效的方法。页面上有计划的引导,体现了设计者对开发者体验的关注,让“吐槽”变成建议,优化解决使用数据字典时遇到的问题。
  II 建筑品质数码肖像
  全行统一的数据架构,在追求高效率的同时,要降低成本。根据《华为数据之道》中经典的信息架构四大范式,我们将从模型、分布、标准、资产四个角度分析架构使能能力。措施。
  1.型号
  公共层处理频率:公共层存储事实数据、维表数据等,支撑索引体系中的一级索引层。在建立指标时,对维度进行标准化和集约化,提高公共指标的可重用性,减少重复处理操作。因此,公共层数据模型的复用率可以作为评价公共层架构的指标之一。
  应用层引用频率:类似于人际关系网络拓扑结构中的核心图算法,该指标直接衡量数据在应用层的系统重要性,指导资产盘点目标。数据亲属关系是一个有向的、无权重的、自循环的网络图。最常被引用的资产通常来源于关键业务实体最准确、最及时的业务记录。这些资产最有可能被跨部门和业务领域调用,并且所有部门都需要可访问并能够访问相同的数据。索引还可以有效过滤掉“孤表”和临时表,减少资源投入和存储成本。
  
  2.分布
  数据覆盖:对于大型银行来说,数百个系统和数万张表分布在全国各地。收款是资产盘点的第一步。衡量采集数据在整个系统中的覆盖率,有助于我们明确当前采集的进度,定位未采集的数据源。
  数据冗余:数据冗余是指同一层数据的冗余,可以分为两个来源。第一,具有相同含义的数据存储在多个物理位置;其次,架构模型本身在设计中有很多重复的交叉项。
  数据容量:数据容量是对数据中心的整体描述,包括中心当前收录
的整体数据量的绝对值,以及数据量随时间的增长速度。数据容量高低都不理想,需要结合银行现状辩证看待。
  3.标准
  标准的稳定性:数据标准规范数据含义、结构等,应满足内容统一、定义不交叉等条件,避免数据标准内部“数据打架”。
  标准失败率:在标准技术规范完备、主题完整、标准已权威发布的前提下,标准失败率反映了数据标准“最后一公里”的执行情况。借助自动化工具,可以计算数据经过各层、分片后的退订率,智能发现潜在的退订问题。
  4、资产
  技术元数据统计:技术元数据连接源数据和数据仓库,记录数据从产生到消亡的过程。我们选取了系统覆盖率、系统内表级覆盖率、表名和字段名有效性、枚举值有效性等统计指标来表示技术资产在数据结构中的产出效益。
  企业活动命中率:数据资产是从业务流程和业务模型中提取的数字化描述。标签资产对业务行为的命中率、指标资产上报统计的命中率、用户访问上报资产的次数越高,资产内容映射企业活动的准确度越高。
  结论
  随着企业数字化转型的不断深入,“数据治理数字化画像”从方法论到实践都将趋于完善,内容价值、安全性能、用户体验也将随之提升。如何动态衡量数据治理工作的有效性,建立适合自身企业的“北极星指标”,是每一个处于智能化转型阶段的企业都必须研究的,它的成功将创造不可估量的商业价值。 查看全部

  汇总:如何采集App的数据?
  1、本页面内容由
  企业和个人或源网独立上传,本单位不对页面内容(包括但不限于文字、图片、视频)的真实性和知识产权负责。2、我单位不保证或表明本网站内容
  的真实性、准确性和合法性,如因任何原因,因任何原因,对本网站内容或用户依赖本网站内容造成的任何损失或损害,我单位不承担直接责任和连带责任!
  如果您对本页面内容有异议或发现您的网站已显示,不想显示有关您网站的信息,请致电-27896180或QQ(1930338949),我们将立即处理,不收取任何手续费。
  
  相关新闻
  网站数据采集
和抓取?
  UCAYUN采集
AI伪原创工具与优采云
采集器
完美结合
  自媒体爆款征集工具的兴起——中水洲
  
  什么
  是否意味着公众号文章中存在原创
冲突,将以群组分享的方式发送?
  有没有好用的淘宝数据采集
软件?
  自媒体运营必采:一站式文章征集、伪原创工具、一键发布神器
  官方数据:数据治理的数字画像
  加入更敏捷的服务
  前言
  随着全网进入大数据时代,企业越来越注重利用大数据服务精细化营销、精细化运营。各种客户画像、员工画像理论如雨后春笋般涌现,数据应用的底层——数据治理,却鲜有一个整体的理论体系。如何防止治理工作本身“脱靶”,如何量化数据基础设施建设的贡献,需要为数据治理工作绘制一幅“数字画像”。这一命题的内涵和外延非常丰富。这里我们从两个角度来讨论:用户体验和架构质量。
  用户体验的数字肖像
  基于不同的视角,将用户分为外部客户、内部用户、管理人员、技术人员四类,针对具体的业务场景描述四类用户所经历的“技术赋能”。
  1、外部客户
  功能体验指数:功能体验指数用于衡量操作平台的易用性和直观性。可以通过各种埋点追踪用户的点击行为、页面停留时间、页面浏览深度。为了挖掘用户经常使用的功能,挖掘用户的实际需求,对常用功能进行功能改版优化,进行同行业产品对比,用户反馈调查等,重点关注流畅度和主要功能的实用性。
  平台服务指标:
  (1)服务平台一般采用API接口对外提供数据。因此,可以通过计算API调用率来计算其对外服务输出的活跃度。
  (2)数据服务带来的产品升值也是需要衡量的重要指标。将营销、运营等商业活动的价值提升按一定比例分配给相应的数据治理工作,从业务部门的角度评估数据治理工作对营销等活动的赋能。
  2.内部用户
  
  便捷性:以往业务部门向数据管理部门申请使用数据,通常是通过邮寄或行政手续的方式。这种方式无法实时跟踪申请进度,也无法在统一页面集中管理,导致相关人员在查询和沟通中出现混乱。费了很大力气。建立自动化、标准化的流程和在线操作工具,将大大方便流程。因此人工提取工单压降比可以作为衡量内部用户使用程度的指标。
  时效性:在线数据治理意味着资产地图和标准结构存储在用户的指尖,关键操作的全链路交付时间是触达内部用户的另一种直观体验。该指标可以通过统计每个节点的传输时间并计算相应的平均值来获得。
  贡献:不仅是底层的数据管理,数据的应用输出也能为用户带来实际的商业价值。BI工具的使用情况、提供的模型数量等指标表明用户对应用数据结果的满意度。
  3.管理
  质量提升:对于管理来说,保证数据仓库和数据湖的“清”是他们关心的问题。由于监管报送结果是银保监会对银行的重点考核指标,报送要求的数据质量达标率成为管理数据治理有效性最直观的体现。基于DQC的一系列指标也可以作为管理数据清洁度的体现。
  效率提升:除了监管要求,数据运营成本对于全行管理也至关重要。只有建立规范高效的数据结构,减少数据报表,降低存储和运维成本,才能实现精细化运营,保持高效盈利。
  4、技术人员
  数据字典打分:当企业对开发过程实施强管控时,数据字典的作用可以看作是社会法则的作用,其整体逻辑要经得起反复推敲。在数据字典的查找页面设置评分反馈是一种简单但有效的方法。页面上有计划的引导,体现了设计者对开发者体验的关注,让“吐槽”变成建议,优化解决使用数据字典时遇到的问题。
  II 建筑品质数码肖像
  全行统一的数据架构,在追求高效率的同时,要降低成本。根据《华为数据之道》中经典的信息架构四大范式,我们将从模型、分布、标准、资产四个角度分析架构使能能力。措施。
  1.型号
  公共层处理频率:公共层存储事实数据、维表数据等,支撑索引体系中的一级索引层。在建立指标时,对维度进行标准化和集约化,提高公共指标的可重用性,减少重复处理操作。因此,公共层数据模型的复用率可以作为评价公共层架构的指标之一。
  应用层引用频率:类似于人际关系网络拓扑结构中的核心图算法,该指标直接衡量数据在应用层的系统重要性,指导资产盘点目标。数据亲属关系是一个有向的、无权重的、自循环的网络图。最常被引用的资产通常来源于关键业务实体最准确、最及时的业务记录。这些资产最有可能被跨部门和业务领域调用,并且所有部门都需要可访问并能够访问相同的数据。索引还可以有效过滤掉“孤表”和临时表,减少资源投入和存储成本。
  
  2.分布
  数据覆盖:对于大型银行来说,数百个系统和数万张表分布在全国各地。收款是资产盘点的第一步。衡量采集数据在整个系统中的覆盖率,有助于我们明确当前采集的进度,定位未采集的数据源。
  数据冗余:数据冗余是指同一层数据的冗余,可以分为两个来源。第一,具有相同含义的数据存储在多个物理位置;其次,架构模型本身在设计中有很多重复的交叉项。
  数据容量:数据容量是对数据中心的整体描述,包括中心当前收录
的整体数据量的绝对值,以及数据量随时间的增长速度。数据容量高低都不理想,需要结合银行现状辩证看待。
  3.标准
  标准的稳定性:数据标准规范数据含义、结构等,应满足内容统一、定义不交叉等条件,避免数据标准内部“数据打架”。
  标准失败率:在标准技术规范完备、主题完整、标准已权威发布的前提下,标准失败率反映了数据标准“最后一公里”的执行情况。借助自动化工具,可以计算数据经过各层、分片后的退订率,智能发现潜在的退订问题。
  4、资产
  技术元数据统计:技术元数据连接源数据和数据仓库,记录数据从产生到消亡的过程。我们选取了系统覆盖率、系统内表级覆盖率、表名和字段名有效性、枚举值有效性等统计指标来表示技术资产在数据结构中的产出效益。
  企业活动命中率:数据资产是从业务流程和业务模型中提取的数字化描述。标签资产对业务行为的命中率、指标资产上报统计的命中率、用户访问上报资产的次数越高,资产内容映射企业活动的准确度越高。
  结论
  随着企业数字化转型的不断深入,“数据治理数字化画像”从方法论到实践都将趋于完善,内容价值、安全性能、用户体验也将随之提升。如何动态衡量数据治理工作的有效性,建立适合自身企业的“北极星指标”,是每一个处于智能化转型阶段的企业都必须研究的,它的成功将创造不可估量的商业价值。

最热门:我Python采集了新榜热门内容,原来这就是别人能成为自媒体大佬的秘密!

采集交流优采云 发表了文章 • 0 个评论 • 215 次浏览 • 2022-11-26 12:16 • 来自相关话题

  最热门:我Python采集了新榜热门内容,原来这就是别人能成为自媒体大佬的秘密!
  什么值得写
  这个功能也很强大。比如你想写科技领域的内容,这个功能会为你推荐该类型的最新热门文章。
  这里只推荐三个功能,其他功能我就不写篇幅介绍了。大家可以自己探索一下,直接进入今天的话题,爬取哪些值得写的推荐热榜文章,学习一下其他搞自媒体的人是怎么写博客的。
  采集
目标
  网站:新列表编辑器
  工具使用
  开发工具:pycharm 开发环境:python3.7、Windows10 工具包:requests、execjs
  项目思路分析
  虽然这个网页放在今天还是比较实用的,以后可以在当前网页上选择合适的内容来写,但是有什么问题呢?网页上的数据都是加密的,辣条真是晚上睡不着。
  首先,爬虫常规操作找到目标数据的接口位置,打开抓包工具查看数据的加载方式,打开抓包工具瞬间数据没了
  
  当前网页应该已经通过开发者工具测试过,将抓包工具作为单独的页面打开
  单独打开是没有问题的。查找文件接口数据,确定请求的url地址
  数据的接口
https://edit.newrank.cn/xdnphb ... erial
  当前接口的请求方式为post,post请求表示需要传输数据
  该项目可以清楚地看到加载的数据的格式、日期和类型。数据页翻过日期。Nonece 和 xyz 是加密数据。简单判断一下,nonece和xyz应该是md5加密的。首先找到nonece和xyz的加密位置,可以使用全局搜索或者xhr断点调试的方法,只要能找到数据的加密位置即可,拉条这里直接使用xhr断点找到数据的发送位置
  通过抓包工具右侧的调用栈找到后续的执行流程。点击一一查看,找出发送的数据是从哪里产生的。传输的数据data是h。现在我们只需要找到h的生成位置即可。h 源自 u。来的u是c函数生成的,nonece,zyz是c函数生成的
  
  在location数据上打断点,查看数据的加载规律,nonece是u方法生成的9个参数中的随机值
  xyz加密后的数据是o的值加上&nonece和nonece,o的参数是url加上appkey加上item的值
  "/xdnphb/editor/articleMaterial/searchArticleMaterial?AppKey=joker&item={"type":"lakh","period":"1#2021-09-18","order":"2","extra":"全部","ranklist_id":"","weixin_id":"","start_time":"2021-09-18"}&nonce=6a65cad87"
  xyz里有很多加密代码,这是什么狗屁东西
  直接搭建环境。不要硬编码js代码。把js代码拷贝到本地,先把加密函数带过来,把整个t函数拿过来本地,自己跑试试看
  大功告成,数据加密方式和加密规则都解决了。现在使用Python集成,向目标URL发送请求,获取数据并保存。js源码大家可以自己去推,只要t函数就可以了。
  显示结果
  外媒:如何让搜索引擎爱上我们的网站
  有句谚语:酒的香气不怕巷子深,但是我们做网站的时候不太喜欢这句话,网站建成后最怕的就是没人知道,更别说把它放在小巷深处了。
  我们创建网站的目的是什么?当然,通过我们的网站让其他人了解我们的公司和产品。如何让网站更好地被别人发现?我们可以通过投放广告或搜索引擎搜索来做到这一点。广告很简单,但成本也相对较高。既然是主动推动,观众未必是我们的准客户。因此,搜索引擎成为我们的主要考虑因素。
  那么搜索引擎如何找到我们呢?这就不得不提我们的主题:搜索引擎优化(SEO),这个概念已经不是什么新鲜事了,百度有大量的教程和培训机构,但仔细一看发现,大家似乎都在谈论怎么做内容,怎么做外部链接,有人说内容为王,外部链接为王, 有人说站组是小站的出路,也有人说聚合页面营销是优化的最佳方式。
  然而,很少有人系统地描述应该在哪个阶段使用这些方法。这导致很多站长看到后,纷纷在自己的网站上设置方法,然后开始每天盯着排名,嘿嘿,怎么还没涨呢!哎呀,排名下降了。各种猜测开始在我脑海中翻腾,我开始怀疑这种方法是否可靠。
  其实,并不是这种方法错了,而是用错了时间。因为SEO要谈的太多了,我就不在这里谈它是什么以及如何做。我说的是如何使用组合拳来创建漂亮的组合,以便我们的网站能够突破并成功获得良好的排名。
  因为SEO的知识涉及面很广,我们会分成几个模块,从网站开始,内部决定外部,无论是人还是搜索引擎他们喜欢一个网站,因为它有素材,在这里你可以知道你想知道什么,那么这就需要我们用心去运营我们的网站, 用心创造内容。那么如何留心呢?
  ▌选择我们的关键词
  关键词是用户通过搜索引擎找到我们的唯一途径,搜索引擎会关键词和我们的网页做一个
  映射关系,在搜索引擎数据库中,关键词是我们网页的代表符号,那么互联网上有那么多相关的内容,一个关键词可能代表非常非常多的页面,我们如何让我们的网页排名第一呢?这就是搜索引擎排名,我们要寻找符合我们的关键词,可能有很多关键词符合我们,我们在选择的时候一定要注意技巧。
  1.不要选择大关键词
  比如我现在负责易观产品的官方网站,我们的产品是大数据分析的,我们的客户在百度会用什么词来找?大数据分析这个词可能是首先想到的,但这个词的价值并不高,为什么?大数据分析知识、大数据分析模型、大数据分析产品等相关关键词可能会引发这个关键词,但对我们来说最有价值的是关键词大数据分析产品,那么我们就不能把精力花在这个大字上,应该把重点放在大数据分析产品这个字眼上。不要说大话,因为大词很难,价值低,而且在吸引客户方面不准确。
  2.挖掘符合我们的长尾关键词
  长尾关键词其实是我们关键词的补充,比如大数据分析产品,
  产品都是对大数据分析的补充,组合成一个新词,这个新词我们还可以挖掘更多的长尾关键词,比如大数据分析产品对比、大数据分析产品价格等等,不同的关键词我们必须有相应的登陆页面。
  如何挖关键词,我们可以通过相关工具帮我们,有很多免费工具供我们选择,国外关键词挖矿工具有谷歌趋势、谷歌搜索控制台等免费工具,国内我比较喜欢用爱站,虽然挖矿比较需要付费,但是免费也可以帮我们挖很多关键词。
  通过该工具,我们可以了解用户最常搜索哪些单词,并过滤掉对我们有价值的关键词作为我们的页面关键词。
  3. 通过竞争网站挖掘有价值的关键词
  这种方法需要我们打开我们友好的网站,看看他们的栏目页面标题(页面标题)用了什么关键词,你可以在搜索引擎搜索框中输入site:域名,看看他们的标题用了什么关键词,记录这些关键词,朋友是对手和老师,他们选择的关键词也会成为我们选词的关键参考。
  ▌ 结构优化,让搜索引擎进来谈恋爱搜索引擎通过自己的爬虫
  抓取我们的页面,比如百度的百度蜘蛛、谷歌的Googlebot等搜索引擎也有自己的爬虫,我们不再赘述。这些爬虫是帮助我们的网站被搜索引擎索引的好朋友,我们希望提供良好的服务。
  
  他们更喜欢网页
  符合W3C标准和结构规范的,比如文本很多,没有死胡同的页面,他们很懒惰,他们想知道哪个是主题,哪个是次要内容。没错,他们就是那么聪明和温暖。如何娱乐他们?
  1. TDK优化
  T:标题,是我们的页面标题,这个
  是它了解这个页面的第一个角度,我们希望用户用什么关键词来搜索这个页面,那么这里必须放相关的关键词。重要性不言而喻。
  D:描述,页面介绍,
  更实用的是,当页面在搜索引擎列表中时,这里可以简单总结一下我们做了什么,有的会把手机放在这里,方便直接沟通。
  K:关键词,关键词,现在存在的意义很低,你可以把我们页面的关键词放在这里,虽然没用。
  尤其是标题,我们要关注,里面的字,是直接决定我们能不能被搜索到的关键。
  2. 页面内容布局
  如前所述,网页的标题是蜘蛛判断我们页面做什么的中心点,所以我们页面的内容应该围绕这个主题开发。
  这里要提到的是关键词密度,我们的内容必须收录
这个标题的关键词,密度应该在2%到8%之间。否则,如果关键词写,这个标题就不会排名很好。
  3. H1标签不应被滥用
  我们在写页面的时候,往往不会考虑HTML元素的组合和使用,因为我们可以重置HTML原生的所有样式,即使我们用错了元素,页面渲染的效果还是那么漂亮,但是这里要说的是,我们的小蜘蛛很敏感,看元素用法不规范, 光不高兴,重的转身离开。所以我们要规范使用,最重要的是这个H1标签,
  我们都知道H1标签是识别主题的意思,当蜘蛛看到这个标签时,它会默认这个是当前页面的标题,
  和我们的标题A级,但是如果这个页面出现多个H1,蜘蛛就糊涂了,不明白这个页面的中心思想是哪个,要么随便找一个作为标题,要么直接去下一页。因此请记住,一个页面只有一个 H1 标签,所有其他副标题都替换为 H2,H3 用于较低级别。
  4. 导航结构设计
  网站导航是
  一般整个网站统一,有些企业网站会在导航上放一个首页,而且是排在第一位的,其实是可以删除的,但是为了方便用户返回首页一般很多人都这么放,如果有这个首页的字眼,建议不跟着链接, 为了不希望主页有这样的关键词。
  导航的位置非常重要,他是蜘蛛爬行的入口,导航
  级别越浅,蜘蛛收录
页面的概率就越高,所以把我们的核心页面放在导航入口是非常重要的,导航也是蜘蛛反复旅行的重要通道,也是很好的内在链接。
  导航这里记得用js动态加载分类,因为爬虫无法识别js动态加载的内容,如果二级分类是放在鼠标上出现,那么一定要在源码中拥有这个二级内容,只是暂时隐藏。不要通过数据请求获取它。
  
  5. 徽标部分优化
  每个网站的logo都有,但是这里往往很多人不会好好处理,因为这里一般都放的是首页地址,所以一般没有任何文字,一张图片链接到首页,往往区分权重,这里和导航首页关键词一样应该是链接地址做nofollow,首页是我们网站权重最大的地方, 我们期望他的入口都按照我们规定的关键词,就像一条水道,保持水流速的最好办法就是避免太多的间隙,这就是道理。
  6. 所有出站链接都应不关注
  网站一般都有备案信息,链接到国家工业和信息化局的网站,这样的链接要么被删除,要么不予关注,不允许分我们的权重。确保我们收录
的运河是最大的,并且水量按照我们计划的方向流动。引导蜘蛛正确行走并抓取抓取的页面。
  蜘蛛怎么能不喜欢这样具有标准化页面、清晰入口和清晰说明的网页?
  ▌ 借助工具,不断优化网站
  这里不得不提的是方舟是如何帮助我们优化方舟官网的,一个好的工具确实可以让我们事半功倍,当我们离开工具的时候,往往依靠以往的经验和猜测,通过测试来验证想法,这个过程往往需要很长时间。也可能有不准确的数据影响我们的判断,因此我们需要一个方便的工具。帮助我们及时发现问题,并在第一时间做出数据反馈,帮助我们及时改进。
  方舟的热图分析工具帮助我们做出结构匹配决策,一旦我们讨论过,体验一下旁边的演示按钮,是否会区分用户点击演示按钮,将下载按钮替换为一行文字也不会更好,当我们打开热图分析时,数据已经告诉我们结果。
  当我们进行页面的响应式设计时,我们在方舟事件分析中参考了设备纬度,以告诉我们应该关注哪些终端体验。
  知道哪些搜索引擎来得更多,针对相应的渠道进行优化,精准高效。
  我们可以计划下一次大迭代应该通过爬虫的访问时间和周期,这样爬虫就可以在第一时间更新我们的内容,爬虫访问的频率直观地呈现在我们眼前,通过查看过去的系统日志,爬虫轨迹已经成为历史。
  ▌ 坚持原著,蜘蛛的胃口越来越好
  优化是消除爬虫的障碍
  来到我们的网站,内容就是像我们这样的爬虫的根,没有内容结构是没用的,内容很差,都是抄袭的文章,爬虫不会收录这些页面,所以坚持原创内容留住这个小宝贝。
  搜索引擎最近升级了好几次,对文章相似度的判断越来越准确,过去大家调整了段落的顺序,把里面的字改成了原创,这就要求我们不要投机取巧,用心去创造。
  由于篇幅所限,很难写完一篇关于网站优化的文章,以及内部链接关键词、面包屑、图片技巧、页面聚合等知识点,我们会放在下一篇文章中。本文主要讲结构优化,关键词挖掘,导航技巧和内容,这也是我们网站前期要做好的几点。前面说的,方法没有好坏之分,关键是要用对的时机,希望大家在新网站开局就注意这些要点。
  易观Argo现已免费使用,有兴趣的同学可点击阅读原文下载安装,或扫描下方二维码试用。体验易观Argo带给我们优化网站的快感。
  在
  原创
文章上盖章,下载并安装易观Argo 查看全部

  最热门:我Python采集了新榜热门内容,原来这就是别人能成为自媒体大佬的秘密!
  什么值得写
  这个功能也很强大。比如你想写科技领域的内容,这个功能会为你推荐该类型的最新热门文章。
  这里只推荐三个功能,其他功能我就不写篇幅介绍了。大家可以自己探索一下,直接进入今天的话题,爬取哪些值得写的推荐热榜文章,学习一下其他搞自媒体的人是怎么写博客的。
  采集
目标
  网站:新列表编辑器
  工具使用
  开发工具:pycharm 开发环境:python3.7、Windows10 工具包:requests、execjs
  项目思路分析
  虽然这个网页放在今天还是比较实用的,以后可以在当前网页上选择合适的内容来写,但是有什么问题呢?网页上的数据都是加密的,辣条真是晚上睡不着。
  首先,爬虫常规操作找到目标数据的接口位置,打开抓包工具查看数据的加载方式,打开抓包工具瞬间数据没了
  
  当前网页应该已经通过开发者工具测试过,将抓包工具作为单独的页面打开
  单独打开是没有问题的。查找文件接口数据,确定请求的url地址
  数据的接口
https://edit.newrank.cn/xdnphb ... erial
  当前接口的请求方式为post,post请求表示需要传输数据
  该项目可以清楚地看到加载的数据的格式、日期和类型。数据页翻过日期。Nonece 和 xyz 是加密数据。简单判断一下,nonece和xyz应该是md5加密的。首先找到nonece和xyz的加密位置,可以使用全局搜索或者xhr断点调试的方法,只要能找到数据的加密位置即可,拉条这里直接使用xhr断点找到数据的发送位置
  通过抓包工具右侧的调用栈找到后续的执行流程。点击一一查看,找出发送的数据是从哪里产生的。传输的数据data是h。现在我们只需要找到h的生成位置即可。h 源自 u。来的u是c函数生成的,nonece,zyz是c函数生成的
  
  在location数据上打断点,查看数据的加载规律,nonece是u方法生成的9个参数中的随机值
  xyz加密后的数据是o的值加上&nonece和nonece,o的参数是url加上appkey加上item的值
  "/xdnphb/editor/articleMaterial/searchArticleMaterial?AppKey=joker&item={"type":"lakh","period":"1#2021-09-18","order":"2","extra":"全部","ranklist_id":"","weixin_id":"","start_time":"2021-09-18"}&nonce=6a65cad87"
  xyz里有很多加密代码,这是什么狗屁东西
  直接搭建环境。不要硬编码js代码。把js代码拷贝到本地,先把加密函数带过来,把整个t函数拿过来本地,自己跑试试看
  大功告成,数据加密方式和加密规则都解决了。现在使用Python集成,向目标URL发送请求,获取数据并保存。js源码大家可以自己去推,只要t函数就可以了。
  显示结果
  外媒:如何让搜索引擎爱上我们的网站
  有句谚语:酒的香气不怕巷子深,但是我们做网站的时候不太喜欢这句话,网站建成后最怕的就是没人知道,更别说把它放在小巷深处了。
  我们创建网站的目的是什么?当然,通过我们的网站让其他人了解我们的公司和产品。如何让网站更好地被别人发现?我们可以通过投放广告或搜索引擎搜索来做到这一点。广告很简单,但成本也相对较高。既然是主动推动,观众未必是我们的准客户。因此,搜索引擎成为我们的主要考虑因素。
  那么搜索引擎如何找到我们呢?这就不得不提我们的主题:搜索引擎优化(SEO),这个概念已经不是什么新鲜事了,百度有大量的教程和培训机构,但仔细一看发现,大家似乎都在谈论怎么做内容,怎么做外部链接,有人说内容为王,外部链接为王, 有人说站组是小站的出路,也有人说聚合页面营销是优化的最佳方式。
  然而,很少有人系统地描述应该在哪个阶段使用这些方法。这导致很多站长看到后,纷纷在自己的网站上设置方法,然后开始每天盯着排名,嘿嘿,怎么还没涨呢!哎呀,排名下降了。各种猜测开始在我脑海中翻腾,我开始怀疑这种方法是否可靠。
  其实,并不是这种方法错了,而是用错了时间。因为SEO要谈的太多了,我就不在这里谈它是什么以及如何做。我说的是如何使用组合拳来创建漂亮的组合,以便我们的网站能够突破并成功获得良好的排名。
  因为SEO的知识涉及面很广,我们会分成几个模块,从网站开始,内部决定外部,无论是人还是搜索引擎他们喜欢一个网站,因为它有素材,在这里你可以知道你想知道什么,那么这就需要我们用心去运营我们的网站, 用心创造内容。那么如何留心呢?
  ▌选择我们的关键词
  关键词是用户通过搜索引擎找到我们的唯一途径,搜索引擎会关键词和我们的网页做一个
  映射关系,在搜索引擎数据库中,关键词是我们网页的代表符号,那么互联网上有那么多相关的内容,一个关键词可能代表非常非常多的页面,我们如何让我们的网页排名第一呢?这就是搜索引擎排名,我们要寻找符合我们的关键词,可能有很多关键词符合我们,我们在选择的时候一定要注意技巧。
  1.不要选择大关键词
  比如我现在负责易观产品的官方网站,我们的产品是大数据分析的,我们的客户在百度会用什么词来找?大数据分析这个词可能是首先想到的,但这个词的价值并不高,为什么?大数据分析知识、大数据分析模型、大数据分析产品等相关关键词可能会引发这个关键词,但对我们来说最有价值的是关键词大数据分析产品,那么我们就不能把精力花在这个大字上,应该把重点放在大数据分析产品这个字眼上。不要说大话,因为大词很难,价值低,而且在吸引客户方面不准确。
  2.挖掘符合我们的长尾关键词
  长尾关键词其实是我们关键词的补充,比如大数据分析产品,
  产品都是对大数据分析的补充,组合成一个新词,这个新词我们还可以挖掘更多的长尾关键词,比如大数据分析产品对比、大数据分析产品价格等等,不同的关键词我们必须有相应的登陆页面。
  如何挖关键词,我们可以通过相关工具帮我们,有很多免费工具供我们选择,国外关键词挖矿工具有谷歌趋势、谷歌搜索控制台等免费工具,国内我比较喜欢用爱站,虽然挖矿比较需要付费,但是免费也可以帮我们挖很多关键词。
  通过该工具,我们可以了解用户最常搜索哪些单词,并过滤掉对我们有价值的关键词作为我们的页面关键词。
  3. 通过竞争网站挖掘有价值的关键词
  这种方法需要我们打开我们友好的网站,看看他们的栏目页面标题(页面标题)用了什么关键词,你可以在搜索引擎搜索框中输入site:域名,看看他们的标题用了什么关键词,记录这些关键词,朋友是对手和老师,他们选择的关键词也会成为我们选词的关键参考。
  ▌ 结构优化,让搜索引擎进来谈恋爱搜索引擎通过自己的爬虫
  抓取我们的页面,比如百度的百度蜘蛛、谷歌的Googlebot等搜索引擎也有自己的爬虫,我们不再赘述。这些爬虫是帮助我们的网站被搜索引擎索引的好朋友,我们希望提供良好的服务。
  
  他们更喜欢网页
  符合W3C标准和结构规范的,比如文本很多,没有死胡同的页面,他们很懒惰,他们想知道哪个是主题,哪个是次要内容。没错,他们就是那么聪明和温暖。如何娱乐他们?
  1. TDK优化
  T:标题,是我们的页面标题,这个
  是它了解这个页面的第一个角度,我们希望用户用什么关键词来搜索这个页面,那么这里必须放相关的关键词。重要性不言而喻。
  D:描述,页面介绍,
  更实用的是,当页面在搜索引擎列表中时,这里可以简单总结一下我们做了什么,有的会把手机放在这里,方便直接沟通。
  K:关键词,关键词,现在存在的意义很低,你可以把我们页面的关键词放在这里,虽然没用。
  尤其是标题,我们要关注,里面的字,是直接决定我们能不能被搜索到的关键。
  2. 页面内容布局
  如前所述,网页的标题是蜘蛛判断我们页面做什么的中心点,所以我们页面的内容应该围绕这个主题开发。
  这里要提到的是关键词密度,我们的内容必须收录
这个标题的关键词,密度应该在2%到8%之间。否则,如果关键词写,这个标题就不会排名很好。
  3. H1标签不应被滥用
  我们在写页面的时候,往往不会考虑HTML元素的组合和使用,因为我们可以重置HTML原生的所有样式,即使我们用错了元素,页面渲染的效果还是那么漂亮,但是这里要说的是,我们的小蜘蛛很敏感,看元素用法不规范, 光不高兴,重的转身离开。所以我们要规范使用,最重要的是这个H1标签,
  我们都知道H1标签是识别主题的意思,当蜘蛛看到这个标签时,它会默认这个是当前页面的标题,
  和我们的标题A级,但是如果这个页面出现多个H1,蜘蛛就糊涂了,不明白这个页面的中心思想是哪个,要么随便找一个作为标题,要么直接去下一页。因此请记住,一个页面只有一个 H1 标签,所有其他副标题都替换为 H2,H3 用于较低级别。
  4. 导航结构设计
  网站导航是
  一般整个网站统一,有些企业网站会在导航上放一个首页,而且是排在第一位的,其实是可以删除的,但是为了方便用户返回首页一般很多人都这么放,如果有这个首页的字眼,建议不跟着链接, 为了不希望主页有这样的关键词。
  导航的位置非常重要,他是蜘蛛爬行的入口,导航
  级别越浅,蜘蛛收录
页面的概率就越高,所以把我们的核心页面放在导航入口是非常重要的,导航也是蜘蛛反复旅行的重要通道,也是很好的内在链接。
  导航这里记得用js动态加载分类,因为爬虫无法识别js动态加载的内容,如果二级分类是放在鼠标上出现,那么一定要在源码中拥有这个二级内容,只是暂时隐藏。不要通过数据请求获取它。
  
  5. 徽标部分优化
  每个网站的logo都有,但是这里往往很多人不会好好处理,因为这里一般都放的是首页地址,所以一般没有任何文字,一张图片链接到首页,往往区分权重,这里和导航首页关键词一样应该是链接地址做nofollow,首页是我们网站权重最大的地方, 我们期望他的入口都按照我们规定的关键词,就像一条水道,保持水流速的最好办法就是避免太多的间隙,这就是道理。
  6. 所有出站链接都应不关注
  网站一般都有备案信息,链接到国家工业和信息化局的网站,这样的链接要么被删除,要么不予关注,不允许分我们的权重。确保我们收录
的运河是最大的,并且水量按照我们计划的方向流动。引导蜘蛛正确行走并抓取抓取的页面。
  蜘蛛怎么能不喜欢这样具有标准化页面、清晰入口和清晰说明的网页?
  ▌ 借助工具,不断优化网站
  这里不得不提的是方舟是如何帮助我们优化方舟官网的,一个好的工具确实可以让我们事半功倍,当我们离开工具的时候,往往依靠以往的经验和猜测,通过测试来验证想法,这个过程往往需要很长时间。也可能有不准确的数据影响我们的判断,因此我们需要一个方便的工具。帮助我们及时发现问题,并在第一时间做出数据反馈,帮助我们及时改进。
  方舟的热图分析工具帮助我们做出结构匹配决策,一旦我们讨论过,体验一下旁边的演示按钮,是否会区分用户点击演示按钮,将下载按钮替换为一行文字也不会更好,当我们打开热图分析时,数据已经告诉我们结果。
  当我们进行页面的响应式设计时,我们在方舟事件分析中参考了设备纬度,以告诉我们应该关注哪些终端体验。
  知道哪些搜索引擎来得更多,针对相应的渠道进行优化,精准高效。
  我们可以计划下一次大迭代应该通过爬虫的访问时间和周期,这样爬虫就可以在第一时间更新我们的内容,爬虫访问的频率直观地呈现在我们眼前,通过查看过去的系统日志,爬虫轨迹已经成为历史。
  ▌ 坚持原著,蜘蛛的胃口越来越好
  优化是消除爬虫的障碍
  来到我们的网站,内容就是像我们这样的爬虫的根,没有内容结构是没用的,内容很差,都是抄袭的文章,爬虫不会收录这些页面,所以坚持原创内容留住这个小宝贝。
  搜索引擎最近升级了好几次,对文章相似度的判断越来越准确,过去大家调整了段落的顺序,把里面的字改成了原创,这就要求我们不要投机取巧,用心去创造。
  由于篇幅所限,很难写完一篇关于网站优化的文章,以及内部链接关键词、面包屑、图片技巧、页面聚合等知识点,我们会放在下一篇文章中。本文主要讲结构优化,关键词挖掘,导航技巧和内容,这也是我们网站前期要做好的几点。前面说的,方法没有好坏之分,关键是要用对的时机,希望大家在新网站开局就注意这些要点。
  易观Argo现已免费使用,有兴趣的同学可点击阅读原文下载安装,或扫描下方二维码试用。体验易观Argo带给我们优化网站的快感。
  在
  原创
文章上盖章,下载并安装易观Argo

福利:淘宝官方发货的微信小程序值得推荐吗?-月锋

采集交流优采云 发表了文章 • 0 个评论 • 41 次浏览 • 2022-11-25 08:32 • 来自相关话题

  福利:淘宝官方发货的微信小程序值得推荐吗?-月锋
  文章采集软件app:下载地址::软件使用步骤:
  1、用户可以通过软件完成图片录入,图片文件的格式转换,文字识别,标题识别,字体压缩等,
  
  2、软件支持添加不同文件作为自动机来运行,
  3、软件可以无需设置环境变量直接启动软件,
  4、按软件提示设置无线网卡,以后使用小程序时就可以不用再下载更多软件了!软件地址::,快速采集天猫、京东等一些知名网店的商品。
  
  【收集一些】云采集工具
  【已上传部分】
  有没有哪款也可以一键云采集淘宝图片的工具?-月锋的回答有哪些淘宝官方发货的微信小程序值得推荐?-月锋的回答自己做了一个小程序:采集下单的
  谢邀。题主有收集摄影类的图片吗?如果有的话,推荐一下优采云
采集器,免费、且采集效率高。此外还有可以试试雪球网,基本上想查某个网页的信息都可以找到,基本上国内外网站都能搜到。--如果不能满足题主需求,有没有免费又好用的工具?我用过一段时间,像爱采购这些,还是不能满足需求。 查看全部

  福利:淘宝官方发货的微信小程序值得推荐吗?-月锋
  文章采集软件app:下载地址::软件使用步骤:
  1、用户可以通过软件完成图片录入,图片文件的格式转换,文字识别,标题识别,字体压缩等,
  
  2、软件支持添加不同文件作为自动机来运行,
  3、软件可以无需设置环境变量直接启动软件,
  4、按软件提示设置无线网卡,以后使用小程序时就可以不用再下载更多软件了!软件地址::,快速采集天猫、京东等一些知名网店的商品。
  
  【收集一些】云采集工具
  【已上传部分】
  有没有哪款也可以一键云采集淘宝图片的工具?-月锋的回答有哪些淘宝官方发货的微信小程序值得推荐?-月锋的回答自己做了一个小程序:采集下单的
  谢邀。题主有收集摄影类的图片吗?如果有的话,推荐一下优采云
采集器,免费、且采集效率高。此外还有可以试试雪球网,基本上想查某个网页的信息都可以找到,基本上国内外网站都能搜到。--如果不能满足题主需求,有没有免费又好用的工具?我用过一段时间,像爱采购这些,还是不能满足需求。

事实:一个自定义的appstore,到底哪个好看呢?(组图)

采集交流优采云 发表了文章 • 0 个评论 • 43 次浏览 • 2022-11-24 06:11 • 来自相关话题

  事实:一个自定义的appstore,到底哪个好看呢?(组图)
  文章采集软件appstore的名字在下图红框位置(软件名称均来自appleglobalappstorestore)点击进入后选择【图标】-【创建appstore】-【图标】系统自动把最新的名称和描述传入,接下来我们点击【下载】。点击下载,就是下载完成的画面!在这个截图的当中找到一个自己需要的【图标】,如上图的酒杯。
  
  在桌面上将酒杯图标拖入我们的appstore,如下图,将已有的图标全部点开。接下来就可以进行自定义appstore,我们在左侧选择store里面的一个app,如上图选择的是【appstore上的应用程序】,这个应用程序我们在桌面可以看到的,如下图。接下来,就是继续进行自定义appstore,我们点击我们的【应用程序】,然后把【信息】发给我们需要进行自定义的appstore。
  
  接下来的操作是点击上方【我的】进行个人信息的注册登陆。完成以上操作,我们在appstore上看到的就是一个自定义的appstore!如果你要挑选最好看的appstore,其实这两个都不错,就是有时候不知道哪个好看了,最好看的appstore就是appstore自带的应用商店,里面有最新和最美的应用。那么好看的appstore到底哪个好看呢?这个就不是靠一篇文章就能说完的,最好的appstore还是要自己亲自去发掘。
  毕竟appstore里面大部分都是免费的,当然每个人可能都会有自己的偏好,或者喜欢收费的。我喜欢最美的应用,所以我选择了最美的appstore!。 查看全部

  事实:一个自定义的appstore,到底哪个好看呢?(组图)
  文章采集软件appstore的名字在下图红框位置(软件名称均来自appleglobalappstorestore)点击进入后选择【图标】-【创建appstore】-【图标】系统自动把最新的名称和描述传入,接下来我们点击【下载】。点击下载,就是下载完成的画面!在这个截图的当中找到一个自己需要的【图标】,如上图的酒杯。
  
  在桌面上将酒杯图标拖入我们的appstore,如下图,将已有的图标全部点开。接下来就可以进行自定义appstore,我们在左侧选择store里面的一个app,如上图选择的是【appstore上的应用程序】,这个应用程序我们在桌面可以看到的,如下图。接下来,就是继续进行自定义appstore,我们点击我们的【应用程序】,然后把【信息】发给我们需要进行自定义的appstore。
  
  接下来的操作是点击上方【我的】进行个人信息的注册登陆。完成以上操作,我们在appstore上看到的就是一个自定义的appstore!如果你要挑选最好看的appstore,其实这两个都不错,就是有时候不知道哪个好看了,最好看的appstore就是appstore自带的应用商店,里面有最新和最美的应用。那么好看的appstore到底哪个好看呢?这个就不是靠一篇文章就能说完的,最好的appstore还是要自己亲自去发掘。
  毕竟appstore里面大部分都是免费的,当然每个人可能都会有自己的偏好,或者喜欢收费的。我喜欢最美的应用,所以我选择了最美的appstore!。

事实:打开摄像头找美女或者帅哥合成自己需要的信息截图

采集交流优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2022-11-23 20:25 • 来自相关话题

  事实:打开摄像头找美女或者帅哥合成自己需要的信息截图
  文章采集软件appfuture,可以给朋友圈发布的广告添加自定义的图片,点击mark即可保存。
  把需要的信息截图下来,然后用按钮也可以了。ps:我的网站里面也有你需要的信息。
  上有个插件叫weixin,叫啥不记得了,
  有趣的问题,
  
  目前貌似没有具体可行的插件。题主自己动手丰衣足食,应该很快就能找到想要的。
  打开摄像头,
  同问啊,怎么让别人帮忙扩个图,找好多都不行,
  苹果安卓都可以哦,不过要转发给好友,如果想自己制作类似的,可以直接去打开摄像头找美女或者帅哥合成自己需要的图片,
  楼主可以试试,一直从事图片的工作,这个是可以实现的,要求也不高,就是你的照片要足够吸引人,
  
  找我就行了,免费的。
  搜索一下,现在已经有了,但我不知道叫什么名字,
  来看看我制作的的吧
  像下面这个差不多可以了
  如果你真的想弄,可以直接百度一下,有很多制作教程。另外我觉得这种年轻人制作图片,大多是直接把照片转换成动态gif格式的,再下载,分享。这种要求应该不高。图片来源于网络, 查看全部

  事实:打开摄像头找美女或者帅哥合成自己需要的信息截图
  文章采集软件appfuture,可以给朋友圈发布的广告添加自定义的图片,点击mark即可保存。
  把需要的信息截图下来,然后用按钮也可以了。ps:我的网站里面也有你需要的信息。
  上有个插件叫weixin,叫啥不记得了,
  有趣的问题,
  
  目前貌似没有具体可行的插件。题主自己动手丰衣足食,应该很快就能找到想要的。
  打开摄像头,
  同问啊,怎么让别人帮忙扩个图,找好多都不行,
  苹果安卓都可以哦,不过要转发给好友,如果想自己制作类似的,可以直接去打开摄像头找美女或者帅哥合成自己需要的图片,
  楼主可以试试,一直从事图片的工作,这个是可以实现的,要求也不高,就是你的照片要足够吸引人,
  
  找我就行了,免费的。
  搜索一下,现在已经有了,但我不知道叫什么名字,
  来看看我制作的的吧
  像下面这个差不多可以了
  如果你真的想弄,可以直接百度一下,有很多制作教程。另外我觉得这种年轻人制作图片,大多是直接把照片转换成动态gif格式的,再下载,分享。这种要求应该不高。图片来源于网络,

完整解决方案:采集南阳核酸检测app

采集交流优采云 发表了文章 • 0 个评论 • 302 次浏览 • 2022-11-22 17:17 • 来自相关话题

  完整解决方案:采集南阳核酸检测app
  新版合集app::8096/tool/nycj10950.apk分享给大家。这是专门为南洋核酸检测志愿者打造的掌上服务平台。通过本软件,您可以方便的采集
前来做核酸检测的核酸居民信息,提高核酸检测水平。检测效率高,有需要的用户快来yx007下载吧!
  采集
南洋软件介绍
  通过扫码方式进行数据录入和采集,还可以方便后续查询,提高医护人员的采集效率。这里还有相关的学习资料,欢迎使用。
  采集
南洋软件特色
  1、通过信息采集一体机自动识别二代居民身份证信息,并自动录入。
  2、用户可以通过软件注册核酸信息,查询核酸结果,非常方便。
  
  3、采样完成后,24小时内可获得检测结果报告,可直接查询。
  采集
南洋软件功能
  1.享受更便捷的采集,手机查看数据,体验各种服务。
  2、用户可以直接使用身份查询信息,可以了解各种采样记录。
  3、健康管理质量高,及时了解各种医疗信息,更好的管理。
  南洋软件亮点集锦
  
  1、集群服务,提供最全面的服务,推荐最热门的应用
  2.全程评价,服务好不好,流程快不快,请打分
  3.个性化订阅,按需订阅喜欢的应用
  南洋软件评测合集
  1、为用户带来更多好用的方式,随时满足采集
需求。
  2、各地区的风险登记查询都很好,使用方便简单。
  3、软件方便采集
报名信息,同时每天实时更新,将最新的动态推送给大家。
  解决方案:【CLS数据淘金第四期】网络流日志-云联网日志分析
  【CLS数据淘金第四期】网络流量日志-云网络日志分析
  日志服务 CLS
  腾讯云开发者
  Qcloud社区
  腾讯云官方社区号,汇聚技术开发者,分享技术干货,打造技术影响力交流社区。
  发表于
  收录
在集合中
  介绍
  Cloud Connect Network(CCN)覆盖全球20+区域,提供云上专有网络(VPC)、VPC与本地数据中心(IDC)内网互联服务,具备全网多点互联和路由能力如自学习、链路选择、故障快速收敛等。
  用户可以使用云日志服务(CLS)更快速、方便地采集
云网络流量日志,通过CLS提供的搜索分析、仪表盘、告警等功能,发现和定位云网络问题,支持业务服务。
  云联网流日志分析场景
  (一)预警业务问题
  小秦是某在线教育产品的运维人员。在线教育师生分布在多个地域,VPC较多。直播平台需要构建覆盖多个区域的高质量互联互通,确保跨区域的视频和语音传输清晰无延迟。
  在这种情况下,云联网服务就成了最佳选择。
  使用云组网后,远在天边的老师和同学终于可以无延迟地沟通了。但在课程高峰期,由于带宽限制,仍有部分学员出现卡顿现象。为了保证服务质量,需要在流量激增时及时检测并扩容。
  
  为此,小秦通过CLS日志服务对云联网流量日志进行监控和告警。监控拒绝流量的百分比。
  如图所示,每隔5分钟,查询最近5分钟被拒绝流量的比例。当比率大于 1% 时,将触发警报。声明如下:
  log-status:OK | select round(sum(case when action = 'REJECT' then 1.00 else 0.00 end) / cast(count(*) as double) * 100,2) as "reject占比(%)"
  (二)定位并解决业务问题
  一转眼,又是一个开学季。这一天,小琴的手机和邮箱都收到了云网拒绝流量比例的告警通知。
  小琴打开了CLS的CCN Flow Log_Advanced Analysis Dashboard,过滤掉最上面流量类型为REJECT(拒绝)的流日志。
  再查看被拒流量的线路分布,发现主要集中在ap-guangzhou和ap-shanghai之间。
  分析语句如下:
  log-status:OK | select concat(concat('srcRegion : ',srcregionid, ' , dstRegion : '), dstregionid) as region, sum(bytes) as bytes group by region order by bytes desc limit 20
  小秦查看了被拒绝流量的源IP和目的IP分布,发现IP对分布均匀,排除了个别IP恶意占用带宽的情况。
  分析语句如下:
  log-status:OK | select sum(bytes) as total, concat(concat('srcIP : ',srcaddr, ' , dstIP : '), dstaddr) as region_ip group by region_ip order by total desc limit 20
  接下来,小琴查看了被拒绝流量的协议分布和端口分布。协议和端口占比不集中在某一类,排除因协议和端口原因被拒。
  
  分析语句如下:
  log-status:OK | select sum(bytes) as bytes,concat(concat(concat(cast(protocol as varchar),' srcport:'),srcport,' dstport:'),dstport) as protocol group by protocol limit 10
  最后,小秦认为,本次拒绝流量比例上升,是由于正常使用线路的用户数量激增,需要进行带宽扩容。
  于是小秦查看了线路的带宽趋势。发现ap-guangzhou TO ap-shanghai线和ap-shanghai TO ap-guangzhou线目前峰值在7Gb/s左右。
  分析语句如下:
  log-status:OK | select histogram(cast(__TIMESTAMP__ as timestamp), interval 1 MINUTE) as time, sum(bytes)/60.00*8 as bandwidth, concat(concat('srcRegion : ',srcregionid, ' , dstRegion : '), dstregionid) as region_ip group by time, region_ip limit 10000
  带着以上结论,小琴登录腾讯云联网控制台,调整了两条线路的带宽上限,很快就解决了业务问题!为学生提供高质量的学习体验。
  演示体验
  CLS日志服务免费提供CCN云联网流量日志Demo快速体验,一键开箱即用,CCN检索分析全景体验,预设仪表盘,实时告警等功能。
  产品使用问题和技术咨询,欢迎加入CLS粉丝群,直接与日志达人1v1对话。还有很多粉丝福利,快来加入我们吧。
  欢迎关注“腾讯云开发者”,期待您的“围观”~
  预览时无法单击选项卡 查看全部

  完整解决方案:采集南阳核酸检测app
  新版合集app::8096/tool/nycj10950.apk分享给大家。这是专门为南洋核酸检测志愿者打造的掌上服务平台。通过本软件,您可以方便的采集
前来做核酸检测的核酸居民信息,提高核酸检测水平。检测效率高,有需要的用户快来yx007下载吧!
  采集
南洋软件介绍
  通过扫码方式进行数据录入和采集,还可以方便后续查询,提高医护人员的采集效率。这里还有相关的学习资料,欢迎使用。
  采集
南洋软件特色
  1、通过信息采集一体机自动识别二代居民身份证信息,并自动录入。
  2、用户可以通过软件注册核酸信息,查询核酸结果,非常方便。
  
  3、采样完成后,24小时内可获得检测结果报告,可直接查询。
  采集
南洋软件功能
  1.享受更便捷的采集,手机查看数据,体验各种服务。
  2、用户可以直接使用身份查询信息,可以了解各种采样记录。
  3、健康管理质量高,及时了解各种医疗信息,更好的管理。
  南洋软件亮点集锦
  
  1、集群服务,提供最全面的服务,推荐最热门的应用
  2.全程评价,服务好不好,流程快不快,请打分
  3.个性化订阅,按需订阅喜欢的应用
  南洋软件评测合集
  1、为用户带来更多好用的方式,随时满足采集
需求。
  2、各地区的风险登记查询都很好,使用方便简单。
  3、软件方便采集
报名信息,同时每天实时更新,将最新的动态推送给大家。
  解决方案:【CLS数据淘金第四期】网络流日志-云联网日志分析
  【CLS数据淘金第四期】网络流量日志-云网络日志分析
  日志服务 CLS
  腾讯云开发者
  Qcloud社区
  腾讯云官方社区号,汇聚技术开发者,分享技术干货,打造技术影响力交流社区。
  发表于
  收录
在集合中
  介绍
  Cloud Connect Network(CCN)覆盖全球20+区域,提供云上专有网络(VPC)、VPC与本地数据中心(IDC)内网互联服务,具备全网多点互联和路由能力如自学习、链路选择、故障快速收敛等。
  用户可以使用云日志服务(CLS)更快速、方便地采集
云网络流量日志,通过CLS提供的搜索分析、仪表盘、告警等功能,发现和定位云网络问题,支持业务服务。
  云联网流日志分析场景
  (一)预警业务问题
  小秦是某在线教育产品的运维人员。在线教育师生分布在多个地域,VPC较多。直播平台需要构建覆盖多个区域的高质量互联互通,确保跨区域的视频和语音传输清晰无延迟。
  在这种情况下,云联网服务就成了最佳选择。
  使用云组网后,远在天边的老师和同学终于可以无延迟地沟通了。但在课程高峰期,由于带宽限制,仍有部分学员出现卡顿现象。为了保证服务质量,需要在流量激增时及时检测并扩容。
  
  为此,小秦通过CLS日志服务对云联网流量日志进行监控和告警。监控拒绝流量的百分比。
  如图所示,每隔5分钟,查询最近5分钟被拒绝流量的比例。当比率大于 1% 时,将触发警报。声明如下:
  log-status:OK | select round(sum(case when action = 'REJECT' then 1.00 else 0.00 end) / cast(count(*) as double) * 100,2) as "reject占比(%)"
  (二)定位并解决业务问题
  一转眼,又是一个开学季。这一天,小琴的手机和邮箱都收到了云网拒绝流量比例的告警通知。
  小琴打开了CLS的CCN Flow Log_Advanced Analysis Dashboard,过滤掉最上面流量类型为REJECT(拒绝)的流日志。
  再查看被拒流量的线路分布,发现主要集中在ap-guangzhou和ap-shanghai之间。
  分析语句如下:
  log-status:OK | select concat(concat('srcRegion : ',srcregionid, ' , dstRegion : '), dstregionid) as region, sum(bytes) as bytes group by region order by bytes desc limit 20
  小秦查看了被拒绝流量的源IP和目的IP分布,发现IP对分布均匀,排除了个别IP恶意占用带宽的情况。
  分析语句如下:
  log-status:OK | select sum(bytes) as total, concat(concat('srcIP : ',srcaddr, ' , dstIP : '), dstaddr) as region_ip group by region_ip order by total desc limit 20
  接下来,小琴查看了被拒绝流量的协议分布和端口分布。协议和端口占比不集中在某一类,排除因协议和端口原因被拒。
  
  分析语句如下:
  log-status:OK | select sum(bytes) as bytes,concat(concat(concat(cast(protocol as varchar),' srcport:'),srcport,' dstport:'),dstport) as protocol group by protocol limit 10
  最后,小秦认为,本次拒绝流量比例上升,是由于正常使用线路的用户数量激增,需要进行带宽扩容。
  于是小秦查看了线路的带宽趋势。发现ap-guangzhou TO ap-shanghai线和ap-shanghai TO ap-guangzhou线目前峰值在7Gb/s左右。
  分析语句如下:
  log-status:OK | select histogram(cast(__TIMESTAMP__ as timestamp), interval 1 MINUTE) as time, sum(bytes)/60.00*8 as bandwidth, concat(concat('srcRegion : ',srcregionid, ' , dstRegion : '), dstregionid) as region_ip group by time, region_ip limit 10000
  带着以上结论,小琴登录腾讯云联网控制台,调整了两条线路的带宽上限,很快就解决了业务问题!为学生提供高质量的学习体验。
  演示体验
  CLS日志服务免费提供CCN云联网流量日志Demo快速体验,一键开箱即用,CCN检索分析全景体验,预设仪表盘,实时告警等功能。
  产品使用问题和技术咨询,欢迎加入CLS粉丝群,直接与日志达人1v1对话。还有很多粉丝福利,快来加入我们吧。
  欢迎关注“腾讯云开发者”,期待您的“围观”~
  预览时无法单击选项卡

事实:动态站长采集机器人通过采集基本的网站数据一般没问题

采集交流优采云 发表了文章 • 0 个评论 • 71 次浏览 • 2022-11-22 02:19 • 来自相关话题

  事实:动态站长采集机器人通过采集基本的网站数据一般没问题
  文章采集软件app非常多,常见的如专业一点的如百度风云采集器,六类云采集器等等,另外像麦兜、飞采数据等数据采集软件也可以,还有的就是给电商做采集的采集器,通过抓取后台的数据,同时做标签批量采集,总之一般软件都是采集方便,但是有时效性、数据量大的话还是需要手动统计,那对于小白推荐用动态站长采集机器人的采集软件,搭配最近比较火的动态插件,基本可以满足采集内容上亿的要求,可以看一下下面的安装教程及介绍,希望对你有帮助。
  动态站长采集机器人通过采集基本的网站数据一般没问题,一般网站内容上亿的话就需要采集器自己的采集器是好用的。
  
  一、前期准备工作
  二、采集命令说明
  三、采集效果展示
  
  首先,上线发布一下自己所有的公众号的公众号名称,服务号和企业号,技术名称的名称等,在后台搜索栏输入公众号的名称等即可。然后:进入一个公众号的内容页面,然后点击进入自定义菜单栏,进入我要采集的内容页面,这里面的是我们所有采集到的内容。点击保存,就开始自动采集了,全部采集完成之后点击右上角关闭就行了。
  麦兜采集器。超好用的采集器。操作简单,还能免费试用。
  可以百度搜索一下listinghome,挺好用的,老板找我要采集,商家可以免费试用一个月,码字不易, 查看全部

  事实:动态站长采集机器人通过采集基本的网站数据一般没问题
  文章采集软件app非常多,常见的如专业一点的如百度风云采集器,六类云采集器等等,另外像麦兜、飞采数据等数据采集软件也可以,还有的就是给电商做采集的采集器,通过抓取后台的数据,同时做标签批量采集,总之一般软件都是采集方便,但是有时效性、数据量大的话还是需要手动统计,那对于小白推荐用动态站长采集机器人的采集软件,搭配最近比较火的动态插件,基本可以满足采集内容上亿的要求,可以看一下下面的安装教程及介绍,希望对你有帮助。
  动态站长采集机器人通过采集基本的网站数据一般没问题,一般网站内容上亿的话就需要采集器自己的采集器是好用的。
  
  一、前期准备工作
  二、采集命令说明
  三、采集效果展示
  
  首先,上线发布一下自己所有的公众号的公众号名称,服务号和企业号,技术名称的名称等,在后台搜索栏输入公众号的名称等即可。然后:进入一个公众号的内容页面,然后点击进入自定义菜单栏,进入我要采集的内容页面,这里面的是我们所有采集到的内容。点击保存,就开始自动采集了,全部采集完成之后点击右上角关闭就行了。
  麦兜采集器。超好用的采集器。操作简单,还能免费试用。
  可以百度搜索一下listinghome,挺好用的,老板找我要采集,商家可以免费试用一个月,码字不易,

整套解决方案:采集软件

采集交流优采云 发表了文章 • 0 个评论 • 63 次浏览 • 2022-11-21 09:21 • 来自相关话题

  整套解决方案:采集软件
  
  有没有不需要电脑的采集软件?我想要更容易操作的东西。[图片]聚客宝来告诉您:操作简单、快捷、方便,在手机上即可轻松完成操作。高德地图、百度地图、腾讯地图、阿里巴巴、美团、慧聪网、企业黄页等网站同时采集,9000万+企业信息,10亿多客户联系方式,覆盖全国。该软件已经过仔细筛选。过滤掉重复和不准确的信息,为您采集
尽可能准确的来源信息。[图片] 1.关键词采集 关键词搜索,通过高德地图、百度地图、腾讯地图三大地图的实时采集...
  
  解决方案:CMS建站系统PageAdmin和Drupal8哪个好?
  pageadmin cms,多站点,站群系统,可以创建多站点,站点,后台,用户中心可以绑定独立域名。pageadmin cms自定义表单、字段、自定义数据表,支持一对一、一对多自定义字段,可以应对复杂的数据内容需求。pageadmin cms先进的模板设计,支持master pages、partial pages等公共页面,提高复用性,让网站模板更加高效便捷。千万级负载,缓存+后台缓存+专业数据优化,大数据大流量下也能快速响应。pageadmin cms扩展灵活,支持多终端,具有可拆卸插件设计,可为小程序、APP等终端提供数据接口。
  pageadmin cms是一个知名的cms网站管理系统。它目前在中国有很多用户。许多网站管理员使用它来建立博客、门户网站、学校门户网站和信息门户网站。这个系统的后台非常灵活。可扩展性,自定义表格和自定义字段非常灵活,安全性也很高。
  
  pageadmin cms网站搭建完成后,需要修改模板。对此,我建议,如果你对css基础不了解,可以自己定制一个个性化的模板。模板标题网站,不仅会造成搜索引擎蜘蛛的审美疲劳,也会让用户产生审美疲劳,所以个性化的模板是非常有必要的。
  pageadmin cms 改善网站内容并提高内容质量。前面说的是运营网站的基础,提高网站内容的质量是运营网站的核心。也是能够反映pageadmin cms网站能否继续运营,能否获取流量的关键环节。在这里我想指出,内容质量的提升并不一定需要使用大量的原创文章。事实上,一些与网站内容相关的精彩内容采集
也很有效。此外,每天都会更新一两篇与网站相关的文章。高质量的内容也是必不可少的,只有这样你才能持续吸引用户访问你的网站。
  相比织梦,pageadmin cms在安全方面更加专业,多用于一些对网站安全要求比较高的网站。比如企业网站会用到这个cms。国内很多建站公司都比较喜欢用这个cms为用户建站。此外,pageadmin cms 的框架相对较新。使用目前网络上最流行的mvc模式,制作模板比织梦方便多了。pageadmin cms网上有很多免费模板,但都是老版模板。鉴于pageadmin cms模板制作比较简单,所以制作一个属于自己的网站模板并不是那么难。
  
  pageadmin cms可以增加应用市场,在线安装应用插件。可以增加自己的自定义信息和用户信息回收站功能。pageadmin cms信息表增加复制功能和Url识别功能,使url在多站点场景下更加人性化。pageadmin cms增加优化的递归算法,提高后台多级菜单的构建速度,增加api管理功能,方便api查看和调用。同时在后台增加了自定义路由的可视化管理界面。
  pageadmin cms管理员增加多角色支持,方便灵活组合权限,增加登录安全性,每次登录后刷新验证码。让每个后台都支持独立的域名绑定,支持内网IP,可以将后台与外网完全隔离。pageadmin cms用户登录增加手机+短信验证码支持,可开启关闭。底层增加跨域支持,方便多域名、APP或小程序等多终端开发。pageadmin cms管理列表增加附件和附件组的下载和图片组的直接展示。修复404页面返回302状态的bug,
  pageadmin cms解决了后台添加成员不验证密码复杂度的bug。修改字段不能设置角色和成员组权限的bug可以修复后台数据库工具运行多行SQL错误的bug,也可以修复模板引擎重复引用程序集影响加载速度的bug。 查看全部

  整套解决方案:采集软件
  
  有没有不需要电脑的采集软件?我想要更容易操作的东西。[图片]聚客宝来告诉您:操作简单、快捷、方便,在手机上即可轻松完成操作。高德地图、百度地图、腾讯地图、阿里巴巴、美团、慧聪网、企业黄页等网站同时采集,9000万+企业信息,10亿多客户联系方式,覆盖全国。该软件已经过仔细筛选。过滤掉重复和不准确的信息,为您采集
尽可能准确的来源信息。[图片] 1.关键词采集 关键词搜索,通过高德地图、百度地图、腾讯地图三大地图的实时采集...
  
  解决方案:CMS建站系统PageAdmin和Drupal8哪个好?
  pageadmin cms,多站点,站群系统,可以创建多站点,站点,后台,用户中心可以绑定独立域名。pageadmin cms自定义表单、字段、自定义数据表,支持一对一、一对多自定义字段,可以应对复杂的数据内容需求。pageadmin cms先进的模板设计,支持master pages、partial pages等公共页面,提高复用性,让网站模板更加高效便捷。千万级负载,缓存+后台缓存+专业数据优化,大数据大流量下也能快速响应。pageadmin cms扩展灵活,支持多终端,具有可拆卸插件设计,可为小程序、APP等终端提供数据接口。
  pageadmin cms是一个知名的cms网站管理系统。它目前在中国有很多用户。许多网站管理员使用它来建立博客、门户网站、学校门户网站和信息门户网站。这个系统的后台非常灵活。可扩展性,自定义表格和自定义字段非常灵活,安全性也很高。
  
  pageadmin cms网站搭建完成后,需要修改模板。对此,我建议,如果你对css基础不了解,可以自己定制一个个性化的模板。模板标题网站,不仅会造成搜索引擎蜘蛛的审美疲劳,也会让用户产生审美疲劳,所以个性化的模板是非常有必要的。
  pageadmin cms 改善网站内容并提高内容质量。前面说的是运营网站的基础,提高网站内容的质量是运营网站的核心。也是能够反映pageadmin cms网站能否继续运营,能否获取流量的关键环节。在这里我想指出,内容质量的提升并不一定需要使用大量的原创文章。事实上,一些与网站内容相关的精彩内容采集
也很有效。此外,每天都会更新一两篇与网站相关的文章。高质量的内容也是必不可少的,只有这样你才能持续吸引用户访问你的网站。
  相比织梦,pageadmin cms在安全方面更加专业,多用于一些对网站安全要求比较高的网站。比如企业网站会用到这个cms。国内很多建站公司都比较喜欢用这个cms为用户建站。此外,pageadmin cms 的框架相对较新。使用目前网络上最流行的mvc模式,制作模板比织梦方便多了。pageadmin cms网上有很多免费模板,但都是老版模板。鉴于pageadmin cms模板制作比较简单,所以制作一个属于自己的网站模板并不是那么难。
  
  pageadmin cms可以增加应用市场,在线安装应用插件。可以增加自己的自定义信息和用户信息回收站功能。pageadmin cms信息表增加复制功能和Url识别功能,使url在多站点场景下更加人性化。pageadmin cms增加优化的递归算法,提高后台多级菜单的构建速度,增加api管理功能,方便api查看和调用。同时在后台增加了自定义路由的可视化管理界面。
  pageadmin cms管理员增加多角色支持,方便灵活组合权限,增加登录安全性,每次登录后刷新验证码。让每个后台都支持独立的域名绑定,支持内网IP,可以将后台与外网完全隔离。pageadmin cms用户登录增加手机+短信验证码支持,可开启关闭。底层增加跨域支持,方便多域名、APP或小程序等多终端开发。pageadmin cms管理列表增加附件和附件组的下载和图片组的直接展示。修复404页面返回302状态的bug,
  pageadmin cms解决了后台添加成员不验证密码复杂度的bug。修改字段不能设置角色和成员组权限的bug可以修复后台数据库工具运行多行SQL错误的bug,也可以修复模板引擎重复引用程序集影响加载速度的bug。

最新版:采集北京APP2022最新安卓版v1.0.8.2最新安卓版

采集交流优采云 发表了文章 • 0 个评论 • 209 次浏览 • 2022-11-18 00:13 • 来自相关话题

  最新版:采集北京APP2022最新安卓版v1.0.8.2最新安卓版
  采集北京APP2022最新安卓版,这是一款非常好用的标本取样应用软件工具。这个软件里面有很多人脸识别内容和各种采集功能。非常全面,还可以为您提供各种优质服务。里面的很多资料和数据采集都非常全面。喜欢的朋友,快来289下载体验吧。
  软件说明
  采集北京APP是一款带来更多贴心功能的应用,您可以免费进入体验,超级简单的个人信息注册流程,享受优质服务,直接了解北京我们的各种健康相关信息也可以得到各种数据。
  软件特点:
  1、完成个人信息后,根据实际情况选择采样点和选择采样方式,非常方便;
  2.输入身份证号码,可查询近期参加过核酸检测筛查采样的居民记录;
  
  3、注册后可提高抽样效率,二维码可注册,随时使用,防止现场失误。
  软件亮点:
  1、系统基于身份识别技术,完美融合十合一采集模式;
  2、专为北京地区医护人员设计的核酸采集工具,可实现数据录入和扫码采集;
  3、也可以方便后期查询,提高医护人员的采集效率。还有相关的学习资料。
  软件特点:
  1、信息采集速度是以往人工登记方式的3倍以上,实验室标本登记速度是3倍以上;
  
  2、标本采集人员只需提前下载并安装手机APP应用,通过短短5分钟的培训,即可轻松掌握操作要领;
  3.软件的功能还是很不错的,使用的方法也比较独特,可以用来做采集核酸检测。
  软件点评:
  1、软件操作简单方便。您只需为核酸人员拍照,自动为您生成文件;
  2、帮助您管理自己的核酸信息,满足您对核酸管理的一切需求;
  3、多种模板和表格,可以为大家进行各种填表任务,超级方便。
  外媒:今日头条 Android '秒' 级编译速度优化
  背景介绍
  Android 项目一般使用 gradle 作为构建打包工具,而其执行速度慢也一直为人所诟病,对于今日头条 Android 项目这种千万行级别的大型工程来说,全量编译一次的时间可能高达六七分钟,在某些需要快速验证功能的场景,改动一行代码的增量编译甚至也需要等两三分钟,这般龟速严重影响了开发体验与效率,因此针对 gradle 编译构建耗时进行优化显得尤为重要。
  在今日头条 Android 项目上,编译构建速度的优化和恶化一直在交替执行,18 年时由于模块化拆分等影响,clean build 一次的耗时达到了顶峰 7 分 30s 左右,相关同学通过模块 aar 化,maven 代理加速,以及增量 java 编译等优化手段,将 clean build 耗时优化到 4 分钟,增量编译优化到 20~30s 。但是后面随着 kotlin 的大规模使用,自定义 transform 以及 apt 库泛滥,又将增量编译速度拖慢到 2 分 30s ,且有进一步恶化的趋势。为了优化现有不合理的编译耗时,防止进一步的恶化,最近的 5,6 双月又针对编译耗时做了一些列专项优化(kapt,transform,dexBuilder,build-cache 等) 并添加了相关的防恶化管控方案。 从 4.27 截止到 6.29 ,整体的优化效果如下:
  历史优化方案
  由于 18 年左右客户端基础技术相关同学已经对今日头条 Android 工程做了许多 gradle 相关的优化,且这些优化是近期优化的基础,因此先挑选几个具有代表性的方案进行介绍,作为下文的背景同步。
  maven 代理优化 sync 时间背景
  gradle 工程往往会在 repositories 中添加一些列的 maven 仓库地址,作为组件依赖获取的查找路径,早期在今日头条的项目中配置了十几个 maven 的地址,但是依赖获取是按照 maven 仓库配置的顺序依次查找的,如果某个组件存在于最后一个仓库中,那前面的十几个仓库得依次发起网络请求查找,并在网络请求返回失败后才查找下一个,如果项目中大多组件都在较后仓库的位置,累加起来的查找时间就会很长。
  优化方案使用公司内部搭建的 maven 私服,在私服上设置代理仓库,为其他仓库配置代理(例如 google、jcenter、mavenCentral 等仓库),代理仓库创建好后,在 Negative Cache 配置项中关闭其 cache 开关:如果查找时没有找到某版本依赖库时会缓存失败结果,一段时间内不会重新去 maven 仓库查找对应依赖库,即使 maven 仓库中已经有该版本的依赖库,查找时仍然返回失败的结果。建立仓库组,将所有仓库归放到一个统一的仓库组里,依赖查找时只需要去这个组仓库中查找,这样能大大降低多次发起网络请求遍历仓库的耗时。模块 aar 化背景
  今日头条项目进行了多次组件化和模块化的重构,分拆出了 200 多个子模块,这些子模块如果全都 include 进项目,那么在 clean build 的时候,所有子模块的代码需要重新编译,而对于大多数开发人员来说,基本上只关心自己负责的少数几个模块,根本不需要改动其他模块的代码,这些其他 project 的配置和编译时间就成为了不必要的代价。
  优化方案
  对于以上子模块过多的解决方案是:将所有模块发布成 aar ,在项目中全部默认通过 maven 依赖这些编译好的组件,而在需要修改某个模块时,通过配置项将该模块的依赖形式改为源码依赖,做到在编译时只编译改动的模块。但是这样做会导致模块渐渐的又全部变为源码依赖的形式,除非规定每次修改完对应模块后,开发人员自己手动将模块发布成 aar ,并改回依赖形式。这种严重依赖开发人员自觉,并且在模块数量多依赖关系复杂的时候会显得异常繁琐,因此为了开发阶段的便利,设计了一整套更完整细致的方案:
  开发时,从主分支拉取的代码一定是全 aar 依赖的,除了 app 模块没有任何子模块是源码引入。需要修改对应模块时,通过修改 local.properties 里的 INCLUDES 参数指定源码引入的模块。开发完成后,push 代码至远端,触发代码合并流程后,在 ci 预编译过程与合码目标分支对比,检测修改的模块,将这些模块按照依赖关系依次发布成 aar ,并在工程中修改依赖为新版本的 aar, 这一步保证了每次代码合入完成后,主分支上的依赖都是全 aar 依赖的。收益
  通过上述改造,将源码模块切换成 aar 依赖后,clean build 耗时从 7,8 分钟降低至 4,5 分钟,收益接近 50%,效果显著。
  增量 java/kotlin 编译背景
  在非 clean build 的情况下,更改 java/kotlin 代码虽然会做增量编译,但是为了绝对的正确性,gradle 会根据一些列依赖关系计算,选择需要重新编译的代码,这个计算粒度比较粗,稍微改动一个类的代码,就可能导致大量代码重新执行 apt, 编译等流程。
  由于 gradle 作为通用框架,其设计的基本原则是绝对的正确,因此很容易导致增量编译失效,在实际开发中,为了快速编译展示结果,可以在编译正确性和编译速度上做一个折中的方案:
  禁用原创的 javac/kotlinCompile 等 task, 自行实现代码增量修改判断,只编译修改的代码。动态禁用 kapt 相关的 task, 降低 kapt,kaptGenerateStub 等 task 的耗时。
  以上方案(下文全部简称为 fastbuild) 虽然在涉及常量修改,方法签名变更方面 存在一定的问题(常量内联等),但是能换来增量编译从 2 分多降低至 20~30s,极大的提升编译效率,且有问题的场景并不常见,因此整体上该方案是利大于弊的。
  编译耗时恶化
  通过上文介绍的几个优化方案和其他优化方式,在 18 年时,今日头条 Android 项目的整体编译速度(clean build 4~5min, fast 增量编译 20~30s)在同量级的大型工程中来说是比较快的 ,然而后期随着业务发展的需求,编译脚本添加了很多新的逻辑:
  kotlin 大规模使用,kapt 新增了很多注解处理逻辑。引入对 java8 语法的支持 , java8 语法的 desugar(脱糖)操作增加了编译耗时。大量的字节码插桩需求,添加了许多 transform ,大幅度提升了增量编译耗时。
  这些逻辑的引入,使得增量编译耗时恶化到 2 分 30s,即使采用 fastbuild,改动一行代码编译也需要 1 分 30s 之多,开发体验非常差。而下文将着重描述最近一段时间对上述问题的优化过程。
  近期优化方案app 壳模块 kapt 优化背景
  今日头条工程经过多次模块化,组件化重构后, app 模块(NewsArticle)的大部分代码都已经迁移到子模块(上文已经介绍过子模块可以采用 aar 化用于编译速度优化,app 模块只剩下一个壳而已。
  但是从 build profile 数据(执行 gradle 命令时添加 --profile 参数会在编译完成后输出相关 task 耗时的统计文件) 中发现到一个异常 case:明明只有 2 个类的 app 模块 kapt(annotationProcessor 注解处理) 相关耗时近 1 分钟。
  通过进一步观察,虽然 app 模块拆分后只有 2 个简单类的代码,但是却用了 6 种 kapt 库, 且实际生效的只是其中 ServiceImpl 一个注解 (内部 ServiceManager 框架,用于指示生产 Proxy 类,对模块之间代码调用进行解耦)。如此一顿操作猛如虎,每次编译却只生成固定的两个 Proxy 类,与 53s 的高耗时相比,投入产出比极低。
  优化方案
  把固定生成的 Proxy 类从 generate 目录移动到 src 目录,然后禁止 app 模块中 kapt 相关 task ,并添加相关管控方案(如下图: 检测到不合理情况后立刻抛出异常),防止其他人添加新增的 kapt 库。
  收益在 mac clean build 中平均有 40s 收益在 ci clean build 中平均有 20s 收益kapt 隔离优化背景
  通过上文介绍在 app 模块发现的异常的 kapt case, 进而发现在工程中为了方便,定义了一个 library.gradle ,该文件的作用是定义项目中通用的 Android dsl 配置和共有的基础依赖,因此项目中所有子模块均 apply 了这个文件,但是这个文件陆陆续续的被不同的业务添加新的 kapt 注解处理库,在全源码编译时,所有子模块都得执行 library 模块中定义的全部 6 个 kapt ,即使该模块没有任何注解相关的处理也不例外。
  而上述情况的问题在于:相比纯 java 模块的注解处理,kotlin 代码需要先通过 kaptGenerateStub 将 kt 文件转换成为 java ,让 apt 处理程序能够统一的面向 java 做注解扫描和处理。但是上面讲到其实有很多模块是根本不会有任何实际 kapt 处理过程的,却白白的做了一次 kt 转 java 的操作,源码引入的模块越多,这种无意义的耗时累加起来也非常可观。
  为了能够弄清楚到底有哪些子模块真正用到了 kapt ,哪些没用到可以禁用掉 kapt 相关 task ,对项目中所有子模块进行了一遍扫描:
  获取 kapt configuration 的所有依赖,可以得到 kapt 依赖库的 jar 包,利用 asm 获取所有 annotation.遍历所有 subproject 的 sourceset 下所有 .java,.kt 源文件,解析 import 信息,看是否有步骤 1 中解析的 annotationpackage task 完成后遍历 所有 subproject 所有 generate/apt ,generate/kapt 目录下生成的 java 文件
  使用上述方案,通过全源码打包最终扫描出来大概是 70+模块不会进行任何 kapt 的实际输出,且将这些不会进行输出的 kapt,kaptGenerateStub 的 task 耗时累加起来较高 217s (由于 task 并发执行所以实际总时长可能要少一些).
  获取到不实际生成 kapt 内容的模块后,开始对这些模块进行细粒度的拆分,让它们从 apply library.gradle 改为没有 kapt 相关的 library-api.gradle ,该文件除了禁用 kapt 外,与 library 逻辑一致。
  但是这样做算是在背后偷偷做了些更改,很可能后续新来的同学不知道有这种优化手段,可能新增了注解后却没有任何输出且找不到原因,而优化效果最好是尽量少给业务同学带来困扰。为了避免这种情况,便对这些 library-api 模块依赖的注解做隔离优化,即:把这些模块依赖的注解库全部 自动 exclude 掉,在尝试使用注解时会因获取不到引用(如下图所示),第一时间发现到依赖被移除的问题。
  另一方面在编译出现错误时,对应 gradle 插件会自动解析找不到的符号,如果发现该符号是被隔离优化的注解,会提示将 library-api 替换成 library,尽可能降低优化方案对业务的负面影响。
  收益mac 全源码场景中有 58s 左右的加速收益。ci 机器上由于 cpu 核数更多 ,task 并发性能更好,只有 10s 左右的收益。transform 优化背景
  transform 作为 Android gradle plugin 提供给开发者的 API,用于在 apk 构建过程中,对 class 字节码,resources 等文件内容进行插桩修改,例如官方的 dex, proguard 等功能均由此 api 实现。
  对于今日头条这种大型工程来说,有很多诸如性能插桩、自动埋点插桩等相关需求,因此基于此 api 开发了大量 transform,用于实现特定功能,但是这些 transform 基本上都是不支持增量编译的,即使只改动了一行代码,这 些 transform 都会遍历所有 class 文件,解析字节码中的方法字段信息,关键是这类 transform 数量有十几个,将这些遍历耗时乘以 10 累加之后,增量编译耗时自然居高不下。
  根据分析,其中性能插桩等相关 transform 做的一些面向线上的插桩方案是完全可以只在 release 打包时打开的,因此可以直接在 debug 编译时禁用这些功能,用于提升开发期间的编译速度。而剩下的 9 个 transform 特征比较相似,可能在一些插桩细节上有所不同,它们大致的处理逻辑为:
  在各个模块中使用 apt processor 采集模块 xx 注解的 class 信息然后生成一个 xxCollect 类,该类的作用是采集好 apt 阶段解析到的本模块的类信息将所有模块采集到的信息进行汇总,利用 transform 阶段扫描出所有的 xxCollect 信息,通过 javaassit 或者 asm 往一个 xxCollectMgr 的某个 collectXxx 方法插桩注入之前收到的信息业务代码可通过 xxCollectMgr 的 collectXxx 方法获取到在各个模块动态生成的所有 xxCollect 信息。(例: 页面路由相关框架便是通过该逻辑采集到所有子模块的路由注册信息)
  由于这 9 个自定义 transform 的功能如此类似,便决定将这些 transform 合并成一个,这样同一个文件的读写操作只执行一次,并且可以做定制化的增量编译优化。虽然公司内有类似的 transform 合并优化方案 byteX ( 已在 github 开源),但是由于今日头条项目在 debug 阶段未开启该功能,且 ByteX 做了一些诸如 ClassGrapth 的构建,对类文件做两次遍历等操作,对于实现类信息采集和信息注入 这个功能来说,byteX 显得比较重 ,于是仍然针对类信息采集注入功能这个细分场景开发了一个收敛框架。
  收益
  该框架完成了内部 9 种类信息采集注入相关框架的收敛,编译耗时的绝对值加速了 25s 左右,且由于提供了统一的增量缓存功能,使得改动一行代码的耗时可以从 2 分 30s 降低到 35~40s ,实现了增量编译速度大的飞跃。最关键的是将所有自定义 transform 统一管控后,后续可以做统一定制化的需求,进一步优化编译速度。
  dexBuilder 优化背景
  在 Android debug 编译 过程中,最主要的耗时在 transform 上,而上文 介绍 今日头条项目自定义 transform 已经被高度优化过,剩下的 dexBuilder(将 class 转换成 dex ) ,dexMerge 等 task 耗时就成为了性能瓶颈,dexBuilder 全量编译耗时 60s 左右,增量编译耗时 22s 左右。
  根据 DexArchiveBuilderTransform 关键方法 launchProcessing 里面关键一行 isDirectoryBased,如果是目录类型的输入,会根据具体变动 class 文件做增量的 dex 编译 ,但是如果是 jar 输入类型,那只要 jar 里任何一个类变动,则整个 jar 所有类都需要重执行 dex,但是由于 gradle 的依赖特性,基本上只有 app 模块是目录类的输入,其他 library 都是 jar 输入类型,对于比较大的业务模块 ,如果该模块有几千个类,那每改动一次类,就会有几千类连带重新 执行 dex 编译。
  dexBuilder 增量效果量化
  在优化前为了得到真正的重新执行 dex 编译的数值,做到最佳优化,设计了一套 hook dex 编译流程的方法(该方法理论上可以 hook Android gradle plugin 任意类:大致就是 hook classLoader ,提前用 asm 修改 D8DexArchiveBuilder 中的 convert 方法
  通过对 D8DexArchiveBuilder 的 hook ,统计到优化前改动一行代码会连带着 24968 个类重新执行 dex 编译,增量效果非常差。
  优化方案
  既然 jar 输入相比于 目录输入来说增量编译效果非常差,那么可以想到 hook TransformInvocation 中的 input 方法,动态将 project 的 jar 类型输入(JarInput)映射为一个 目录输入(DirectoryInput),那么子模块修改对应代码时,只重新编译目录中被修改的 class 为 dex(而不是原来的整个 jar 内所有 class 重新执行 dex 编译),整体 dex 重新编译的数量将大幅度减少。实现具体方案如下:
  而 jar 转 目录的映射细节为:
  在第一次增量修改完成后,重新执行 dex 编译的类数量降低至 2152 个,但是其中仍然有很多迷惑的不该执行 dex 编译的类,预期是修改多少类,就重新执行 多少次 dex,因此继续对其中原因进行进一步的探索
  desugarGraph 异常
  由于 java8 的字节码有些指令在 Android 虚拟机中并不能得到支持,会在编译流程中,将这些指令进行脱糖,转换成已有的指令,而 d8 中 desugar 的流程合并到了 dexBuilder 中,为了避免某些类 desugar 后,依赖它的类的行为正确,需要把依赖它的所有类重新执行一遍 dex 编译。
  而 d8 会根据 DesugaringGraph 查找 desguar 有变动的类及其依赖的 jar 包,如图下面获得到的 addtionalPaths 是 desguar 类可能直接间接相关的 jar 包,即使这些 jar 包没有任何文件内容变更,其中所有类也得重新全部执行一次 dex 编译。
  DesugaringGraph 逻辑概述
  该类用来辅助获取依赖或间接依赖到变更文件的所有文件,而它的生成逻辑为: 全量或增量编译类的时候记录类型之间的依赖和被依赖关系,依赖关系的判断条件有
  
  父类直接实现的接口调用 dynamic 方法指令时的返回类型
  DesugaringGraph 不仅记录了类依赖的类,和依赖它的类,同时也记录了一个文件路径收录了哪些类
  如果文件路径是 class 文件,那路径就收录 1 个类如果路径是 jar 文件,收录这个 jar 下所有类。
  在增量编译时检查到变动的文件时,会检查这个文件路径收录的所有类, 然后递归查找所有直接/间接依赖它的类,并且找到这些依赖它的类后,会把这个类所在的 jar 包作为额外的处理类型(即使 jar 本身没有任何变动,里面所有的类仍然需要重新 dex 编译)
  顺着这个解析关系,找到了一个不正常的 jar 包 bdjson_api ,这个 jar 只有 3 个文件 (IBDJson,BDJsonCollector, BDJsonConstants) 。但是 BDJsonCollector 是一个 stub 类,每次执行 transform 会采集到其他类的信息然后往该类的方法中注入,因此该文件每次编译时都会变动。 这个类本身并没有多少直接依赖它的类,主要是 它所在的 jar 包还有个 IBDJson 接口。
  按照之前的 DesugaringGraph 依赖关系,所有 IBDJson 接口的实现类被判断为依赖它,然后这些实现类如果出现在某个 dynamic 方法中,又会被层层查找,查找完了之后,还得计算所有依赖类所在的 jar 包,jar 包中其他没有依赖它的类也会被重新 dex 编译, 在这个 case 的依赖查找中,连带重新执行 dex 编译的类数量并不多,大概为 4 个 jar 包共 2000 多个类重新执行了无意义的 dex 流程,但是如果是其他 sdk jar 包,则可能就会给 dexBuilder 增量带来毁灭性的打击。 上述问题的解决方法:
  把每次都会修改的 Stub 注入类和其他接口类分离,放在不同 jar 包。(需要改造业务,比较麻烦)动态把这个 sdk jar 输入转换成目录输入。(上文介绍的方法,也与上面 jar 转目录的初衷相符,只不过是漏掉了这个 case,但是却意外证明了:除了收录业务代码多的 project 的 jar 输入需要转换为目录外,sdk jar 同样有必要)
  修复后修改一行代码重新执行 dex 的数量为 10 ,其中 9 个是每次 transform 会修改的 stub 类,1 个是实际修改类。做到了真正的 改多少类,执行多次 dex 编译。
  收益
  assemebleDebug 的增量编译中从原来(上文 transform 优化后)的 35s~40s 是降低至均值 17s,在 fast build 中效果最明显(屏蔽了 apt),第二次增量编译能突破到 9s 实现秒级编译。
  而经过上面所有的优化后,耗时数据里耗时最严重的 dexBuilder 和 dex-merge 基本都降低在 1s 左右,自定义 transform 也是 1s 左右,其他 task 基本都是零点几秒。在不使用 hotfix 方案的情况下(由于今日头条项目使用了过多的自定义 transform 和插件方案,所以不好使用 instantrun 等 hostfix 方案),相关 task 的耗时基本达到了优化的极限。
  build-cache 优化踩坑
  Build-cache 是 gralde 提供的一个编译缓存方案,目的是在构建过程中当两个 task 的输入相同时,可以复用缓存内容,直接跳过 task 的执行拿到缓存好的执行结果。由于缓存结果既可以放在本地磁盘,也可以从远程获取,因此容易想到利用 ci 提前 构建缓存包,在其他 ci 机器和开发时利用缓存包获得加速效果。
  那么如何判断 task 可以直接获取 之前 task 的缓存内容作为输出呢?定义为可缓存的 task ,会定义一些缓存相关的属性,task 执行时通过文件指纹,缓存属性等一大堆属性计算出缓存 key ,用于查找是否命中缓存,计算维度有:
  但是原生的 build-cahce 在缓存命中率上惨不忍睹,公司内抖音团队基于 gradle4.x 的源码做过一些提高命中率的修改,不过今日头条用的 gradle 版本是 5.1 ,受抖音团队的启发,也对 gradle5.1 源码做了些定制化的修改,用于 dump 缓存 key 的计算流程,快速发现缓存问题。相比于抖音发现的一些影响缓存命中的问题,额外发现了一些诸如 mbox , kapt 元素遍历顺序不固定的问题,这里只挑一个典型的 apt 顺序不一致的问题进行介绍:
  apt 顺序不一致导致的缓存失效问题
  经过修改 gradle5.1 源码后对编译流程的信息采集,发现有的 task 缓存无法命中是因为 kapt 时,很多生成代码块逻辑是一样的,但是顺序不一样(如下图 demo :下面两个生成方法的逻辑一致,但是判断顺序不一致,这应该是在 processor 中通过 RoundEnviroment 获取到 注解元素 elemnts 顺序不一致导致的 )
  其内部的原因可能是文件遍历目录时获取子文件的顺序不一致,导致了子文件对应注解元素的顺序也不一致, 总之这个操作影响了生成文件内代码的顺序,也影响了该文件的 hash 计算结果,导致 build-cache 在计算 javac task 的 key 时会错乱导致缓存无法命中。
  解决方案
  但是注意到 AbstractProcessor 的核心方法 process 的两个参数都是接口,因此想到可以代理原来的 RoundEnvironment 接口,将其 getElementXx 的方法经过固定排序后返回,使得 apt 注解元素的顺序能够固定下来。
  由于篇幅影响,其他影响缓存命中相关的 case 略(主要是一些涉及到文件绝对路径, classPath 相关的问题)
  收益由于大多开发场景是引入多少模块就修改多少模块内容,很难获得命中缓存, 收益很小主要是全源码场景能稳定获得一些编译加速,基本上在 22~99s 左右。编译耗时防恶化管控
  在今日头条这种大型工程中,有很多业务部门参与开发,仅 Android 工程 开发人员就有几百人且人员变动频繁,因此内部任何一项优化工作必然是得搭配上一些管控措施的,否则一边优化一边恶化,空浪费人力。
  为此制定了一些管控方案,首先是 debug 阶段的 新增 transform 管控,设置为白名单形式,如果在开发阶段新增了 transform 直接终止编译流程,通过说明文档告知管控的规则,当然,管控的目的是尽可能减少一些不必要的不合理的编译问题,并不是与业务团队作对,如果某一个操作拖慢了整体的编译耗时,但是在 app 性能/稳定性方面有更大收益,且无法在编译期做更多的优化,仍然是允许添加的,只不过是得提前把这个问题暴露出来而已,能更快的找出更多的解决思路,比如引导使用 byteX 等 transform 收敛方案。
  另一方面的是合码流程方面的阻塞 : 今日头条 为了保障 app 的性能稳定性,在合码流程上设置了许多自动化的卡点: 如 包大小检测,插件依赖变更检查, so 变更检查,启动性能检测等,检测到对应问题(如包大小增加异常)会阻塞合码流程。为了管控编译速度 ,使其不至于恶化的太快,也加上了对应的 基于 task 级别的管控,当某一个 task 耗时异常波动,或者新增全新类型的 task 时,能够自动的发现问题,通过机器人将相关人员拉到 mr 讨论群中, 尽量在 合码完成前能发现问题。
  总结
  为了持续稳定的保持较快的编译速度,可能需要做到以下几点:
  项目需要有良好的工程结构,对业务模块进行适当粒度的拆分,做好 aar/源码的切换不仅能节省 javac/kotlinCompile 的耗时,也是其他优化方案的基础。工程配置要有区分度,不要所有子模块都用同样的配置,比如根本不会用到 kapt 功能的模块就别打开 kapt task 了。transform 若无必要,无须新加,或者按级别划分,如今日头条在 debug,devMode,release 不同的构建级别用到的 transform 数量是不一致的,尽量让绝大多数人能获得相对最快的编译速度体验,而不会被用不到的功能拖慢速度。一定要新增的 transform 可以先多用现有的增量方案,如 byteX 以及本文提供的类信息注入框架, 尽量把不要的文件 io 合并。很多高耗时的 官方 task(dexBuilder) 都是有直接或间接的办法提升其效率的,并且如果除了耗时之外有其他的衡量手段,如本文提到的重新 dex 率,通过量化数据可以快速的发现问题,进而找到耗时的罪魁祸首。与 app 性能优化等工作类似,编译速度优化既需要持续进行,也需要一定的问题发现手段,尽量避免问题出现很长一段时间后再去查找原因(那时候可能业务依赖程度会非常高,难以修改)。更多分享
  背景介绍
  Android 项目一般使用 gradle 作为构建打包工具,而其执行速度慢也一直为人所诟病,对于今日头条 Android 项目这种千万行级别的大型工程来说,全量编译一次的时间可能高达六七分钟,在某些需要快速验证功能的场景,改动一行代码的增量编译甚至也需要等两三分钟,这般龟速严重影响了开发体验与效率,因此针对 gradle 编译构建耗时进行优化显得尤为重要。
  在今日头条 Android 项目上,编译构建速度的优化和恶化一直在交替执行,18 年时由于模块化拆分等影响,clean build 一次的耗时达到了顶峰 7 分 30s 左右,相关同学通过模块 aar 化,maven 代理加速,以及增量 java 编译等优化手段,将 clean build 耗时优化到 4 分钟,增量编译优化到 20~30s 。但是后面随着 kotlin 的大规模使用,自定义 transform 以及 apt 库泛滥,又将增量编译速度拖慢到 2 分 30s ,且有进一步恶化的趋势。为了优化现有不合理的编译耗时,防止进一步的恶化,最近的 5,6 双月又针对编译耗时做了一些列专项优化(kapt,transform,dexBuilder,build-cache 等) 并添加了相关的防恶化管控方案。 从 4.27 截止到 6.29 ,整体的优化效果如下:
  历史优化方案
  由于 18 年左右客户端基础技术相关同学已经对今日头条 Android 工程做了许多 gradle 相关的优化,且这些优化是近期优化的基础,因此先挑选几个具有代表性的方案进行介绍,作为下文的背景同步。
  maven 代理优化 sync 时间背景
  gradle 工程往往会在 repositories 中添加一些列的 maven 仓库地址,作为组件依赖获取的查找路径,早期在今日头条的项目中配置了十几个 maven 的地址,但是依赖获取是按照 maven 仓库配置的顺序依次查找的,如果某个组件存在于最后一个仓库中,那前面的十几个仓库得依次发起网络请求查找,并在网络请求返回失败后才查找下一个,如果项目中大多组件都在较后仓库的位置,累加起来的查找时间就会很长。
  优化方案使用公司内部搭建的 maven 私服,在私服上设置代理仓库,为其他仓库配置代理(例如 google、jcenter、mavenCentral 等仓库),代理仓库创建好后,在 Negative Cache 配置项中关闭其 cache 开关:如果查找时没有找到某版本依赖库时会缓存失败结果,一段时间内不会重新去 maven 仓库查找对应依赖库,即使 maven 仓库中已经有该版本的依赖库,查找时仍然返回失败的结果。建立仓库组,将所有仓库归放到一个统一的仓库组里,依赖查找时只需要去这个组仓库中查找,这样能大大降低多次发起网络请求遍历仓库的耗时。模块 aar 化背景
  今日头条项目进行了多次组件化和模块化的重构,分拆出了 200 多个子模块,这些子模块如果全都 include 进项目,那么在 clean build 的时候,所有子模块的代码需要重新编译,而对于大多数开发人员来说,基本上只关心自己负责的少数几个模块,根本不需要改动其他模块的代码,这些其他 project 的配置和编译时间就成为了不必要的代价。
  优化方案
  对于以上子模块过多的解决方案是:将所有模块发布成 aar ,在项目中全部默认通过 maven 依赖这些编译好的组件,而在需要修改某个模块时,通过配置项将该模块的依赖形式改为源码依赖,做到在编译时只编译改动的模块。但是这样做会导致模块渐渐的又全部变为源码依赖的形式,除非规定每次修改完对应模块后,开发人员自己手动将模块发布成 aar ,并改回依赖形式。这种严重依赖开发人员自觉,并且在模块数量多依赖关系复杂的时候会显得异常繁琐,因此为了开发阶段的便利,设计了一整套更完整细致的方案:
  开发时,从主分支拉取的代码一定是全 aar 依赖的,除了 app 模块没有任何子模块是源码引入。需要修改对应模块时,通过修改 local.properties 里的 INCLUDES 参数指定源码引入的模块。开发完成后,push 代码至远端,触发代码合并流程后,在 ci 预编译过程与合码目标分支对比,检测修改的模块,将这些模块按照依赖关系依次发布成 aar ,并在工程中修改依赖为新版本的 aar, 这一步保证了每次代码合入完成后,主分支上的依赖都是全 aar 依赖的。收益
  通过上述改造,将源码模块切换成 aar 依赖后,clean build 耗时从 7,8 分钟降低至 4,5 分钟,收益接近 50%,效果显著。
  增量 java/kotlin 编译背景
  在非 clean build 的情况下,更改 java/kotlin 代码虽然会做增量编译,但是为了绝对的正确性,gradle 会根据一些列依赖关系计算,选择需要重新编译的代码,这个计算粒度比较粗,稍微改动一个类的代码,就可能导致大量代码重新执行 apt, 编译等流程。
  由于 gradle 作为通用框架,其设计的基本原则是绝对的正确,因此很容易导致增量编译失效,在实际开发中,为了快速编译展示结果,可以在编译正确性和编译速度上做一个折中的方案:
  禁用原创的 javac/kotlinCompile 等 task, 自行实现代码增量修改判断,只编译修改的代码。动态禁用 kapt 相关的 task, 降低 kapt,kaptGenerateStub 等 task 的耗时。
  以上方案(下文全部简称为 fastbuild) 虽然在涉及常量修改,方法签名变更方面 存在一定的问题(常量内联等),但是能换来增量编译从 2 分多降低至 20~30s,极大的提升编译效率,且有问题的场景并不常见,因此整体上该方案是利大于弊的。
  编译耗时恶化
  通过上文介绍的几个优化方案和其他优化方式,在 18 年时,今日头条 Android 项目的整体编译速度(clean build 4~5min, fast 增量编译 20~30s)在同量级的大型工程中来说是比较快的 ,然而后期随着业务发展的需求,编译脚本添加了很多新的逻辑:
  kotlin 大规模使用,kapt 新增了很多注解处理逻辑。引入对 java8 语法的支持 , java8 语法的 desugar(脱糖)操作增加了编译耗时。大量的字节码插桩需求,添加了许多 transform ,大幅度提升了增量编译耗时。
  这些逻辑的引入,使得增量编译耗时恶化到 2 分 30s,即使采用 fastbuild,改动一行代码编译也需要 1 分 30s 之多,开发体验非常差。而下文将着重描述最近一段时间对上述问题的优化过程。
  近期优化方案app 壳模块 kapt 优化背景
  今日头条工程经过多次模块化,组件化重构后, app 模块(NewsArticle)的大部分代码都已经迁移到子模块(上文已经介绍过子模块可以采用 aar 化用于编译速度优化,app 模块只剩下一个壳而已。
  但是从 build profile 数据(执行 gradle 命令时添加 --profile 参数会在编译完成后输出相关 task 耗时的统计文件) 中发现到一个异常 case:明明只有 2 个类的 app 模块 kapt(annotationProcessor 注解处理) 相关耗时近 1 分钟。
  通过进一步观察,虽然 app 模块拆分后只有 2 个简单类的代码,但是却用了 6 种 kapt 库, 且实际生效的只是其中 ServiceImpl 一个注解 (内部 ServiceManager 框架,用于指示生产 Proxy 类,对模块之间代码调用进行解耦)。如此一顿操作猛如虎,每次编译却只生成固定的两个 Proxy 类,与 53s 的高耗时相比,投入产出比极低。
  优化方案
  把固定生成的 Proxy 类从 generate 目录移动到 src 目录,然后禁止 app 模块中 kapt 相关 task ,并添加相关管控方案(如下图: 检测到不合理情况后立刻抛出异常),防止其他人添加新增的 kapt 库。
  收益在 mac clean build 中平均有 40s 收益在 ci clean build 中平均有 20s 收益kapt 隔离优化背景
  通过上文介绍在 app 模块发现的异常的 kapt case, 进而发现在工程中为了方便,定义了一个 library.gradle ,该文件的作用是定义项目中通用的 Android dsl 配置和共有的基础依赖,因此项目中所有子模块均 apply 了这个文件,但是这个文件陆陆续续的被不同的业务添加新的 kapt 注解处理库,在全源码编译时,所有子模块都得执行 library 模块中定义的全部 6 个 kapt ,即使该模块没有任何注解相关的处理也不例外。
  而上述情况的问题在于:相比纯 java 模块的注解处理,kotlin 代码需要先通过 kaptGenerateStub 将 kt 文件转换成为 java ,让 apt 处理程序能够统一的面向 java 做注解扫描和处理。但是上面讲到其实有很多模块是根本不会有任何实际 kapt 处理过程的,却白白的做了一次 kt 转 java 的操作,源码引入的模块越多,这种无意义的耗时累加起来也非常可观。
  为了能够弄清楚到底有哪些子模块真正用到了 kapt ,哪些没用到可以禁用掉 kapt 相关 task ,对项目中所有子模块进行了一遍扫描:
  获取 kapt configuration 的所有依赖,可以得到 kapt 依赖库的 jar 包,利用 asm 获取所有 annotation.遍历所有 subproject 的 sourceset 下所有 .java,.kt 源文件,解析 import 信息,看是否有步骤 1 中解析的 annotationpackage task 完成后遍历 所有 subproject 所有 generate/apt ,generate/kapt 目录下生成的 java 文件
  使用上述方案,通过全源码打包最终扫描出来大概是 70+模块不会进行任何 kapt 的实际输出,且将这些不会进行输出的 kapt,kaptGenerateStub 的 task 耗时累加起来较高 217s (由于 task 并发执行所以实际总时长可能要少一些).
  
  获取到不实际生成 kapt 内容的模块后,开始对这些模块进行细粒度的拆分,让它们从 apply library.gradle 改为没有 kapt 相关的 library-api.gradle ,该文件除了禁用 kapt 外,与 library 逻辑一致。
  但是这样做算是在背后偷偷做了些更改,很可能后续新来的同学不知道有这种优化手段,可能新增了注解后却没有任何输出且找不到原因,而优化效果最好是尽量少给业务同学带来困扰。为了避免这种情况,便对这些 library-api 模块依赖的注解做隔离优化,即:把这些模块依赖的注解库全部 自动 exclude 掉,在尝试使用注解时会因获取不到引用(如下图所示),第一时间发现到依赖被移除的问题。
  另一方面在编译出现错误时,对应 gradle 插件会自动解析找不到的符号,如果发现该符号是被隔离优化的注解,会提示将 library-api 替换成 library,尽可能降低优化方案对业务的负面影响。
  收益mac 全源码场景中有 58s 左右的加速收益。ci 机器上由于 cpu 核数更多 ,task 并发性能更好,只有 10s 左右的收益。transform 优化背景
  transform 作为 Android gradle plugin 提供给开发者的 API,用于在 apk 构建过程中,对 class 字节码,resources 等文件内容进行插桩修改,例如官方的 dex, proguard 等功能均由此 api 实现。
  对于今日头条这种大型工程来说,有很多诸如性能插桩、自动埋点插桩等相关需求,因此基于此 api 开发了大量 transform,用于实现特定功能,但是这些 transform 基本上都是不支持增量编译的,即使只改动了一行代码,这 些 transform 都会遍历所有 class 文件,解析字节码中的方法字段信息,关键是这类 transform 数量有十几个,将这些遍历耗时乘以 10 累加之后,增量编译耗时自然居高不下。
  根据分析,其中性能插桩等相关 transform 做的一些面向线上的插桩方案是完全可以只在 release 打包时打开的,因此可以直接在 debug 编译时禁用这些功能,用于提升开发期间的编译速度。而剩下的 9 个 transform 特征比较相似,可能在一些插桩细节上有所不同,它们大致的处理逻辑为:
  在各个模块中使用 apt processor 采集模块 xx 注解的 class 信息然后生成一个 xxCollect 类,该类的作用是采集好 apt 阶段解析到的本模块的类信息将所有模块采集到的信息进行汇总,利用 transform 阶段扫描出所有的 xxCollect 信息,通过 javaassit 或者 asm 往一个 xxCollectMgr 的某个 collectXxx 方法插桩注入之前收到的信息业务代码可通过 xxCollectMgr 的 collectXxx 方法获取到在各个模块动态生成的所有 xxCollect 信息。(例: 页面路由相关框架便是通过该逻辑采集到所有子模块的路由注册信息)
  由于这 9 个自定义 transform 的功能如此类似,便决定将这些 transform 合并成一个,这样同一个文件的读写操作只执行一次,并且可以做定制化的增量编译优化。虽然公司内有类似的 transform 合并优化方案 byteX ( 已在 github 开源),但是由于今日头条项目在 debug 阶段未开启该功能,且 ByteX 做了一些诸如 ClassGrapth 的构建,对类文件做两次遍历等操作,对于实现类信息采集和信息注入 这个功能来说,byteX 显得比较重 ,于是仍然针对类信息采集注入功能这个细分场景开发了一个收敛框架。
  收益
  该框架完成了内部 9 种类信息采集注入相关框架的收敛,编译耗时的绝对值加速了 25s 左右,且由于提供了统一的增量缓存功能,使得改动一行代码的耗时可以从 2 分 30s 降低到 35~40s ,实现了增量编译速度大的飞跃。最关键的是将所有自定义 transform 统一管控后,后续可以做统一定制化的需求,进一步优化编译速度。
  dexBuilder 优化背景
  在 Android debug 编译 过程中,最主要的耗时在 transform 上,而上文 介绍 今日头条项目自定义 transform 已经被高度优化过,剩下的 dexBuilder(将 class 转换成 dex ) ,dexMerge 等 task 耗时就成为了性能瓶颈,dexBuilder 全量编译耗时 60s 左右,增量编译耗时 22s 左右。
  根据 DexArchiveBuilderTransform 关键方法 launchProcessing 里面关键一行 isDirectoryBased,如果是目录类型的输入,会根据具体变动 class 文件做增量的 dex 编译 ,但是如果是 jar 输入类型,那只要 jar 里任何一个类变动,则整个 jar 所有类都需要重执行 dex,但是由于 gradle 的依赖特性,基本上只有 app 模块是目录类的输入,其他 library 都是 jar 输入类型,对于比较大的业务模块 ,如果该模块有几千个类,那每改动一次类,就会有几千类连带重新 执行 dex 编译。
  dexBuilder 增量效果量化
  在优化前为了得到真正的重新执行 dex 编译的数值,做到最佳优化,设计了一套 hook dex 编译流程的方法(该方法理论上可以 hook Android gradle plugin 任意类:大致就是 hook classLoader ,提前用 asm 修改 D8DexArchiveBuilder 中的 convert 方法
  通过对 D8DexArchiveBuilder 的 hook ,统计到优化前改动一行代码会连带着 24968 个类重新执行 dex 编译,增量效果非常差。
  优化方案
  既然 jar 输入相比于 目录输入来说增量编译效果非常差,那么可以想到 hook TransformInvocation 中的 input 方法,动态将 project 的 jar 类型输入(JarInput)映射为一个 目录输入(DirectoryInput),那么子模块修改对应代码时,只重新编译目录中被修改的 class 为 dex(而不是原来的整个 jar 内所有 class 重新执行 dex 编译),整体 dex 重新编译的数量将大幅度减少。实现具体方案如下:
  而 jar 转 目录的映射细节为:
  在第一次增量修改完成后,重新执行 dex 编译的类数量降低至 2152 个,但是其中仍然有很多迷惑的不该执行 dex 编译的类,预期是修改多少类,就重新执行 多少次 dex,因此继续对其中原因进行进一步的探索
  desugarGraph 异常
  由于 java8 的字节码有些指令在 Android 虚拟机中并不能得到支持,会在编译流程中,将这些指令进行脱糖,转换成已有的指令,而 d8 中 desugar 的流程合并到了 dexBuilder 中,为了避免某些类 desugar 后,依赖它的类的行为正确,需要把依赖它的所有类重新执行一遍 dex 编译。
  而 d8 会根据 DesugaringGraph 查找 desguar 有变动的类及其依赖的 jar 包,如图下面获得到的 addtionalPaths 是 desguar 类可能直接间接相关的 jar 包,即使这些 jar 包没有任何文件内容变更,其中所有类也得重新全部执行一次 dex 编译。
  DesugaringGraph 逻辑概述
  该类用来辅助获取依赖或间接依赖到变更文件的所有文件,而它的生成逻辑为: 全量或增量编译类的时候记录类型之间的依赖和被依赖关系,依赖关系的判断条件有
  父类直接实现的接口调用 dynamic 方法指令时的返回类型
  DesugaringGraph 不仅记录了类依赖的类,和依赖它的类,同时也记录了一个文件路径收录了哪些类
  如果文件路径是 class 文件,那路径就收录 1 个类如果路径是 jar 文件,收录这个 jar 下所有类。
  在增量编译时检查到变动的文件时,会检查这个文件路径收录的所有类, 然后递归查找所有直接/间接依赖它的类,并且找到这些依赖它的类后,会把这个类所在的 jar 包作为额外的处理类型(即使 jar 本身没有任何变动,里面所有的类仍然需要重新 dex 编译)
  顺着这个解析关系,找到了一个不正常的 jar 包 bdjson_api ,这个 jar 只有 3 个文件 (IBDJson,BDJsonCollector, BDJsonConstants) 。但是 BDJsonCollector 是一个 stub 类,每次执行 transform 会采集到其他类的信息然后往该类的方法中注入,因此该文件每次编译时都会变动。 这个类本身并没有多少直接依赖它的类,主要是 它所在的 jar 包还有个 IBDJson 接口。
  按照之前的 DesugaringGraph 依赖关系,所有 IBDJson 接口的实现类被判断为依赖它,然后这些实现类如果出现在某个 dynamic 方法中,又会被层层查找,查找完了之后,还得计算所有依赖类所在的 jar 包,jar 包中其他没有依赖它的类也会被重新 dex 编译, 在这个 case 的依赖查找中,连带重新执行 dex 编译的类数量并不多,大概为 4 个 jar 包共 2000 多个类重新执行了无意义的 dex 流程,但是如果是其他 sdk jar 包,则可能就会给 dexBuilder 增量带来毁灭性的打击。 上述问题的解决方法:
  把每次都会修改的 Stub 注入类和其他接口类分离,放在不同 jar 包。(需要改造业务,比较麻烦)动态把这个 sdk jar 输入转换成目录输入。(上文介绍的方法,也与上面 jar 转目录的初衷相符,只不过是漏掉了这个 case,但是却意外证明了:除了收录业务代码多的 project 的 jar 输入需要转换为目录外,sdk jar 同样有必要)
  修复后修改一行代码重新执行 dex 的数量为 10 ,其中 9 个是每次 transform 会修改的 stub 类,1 个是实际修改类。做到了真正的 改多少类,执行多次 dex 编译。
  收益
  assemebleDebug 的增量编译中从原来(上文 transform 优化后)的 35s~40s 是降低至均值 17s,在 fast build 中效果最明显(屏蔽了 apt),第二次增量编译能突破到 9s 实现秒级编译。
  而经过上面所有的优化后,耗时数据里耗时最严重的 dexBuilder 和 dex-merge 基本都降低在 1s 左右,自定义 transform 也是 1s 左右,其他 task 基本都是零点几秒。在不使用 hotfix 方案的情况下(由于今日头条项目使用了过多的自定义 transform 和插件方案,所以不好使用 instantrun 等 hostfix 方案),相关 task 的耗时基本达到了优化的极限。
  build-cache 优化踩坑
  Build-cache 是 gralde 提供的一个编译缓存方案,目的是在构建过程中当两个 task 的输入相同时,可以复用缓存内容,直接跳过 task 的执行拿到缓存好的执行结果。由于缓存结果既可以放在本地磁盘,也可以从远程获取,因此容易想到利用 ci 提前 构建缓存包,在其他 ci 机器和开发时利用缓存包获得加速效果。
  那么如何判断 task 可以直接获取 之前 task 的缓存内容作为输出呢?定义为可缓存的 task ,会定义一些缓存相关的属性,task 执行时通过文件指纹,缓存属性等一大堆属性计算出缓存 key ,用于查找是否命中缓存,计算维度有:
  但是原生的 build-cahce 在缓存命中率上惨不忍睹,公司内抖音团队基于 gradle4.x 的源码做过一些提高命中率的修改,不过今日头条用的 gradle 版本是 5.1 ,受抖音团队的启发,也对 gradle5.1 源码做了些定制化的修改,用于 dump 缓存 key 的计算流程,快速发现缓存问题。相比于抖音发现的一些影响缓存命中的问题,额外发现了一些诸如 mbox , kapt 元素遍历顺序不固定的问题,这里只挑一个典型的 apt 顺序不一致的问题进行介绍:
  apt 顺序不一致导致的缓存失效问题
  经过修改 gradle5.1 源码后对编译流程的信息采集,发现有的 task 缓存无法命中是因为 kapt 时,很多生成代码块逻辑是一样的,但是顺序不一样(如下图 demo :下面两个生成方法的逻辑一致,但是判断顺序不一致,这应该是在 processor 中通过 RoundEnviroment 获取到 注解元素 elemnts 顺序不一致导致的 )
  其内部的原因可能是文件遍历目录时获取子文件的顺序不一致,导致了子文件对应注解元素的顺序也不一致, 总之这个操作影响了生成文件内代码的顺序,也影响了该文件的 hash 计算结果,导致 build-cache 在计算 javac task 的 key 时会错乱导致缓存无法命中。
  解决方案
  但是注意到 AbstractProcessor 的核心方法 process 的两个参数都是接口,因此想到可以代理原来的 RoundEnvironment 接口,将其 getElementXx 的方法经过固定排序后返回,使得 apt 注解元素的顺序能够固定下来。
  由于篇幅影响,其他影响缓存命中相关的 case 略(主要是一些涉及到文件绝对路径, classPath 相关的问题)
  收益由于大多开发场景是引入多少模块就修改多少模块内容,很难获得命中缓存, 收益很小主要是全源码场景能稳定获得一些编译加速,基本上在 22~99s 左右。编译耗时防恶化管控
  在今日头条这种大型工程中,有很多业务部门参与开发,仅 Android 工程 开发人员就有几百人且人员变动频繁,因此内部任何一项优化工作必然是得搭配上一些管控措施的,否则一边优化一边恶化,空浪费人力。
  为此制定了一些管控方案,首先是 debug 阶段的 新增 transform 管控,设置为白名单形式,如果在开发阶段新增了 transform 直接终止编译流程,通过说明文档告知管控的规则,当然,管控的目的是尽可能减少一些不必要的不合理的编译问题,并不是与业务团队作对,如果某一个操作拖慢了整体的编译耗时,但是在 app 性能/稳定性方面有更大收益,且无法在编译期做更多的优化,仍然是允许添加的,只不过是得提前把这个问题暴露出来而已,能更快的找出更多的解决思路,比如引导使用 byteX 等 transform 收敛方案。
  另一方面的是合码流程方面的阻塞 : 今日头条 为了保障 app 的性能稳定性,在合码流程上设置了许多自动化的卡点: 如 包大小检测,插件依赖变更检查, so 变更检查,启动性能检测等,检测到对应问题(如包大小增加异常)会阻塞合码流程。为了管控编译速度 ,使其不至于恶化的太快,也加上了对应的 基于 task 级别的管控,当某一个 task 耗时异常波动,或者新增全新类型的 task 时,能够自动的发现问题,通过机器人将相关人员拉到 mr 讨论群中, 尽量在 合码完成前能发现问题。
  总结
  为了持续稳定的保持较快的编译速度,可能需要做到以下几点:
  项目需要有良好的工程结构,对业务模块进行适当粒度的拆分,做好 aar/源码的切换不仅能节省 javac/kotlinCompile 的耗时,也是其他优化方案的基础。工程配置要有区分度,不要所有子模块都用同样的配置,比如根本不会用到 kapt 功能的模块就别打开 kapt task 了。transform 若无必要,无须新加,或者按级别划分,如今日头条在 debug,devMode,release 不同的构建级别用到的 transform 数量是不一致的,尽量让绝大多数人能获得相对最快的编译速度体验,而不会被用不到的功能拖慢速度。一定要新增的 transform 可以先多用现有的增量方案,如 byteX 以及本文提供的类信息注入框架, 尽量把不要的文件 io 合并。很多高耗时的 官方 task(dexBuilder) 都是有直接或间接的办法提升其效率的,并且如果除了耗时之外有其他的衡量手段,如本文提到的重新 dex 率,通过量化数据可以快速的发现问题,进而找到耗时的罪魁祸首。与 app 性能优化等工作类似,编译速度优化既需要持续进行,也需要一定的问题发现手段,尽量避免问题出现很长一段时间后再去查找原因(那时候可能业务依赖程度会非常高,难以修改)。更多分享
  字节跳动分布式表格存储系统的演进
  字节跳动自研强一致在线 KV&表格存储实践 - 上篇
  字节跳动自研强一致在线 KV &表格存储实践 - 下篇
  字节跳动在 Go 网络库上的实践
  字节跳动-GIP-Android 平台架构团队
  字节跳动-GIP-Android 平台架构团队以服务今日头条产品为主,同时协助公司其他产品,在产品性能、稳定性等用户体验,研发流程,编译优化,架构方向上不断优化和深入探索,以满足产品快速迭代的同时,保持较高的用户体验。我们长期招聘 Android 平台架构方向的同学,在北京,深圳均有相关岗位,想深入交流或者需要部门内推、投递简历的可以联系邮箱 (标题注明 : 字节跳动-GIP 平台 android 部门直推)
  欢迎关注字节跳动技术团队 查看全部

  最新版:采集北京APP2022最新安卓版v1.0.8.2最新安卓版
  采集北京APP2022最新安卓版,这是一款非常好用的标本取样应用软件工具。这个软件里面有很多人脸识别内容和各种采集功能。非常全面,还可以为您提供各种优质服务。里面的很多资料和数据采集都非常全面。喜欢的朋友,快来289下载体验吧。
  软件说明
  采集北京APP是一款带来更多贴心功能的应用,您可以免费进入体验,超级简单的个人信息注册流程,享受优质服务,直接了解北京我们的各种健康相关信息也可以得到各种数据。
  软件特点:
  1、完成个人信息后,根据实际情况选择采样点和选择采样方式,非常方便;
  2.输入身份证号码,可查询近期参加过核酸检测筛查采样的居民记录;
  
  3、注册后可提高抽样效率,二维码可注册,随时使用,防止现场失误。
  软件亮点:
  1、系统基于身份识别技术,完美融合十合一采集模式;
  2、专为北京地区医护人员设计的核酸采集工具,可实现数据录入和扫码采集;
  3、也可以方便后期查询,提高医护人员的采集效率。还有相关的学习资料。
  软件特点:
  1、信息采集速度是以往人工登记方式的3倍以上,实验室标本登记速度是3倍以上;
  
  2、标本采集人员只需提前下载并安装手机APP应用,通过短短5分钟的培训,即可轻松掌握操作要领;
  3.软件的功能还是很不错的,使用的方法也比较独特,可以用来做采集核酸检测。
  软件点评:
  1、软件操作简单方便。您只需为核酸人员拍照,自动为您生成文件;
  2、帮助您管理自己的核酸信息,满足您对核酸管理的一切需求;
  3、多种模板和表格,可以为大家进行各种填表任务,超级方便。
  外媒:今日头条 Android '秒' 级编译速度优化
  背景介绍
  Android 项目一般使用 gradle 作为构建打包工具,而其执行速度慢也一直为人所诟病,对于今日头条 Android 项目这种千万行级别的大型工程来说,全量编译一次的时间可能高达六七分钟,在某些需要快速验证功能的场景,改动一行代码的增量编译甚至也需要等两三分钟,这般龟速严重影响了开发体验与效率,因此针对 gradle 编译构建耗时进行优化显得尤为重要。
  在今日头条 Android 项目上,编译构建速度的优化和恶化一直在交替执行,18 年时由于模块化拆分等影响,clean build 一次的耗时达到了顶峰 7 分 30s 左右,相关同学通过模块 aar 化,maven 代理加速,以及增量 java 编译等优化手段,将 clean build 耗时优化到 4 分钟,增量编译优化到 20~30s 。但是后面随着 kotlin 的大规模使用,自定义 transform 以及 apt 库泛滥,又将增量编译速度拖慢到 2 分 30s ,且有进一步恶化的趋势。为了优化现有不合理的编译耗时,防止进一步的恶化,最近的 5,6 双月又针对编译耗时做了一些列专项优化(kapt,transform,dexBuilder,build-cache 等) 并添加了相关的防恶化管控方案。 从 4.27 截止到 6.29 ,整体的优化效果如下:
  历史优化方案
  由于 18 年左右客户端基础技术相关同学已经对今日头条 Android 工程做了许多 gradle 相关的优化,且这些优化是近期优化的基础,因此先挑选几个具有代表性的方案进行介绍,作为下文的背景同步。
  maven 代理优化 sync 时间背景
  gradle 工程往往会在 repositories 中添加一些列的 maven 仓库地址,作为组件依赖获取的查找路径,早期在今日头条的项目中配置了十几个 maven 的地址,但是依赖获取是按照 maven 仓库配置的顺序依次查找的,如果某个组件存在于最后一个仓库中,那前面的十几个仓库得依次发起网络请求查找,并在网络请求返回失败后才查找下一个,如果项目中大多组件都在较后仓库的位置,累加起来的查找时间就会很长。
  优化方案使用公司内部搭建的 maven 私服,在私服上设置代理仓库,为其他仓库配置代理(例如 google、jcenter、mavenCentral 等仓库),代理仓库创建好后,在 Negative Cache 配置项中关闭其 cache 开关:如果查找时没有找到某版本依赖库时会缓存失败结果,一段时间内不会重新去 maven 仓库查找对应依赖库,即使 maven 仓库中已经有该版本的依赖库,查找时仍然返回失败的结果。建立仓库组,将所有仓库归放到一个统一的仓库组里,依赖查找时只需要去这个组仓库中查找,这样能大大降低多次发起网络请求遍历仓库的耗时。模块 aar 化背景
  今日头条项目进行了多次组件化和模块化的重构,分拆出了 200 多个子模块,这些子模块如果全都 include 进项目,那么在 clean build 的时候,所有子模块的代码需要重新编译,而对于大多数开发人员来说,基本上只关心自己负责的少数几个模块,根本不需要改动其他模块的代码,这些其他 project 的配置和编译时间就成为了不必要的代价。
  优化方案
  对于以上子模块过多的解决方案是:将所有模块发布成 aar ,在项目中全部默认通过 maven 依赖这些编译好的组件,而在需要修改某个模块时,通过配置项将该模块的依赖形式改为源码依赖,做到在编译时只编译改动的模块。但是这样做会导致模块渐渐的又全部变为源码依赖的形式,除非规定每次修改完对应模块后,开发人员自己手动将模块发布成 aar ,并改回依赖形式。这种严重依赖开发人员自觉,并且在模块数量多依赖关系复杂的时候会显得异常繁琐,因此为了开发阶段的便利,设计了一整套更完整细致的方案:
  开发时,从主分支拉取的代码一定是全 aar 依赖的,除了 app 模块没有任何子模块是源码引入。需要修改对应模块时,通过修改 local.properties 里的 INCLUDES 参数指定源码引入的模块。开发完成后,push 代码至远端,触发代码合并流程后,在 ci 预编译过程与合码目标分支对比,检测修改的模块,将这些模块按照依赖关系依次发布成 aar ,并在工程中修改依赖为新版本的 aar, 这一步保证了每次代码合入完成后,主分支上的依赖都是全 aar 依赖的。收益
  通过上述改造,将源码模块切换成 aar 依赖后,clean build 耗时从 7,8 分钟降低至 4,5 分钟,收益接近 50%,效果显著。
  增量 java/kotlin 编译背景
  在非 clean build 的情况下,更改 java/kotlin 代码虽然会做增量编译,但是为了绝对的正确性,gradle 会根据一些列依赖关系计算,选择需要重新编译的代码,这个计算粒度比较粗,稍微改动一个类的代码,就可能导致大量代码重新执行 apt, 编译等流程。
  由于 gradle 作为通用框架,其设计的基本原则是绝对的正确,因此很容易导致增量编译失效,在实际开发中,为了快速编译展示结果,可以在编译正确性和编译速度上做一个折中的方案:
  禁用原创的 javac/kotlinCompile 等 task, 自行实现代码增量修改判断,只编译修改的代码。动态禁用 kapt 相关的 task, 降低 kapt,kaptGenerateStub 等 task 的耗时。
  以上方案(下文全部简称为 fastbuild) 虽然在涉及常量修改,方法签名变更方面 存在一定的问题(常量内联等),但是能换来增量编译从 2 分多降低至 20~30s,极大的提升编译效率,且有问题的场景并不常见,因此整体上该方案是利大于弊的。
  编译耗时恶化
  通过上文介绍的几个优化方案和其他优化方式,在 18 年时,今日头条 Android 项目的整体编译速度(clean build 4~5min, fast 增量编译 20~30s)在同量级的大型工程中来说是比较快的 ,然而后期随着业务发展的需求,编译脚本添加了很多新的逻辑:
  kotlin 大规模使用,kapt 新增了很多注解处理逻辑。引入对 java8 语法的支持 , java8 语法的 desugar(脱糖)操作增加了编译耗时。大量的字节码插桩需求,添加了许多 transform ,大幅度提升了增量编译耗时。
  这些逻辑的引入,使得增量编译耗时恶化到 2 分 30s,即使采用 fastbuild,改动一行代码编译也需要 1 分 30s 之多,开发体验非常差。而下文将着重描述最近一段时间对上述问题的优化过程。
  近期优化方案app 壳模块 kapt 优化背景
  今日头条工程经过多次模块化,组件化重构后, app 模块(NewsArticle)的大部分代码都已经迁移到子模块(上文已经介绍过子模块可以采用 aar 化用于编译速度优化,app 模块只剩下一个壳而已。
  但是从 build profile 数据(执行 gradle 命令时添加 --profile 参数会在编译完成后输出相关 task 耗时的统计文件) 中发现到一个异常 case:明明只有 2 个类的 app 模块 kapt(annotationProcessor 注解处理) 相关耗时近 1 分钟。
  通过进一步观察,虽然 app 模块拆分后只有 2 个简单类的代码,但是却用了 6 种 kapt 库, 且实际生效的只是其中 ServiceImpl 一个注解 (内部 ServiceManager 框架,用于指示生产 Proxy 类,对模块之间代码调用进行解耦)。如此一顿操作猛如虎,每次编译却只生成固定的两个 Proxy 类,与 53s 的高耗时相比,投入产出比极低。
  优化方案
  把固定生成的 Proxy 类从 generate 目录移动到 src 目录,然后禁止 app 模块中 kapt 相关 task ,并添加相关管控方案(如下图: 检测到不合理情况后立刻抛出异常),防止其他人添加新增的 kapt 库。
  收益在 mac clean build 中平均有 40s 收益在 ci clean build 中平均有 20s 收益kapt 隔离优化背景
  通过上文介绍在 app 模块发现的异常的 kapt case, 进而发现在工程中为了方便,定义了一个 library.gradle ,该文件的作用是定义项目中通用的 Android dsl 配置和共有的基础依赖,因此项目中所有子模块均 apply 了这个文件,但是这个文件陆陆续续的被不同的业务添加新的 kapt 注解处理库,在全源码编译时,所有子模块都得执行 library 模块中定义的全部 6 个 kapt ,即使该模块没有任何注解相关的处理也不例外。
  而上述情况的问题在于:相比纯 java 模块的注解处理,kotlin 代码需要先通过 kaptGenerateStub 将 kt 文件转换成为 java ,让 apt 处理程序能够统一的面向 java 做注解扫描和处理。但是上面讲到其实有很多模块是根本不会有任何实际 kapt 处理过程的,却白白的做了一次 kt 转 java 的操作,源码引入的模块越多,这种无意义的耗时累加起来也非常可观。
  为了能够弄清楚到底有哪些子模块真正用到了 kapt ,哪些没用到可以禁用掉 kapt 相关 task ,对项目中所有子模块进行了一遍扫描:
  获取 kapt configuration 的所有依赖,可以得到 kapt 依赖库的 jar 包,利用 asm 获取所有 annotation.遍历所有 subproject 的 sourceset 下所有 .java,.kt 源文件,解析 import 信息,看是否有步骤 1 中解析的 annotationpackage task 完成后遍历 所有 subproject 所有 generate/apt ,generate/kapt 目录下生成的 java 文件
  使用上述方案,通过全源码打包最终扫描出来大概是 70+模块不会进行任何 kapt 的实际输出,且将这些不会进行输出的 kapt,kaptGenerateStub 的 task 耗时累加起来较高 217s (由于 task 并发执行所以实际总时长可能要少一些).
  获取到不实际生成 kapt 内容的模块后,开始对这些模块进行细粒度的拆分,让它们从 apply library.gradle 改为没有 kapt 相关的 library-api.gradle ,该文件除了禁用 kapt 外,与 library 逻辑一致。
  但是这样做算是在背后偷偷做了些更改,很可能后续新来的同学不知道有这种优化手段,可能新增了注解后却没有任何输出且找不到原因,而优化效果最好是尽量少给业务同学带来困扰。为了避免这种情况,便对这些 library-api 模块依赖的注解做隔离优化,即:把这些模块依赖的注解库全部 自动 exclude 掉,在尝试使用注解时会因获取不到引用(如下图所示),第一时间发现到依赖被移除的问题。
  另一方面在编译出现错误时,对应 gradle 插件会自动解析找不到的符号,如果发现该符号是被隔离优化的注解,会提示将 library-api 替换成 library,尽可能降低优化方案对业务的负面影响。
  收益mac 全源码场景中有 58s 左右的加速收益。ci 机器上由于 cpu 核数更多 ,task 并发性能更好,只有 10s 左右的收益。transform 优化背景
  transform 作为 Android gradle plugin 提供给开发者的 API,用于在 apk 构建过程中,对 class 字节码,resources 等文件内容进行插桩修改,例如官方的 dex, proguard 等功能均由此 api 实现。
  对于今日头条这种大型工程来说,有很多诸如性能插桩、自动埋点插桩等相关需求,因此基于此 api 开发了大量 transform,用于实现特定功能,但是这些 transform 基本上都是不支持增量编译的,即使只改动了一行代码,这 些 transform 都会遍历所有 class 文件,解析字节码中的方法字段信息,关键是这类 transform 数量有十几个,将这些遍历耗时乘以 10 累加之后,增量编译耗时自然居高不下。
  根据分析,其中性能插桩等相关 transform 做的一些面向线上的插桩方案是完全可以只在 release 打包时打开的,因此可以直接在 debug 编译时禁用这些功能,用于提升开发期间的编译速度。而剩下的 9 个 transform 特征比较相似,可能在一些插桩细节上有所不同,它们大致的处理逻辑为:
  在各个模块中使用 apt processor 采集模块 xx 注解的 class 信息然后生成一个 xxCollect 类,该类的作用是采集好 apt 阶段解析到的本模块的类信息将所有模块采集到的信息进行汇总,利用 transform 阶段扫描出所有的 xxCollect 信息,通过 javaassit 或者 asm 往一个 xxCollectMgr 的某个 collectXxx 方法插桩注入之前收到的信息业务代码可通过 xxCollectMgr 的 collectXxx 方法获取到在各个模块动态生成的所有 xxCollect 信息。(例: 页面路由相关框架便是通过该逻辑采集到所有子模块的路由注册信息)
  由于这 9 个自定义 transform 的功能如此类似,便决定将这些 transform 合并成一个,这样同一个文件的读写操作只执行一次,并且可以做定制化的增量编译优化。虽然公司内有类似的 transform 合并优化方案 byteX ( 已在 github 开源),但是由于今日头条项目在 debug 阶段未开启该功能,且 ByteX 做了一些诸如 ClassGrapth 的构建,对类文件做两次遍历等操作,对于实现类信息采集和信息注入 这个功能来说,byteX 显得比较重 ,于是仍然针对类信息采集注入功能这个细分场景开发了一个收敛框架。
  收益
  该框架完成了内部 9 种类信息采集注入相关框架的收敛,编译耗时的绝对值加速了 25s 左右,且由于提供了统一的增量缓存功能,使得改动一行代码的耗时可以从 2 分 30s 降低到 35~40s ,实现了增量编译速度大的飞跃。最关键的是将所有自定义 transform 统一管控后,后续可以做统一定制化的需求,进一步优化编译速度。
  dexBuilder 优化背景
  在 Android debug 编译 过程中,最主要的耗时在 transform 上,而上文 介绍 今日头条项目自定义 transform 已经被高度优化过,剩下的 dexBuilder(将 class 转换成 dex ) ,dexMerge 等 task 耗时就成为了性能瓶颈,dexBuilder 全量编译耗时 60s 左右,增量编译耗时 22s 左右。
  根据 DexArchiveBuilderTransform 关键方法 launchProcessing 里面关键一行 isDirectoryBased,如果是目录类型的输入,会根据具体变动 class 文件做增量的 dex 编译 ,但是如果是 jar 输入类型,那只要 jar 里任何一个类变动,则整个 jar 所有类都需要重执行 dex,但是由于 gradle 的依赖特性,基本上只有 app 模块是目录类的输入,其他 library 都是 jar 输入类型,对于比较大的业务模块 ,如果该模块有几千个类,那每改动一次类,就会有几千类连带重新 执行 dex 编译。
  dexBuilder 增量效果量化
  在优化前为了得到真正的重新执行 dex 编译的数值,做到最佳优化,设计了一套 hook dex 编译流程的方法(该方法理论上可以 hook Android gradle plugin 任意类:大致就是 hook classLoader ,提前用 asm 修改 D8DexArchiveBuilder 中的 convert 方法
  通过对 D8DexArchiveBuilder 的 hook ,统计到优化前改动一行代码会连带着 24968 个类重新执行 dex 编译,增量效果非常差。
  优化方案
  既然 jar 输入相比于 目录输入来说增量编译效果非常差,那么可以想到 hook TransformInvocation 中的 input 方法,动态将 project 的 jar 类型输入(JarInput)映射为一个 目录输入(DirectoryInput),那么子模块修改对应代码时,只重新编译目录中被修改的 class 为 dex(而不是原来的整个 jar 内所有 class 重新执行 dex 编译),整体 dex 重新编译的数量将大幅度减少。实现具体方案如下:
  而 jar 转 目录的映射细节为:
  在第一次增量修改完成后,重新执行 dex 编译的类数量降低至 2152 个,但是其中仍然有很多迷惑的不该执行 dex 编译的类,预期是修改多少类,就重新执行 多少次 dex,因此继续对其中原因进行进一步的探索
  desugarGraph 异常
  由于 java8 的字节码有些指令在 Android 虚拟机中并不能得到支持,会在编译流程中,将这些指令进行脱糖,转换成已有的指令,而 d8 中 desugar 的流程合并到了 dexBuilder 中,为了避免某些类 desugar 后,依赖它的类的行为正确,需要把依赖它的所有类重新执行一遍 dex 编译。
  而 d8 会根据 DesugaringGraph 查找 desguar 有变动的类及其依赖的 jar 包,如图下面获得到的 addtionalPaths 是 desguar 类可能直接间接相关的 jar 包,即使这些 jar 包没有任何文件内容变更,其中所有类也得重新全部执行一次 dex 编译。
  DesugaringGraph 逻辑概述
  该类用来辅助获取依赖或间接依赖到变更文件的所有文件,而它的生成逻辑为: 全量或增量编译类的时候记录类型之间的依赖和被依赖关系,依赖关系的判断条件有
  
  父类直接实现的接口调用 dynamic 方法指令时的返回类型
  DesugaringGraph 不仅记录了类依赖的类,和依赖它的类,同时也记录了一个文件路径收录了哪些类
  如果文件路径是 class 文件,那路径就收录 1 个类如果路径是 jar 文件,收录这个 jar 下所有类。
  在增量编译时检查到变动的文件时,会检查这个文件路径收录的所有类, 然后递归查找所有直接/间接依赖它的类,并且找到这些依赖它的类后,会把这个类所在的 jar 包作为额外的处理类型(即使 jar 本身没有任何变动,里面所有的类仍然需要重新 dex 编译)
  顺着这个解析关系,找到了一个不正常的 jar 包 bdjson_api ,这个 jar 只有 3 个文件 (IBDJson,BDJsonCollector, BDJsonConstants) 。但是 BDJsonCollector 是一个 stub 类,每次执行 transform 会采集到其他类的信息然后往该类的方法中注入,因此该文件每次编译时都会变动。 这个类本身并没有多少直接依赖它的类,主要是 它所在的 jar 包还有个 IBDJson 接口。
  按照之前的 DesugaringGraph 依赖关系,所有 IBDJson 接口的实现类被判断为依赖它,然后这些实现类如果出现在某个 dynamic 方法中,又会被层层查找,查找完了之后,还得计算所有依赖类所在的 jar 包,jar 包中其他没有依赖它的类也会被重新 dex 编译, 在这个 case 的依赖查找中,连带重新执行 dex 编译的类数量并不多,大概为 4 个 jar 包共 2000 多个类重新执行了无意义的 dex 流程,但是如果是其他 sdk jar 包,则可能就会给 dexBuilder 增量带来毁灭性的打击。 上述问题的解决方法:
  把每次都会修改的 Stub 注入类和其他接口类分离,放在不同 jar 包。(需要改造业务,比较麻烦)动态把这个 sdk jar 输入转换成目录输入。(上文介绍的方法,也与上面 jar 转目录的初衷相符,只不过是漏掉了这个 case,但是却意外证明了:除了收录业务代码多的 project 的 jar 输入需要转换为目录外,sdk jar 同样有必要)
  修复后修改一行代码重新执行 dex 的数量为 10 ,其中 9 个是每次 transform 会修改的 stub 类,1 个是实际修改类。做到了真正的 改多少类,执行多次 dex 编译。
  收益
  assemebleDebug 的增量编译中从原来(上文 transform 优化后)的 35s~40s 是降低至均值 17s,在 fast build 中效果最明显(屏蔽了 apt),第二次增量编译能突破到 9s 实现秒级编译。
  而经过上面所有的优化后,耗时数据里耗时最严重的 dexBuilder 和 dex-merge 基本都降低在 1s 左右,自定义 transform 也是 1s 左右,其他 task 基本都是零点几秒。在不使用 hotfix 方案的情况下(由于今日头条项目使用了过多的自定义 transform 和插件方案,所以不好使用 instantrun 等 hostfix 方案),相关 task 的耗时基本达到了优化的极限。
  build-cache 优化踩坑
  Build-cache 是 gralde 提供的一个编译缓存方案,目的是在构建过程中当两个 task 的输入相同时,可以复用缓存内容,直接跳过 task 的执行拿到缓存好的执行结果。由于缓存结果既可以放在本地磁盘,也可以从远程获取,因此容易想到利用 ci 提前 构建缓存包,在其他 ci 机器和开发时利用缓存包获得加速效果。
  那么如何判断 task 可以直接获取 之前 task 的缓存内容作为输出呢?定义为可缓存的 task ,会定义一些缓存相关的属性,task 执行时通过文件指纹,缓存属性等一大堆属性计算出缓存 key ,用于查找是否命中缓存,计算维度有:
  但是原生的 build-cahce 在缓存命中率上惨不忍睹,公司内抖音团队基于 gradle4.x 的源码做过一些提高命中率的修改,不过今日头条用的 gradle 版本是 5.1 ,受抖音团队的启发,也对 gradle5.1 源码做了些定制化的修改,用于 dump 缓存 key 的计算流程,快速发现缓存问题。相比于抖音发现的一些影响缓存命中的问题,额外发现了一些诸如 mbox , kapt 元素遍历顺序不固定的问题,这里只挑一个典型的 apt 顺序不一致的问题进行介绍:
  apt 顺序不一致导致的缓存失效问题
  经过修改 gradle5.1 源码后对编译流程的信息采集,发现有的 task 缓存无法命中是因为 kapt 时,很多生成代码块逻辑是一样的,但是顺序不一样(如下图 demo :下面两个生成方法的逻辑一致,但是判断顺序不一致,这应该是在 processor 中通过 RoundEnviroment 获取到 注解元素 elemnts 顺序不一致导致的 )
  其内部的原因可能是文件遍历目录时获取子文件的顺序不一致,导致了子文件对应注解元素的顺序也不一致, 总之这个操作影响了生成文件内代码的顺序,也影响了该文件的 hash 计算结果,导致 build-cache 在计算 javac task 的 key 时会错乱导致缓存无法命中。
  解决方案
  但是注意到 AbstractProcessor 的核心方法 process 的两个参数都是接口,因此想到可以代理原来的 RoundEnvironment 接口,将其 getElementXx 的方法经过固定排序后返回,使得 apt 注解元素的顺序能够固定下来。
  由于篇幅影响,其他影响缓存命中相关的 case 略(主要是一些涉及到文件绝对路径, classPath 相关的问题)
  收益由于大多开发场景是引入多少模块就修改多少模块内容,很难获得命中缓存, 收益很小主要是全源码场景能稳定获得一些编译加速,基本上在 22~99s 左右。编译耗时防恶化管控
  在今日头条这种大型工程中,有很多业务部门参与开发,仅 Android 工程 开发人员就有几百人且人员变动频繁,因此内部任何一项优化工作必然是得搭配上一些管控措施的,否则一边优化一边恶化,空浪费人力。
  为此制定了一些管控方案,首先是 debug 阶段的 新增 transform 管控,设置为白名单形式,如果在开发阶段新增了 transform 直接终止编译流程,通过说明文档告知管控的规则,当然,管控的目的是尽可能减少一些不必要的不合理的编译问题,并不是与业务团队作对,如果某一个操作拖慢了整体的编译耗时,但是在 app 性能/稳定性方面有更大收益,且无法在编译期做更多的优化,仍然是允许添加的,只不过是得提前把这个问题暴露出来而已,能更快的找出更多的解决思路,比如引导使用 byteX 等 transform 收敛方案。
  另一方面的是合码流程方面的阻塞 : 今日头条 为了保障 app 的性能稳定性,在合码流程上设置了许多自动化的卡点: 如 包大小检测,插件依赖变更检查, so 变更检查,启动性能检测等,检测到对应问题(如包大小增加异常)会阻塞合码流程。为了管控编译速度 ,使其不至于恶化的太快,也加上了对应的 基于 task 级别的管控,当某一个 task 耗时异常波动,或者新增全新类型的 task 时,能够自动的发现问题,通过机器人将相关人员拉到 mr 讨论群中, 尽量在 合码完成前能发现问题。
  总结
  为了持续稳定的保持较快的编译速度,可能需要做到以下几点:
  项目需要有良好的工程结构,对业务模块进行适当粒度的拆分,做好 aar/源码的切换不仅能节省 javac/kotlinCompile 的耗时,也是其他优化方案的基础。工程配置要有区分度,不要所有子模块都用同样的配置,比如根本不会用到 kapt 功能的模块就别打开 kapt task 了。transform 若无必要,无须新加,或者按级别划分,如今日头条在 debug,devMode,release 不同的构建级别用到的 transform 数量是不一致的,尽量让绝大多数人能获得相对最快的编译速度体验,而不会被用不到的功能拖慢速度。一定要新增的 transform 可以先多用现有的增量方案,如 byteX 以及本文提供的类信息注入框架, 尽量把不要的文件 io 合并。很多高耗时的 官方 task(dexBuilder) 都是有直接或间接的办法提升其效率的,并且如果除了耗时之外有其他的衡量手段,如本文提到的重新 dex 率,通过量化数据可以快速的发现问题,进而找到耗时的罪魁祸首。与 app 性能优化等工作类似,编译速度优化既需要持续进行,也需要一定的问题发现手段,尽量避免问题出现很长一段时间后再去查找原因(那时候可能业务依赖程度会非常高,难以修改)。更多分享
  背景介绍
  Android 项目一般使用 gradle 作为构建打包工具,而其执行速度慢也一直为人所诟病,对于今日头条 Android 项目这种千万行级别的大型工程来说,全量编译一次的时间可能高达六七分钟,在某些需要快速验证功能的场景,改动一行代码的增量编译甚至也需要等两三分钟,这般龟速严重影响了开发体验与效率,因此针对 gradle 编译构建耗时进行优化显得尤为重要。
  在今日头条 Android 项目上,编译构建速度的优化和恶化一直在交替执行,18 年时由于模块化拆分等影响,clean build 一次的耗时达到了顶峰 7 分 30s 左右,相关同学通过模块 aar 化,maven 代理加速,以及增量 java 编译等优化手段,将 clean build 耗时优化到 4 分钟,增量编译优化到 20~30s 。但是后面随着 kotlin 的大规模使用,自定义 transform 以及 apt 库泛滥,又将增量编译速度拖慢到 2 分 30s ,且有进一步恶化的趋势。为了优化现有不合理的编译耗时,防止进一步的恶化,最近的 5,6 双月又针对编译耗时做了一些列专项优化(kapt,transform,dexBuilder,build-cache 等) 并添加了相关的防恶化管控方案。 从 4.27 截止到 6.29 ,整体的优化效果如下:
  历史优化方案
  由于 18 年左右客户端基础技术相关同学已经对今日头条 Android 工程做了许多 gradle 相关的优化,且这些优化是近期优化的基础,因此先挑选几个具有代表性的方案进行介绍,作为下文的背景同步。
  maven 代理优化 sync 时间背景
  gradle 工程往往会在 repositories 中添加一些列的 maven 仓库地址,作为组件依赖获取的查找路径,早期在今日头条的项目中配置了十几个 maven 的地址,但是依赖获取是按照 maven 仓库配置的顺序依次查找的,如果某个组件存在于最后一个仓库中,那前面的十几个仓库得依次发起网络请求查找,并在网络请求返回失败后才查找下一个,如果项目中大多组件都在较后仓库的位置,累加起来的查找时间就会很长。
  优化方案使用公司内部搭建的 maven 私服,在私服上设置代理仓库,为其他仓库配置代理(例如 google、jcenter、mavenCentral 等仓库),代理仓库创建好后,在 Negative Cache 配置项中关闭其 cache 开关:如果查找时没有找到某版本依赖库时会缓存失败结果,一段时间内不会重新去 maven 仓库查找对应依赖库,即使 maven 仓库中已经有该版本的依赖库,查找时仍然返回失败的结果。建立仓库组,将所有仓库归放到一个统一的仓库组里,依赖查找时只需要去这个组仓库中查找,这样能大大降低多次发起网络请求遍历仓库的耗时。模块 aar 化背景
  今日头条项目进行了多次组件化和模块化的重构,分拆出了 200 多个子模块,这些子模块如果全都 include 进项目,那么在 clean build 的时候,所有子模块的代码需要重新编译,而对于大多数开发人员来说,基本上只关心自己负责的少数几个模块,根本不需要改动其他模块的代码,这些其他 project 的配置和编译时间就成为了不必要的代价。
  优化方案
  对于以上子模块过多的解决方案是:将所有模块发布成 aar ,在项目中全部默认通过 maven 依赖这些编译好的组件,而在需要修改某个模块时,通过配置项将该模块的依赖形式改为源码依赖,做到在编译时只编译改动的模块。但是这样做会导致模块渐渐的又全部变为源码依赖的形式,除非规定每次修改完对应模块后,开发人员自己手动将模块发布成 aar ,并改回依赖形式。这种严重依赖开发人员自觉,并且在模块数量多依赖关系复杂的时候会显得异常繁琐,因此为了开发阶段的便利,设计了一整套更完整细致的方案:
  开发时,从主分支拉取的代码一定是全 aar 依赖的,除了 app 模块没有任何子模块是源码引入。需要修改对应模块时,通过修改 local.properties 里的 INCLUDES 参数指定源码引入的模块。开发完成后,push 代码至远端,触发代码合并流程后,在 ci 预编译过程与合码目标分支对比,检测修改的模块,将这些模块按照依赖关系依次发布成 aar ,并在工程中修改依赖为新版本的 aar, 这一步保证了每次代码合入完成后,主分支上的依赖都是全 aar 依赖的。收益
  通过上述改造,将源码模块切换成 aar 依赖后,clean build 耗时从 7,8 分钟降低至 4,5 分钟,收益接近 50%,效果显著。
  增量 java/kotlin 编译背景
  在非 clean build 的情况下,更改 java/kotlin 代码虽然会做增量编译,但是为了绝对的正确性,gradle 会根据一些列依赖关系计算,选择需要重新编译的代码,这个计算粒度比较粗,稍微改动一个类的代码,就可能导致大量代码重新执行 apt, 编译等流程。
  由于 gradle 作为通用框架,其设计的基本原则是绝对的正确,因此很容易导致增量编译失效,在实际开发中,为了快速编译展示结果,可以在编译正确性和编译速度上做一个折中的方案:
  禁用原创的 javac/kotlinCompile 等 task, 自行实现代码增量修改判断,只编译修改的代码。动态禁用 kapt 相关的 task, 降低 kapt,kaptGenerateStub 等 task 的耗时。
  以上方案(下文全部简称为 fastbuild) 虽然在涉及常量修改,方法签名变更方面 存在一定的问题(常量内联等),但是能换来增量编译从 2 分多降低至 20~30s,极大的提升编译效率,且有问题的场景并不常见,因此整体上该方案是利大于弊的。
  编译耗时恶化
  通过上文介绍的几个优化方案和其他优化方式,在 18 年时,今日头条 Android 项目的整体编译速度(clean build 4~5min, fast 增量编译 20~30s)在同量级的大型工程中来说是比较快的 ,然而后期随着业务发展的需求,编译脚本添加了很多新的逻辑:
  kotlin 大规模使用,kapt 新增了很多注解处理逻辑。引入对 java8 语法的支持 , java8 语法的 desugar(脱糖)操作增加了编译耗时。大量的字节码插桩需求,添加了许多 transform ,大幅度提升了增量编译耗时。
  这些逻辑的引入,使得增量编译耗时恶化到 2 分 30s,即使采用 fastbuild,改动一行代码编译也需要 1 分 30s 之多,开发体验非常差。而下文将着重描述最近一段时间对上述问题的优化过程。
  近期优化方案app 壳模块 kapt 优化背景
  今日头条工程经过多次模块化,组件化重构后, app 模块(NewsArticle)的大部分代码都已经迁移到子模块(上文已经介绍过子模块可以采用 aar 化用于编译速度优化,app 模块只剩下一个壳而已。
  但是从 build profile 数据(执行 gradle 命令时添加 --profile 参数会在编译完成后输出相关 task 耗时的统计文件) 中发现到一个异常 case:明明只有 2 个类的 app 模块 kapt(annotationProcessor 注解处理) 相关耗时近 1 分钟。
  通过进一步观察,虽然 app 模块拆分后只有 2 个简单类的代码,但是却用了 6 种 kapt 库, 且实际生效的只是其中 ServiceImpl 一个注解 (内部 ServiceManager 框架,用于指示生产 Proxy 类,对模块之间代码调用进行解耦)。如此一顿操作猛如虎,每次编译却只生成固定的两个 Proxy 类,与 53s 的高耗时相比,投入产出比极低。
  优化方案
  把固定生成的 Proxy 类从 generate 目录移动到 src 目录,然后禁止 app 模块中 kapt 相关 task ,并添加相关管控方案(如下图: 检测到不合理情况后立刻抛出异常),防止其他人添加新增的 kapt 库。
  收益在 mac clean build 中平均有 40s 收益在 ci clean build 中平均有 20s 收益kapt 隔离优化背景
  通过上文介绍在 app 模块发现的异常的 kapt case, 进而发现在工程中为了方便,定义了一个 library.gradle ,该文件的作用是定义项目中通用的 Android dsl 配置和共有的基础依赖,因此项目中所有子模块均 apply 了这个文件,但是这个文件陆陆续续的被不同的业务添加新的 kapt 注解处理库,在全源码编译时,所有子模块都得执行 library 模块中定义的全部 6 个 kapt ,即使该模块没有任何注解相关的处理也不例外。
  而上述情况的问题在于:相比纯 java 模块的注解处理,kotlin 代码需要先通过 kaptGenerateStub 将 kt 文件转换成为 java ,让 apt 处理程序能够统一的面向 java 做注解扫描和处理。但是上面讲到其实有很多模块是根本不会有任何实际 kapt 处理过程的,却白白的做了一次 kt 转 java 的操作,源码引入的模块越多,这种无意义的耗时累加起来也非常可观。
  为了能够弄清楚到底有哪些子模块真正用到了 kapt ,哪些没用到可以禁用掉 kapt 相关 task ,对项目中所有子模块进行了一遍扫描:
  获取 kapt configuration 的所有依赖,可以得到 kapt 依赖库的 jar 包,利用 asm 获取所有 annotation.遍历所有 subproject 的 sourceset 下所有 .java,.kt 源文件,解析 import 信息,看是否有步骤 1 中解析的 annotationpackage task 完成后遍历 所有 subproject 所有 generate/apt ,generate/kapt 目录下生成的 java 文件
  使用上述方案,通过全源码打包最终扫描出来大概是 70+模块不会进行任何 kapt 的实际输出,且将这些不会进行输出的 kapt,kaptGenerateStub 的 task 耗时累加起来较高 217s (由于 task 并发执行所以实际总时长可能要少一些).
  
  获取到不实际生成 kapt 内容的模块后,开始对这些模块进行细粒度的拆分,让它们从 apply library.gradle 改为没有 kapt 相关的 library-api.gradle ,该文件除了禁用 kapt 外,与 library 逻辑一致。
  但是这样做算是在背后偷偷做了些更改,很可能后续新来的同学不知道有这种优化手段,可能新增了注解后却没有任何输出且找不到原因,而优化效果最好是尽量少给业务同学带来困扰。为了避免这种情况,便对这些 library-api 模块依赖的注解做隔离优化,即:把这些模块依赖的注解库全部 自动 exclude 掉,在尝试使用注解时会因获取不到引用(如下图所示),第一时间发现到依赖被移除的问题。
  另一方面在编译出现错误时,对应 gradle 插件会自动解析找不到的符号,如果发现该符号是被隔离优化的注解,会提示将 library-api 替换成 library,尽可能降低优化方案对业务的负面影响。
  收益mac 全源码场景中有 58s 左右的加速收益。ci 机器上由于 cpu 核数更多 ,task 并发性能更好,只有 10s 左右的收益。transform 优化背景
  transform 作为 Android gradle plugin 提供给开发者的 API,用于在 apk 构建过程中,对 class 字节码,resources 等文件内容进行插桩修改,例如官方的 dex, proguard 等功能均由此 api 实现。
  对于今日头条这种大型工程来说,有很多诸如性能插桩、自动埋点插桩等相关需求,因此基于此 api 开发了大量 transform,用于实现特定功能,但是这些 transform 基本上都是不支持增量编译的,即使只改动了一行代码,这 些 transform 都会遍历所有 class 文件,解析字节码中的方法字段信息,关键是这类 transform 数量有十几个,将这些遍历耗时乘以 10 累加之后,增量编译耗时自然居高不下。
  根据分析,其中性能插桩等相关 transform 做的一些面向线上的插桩方案是完全可以只在 release 打包时打开的,因此可以直接在 debug 编译时禁用这些功能,用于提升开发期间的编译速度。而剩下的 9 个 transform 特征比较相似,可能在一些插桩细节上有所不同,它们大致的处理逻辑为:
  在各个模块中使用 apt processor 采集模块 xx 注解的 class 信息然后生成一个 xxCollect 类,该类的作用是采集好 apt 阶段解析到的本模块的类信息将所有模块采集到的信息进行汇总,利用 transform 阶段扫描出所有的 xxCollect 信息,通过 javaassit 或者 asm 往一个 xxCollectMgr 的某个 collectXxx 方法插桩注入之前收到的信息业务代码可通过 xxCollectMgr 的 collectXxx 方法获取到在各个模块动态生成的所有 xxCollect 信息。(例: 页面路由相关框架便是通过该逻辑采集到所有子模块的路由注册信息)
  由于这 9 个自定义 transform 的功能如此类似,便决定将这些 transform 合并成一个,这样同一个文件的读写操作只执行一次,并且可以做定制化的增量编译优化。虽然公司内有类似的 transform 合并优化方案 byteX ( 已在 github 开源),但是由于今日头条项目在 debug 阶段未开启该功能,且 ByteX 做了一些诸如 ClassGrapth 的构建,对类文件做两次遍历等操作,对于实现类信息采集和信息注入 这个功能来说,byteX 显得比较重 ,于是仍然针对类信息采集注入功能这个细分场景开发了一个收敛框架。
  收益
  该框架完成了内部 9 种类信息采集注入相关框架的收敛,编译耗时的绝对值加速了 25s 左右,且由于提供了统一的增量缓存功能,使得改动一行代码的耗时可以从 2 分 30s 降低到 35~40s ,实现了增量编译速度大的飞跃。最关键的是将所有自定义 transform 统一管控后,后续可以做统一定制化的需求,进一步优化编译速度。
  dexBuilder 优化背景
  在 Android debug 编译 过程中,最主要的耗时在 transform 上,而上文 介绍 今日头条项目自定义 transform 已经被高度优化过,剩下的 dexBuilder(将 class 转换成 dex ) ,dexMerge 等 task 耗时就成为了性能瓶颈,dexBuilder 全量编译耗时 60s 左右,增量编译耗时 22s 左右。
  根据 DexArchiveBuilderTransform 关键方法 launchProcessing 里面关键一行 isDirectoryBased,如果是目录类型的输入,会根据具体变动 class 文件做增量的 dex 编译 ,但是如果是 jar 输入类型,那只要 jar 里任何一个类变动,则整个 jar 所有类都需要重执行 dex,但是由于 gradle 的依赖特性,基本上只有 app 模块是目录类的输入,其他 library 都是 jar 输入类型,对于比较大的业务模块 ,如果该模块有几千个类,那每改动一次类,就会有几千类连带重新 执行 dex 编译。
  dexBuilder 增量效果量化
  在优化前为了得到真正的重新执行 dex 编译的数值,做到最佳优化,设计了一套 hook dex 编译流程的方法(该方法理论上可以 hook Android gradle plugin 任意类:大致就是 hook classLoader ,提前用 asm 修改 D8DexArchiveBuilder 中的 convert 方法
  通过对 D8DexArchiveBuilder 的 hook ,统计到优化前改动一行代码会连带着 24968 个类重新执行 dex 编译,增量效果非常差。
  优化方案
  既然 jar 输入相比于 目录输入来说增量编译效果非常差,那么可以想到 hook TransformInvocation 中的 input 方法,动态将 project 的 jar 类型输入(JarInput)映射为一个 目录输入(DirectoryInput),那么子模块修改对应代码时,只重新编译目录中被修改的 class 为 dex(而不是原来的整个 jar 内所有 class 重新执行 dex 编译),整体 dex 重新编译的数量将大幅度减少。实现具体方案如下:
  而 jar 转 目录的映射细节为:
  在第一次增量修改完成后,重新执行 dex 编译的类数量降低至 2152 个,但是其中仍然有很多迷惑的不该执行 dex 编译的类,预期是修改多少类,就重新执行 多少次 dex,因此继续对其中原因进行进一步的探索
  desugarGraph 异常
  由于 java8 的字节码有些指令在 Android 虚拟机中并不能得到支持,会在编译流程中,将这些指令进行脱糖,转换成已有的指令,而 d8 中 desugar 的流程合并到了 dexBuilder 中,为了避免某些类 desugar 后,依赖它的类的行为正确,需要把依赖它的所有类重新执行一遍 dex 编译。
  而 d8 会根据 DesugaringGraph 查找 desguar 有变动的类及其依赖的 jar 包,如图下面获得到的 addtionalPaths 是 desguar 类可能直接间接相关的 jar 包,即使这些 jar 包没有任何文件内容变更,其中所有类也得重新全部执行一次 dex 编译。
  DesugaringGraph 逻辑概述
  该类用来辅助获取依赖或间接依赖到变更文件的所有文件,而它的生成逻辑为: 全量或增量编译类的时候记录类型之间的依赖和被依赖关系,依赖关系的判断条件有
  父类直接实现的接口调用 dynamic 方法指令时的返回类型
  DesugaringGraph 不仅记录了类依赖的类,和依赖它的类,同时也记录了一个文件路径收录了哪些类
  如果文件路径是 class 文件,那路径就收录 1 个类如果路径是 jar 文件,收录这个 jar 下所有类。
  在增量编译时检查到变动的文件时,会检查这个文件路径收录的所有类, 然后递归查找所有直接/间接依赖它的类,并且找到这些依赖它的类后,会把这个类所在的 jar 包作为额外的处理类型(即使 jar 本身没有任何变动,里面所有的类仍然需要重新 dex 编译)
  顺着这个解析关系,找到了一个不正常的 jar 包 bdjson_api ,这个 jar 只有 3 个文件 (IBDJson,BDJsonCollector, BDJsonConstants) 。但是 BDJsonCollector 是一个 stub 类,每次执行 transform 会采集到其他类的信息然后往该类的方法中注入,因此该文件每次编译时都会变动。 这个类本身并没有多少直接依赖它的类,主要是 它所在的 jar 包还有个 IBDJson 接口。
  按照之前的 DesugaringGraph 依赖关系,所有 IBDJson 接口的实现类被判断为依赖它,然后这些实现类如果出现在某个 dynamic 方法中,又会被层层查找,查找完了之后,还得计算所有依赖类所在的 jar 包,jar 包中其他没有依赖它的类也会被重新 dex 编译, 在这个 case 的依赖查找中,连带重新执行 dex 编译的类数量并不多,大概为 4 个 jar 包共 2000 多个类重新执行了无意义的 dex 流程,但是如果是其他 sdk jar 包,则可能就会给 dexBuilder 增量带来毁灭性的打击。 上述问题的解决方法:
  把每次都会修改的 Stub 注入类和其他接口类分离,放在不同 jar 包。(需要改造业务,比较麻烦)动态把这个 sdk jar 输入转换成目录输入。(上文介绍的方法,也与上面 jar 转目录的初衷相符,只不过是漏掉了这个 case,但是却意外证明了:除了收录业务代码多的 project 的 jar 输入需要转换为目录外,sdk jar 同样有必要)
  修复后修改一行代码重新执行 dex 的数量为 10 ,其中 9 个是每次 transform 会修改的 stub 类,1 个是实际修改类。做到了真正的 改多少类,执行多次 dex 编译。
  收益
  assemebleDebug 的增量编译中从原来(上文 transform 优化后)的 35s~40s 是降低至均值 17s,在 fast build 中效果最明显(屏蔽了 apt),第二次增量编译能突破到 9s 实现秒级编译。
  而经过上面所有的优化后,耗时数据里耗时最严重的 dexBuilder 和 dex-merge 基本都降低在 1s 左右,自定义 transform 也是 1s 左右,其他 task 基本都是零点几秒。在不使用 hotfix 方案的情况下(由于今日头条项目使用了过多的自定义 transform 和插件方案,所以不好使用 instantrun 等 hostfix 方案),相关 task 的耗时基本达到了优化的极限。
  build-cache 优化踩坑
  Build-cache 是 gralde 提供的一个编译缓存方案,目的是在构建过程中当两个 task 的输入相同时,可以复用缓存内容,直接跳过 task 的执行拿到缓存好的执行结果。由于缓存结果既可以放在本地磁盘,也可以从远程获取,因此容易想到利用 ci 提前 构建缓存包,在其他 ci 机器和开发时利用缓存包获得加速效果。
  那么如何判断 task 可以直接获取 之前 task 的缓存内容作为输出呢?定义为可缓存的 task ,会定义一些缓存相关的属性,task 执行时通过文件指纹,缓存属性等一大堆属性计算出缓存 key ,用于查找是否命中缓存,计算维度有:
  但是原生的 build-cahce 在缓存命中率上惨不忍睹,公司内抖音团队基于 gradle4.x 的源码做过一些提高命中率的修改,不过今日头条用的 gradle 版本是 5.1 ,受抖音团队的启发,也对 gradle5.1 源码做了些定制化的修改,用于 dump 缓存 key 的计算流程,快速发现缓存问题。相比于抖音发现的一些影响缓存命中的问题,额外发现了一些诸如 mbox , kapt 元素遍历顺序不固定的问题,这里只挑一个典型的 apt 顺序不一致的问题进行介绍:
  apt 顺序不一致导致的缓存失效问题
  经过修改 gradle5.1 源码后对编译流程的信息采集,发现有的 task 缓存无法命中是因为 kapt 时,很多生成代码块逻辑是一样的,但是顺序不一样(如下图 demo :下面两个生成方法的逻辑一致,但是判断顺序不一致,这应该是在 processor 中通过 RoundEnviroment 获取到 注解元素 elemnts 顺序不一致导致的 )
  其内部的原因可能是文件遍历目录时获取子文件的顺序不一致,导致了子文件对应注解元素的顺序也不一致, 总之这个操作影响了生成文件内代码的顺序,也影响了该文件的 hash 计算结果,导致 build-cache 在计算 javac task 的 key 时会错乱导致缓存无法命中。
  解决方案
  但是注意到 AbstractProcessor 的核心方法 process 的两个参数都是接口,因此想到可以代理原来的 RoundEnvironment 接口,将其 getElementXx 的方法经过固定排序后返回,使得 apt 注解元素的顺序能够固定下来。
  由于篇幅影响,其他影响缓存命中相关的 case 略(主要是一些涉及到文件绝对路径, classPath 相关的问题)
  收益由于大多开发场景是引入多少模块就修改多少模块内容,很难获得命中缓存, 收益很小主要是全源码场景能稳定获得一些编译加速,基本上在 22~99s 左右。编译耗时防恶化管控
  在今日头条这种大型工程中,有很多业务部门参与开发,仅 Android 工程 开发人员就有几百人且人员变动频繁,因此内部任何一项优化工作必然是得搭配上一些管控措施的,否则一边优化一边恶化,空浪费人力。
  为此制定了一些管控方案,首先是 debug 阶段的 新增 transform 管控,设置为白名单形式,如果在开发阶段新增了 transform 直接终止编译流程,通过说明文档告知管控的规则,当然,管控的目的是尽可能减少一些不必要的不合理的编译问题,并不是与业务团队作对,如果某一个操作拖慢了整体的编译耗时,但是在 app 性能/稳定性方面有更大收益,且无法在编译期做更多的优化,仍然是允许添加的,只不过是得提前把这个问题暴露出来而已,能更快的找出更多的解决思路,比如引导使用 byteX 等 transform 收敛方案。
  另一方面的是合码流程方面的阻塞 : 今日头条 为了保障 app 的性能稳定性,在合码流程上设置了许多自动化的卡点: 如 包大小检测,插件依赖变更检查, so 变更检查,启动性能检测等,检测到对应问题(如包大小增加异常)会阻塞合码流程。为了管控编译速度 ,使其不至于恶化的太快,也加上了对应的 基于 task 级别的管控,当某一个 task 耗时异常波动,或者新增全新类型的 task 时,能够自动的发现问题,通过机器人将相关人员拉到 mr 讨论群中, 尽量在 合码完成前能发现问题。
  总结
  为了持续稳定的保持较快的编译速度,可能需要做到以下几点:
  项目需要有良好的工程结构,对业务模块进行适当粒度的拆分,做好 aar/源码的切换不仅能节省 javac/kotlinCompile 的耗时,也是其他优化方案的基础。工程配置要有区分度,不要所有子模块都用同样的配置,比如根本不会用到 kapt 功能的模块就别打开 kapt task 了。transform 若无必要,无须新加,或者按级别划分,如今日头条在 debug,devMode,release 不同的构建级别用到的 transform 数量是不一致的,尽量让绝大多数人能获得相对最快的编译速度体验,而不会被用不到的功能拖慢速度。一定要新增的 transform 可以先多用现有的增量方案,如 byteX 以及本文提供的类信息注入框架, 尽量把不要的文件 io 合并。很多高耗时的 官方 task(dexBuilder) 都是有直接或间接的办法提升其效率的,并且如果除了耗时之外有其他的衡量手段,如本文提到的重新 dex 率,通过量化数据可以快速的发现问题,进而找到耗时的罪魁祸首。与 app 性能优化等工作类似,编译速度优化既需要持续进行,也需要一定的问题发现手段,尽量避免问题出现很长一段时间后再去查找原因(那时候可能业务依赖程度会非常高,难以修改)。更多分享
  字节跳动分布式表格存储系统的演进
  字节跳动自研强一致在线 KV&表格存储实践 - 上篇
  字节跳动自研强一致在线 KV &表格存储实践 - 下篇
  字节跳动在 Go 网络库上的实践
  字节跳动-GIP-Android 平台架构团队
  字节跳动-GIP-Android 平台架构团队以服务今日头条产品为主,同时协助公司其他产品,在产品性能、稳定性等用户体验,研发流程,编译优化,架构方向上不断优化和深入探索,以满足产品快速迭代的同时,保持较高的用户体验。我们长期招聘 Android 平台架构方向的同学,在北京,深圳均有相关岗位,想深入交流或者需要部门内推、投递简历的可以联系邮箱 (标题注明 : 字节跳动-GIP 平台 android 部门直推)
  欢迎关注字节跳动技术团队

汇总:文章采集软件app推荐文章大全及推荐软件大全(二)

采集交流优采云 发表了文章 • 0 个评论 • 65 次浏览 • 2022-11-17 02:16 • 来自相关话题

  汇总:文章采集软件app推荐文章大全及推荐软件大全(二)
  文章采集软件app推荐文章采集软件大全
  1、输入关键词搜索
  2、百度搜索
  3、搜狗搜索
  4、360搜索
  5、淘宝网
  6、58同城
  7、咸鱼
  8、搜狗微信搜索
  9、百度新闻搜索1
  0、搜狗搜索1
  1、当当1
  2、今日头条1
  3、yahootrends1
  4、百度经验1
  5、qq网站1
  6、天涯社区1
  7、qq邮箱1
  8、123061
  9、b站动态2
  0、支付宝2
  1、豆瓣2
  2、陌陌2
  3、陌陌资讯专区2
  4、微博搜索2
  5、优酷2
  6、知乎2
  7、果壳2
  9、百度新闻3
  0、智慧社区3
  1、直播大咖3
  2、大众点评3
  3、人人网3
  4、kiki3
  6、douban3
  7、百度经验3
  
  8、淘宝网3
  9、天涯4
  0、地图4
  1、360云搜4
  1、百度百科4
  2、360网盘4
  3、360浏览器4
  4、百度云资源4
  5、有道词典4
  6、欧朋词典4
  7、云搜客4
  8、迅雷云播4
  9、中国移动电信数据网盘5
  0、微云5
  1、汽车之家5
  2、友盟5
  3、1155
  4、天猫5
  5、一搜5
  6、百度翻译5
  7、雅虎搜索5
  8、google翻译5
  9、ghost翻译6
  0、foxmail6
  1、qq翻译6
  2、腾讯翻译君6
  3、163搜索6
  4、沃百科6
  5、eset安全卫士6
  6、乐网6
  7、迅雷查看器6
  8、dzgi.yy6
  9、好搜7
  0、即刻7
  1、虾米7
  2、百度驱动器7
  3、英文搜索7
  
  4、ed2k录音机7
  5、音网7
  6、站长之家7
  7、小黄油7
  8、网络电台7
  9、轻听7
  9、uc8
  1、搜狗搜索8
  2、qq影音8
  3、socialboy8
  4、qq音乐8
  5、hao1238
  5、电脑管家8
  6、腾讯家庭8
  6、31679
  0、搜狗图片9
  1、adsafe9
  2、必应9
  3、牛津高阶9
  4、快图9
  5、chrome9
  5、reddit9
  6、5289
  8、kelvinz-san9
  8、常用语9
  8、鲁大师9
  9、正则表达式9
  9、搜狗百科10
  0、黑鸟101
  0、芒果tv102
  0、qq客户端102
  1、百度云视频102
  2、某讯视频102
  3、站长之家102
  4、yy视频102
  5、搜狐视频102
  6、5689202
  2、保卫萝卜2022 查看全部

  汇总:文章采集软件app推荐文章大全及推荐软件大全(二)
  文章采集软件app推荐文章采集软件大全
  1、输入关键词搜索
  2、百度搜索
  3、搜狗搜索
  4、360搜索
  5、淘宝网
  6、58同城
  7、咸鱼
  8、搜狗微信搜索
  9、百度新闻搜索1
  0、搜狗搜索1
  1、当当1
  2、今日头条1
  3、yahootrends1
  4、百度经验1
  5、qq网站1
  6、天涯社区1
  7、qq邮箱1
  8、123061
  9、b站动态2
  0、支付宝2
  1、豆瓣2
  2、陌陌2
  3、陌陌资讯专区2
  4、微博搜索2
  5、优酷2
  6、知乎2
  7、果壳2
  9、百度新闻3
  0、智慧社区3
  1、直播大咖3
  2、大众点评3
  3、人人网3
  4、kiki3
  6、douban3
  7、百度经验3
  
  8、淘宝网3
  9、天涯4
  0、地图4
  1、360云搜4
  1、百度百科4
  2、360网盘4
  3、360浏览器4
  4、百度云资源4
  5、有道词典4
  6、欧朋词典4
  7、云搜客4
  8、迅雷云播4
  9、中国移动电信数据网盘5
  0、微云5
  1、汽车之家5
  2、友盟5
  3、1155
  4、天猫5
  5、一搜5
  6、百度翻译5
  7、雅虎搜索5
  8、google翻译5
  9、ghost翻译6
  0、foxmail6
  1、qq翻译6
  2、腾讯翻译君6
  3、163搜索6
  4、沃百科6
  5、eset安全卫士6
  6、乐网6
  7、迅雷查看器6
  8、dzgi.yy6
  9、好搜7
  0、即刻7
  1、虾米7
  2、百度驱动器7
  3、英文搜索7
  
  4、ed2k录音机7
  5、音网7
  6、站长之家7
  7、小黄油7
  8、网络电台7
  9、轻听7
  9、uc8
  1、搜狗搜索8
  2、qq影音8
  3、socialboy8
  4、qq音乐8
  5、hao1238
  5、电脑管家8
  6、腾讯家庭8
  6、31679
  0、搜狗图片9
  1、adsafe9
  2、必应9
  3、牛津高阶9
  4、快图9
  5、chrome9
  5、reddit9
  6、5289
  8、kelvinz-san9
  8、常用语9
  8、鲁大师9
  9、正则表达式9
  9、搜狗百科10
  0、黑鸟101
  0、芒果tv102
  0、qq客户端102
  1、百度云视频102
  2、某讯视频102
  3、站长之家102
  4、yy视频102
  5、搜狐视频102
  6、5689202
  2、保卫萝卜2022

完美:阿里巴巴星历做一个比手淘热点还准的节日表

采集交流优采云 发表了文章 • 0 个评论 • 34 次浏览 • 2022-11-16 10:45 • 来自相关话题

  完美:阿里巴巴星历做一个比手淘热点还准的节日表
  文章采集软件app,从这些简单的app任务中,可以找到我们需要的数据采集软件。如果大家想找专业的datagrid采集工具,可以登录我们datagrid官网,下载。
  /
  
  请问你用哪款爬虫软件呢?
  1,你可以用百度搜下你的目标网站,里面都有用python做的爬虫网站和一些教程2,你可以用虫部落,虫部落里面有很多爬虫集,可以自己找下,下载使用。比如说我曾经用python自己搭建过一个常用功能网站的数据抓取,一个小时内就全部爬下来了。
  在dw上爬数据
  
  使用python爬虫是有方向的,如果你想爬阿里等电商,肯定会学到爬手淘的爬虫。如果你想爬阿里的爬虫,那么你可以用python爬虫在python和ruby(python都可以快速开发爬虫)之间来回跳跃。
  手淘今日热点|阿里巴巴星历做一个比手淘热点还准的节日表做一个比手淘更大的抓取页面利用电商信息和python实现爬取淘宝网交易数据(分页数据)
  豆瓣电影豆瓣电影一大堆电影不是有条件限制么?比如只能在电影名中看到制作者的信息,或者你觉得它应该在哪里,
  你可以考虑django,电商的用户有一个巨大的痛点:买东西之前首先得看看有没有什么电商的banner广告,有广告则不能下单。怎么办呢?搞一个爬虫抓呀,抓到了还可以做成一个机器人来帮你看广告是否可信。阿里云电商数据库也可以接入django,可以做一个简单的电商投票,选出一个最大的因为最值得信赖的价格最便宜的产品进行促销。如果想深入了解django,请看我的专栏文章:都老师的专栏-django高级教程。 查看全部

  完美:阿里巴巴星历做一个比手淘热点还准的节日表
  文章采集软件app,从这些简单的app任务中,可以找到我们需要的数据采集软件。如果大家想找专业的datagrid采集工具,可以登录我们datagrid官网,下载。
  /
  
  请问你用哪款爬虫软件呢?
  1,你可以用百度搜下你的目标网站,里面都有用python做的爬虫网站和一些教程2,你可以用虫部落,虫部落里面有很多爬虫集,可以自己找下,下载使用。比如说我曾经用python自己搭建过一个常用功能网站的数据抓取,一个小时内就全部爬下来了。
  在dw上爬数据
  
  使用python爬虫是有方向的,如果你想爬阿里等电商,肯定会学到爬手淘的爬虫。如果你想爬阿里的爬虫,那么你可以用python爬虫在python和ruby(python都可以快速开发爬虫)之间来回跳跃。
  手淘今日热点|阿里巴巴星历做一个比手淘热点还准的节日表做一个比手淘更大的抓取页面利用电商信息和python实现爬取淘宝网交易数据(分页数据)
  豆瓣电影豆瓣电影一大堆电影不是有条件限制么?比如只能在电影名中看到制作者的信息,或者你觉得它应该在哪里,
  你可以考虑django,电商的用户有一个巨大的痛点:买东西之前首先得看看有没有什么电商的banner广告,有广告则不能下单。怎么办呢?搞一个爬虫抓呀,抓到了还可以做成一个机器人来帮你看广告是否可信。阿里云电商数据库也可以接入django,可以做一个简单的电商投票,选出一个最大的因为最值得信赖的价格最便宜的产品进行促销。如果想深入了解django,请看我的专栏文章:都老师的专栏-django高级教程。

最新版本:墨多app软件下载

采集交流优采云 发表了文章 • 0 个评论 • 34 次浏览 • 2022-11-13 16:48 • 来自相关话题

  最新版本:墨多app软件下载
  魔多app是一款专注于销售行业的APP。这个APP可以帮助我们的销售人员减少工作量,让每个销售人员足不出户就能掌握很多信息。有很多小工具和文章是的帮助销售人员更好地工作,你还在等什么,现在就下载玩吧。
  Modo应用简介
  1. 搜索
  通过首页顶部的搜索栏点击进入搜索界面,在输入框中搜索文章、视频或用户。文章进入文章详情,视频进入视频详情,用户进入用户个人中心。
  2、客户来源
  客户来源分为全景客户来源、分类客户来源和范围客户来源。地图包括高德比地图、百度地图、腾讯地到三河,输入或选择官步子和产业点集鱼北采集,就会搜索到对应的商户。
  3.客源管理
  点击首页或客源采集页面的客源管理进入该页面,选择客源来源,选择关键词即可查看。床部可以进行导出到通讯、导出到表格、群发、清空数据、清除通讯等操作,也可以根据客源背后的按钮独立操作。
  四、语言库
  可迪可以在发短信界面点击选择模板和我的壳面,点击文字进入这个壳面类别。您可以使用右侧的加号进入该语言的添加页面。可以添加白色定义。点击复制词类下的词,长按编辑,可以自定义添加。
  五、全网源码
  
  在首页,点击全网进入该页面。点击进入wab链接。
  6.获客视频
  您可以点击主页上的视频进入此页面。点击进入视频详情,点击搜索进入搜索页面。点击获客类别右侧的加号,进入获客类别排序界面。
  7.获客文章
  您可以通过首页文章让客户进入这个页面。单击以输入 文章 详细信息。点击搜索进入搜索页面,点击获客类别右侧的加号进入类别排序页面。
  摩多应用功能
  对于广大从事营销工作的人来说,平台可以很好的满足你的需求,操作也很简单;
  涵盖的小工具还是很齐全的,随时打开手机可以自由选择,不同的内容详细划分;
  而且还有很多招聘技巧可以免费为你提供,无论你从事什么行业,都能让你满意。
  
  魔多应用亮点
  1.魔多app是一款基于强大的程序管理和多种渠道模式的挖掘和开发的优质工具营销软件。软件具有不同模式的数据系统,对各种客户来源进行汇总和管理,使用更加方便。
  2、通过完善的管理和资源导入模式,软件建立了非常完善的数据获客模式,让所有用户都能浏览到不同的文章和视频,可以转发扩大流量。
  3、同时软件建立了非常强大的采集管理模式,会自动汇总整理不同类型的客户源数据并根据客户需求进行开发管理,还可以导入表格。
  魔多应用功能
  1.随时轻松管理和导入。魔多app中建立了一个非常强大的数据采集网络模式,让所有用户都可以在不同的模式下管理和发布,数据可以更轻松地采集和获取。
  2. 优质模式,直观,用户在使用软件过程中可以更轻松地管理不同类型,通过海量户采集和统计模式管理所有内容,更好的处理不同的要求。
  3、营销数据随时发布。用户可以通过软件轻松制作各种海报数据和不同模式的文章和短视频。它们可以轻松导入和更轻松地管理。
  小编点评
  帮助我们的销售人员更好地工作!
  解决方案:pbootcms网站建设网络科技类模板 SEO优化网络建站公司网站源码下载
  (自适应手机)pbootcms网站建设网络技术模板SEO优化网络建设公司网站源码下载,Pbootcms内核开发网站模板,该模板适用于建站公司网站、SEO优化网站等企业,当然其他行业也可以,只需要用其他行业替换文字和图片;
  PC+WAP,相同的背景,即时数据同步,应用简单!附带测试数据!
  
<p>友好的seo,所有页面都可以完全自定义标题/关键词/描述,PHP程序(php≥7.0, 查看全部

  最新版本:墨多app软件下载
  魔多app是一款专注于销售行业的APP。这个APP可以帮助我们的销售人员减少工作量,让每个销售人员足不出户就能掌握很多信息。有很多小工具和文章是的帮助销售人员更好地工作,你还在等什么,现在就下载玩吧。
  Modo应用简介
  1. 搜索
  通过首页顶部的搜索栏点击进入搜索界面,在输入框中搜索文章、视频或用户。文章进入文章详情,视频进入视频详情,用户进入用户个人中心。
  2、客户来源
  客户来源分为全景客户来源、分类客户来源和范围客户来源。地图包括高德比地图、百度地图、腾讯地到三河,输入或选择官步子和产业点集鱼北采集,就会搜索到对应的商户。
  3.客源管理
  点击首页或客源采集页面的客源管理进入该页面,选择客源来源,选择关键词即可查看。床部可以进行导出到通讯、导出到表格、群发、清空数据、清除通讯等操作,也可以根据客源背后的按钮独立操作。
  四、语言库
  可迪可以在发短信界面点击选择模板和我的壳面,点击文字进入这个壳面类别。您可以使用右侧的加号进入该语言的添加页面。可以添加白色定义。点击复制词类下的词,长按编辑,可以自定义添加。
  五、全网源码
  
  在首页,点击全网进入该页面。点击进入wab链接。
  6.获客视频
  您可以点击主页上的视频进入此页面。点击进入视频详情,点击搜索进入搜索页面。点击获客类别右侧的加号,进入获客类别排序界面。
  7.获客文章
  您可以通过首页文章让客户进入这个页面。单击以输入 文章 详细信息。点击搜索进入搜索页面,点击获客类别右侧的加号进入类别排序页面。
  摩多应用功能
  对于广大从事营销工作的人来说,平台可以很好的满足你的需求,操作也很简单;
  涵盖的小工具还是很齐全的,随时打开手机可以自由选择,不同的内容详细划分;
  而且还有很多招聘技巧可以免费为你提供,无论你从事什么行业,都能让你满意。
  
  魔多应用亮点
  1.魔多app是一款基于强大的程序管理和多种渠道模式的挖掘和开发的优质工具营销软件。软件具有不同模式的数据系统,对各种客户来源进行汇总和管理,使用更加方便。
  2、通过完善的管理和资源导入模式,软件建立了非常完善的数据获客模式,让所有用户都能浏览到不同的文章和视频,可以转发扩大流量。
  3、同时软件建立了非常强大的采集管理模式,会自动汇总整理不同类型的客户源数据并根据客户需求进行开发管理,还可以导入表格。
  魔多应用功能
  1.随时轻松管理和导入。魔多app中建立了一个非常强大的数据采集网络模式,让所有用户都可以在不同的模式下管理和发布,数据可以更轻松地采集和获取。
  2. 优质模式,直观,用户在使用软件过程中可以更轻松地管理不同类型,通过海量户采集和统计模式管理所有内容,更好的处理不同的要求。
  3、营销数据随时发布。用户可以通过软件轻松制作各种海报数据和不同模式的文章和短视频。它们可以轻松导入和更轻松地管理。
  小编点评
  帮助我们的销售人员更好地工作!
  解决方案:pbootcms网站建设网络科技类模板 SEO优化网络建站公司网站源码下载
  (自适应手机)pbootcms网站建设网络技术模板SEO优化网络建设公司网站源码下载,Pbootcms内核开发网站模板,该模板适用于建站公司网站、SEO优化网站等企业,当然其他行业也可以,只需要用其他行业替换文字和图片;
  PC+WAP,相同的背景,即时数据同步,应用简单!附带测试数据!
  
<p>友好的seo,所有页面都可以完全自定义标题/关键词/描述,PHP程序(php≥7.0,

解决方案:高德地图腾讯地图手机端数据采集软件; 地图数据采集软件APP

采集交流优采云 发表了文章 • 0 个评论 • 227 次浏览 • 2022-11-13 13:17 • 来自相关话题

  解决方案:高德地图腾讯地图手机端数据采集软件; 地图数据采集软件APP
  高德地图腾讯地图移动端数据采集软件;地图数据采集软件APP
  Q 同 V:862685179 地址:
  Map Data采集软件手机app版特点
  — 1、采集地图最专业,一般采集软件是网页采集,采集速度很慢。
  — 2.采集最快的速度,让您在最短时间内获得最想要的信息,为获得大量客户提供有力保障。
  
  — 3. 最精确的搜索,可以按区域搜索,根据需要的关键词,可以精确到县级区域。
  — 4. 操作最简单,让用户快速上手,完全专注于自己的搜索需求。
  — 5、搜索领域最广最精细,搜索行业最全,360行可搜索。
  — 6、实时保存采集结果和断点,即中断采集后,采集会自动继续上一个采集,无需从头开始采集,大大提高效率。
  — 7. 多张地图,多张关键词,多个城市同时采集。
  — 8.在采集的同时,可以发短信和拨打手机采集,非常方便。
  地图数据采集Master手机app版对比其他地图采集软件的优势
  
  — 1.地图数据采集Master手机app版首先是运行在Android手机上的软件,其他地图数据采集软件一般在电脑上。
  — 2.地图数据采集Master手机app版运行在手机上,使用起来非常方便,比如上班路上,出差,甚至吃饭的时候都可以用更不用说工作时,随时随地做生意是PC版所没有的优势。
  — 3.地图数据采集Master手机app版本可以在采集时向采集收到的电话号码发送短信和拨打电话,片刻不影响业务发展。
  — 4. 手机版采集地图数据采集Master手机app版可轻松导入通讯录,手机版采集远胜电脑版地图数据采集。采集软件很方便。
  — 5. 地图数据采集Master手机app版本可以同时使用三张地图采集,不像很多地图数据采集软件采集完成一张地图然后手动切换到另一张地图一张地图采集,我们的软件采集效率更高。
  — 6.地图数据采集Master手机app版本可以同时搜索多个区域和多个关键词,非常方便。
  — 7. 县 采集 的支持。
  解决方案:乐天商品采集器
  “乐天商品采集器”是乐天商品的特殊采集器。仅限于乐天类别的最大显示结果数(150 页)。为了捕获所有商品,该软件内置了自动价格拆分模式。价格区间不断拆分查询,直到展示列表小于等于150页,然后爬取商品URL。采集 使用这种价格拆分模式可以尽可能爬取所有商品。(此价格拆分模型适用于任何对展示次数有页面限制的电子商务网站)
  该软件分为两个模块。第一个模块专门用于爬取商品的url,可以爬取任意category(),以及搜索结果列表等;第二个模块导入产品 URL 来抓取产品信息,结果是 ZENCART 格式的 CSV。您可以使用“Zencart 产品批量上传工具”自动发布到 ZENCART网站。
  
   查看全部

  解决方案:高德地图腾讯地图手机端数据采集软件; 地图数据采集软件APP
  高德地图腾讯地图移动端数据采集软件;地图数据采集软件APP
  Q 同 V:862685179 地址:
  Map Data采集软件手机app版特点
  — 1、采集地图最专业,一般采集软件是网页采集,采集速度很慢。
  — 2.采集最快的速度,让您在最短时间内获得最想要的信息,为获得大量客户提供有力保障。
  
  — 3. 最精确的搜索,可以按区域搜索,根据需要的关键词,可以精确到县级区域。
  — 4. 操作最简单,让用户快速上手,完全专注于自己的搜索需求。
  — 5、搜索领域最广最精细,搜索行业最全,360行可搜索。
  — 6、实时保存采集结果和断点,即中断采集后,采集会自动继续上一个采集,无需从头开始采集,大大提高效率。
  — 7. 多张地图,多张关键词,多个城市同时采集。
  — 8.在采集的同时,可以发短信和拨打手机采集,非常方便。
  地图数据采集Master手机app版对比其他地图采集软件的优势
  
  — 1.地图数据采集Master手机app版首先是运行在Android手机上的软件,其他地图数据采集软件一般在电脑上。
  — 2.地图数据采集Master手机app版运行在手机上,使用起来非常方便,比如上班路上,出差,甚至吃饭的时候都可以用更不用说工作时,随时随地做生意是PC版所没有的优势。
  — 3.地图数据采集Master手机app版本可以在采集时向采集收到的电话号码发送短信和拨打电话,片刻不影响业务发展。
  — 4. 手机版采集地图数据采集Master手机app版可轻松导入通讯录,手机版采集远胜电脑版地图数据采集。采集软件很方便。
  — 5. 地图数据采集Master手机app版本可以同时使用三张地图采集,不像很多地图数据采集软件采集完成一张地图然后手动切换到另一张地图一张地图采集,我们的软件采集效率更高。
  — 6.地图数据采集Master手机app版本可以同时搜索多个区域和多个关键词,非常方便。
  — 7. 县 采集 的支持。
  解决方案:乐天商品采集
  “乐天商品采集器”是乐天商品的特殊采集器。仅限于乐天类别的最大显示结果数(150 页)。为了捕获所有商品,该软件内置了自动价格拆分模式。价格区间不断拆分查询,直到展示列表小于等于150页,然后爬取商品URL。采集 使用这种价格拆分模式可以尽可能爬取所有商品。(此价格拆分模型适用于任何对展示次数有页面限制的电子商务网站)
  该软件分为两个模块。第一个模块专门用于爬取商品的url,可以爬取任意category(),以及搜索结果列表等;第二个模块导入产品 URL 来抓取产品信息,结果是 ZENCART 格式的 CSV。您可以使用“Zencart 产品批量上传工具”自动发布到 ZENCART网站。
  
  

最新发布:标本采集最新版本应用截图

采集交流优采云 发表了文章 • 0 个评论 • 152 次浏览 • 2022-11-07 02:20 • 来自相关话题

  最新发布:标本采集最新版本应用截图
  标本采集最新版是一款数据采集软件,软件功能操作非常简单。有很多采集模板,可以自由使用,大大提升数据采集@采集的效率可以让用户获得足够全面的数据信息,还可以在线搜索对应的数据。
  《标本采集最新版》软件亮点:
  1、通过查看标本数据信息,可以快速了解自己的身体是否健康。
  2、软件的操作页面看起来非常简单直观,新用户也可以快速上手。
  
  3、如对软件功能不了解,可随时与平台客服人员沟通。
  《标本采集最新版》软件特点:
  1、这些采集信息会不断更新,以便用户获取最权威的数据。
  2、多种采集方式自由选择,通过摄像头采集数据。
  
  3、本软件的适用范围很广,本软件可以处理各种数据采集作业。
  4、所有数据信息都可以在线保存,用户可以随时查看自己之前保存的数据。
  《标本采集最新版本》编辑点评:
  样本采集 提供的最新版本的功能和技术非常完善,有专业的技术团队维护功能,大家在操作软件时可以感受到非常稳定的性能体验。
  最新版:抖音批量采集下载工具(电脑版)
  
  今天介绍的抖音批量采集下载工具可以采集一个作者的所有作品、单个视频作品、某个主题挑战下的指定数量的作品、指定数量的作品使用某种音乐。还可以检测作者的作品更新、话题挑战、音乐等,只有在有新作品时才下载新作品。
  温馨提示:我之前在公众号(AD School)推荐过几个抖音批量下载软件,但全部无效。今天介绍的软件不应该总是有效的。如有必要,请尽快使用。
  
  软件使用方法:打开手机抖音软件,复制链接,将链接发送给微信文件传输助手,登录微信电脑版,从文件传输助手复制链接,然后点击抖音Batch采集下载工具的主程序(抖音采集tool20210401.exe),软件会自动获取剪贴板上的抖音链接,并自动开始采集下载,下载完成后会弹出下载日志。
  下载的视频保存在软件目录下的一个文件夹中,文件夹名称为:Work Save。 查看全部

  最新发布:标本采集最新版本应用截图
  标本采集最新版是一款数据采集软件,软件功能操作非常简单。有很多采集模板,可以自由使用,大大提升数据采集@采集的效率可以让用户获得足够全面的数据信息,还可以在线搜索对应的数据。
  《标本采集最新版》软件亮点:
  1、通过查看标本数据信息,可以快速了解自己的身体是否健康。
  2、软件的操作页面看起来非常简单直观,新用户也可以快速上手。
  
  3、如对软件功能不了解,可随时与平台客服人员沟通。
  《标本采集最新版》软件特点:
  1、这些采集信息会不断更新,以便用户获取最权威的数据。
  2、多种采集方式自由选择,通过摄像头采集数据。
  
  3、本软件的适用范围很广,本软件可以处理各种数据采集作业。
  4、所有数据信息都可以在线保存,用户可以随时查看自己之前保存的数据。
  《标本采集最新版本》编辑点评:
  样本采集 提供的最新版本的功能和技术非常完善,有专业的技术团队维护功能,大家在操作软件时可以感受到非常稳定的性能体验。
  最新版:抖音批量采集下载工具(电脑版)
  
  今天介绍的抖音批量采集下载工具可以采集一个作者的所有作品、单个视频作品、某个主题挑战下的指定数量的作品、指定数量的作品使用某种音乐。还可以检测作者的作品更新、话题挑战、音乐等,只有在有新作品时才下载新作品。
  温馨提示:我之前在公众号(AD School)推荐过几个抖音批量下载软件,但全部无效。今天介绍的软件不应该总是有效的。如有必要,请尽快使用。
  
  软件使用方法:打开手机抖音软件,复制链接,将链接发送给微信文件传输助手,登录微信电脑版,从文件传输助手复制链接,然后点击抖音Batch采集下载工具的主程序(抖音采集tool20210401.exe),软件会自动获取剪贴板上的抖音链接,并自动开始采集下载,下载完成后会弹出下载日志。
  下载的视频保存在软件目录下的一个文件夹中,文件夹名称为:Work Save。

最新版:文章采集阅读软件 V1.1 正式版

采集交流优采云 发表了文章 • 0 个评论 • 89 次浏览 • 2022-11-06 22:44 • 来自相关话题

  最新版:文章采集阅读软件 V1.1 正式版
  文章采集阅读软件(网站文章采集工具)是一个很好用又好用的文章采集阅读辅助工具。这个文章采集阅读软件功能强大,功能全面,易于使用。使用后,可以帮助用户更轻松方便地采集阅读文章。软件采用E语言编写,不仅可以采集文本,还可以简单的替换部分文本,或者添加文本,可以帮助有需要的用户采集大量文章阅读,同时还提供了替换或删除指定文本的简单功能。欢迎有需要的朋友下载使用。
  使用说明:
  最近学到的帖子+常规。
  写了一个培训软件。
  
  编程自己在新手中还是新手,请忽略。
  匹配可能不准确请勿喷。
  您可以简单地替换一些文本或添加文本。
  执行 软文 也应该有效。
  用E语言编写的程序。
  
  指示:
  1.下载解压后的文件,解压后找到“采集reading.exe”,双击打开
  2.过一会会出现界面,欢迎使用
  3.点击开始采集,然后找到需要的文章进行读取或替换或删除
  免费的:网站SEO优化:免费帝国采集做法分享
  SEO优化帝国采集
  今天小编就继续给大家分享一些关于帝国采集和做网站的SEO技巧和问题解决方法,以及如何通过与帝国cms做一个SEO方法采集 收录 100,000 个 采集 站。Empirecms作为老牌内容管理系统,拥有大量用户。但是,许多用户也遇到了同样的问题。一开始他们用Empire采集探索帝国自带的采集器,后来觉得不够强大,挖矿速度也很慢。要么采集不可用,要么无法入库,一直停留在导入临时库页面不动,超时。我是如何解决这些问题的?然后我们可以切换到第三方采集 软件,它不仅解决了上述问题,而且使 网站 工作。目前,收录 稳定在 120,000 左右。
  
  收录120,000
  帝国采集做网站怎么做SEO优化?学会选择 关键词 非常重要。SEO中最重要的是对关键词的优化,包括如何选择核心关键词、长尾关键词;如何查看 关键词 的受欢迎程度,竞争,还要了解一些分词技巧。内容优化,包括文章文章中的关键词密度、位置、内链等。了解什么样的网站结构容易被搜索引擎使用收录,网站域名基础知识,网站网址静态和动态,有什么好处做网站SEO优化的站长和同学都知道,每天网站应该定期发布一些文章,但是如果有几个网站 可以这样发布,如果网站这样手动更新太多的话,效率难免会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。可以这样发布,如果网站有太多这样的手动更新,效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。可以这样发布,如果网站有太多这样的手动更新,效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。如果网站这样的手动更新太多,效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。如果网站这样的手动更新太多,效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。软件完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。软件完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。
  
  帝国cms采集
  这样一来,cms在帝国的采集用户的难题就迎刃而解了。只有解决了内容问题,我们才有时间和精力做网站的SEO优化。对小编来说,三个月10万的网站收录很容易搭建。一般SEO优化网站一个多月就会看到效果,搭建一个需要三个月左右。网站收录到10万不值一提。借助全网免费的采集软件,文章的内容全部由采集返回。我想每个人都想知道如何优化它来达到这样的效果。首先,在网站SEO优化方面还是有一些内容可以和大家分享的:一、我认为主页的标题和描述非常重要。对于小编的每一个网站,我都会认真思考一下标题和描述应该怎么写。写得好,优化效率更高。采集是帝国采集的优秀工具,站群的搭建简单方便,所以我们需要在标题关键词中收录行业等,既包括标题和描述,所以目前这个网站可以轻松收录达到100,000。其次,关键词的密度也是需要考虑的问题。关键词出现在网站首页的频率,关键词的密度在2-8%,这是比较合理的关键词内的密度访问。关键词 SEO内链是提高关键词排名的重要途径之一。它可以准确地告诉蜘蛛链接地址的主要内容是什么。如果你想网站能得到更好的关键词@关键词排名,建议大家使用关键词内链功能。
  我先分享一些关于帝国采集的经验。当然,网站收录可以上升,不仅仅是小编提到的几点,SEO是一个多维度、长期的过程。网站很多地方都需要做SEO优化。看似深奥,其实很简单。搜索引擎已经给出了相应的规则。我们只需要按照这些规则做好SEO优化,网站自然网站@收录排名也就上去了! 查看全部

  最新版:文章采集阅读软件 V1.1 正式版
  文章采集阅读软件(网站文章采集工具)是一个很好用又好用的文章采集阅读辅助工具。这个文章采集阅读软件功能强大,功能全面,易于使用。使用后,可以帮助用户更轻松方便地采集阅读文章。软件采用E语言编写,不仅可以采集文本,还可以简单的替换部分文本,或者添加文本,可以帮助有需要的用户采集大量文章阅读,同时还提供了替换或删除指定文本的简单功能。欢迎有需要的朋友下载使用。
  使用说明:
  最近学到的帖子+常规。
  写了一个培训软件。
  
  编程自己在新手中还是新手,请忽略。
  匹配可能不准确请勿喷。
  您可以简单地替换一些文本或添加文本。
  执行 软文 也应该有效。
  用E语言编写的程序。
  
  指示:
  1.下载解压后的文件,解压后找到“采集reading.exe”,双击打开
  2.过一会会出现界面,欢迎使用
  3.点击开始采集,然后找到需要的文章进行读取或替换或删除
  免费的:网站SEO优化:免费帝国采集做法分享
  SEO优化帝国采集
  今天小编就继续给大家分享一些关于帝国采集和做网站的SEO技巧和问题解决方法,以及如何通过与帝国cms做一个SEO方法采集 收录 100,000 个 采集 站。Empirecms作为老牌内容管理系统,拥有大量用户。但是,许多用户也遇到了同样的问题。一开始他们用Empire采集探索帝国自带的采集器,后来觉得不够强大,挖矿速度也很慢。要么采集不可用,要么无法入库,一直停留在导入临时库页面不动,超时。我是如何解决这些问题的?然后我们可以切换到第三方采集 软件,它不仅解决了上述问题,而且使 网站 工作。目前,收录 稳定在 120,000 左右。
  
  收录120,000
  帝国采集做网站怎么做SEO优化?学会选择 关键词 非常重要。SEO中最重要的是对关键词的优化,包括如何选择核心关键词、长尾关键词;如何查看 关键词 的受欢迎程度,竞争,还要了解一些分词技巧。内容优化,包括文章文章中的关键词密度、位置、内链等。了解什么样的网站结构容易被搜索引擎使用收录,网站域名基础知识,网站网址静态和动态,有什么好处做网站SEO优化的站长和同学都知道,每天网站应该定期发布一些文章,但是如果有几个网站 可以这样发布,如果网站这样手动更新太多的话,效率难免会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。可以这样发布,如果网站有太多这样的手动更新,效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。可以这样发布,如果网站有太多这样的手动更新,效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。如果网站这样的手动更新太多,效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。如果网站这样的手动更新太多,效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。软件完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。软件完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。
  
  帝国cms采集
  这样一来,cms在帝国的采集用户的难题就迎刃而解了。只有解决了内容问题,我们才有时间和精力做网站的SEO优化。对小编来说,三个月10万的网站收录很容易搭建。一般SEO优化网站一个多月就会看到效果,搭建一个需要三个月左右。网站收录到10万不值一提。借助全网免费的采集软件,文章的内容全部由采集返回。我想每个人都想知道如何优化它来达到这样的效果。首先,在网站SEO优化方面还是有一些内容可以和大家分享的:一、我认为主页的标题和描述非常重要。对于小编的每一个网站,我都会认真思考一下标题和描述应该怎么写。写得好,优化效率更高。采集是帝国采集的优秀工具,站群的搭建简单方便,所以我们需要在标题关键词中收录行业等,既包括标题和描述,所以目前这个网站可以轻松收录达到100,000。其次,关键词的密度也是需要考虑的问题。关键词出现在网站首页的频率,关键词的密度在2-8%,这是比较合理的关键词内的密度访问。关键词 SEO内链是提高关键词排名的重要途径之一。它可以准确地告诉蜘蛛链接地址的主要内容是什么。如果你想网站能得到更好的关键词@关键词排名,建议大家使用关键词内链功能。
  我先分享一些关于帝国采集的经验。当然,网站收录可以上升,不仅仅是小编提到的几点,SEO是一个多维度、长期的过程。网站很多地方都需要做SEO优化。看似深奥,其实很简单。搜索引擎已经给出了相应的规则。我们只需要按照这些规则做好SEO优化,网站自然网站@收录排名也就上去了!

分享:公众号文章采集的两种方案,搜狗和微信App采集

采集交流优采云 发表了文章 • 0 个评论 • 82 次浏览 • 2022-11-06 12:59 • 来自相关话题

  分享:公众号文章采集的两种方案,搜狗和微信App采集
  更新于 2018-06-05
  许多答案无用或不再有效,这是我的解决方案。
  如果只采集公众号文章微信,要求不是很严格,可以去搜狗。这种方案成本低,相对简单,但缺点也很明显。这是一个临时的 文章 链接。如果要转成永久链接,还是要通过app界面。.
  
  另一种解决方案是从微信APP本身添加抓取软件采集,成本会高很多,但是可以采集的数据类型很多,包括但不限于:历史页面文章 ,阅读喜欢,评论等。
  为了更直观,我做了一张图来对比搜狗和微信App采集的两种方案。
  我自己使用这两种方案,也提供封装好的接口。具体要求将取决于成本和场景来选择使用哪一种。
  
  简单的一句话总结就是,搜狗有微信App,但搜狗没有微信App,但无论软硬成本,微信方案都比搜狗方案贵很多。
  题外话,图片指的是微信中的搜索界面。我自己已经实现了,可以获取搜索公众号和文章的返回数据,只是作为微信批量添加软件的练习,因为这个接口用处不大,所以没有解包已打开,如果需要,可以单独联系我。很多人可能会认为采集和搜索界面不太可能给微信添加抓取软件,因为这个数据根本就不是http协议。但我想说的是,有时 采集data 不一定要在请求中截取。解决方案有很多,但成本也会变得非常大(开发成本和上线成本)。
  另外,关于公众号文章的读物采集,可以看我的另一个回答知乎:
  技术文章:为什么我的博客百度只收录了首页?
  1.熊掌号和百度小程序
  面对这种问题,首先要检查的是网站是否配置了熊掌ID和百度小程序。从目前来看,Bear's Paw ID 正在解决网站收录。锋利的武器。
  对于企业网站来说,百度小程序的配置是一个快速的排名通道。从目前来看,仍是红利期。
  建议有能力的企业网站可以尝试配置。
  2. 网站信息架构
  对于新站点,百度爬虫的爬取频率非常有限。如果你的网站信息架构设计不合理,一定程度上会影响网站收录中的相关页面。主要包括:
  
  3.新站原创保护
  一个全新的网站上线,而不是一个旧的域名,理论上,这个域名是没有可信度的。其实这个时候,我们需要尽可能的保留网站上的优质内容,先被索引,而不是被采集。为此原因:
  4. 网站日志分析
  对于网站的日志分析,是解决百度缺少收录网站其他页面的一个非常有效的工具。它可以清楚地了解用户和蜘蛛对整个站点的访问:
  5. 网站资源分配
  从多年的SEO经验来看,任何网站的收录排名都是基于一定的资源,包括:
  网站内容质量
  
  如果你的网站书伪原创代笔,或者采集内容,那么百度收录网站首页是很正常的。对于新网站,一定不要选择提交旧内容。
  站外外部链接
  出现页面没有被百度收录列出的另一个原因是缺乏外链资源的支持,蜘蛛无法第一时间抓取到新的内容。为此,您可能需要编写一些高质量的内容,发布在高权威网站上,并通过外部链接的形式,指向经常更新的页面。
  站内链建设
  与熊掌ID相比,其实我们可以忽略内链的存在,如果不配置熊掌ID,那么内链有利于提高新内容被发现的概率。
  当您的页面长时间没有收录时,您可以适当利用内部链接来构建站点内的信息流。
  总结:百度只有收录一个主页的原因有很多,以上只是一些小细节。 查看全部

  分享:公众号文章采集的两种方案,搜狗和微信App采集
  更新于 2018-06-05
  许多答案无用或不再有效,这是我的解决方案。
  如果只采集公众号文章微信,要求不是很严格,可以去搜狗。这种方案成本低,相对简单,但缺点也很明显。这是一个临时的 文章 链接。如果要转成永久链接,还是要通过app界面。.
  
  另一种解决方案是从微信APP本身添加抓取软件采集,成本会高很多,但是可以采集的数据类型很多,包括但不限于:历史页面文章 ,阅读喜欢,评论等。
  为了更直观,我做了一张图来对比搜狗和微信App采集的两种方案。
  我自己使用这两种方案,也提供封装好的接口。具体要求将取决于成本和场景来选择使用哪一种。
  
  简单的一句话总结就是,搜狗有微信App,但搜狗没有微信App,但无论软硬成本,微信方案都比搜狗方案贵很多。
  题外话,图片指的是微信中的搜索界面。我自己已经实现了,可以获取搜索公众号和文章的返回数据,只是作为微信批量添加软件的练习,因为这个接口用处不大,所以没有解包已打开,如果需要,可以单独联系我。很多人可能会认为采集和搜索界面不太可能给微信添加抓取软件,因为这个数据根本就不是http协议。但我想说的是,有时 采集data 不一定要在请求中截取。解决方案有很多,但成本也会变得非常大(开发成本和上线成本)。
  另外,关于公众号文章的读物采集,可以看我的另一个回答知乎:
  技术文章:为什么我的博客百度只收录了首页?
  1.熊掌号和百度小程序
  面对这种问题,首先要检查的是网站是否配置了熊掌ID和百度小程序。从目前来看,Bear's Paw ID 正在解决网站收录。锋利的武器。
  对于企业网站来说,百度小程序的配置是一个快速的排名通道。从目前来看,仍是红利期。
  建议有能力的企业网站可以尝试配置。
  2. 网站信息架构
  对于新站点,百度爬虫的爬取频率非常有限。如果你的网站信息架构设计不合理,一定程度上会影响网站收录中的相关页面。主要包括:
  
  3.新站原创保护
  一个全新的网站上线,而不是一个旧的域名,理论上,这个域名是没有可信度的。其实这个时候,我们需要尽可能的保留网站上的优质内容,先被索引,而不是被采集。为此原因:
  4. 网站日志分析
  对于网站的日志分析,是解决百度缺少收录网站其他页面的一个非常有效的工具。它可以清楚地了解用户和蜘蛛对整个站点的访问:
  5. 网站资源分配
  从多年的SEO经验来看,任何网站的收录排名都是基于一定的资源,包括:
  网站内容质量
  
  如果你的网站书伪原创代笔,或者采集内容,那么百度收录网站首页是很正常的。对于新网站,一定不要选择提交旧内容。
  站外外部链接
  出现页面没有被百度收录列出的另一个原因是缺乏外链资源的支持,蜘蛛无法第一时间抓取到新的内容。为此,您可能需要编写一些高质量的内容,发布在高权威网站上,并通过外部链接的形式,指向经常更新的页面。
  站内链建设
  与熊掌ID相比,其实我们可以忽略内链的存在,如果不配置熊掌ID,那么内链有利于提高新内容被发现的概率。
  当您的页面长时间没有收录时,您可以适当利用内部链接来构建站点内的信息流。
  总结:百度只有收录一个主页的原因有很多,以上只是一些小细节。

干货分享:说说虫虫营销助手百度应用文档教程

采集交流优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2022-11-02 18:26 • 来自相关话题

  干货分享:说说虫虫营销助手百度应用文档教程
  说说bug营销助手百度应用文档教程
  1. 文章 发布
  
  发布支持百度目前所有的WEB2.0应用,用户可以点击图片单独操作,也可以点击一键发布。如果相关账号没有注册,用户可以先注册账号,也可以进入已有账号进行操作。百度应用中的网站都在默认组中。
  2. 文章采集
  文章采集目前支持百度空间、图书馆、百科和旅行,点击对应图片开始采集。
  
  3. 网站提交
  这部分的主要对象是企业用户。百度推出了搜索开放平台等各类企业APP应用接口。用户只需提交相关企业文件。达到各种效果。比如Bugs官方申请的软件下载应用,用户只需要在百度输入“Bugs营销助手”,百度首页就会出现相关下载页面的地址,排名非常高。用户点击软件中的相关图片后,软件会引导用户到具体的申请提交地址。用户提交具体企业信息后,等待百度审批。
  更多北碚商城产品介绍:软文营销服务全球电影资讯网软文中国企业金融网发帖软文发帖示例
  教程:SEO批量在线翻译伪原创软件
  SEO翻译伪原创把我们原来的中文翻译成其他词,然后再反译成中文,语义不会改变,但是词和主谓宾结构会发生相应的变化。同义词替换为文章伪原创,SEO翻译伪原创更符合用户阅读习惯,去重率更高。
  在制定 SEO 策略时,充满活力的内容是构建新内容的跳板。通过SEO翻译伪原创,我们可以向国外同行业的文章学习和采集资料。SEO翻译伪原创有视觉指定采集和批量文章翻译,集成的翻译页面让我们可以选择翻译、谷歌翻译、有道翻译等翻译渠道。多种选择有助于确保翻译质量和翻译数量。
  SEO翻译伪原创不仅适用于在线采集任务,它还可以为保存在本地文件夹中的文章完成批量翻译伪原创发布,具有独特的翻译优化它允许我们识别原文的标签和段落,使翻译后的文章符合用户的阅读习惯,而不是全部靠在一起,不美观。
  SEO翻译伪原创支持文章敏感词删除、图片本地化和关键词锚文本插入等SEO技术。文章干净、有条理和搜索引擎友好的收录,用户更有可能找到我们的内容,因为内容充满活力,专注于内在兴趣的主题。通过创建有价值和有见地的帖子,人们会留在我们的页面上,从而降低跳出率。
  
  通过搜索全球同行 网站文章 来展示我们的专业知识,然后提炼和制作动态内容。它使我们在竞争中脱颖而出,并展示了我们的垂直专业知识。考虑到这一点,让我们看看这些技巧,以帮助编写我们的动态内容。
  当我们创建动态内容时,我们需要牢记我们的读者。研究表明,75% 的用户从未滚动过第一个搜索结果页面。我们的目标是生成始终与我们的用户相关且与我们的业务相关的内容。最好关注动态内容,例如“如何构建有效的电话系统”,因为这些主题永远不会过时并且总是受到追捧。总有人想更多地了解我们的专业主题。通过在我们的 网站 中收录初学者指南和常见问题解答,我们可以为这些新用户提供宝贵的资源。
  这些关键字确保我们的帖子出现在搜索结果中并针对 SEO 进行了优化。SEO Translator 伪原创 拥有诸如 关键词 Mining 等工具,可以为我们的内容找到最佳的 SEO 关键字。上述工具探索了关键字的指标,这些指标表明我们的主题是否存在竞争和搜索兴趣。这允许用户应用程序确定我们的内容将如何使用可用的关键字进行排名。这是关于通过有价值且可访问的内容引起注意。
  
  如果竞争对手在我们想要的关键字上发布并且他们的参与度很高,那么可能值得使用另一个关键字。超越他们的流量需要时间和金钱,因此关注另一个可以主导搜索结果的关键字是有意义的。
  对于网站的SEO优化,无论是挖掘关键词,还是指定网站采集获取素材,都应该多从文章新颖性和人气话题开始。搜索引擎和用户都很好奇,行业突发的信息和爆炸性话题往往是大家关注的焦点,而我们的素材获取可以通过SEO翻译伪原创工具在全平台、全网搜索到.
  SEO翻译伪原创让我们摆脱了文字的束缚,可以在网上搜索到我们想要的内容和素材。通过批量SEO翻译,我们可以为我们的网站源源不断地更新内容。SEO翻译的分享就到这里了伪原创,喜欢的话记得点三个链接哦。返回搜狐,查看更多 查看全部

  干货分享:说说虫虫营销助手百度应用文档教程
  说说bug营销助手百度应用文档教程
  1. 文章 发布
  
  发布支持百度目前所有的WEB2.0应用,用户可以点击图片单独操作,也可以点击一键发布。如果相关账号没有注册,用户可以先注册账号,也可以进入已有账号进行操作。百度应用中的网站都在默认组中。
  2. 文章采集
  文章采集目前支持百度空间、图书馆、百科和旅行,点击对应图片开始采集。
  
  3. 网站提交
  这部分的主要对象是企业用户。百度推出了搜索开放平台等各类企业APP应用接口。用户只需提交相关企业文件。达到各种效果。比如Bugs官方申请的软件下载应用,用户只需要在百度输入“Bugs营销助手”,百度首页就会出现相关下载页面的地址,排名非常高。用户点击软件中的相关图片后,软件会引导用户到具体的申请提交地址。用户提交具体企业信息后,等待百度审批。
  更多北碚商城产品介绍:软文营销服务全球电影资讯网软文中国企业金融网发帖软文发帖示例
  教程:SEO批量在线翻译伪原创软件
  SEO翻译伪原创把我们原来的中文翻译成其他词,然后再反译成中文,语义不会改变,但是词和主谓宾结构会发生相应的变化。同义词替换为文章伪原创,SEO翻译伪原创更符合用户阅读习惯,去重率更高。
  在制定 SEO 策略时,充满活力的内容是构建新内容的跳板。通过SEO翻译伪原创,我们可以向国外同行业的文章学习和采集资料。SEO翻译伪原创有视觉指定采集和批量文章翻译,集成的翻译页面让我们可以选择翻译、谷歌翻译、有道翻译等翻译渠道。多种选择有助于确保翻译质量和翻译数量。
  SEO翻译伪原创不仅适用于在线采集任务,它还可以为保存在本地文件夹中的文章完成批量翻译伪原创发布,具有独特的翻译优化它允许我们识别原文的标签和段落,使翻译后的文章符合用户的阅读习惯,而不是全部靠在一起,不美观。
  SEO翻译伪原创支持文章敏感词删除、图片本地化和关键词锚文本插入等SEO技术。文章干净、有条理和搜索引擎友好的收录,用户更有可能找到我们的内容,因为内容充满活力,专注于内在兴趣的主题。通过创建有价值和有见地的帖子,人们会留在我们的页面上,从而降低跳出率。
  
  通过搜索全球同行 网站文章 来展示我们的专业知识,然后提炼和制作动态内容。它使我们在竞争中脱颖而出,并展示了我们的垂直专业知识。考虑到这一点,让我们看看这些技巧,以帮助编写我们的动态内容。
  当我们创建动态内容时,我们需要牢记我们的读者。研究表明,75% 的用户从未滚动过第一个搜索结果页面。我们的目标是生成始终与我们的用户相关且与我们的业务相关的内容。最好关注动态内容,例如“如何构建有效的电话系统”,因为这些主题永远不会过时并且总是受到追捧。总有人想更多地了解我们的专业主题。通过在我们的 网站 中收录初学者指南和常见问题解答,我们可以为这些新用户提供宝贵的资源。
  这些关键字确保我们的帖子出现在搜索结果中并针对 SEO 进行了优化。SEO Translator 伪原创 拥有诸如 关键词 Mining 等工具,可以为我们的内容找到最佳的 SEO 关键字。上述工具探索了关键字的指标,这些指标表明我们的主题是否存在竞争和搜索兴趣。这允许用户应用程序确定我们的内容将如何使用可用的关键字进行排名。这是关于通过有价值且可访问的内容引起注意。
  
  如果竞争对手在我们想要的关键字上发布并且他们的参与度很高,那么可能值得使用另一个关键字。超越他们的流量需要时间和金钱,因此关注另一个可以主导搜索结果的关键字是有意义的。
  对于网站的SEO优化,无论是挖掘关键词,还是指定网站采集获取素材,都应该多从文章新颖性和人气话题开始。搜索引擎和用户都很好奇,行业突发的信息和爆炸性话题往往是大家关注的焦点,而我们的素材获取可以通过SEO翻译伪原创工具在全平台、全网搜索到.
  SEO翻译伪原创让我们摆脱了文字的束缚,可以在网上搜索到我们想要的内容和素材。通过批量SEO翻译,我们可以为我们的网站源源不断地更新内容。SEO翻译的分享就到这里了伪原创,喜欢的话记得点三个链接哦。返回搜狐,查看更多

给力:新媒体、人力不足、收集欲强怎么办?

采集交流优采云 发表了文章 • 0 个评论 • 36 次浏览 • 2022-11-02 03:10 • 来自相关话题

  给力:新媒体、人力不足、收集欲强怎么办?
  文章采集软件app推荐过很多了,作为收集爱好者,我的回答范围覆盖了分答、知乎、天天快报、今日头条、微博、小红书、豆瓣、lofter、instagram等平台。不过这不够啊,对于新媒体、人力不足、收集欲强的小伙伴们,该怎么办呢?会收集各大平台数据库已经足够容纳全网数据了,这次再推荐6款收集整理工具。想要收集资料的小伙伴们要看仔细了,这几款工具都是第三方或者个人开发的,部分可免费试用。收集本地数据进入全网数据库。
  1、资料王这是一款资料收集的小工具,但我觉得没有什么奇奇怪怪的特点。不过资料太多,收集不容易,比如聊天记录,别人发来一个快递的图片,需要在快递公司的数据库里找,这个时候就需要看图。除此之外,还要搜索最新的热点,并且确定它是否收录自己的内容,是否能识别自己的文章,并且选择分享等。这个要花一些时间和功夫。收集自己的数据。
  
  2、douyinput需要先注册一个账号,然后按照图片注册一个链接,就可以开始收集数据了。如果不小心点开了,就会出现各种方法,这里不细说了。这是我最喜欢的收集数据工具,我是从behance、emoji表情开始收集的。这种软件最好结合一些表情包使用,比如我在douyinput搜索emoji表情,有6个不同的emoji表情可供自己选择,如果想要把它放在头像上,需要搭配上表情包。
  wikihow是我发现的另一个收集方法,它也是进入全网数据库。我用过网易云课堂、腾讯课堂、尚德机构云课堂等等,都可以通过百度云。下载一些课程讲座的ppt,还有一些小教程。
  3、camtasiastudio一键将图片导入到屏幕上,以后还能看视频,可能各大收集工具都有类似功能。各种软件都支持,最重要的是免费的。
  
  4、colordirectio这个工具能识别一下你图片右下角的颜色,几个字,数字,会很快形成一条相应的数据链接,如果就是一张图片,一个文字等,你想要都能搜到。如果你想搜索文字,只是输入一串数字,也能搜索到。
  5、keepspider想要获取某图片的某些关键字,如果不是全网图片,就只能自己拼接自己的关键字。想要搜图片,还能识别你的关键字,有点类似以图搜字。除此之外,还能识别自己的文章。
  6、云笔记不多说,只放一张图,你就能知道云笔记是一个什么东西。这些工具你看都看了,别忘了每天多浏览几遍,有时你也会搜到很好的文章和思路。 查看全部

  给力:新媒体、人力不足、收集欲强怎么办?
  文章采集软件app推荐过很多了,作为收集爱好者,我的回答范围覆盖了分答、知乎、天天快报、今日头条、微博、小红书、豆瓣、lofter、instagram等平台。不过这不够啊,对于新媒体、人力不足、收集欲强的小伙伴们,该怎么办呢?会收集各大平台数据库已经足够容纳全网数据了,这次再推荐6款收集整理工具。想要收集资料的小伙伴们要看仔细了,这几款工具都是第三方或者个人开发的,部分可免费试用。收集本地数据进入全网数据库。
  1、资料王这是一款资料收集的小工具,但我觉得没有什么奇奇怪怪的特点。不过资料太多,收集不容易,比如聊天记录,别人发来一个快递的图片,需要在快递公司的数据库里找,这个时候就需要看图。除此之外,还要搜索最新的热点,并且确定它是否收录自己的内容,是否能识别自己的文章,并且选择分享等。这个要花一些时间和功夫。收集自己的数据。
  
  2、douyinput需要先注册一个账号,然后按照图片注册一个链接,就可以开始收集数据了。如果不小心点开了,就会出现各种方法,这里不细说了。这是我最喜欢的收集数据工具,我是从behance、emoji表情开始收集的。这种软件最好结合一些表情包使用,比如我在douyinput搜索emoji表情,有6个不同的emoji表情可供自己选择,如果想要把它放在头像上,需要搭配上表情包。
  wikihow是我发现的另一个收集方法,它也是进入全网数据库。我用过网易云课堂、腾讯课堂、尚德机构云课堂等等,都可以通过百度云。下载一些课程讲座的ppt,还有一些小教程。
  3、camtasiastudio一键将图片导入到屏幕上,以后还能看视频,可能各大收集工具都有类似功能。各种软件都支持,最重要的是免费的。
  
  4、colordirectio这个工具能识别一下你图片右下角的颜色,几个字,数字,会很快形成一条相应的数据链接,如果就是一张图片,一个文字等,你想要都能搜到。如果你想搜索文字,只是输入一串数字,也能搜索到。
  5、keepspider想要获取某图片的某些关键字,如果不是全网图片,就只能自己拼接自己的关键字。想要搜图片,还能识别你的关键字,有点类似以图搜字。除此之外,还能识别自己的文章。
  6、云笔记不多说,只放一张图,你就能知道云笔记是一个什么东西。这些工具你看都看了,别忘了每天多浏览几遍,有时你也会搜到很好的文章和思路。

操作方法:文章采集器-楼主会自动识别文章及摘要,只需点选即可采集

采集交流优采云 发表了文章 • 0 个评论 • 72 次浏览 • 2022-10-31 05:14 • 来自相关话题

  操作方法:文章采集器-楼主会自动识别文章及摘要,只需点选即可采集
  
  文章采集软件app文章采集器-楼主会自动识别文章及摘要,只需点选即可采集这里有不同样式需求的自动采集一:自动采集图片自动采集:以【北京楼盘】为例,单击“浏览”按钮,即可看到了一张需要采集的图片,本地图片可直接点击保存图片至本地手机当中采集二:自动采集文章本地图片采集:采集时需点击图片,即可获取该文章所有的文章的内容集,文章标题自动采集文章摘要采集:点击一则文章,即可获取该文章所有的摘要摘要内容到本地手机当中采集三:自动采集微信文章长按图片识别文字、文章摘要自动采集:采集时选择图片即可采集文章全部内容注意事项楼主采集的为bls/css转json代码文件如遇未匹配到模板字符值的图片即为不能采集优势数据多种批量处理新建批量查找对象将原始数据导入文本中将查找对象从图片保存到数据库(需用json格式)所有内容仅需简单点击即可采集操作方法楼主没有进行更多的讲解只有限定了楼主理解的优点与不足操作与正常采集无差别缺点1。
  
  数据规整效率不高2。手机版无法传递单独文件压缩可忽略采集分享欲采集中信息部分直接导出至本地手机浏览器、电脑软件服务器中。
  采集公众号文章可以用动态生成器呀,效率比excel快太多,目前专门做公众号文章数据采集这一块的,刚刚有人推荐他们, 查看全部

  操作方法:文章采集器-楼主会自动识别文章及摘要,只需点选即可采集
  
  文章采集软件app文章采集器-楼主会自动识别文章及摘要,只需点选即可采集这里有不同样式需求的自动采集一:自动采集图片自动采集:以【北京楼盘】为例,单击“浏览”按钮,即可看到了一张需要采集的图片,本地图片可直接点击保存图片至本地手机当中采集二:自动采集文章本地图片采集:采集时需点击图片,即可获取该文章所有的文章的内容集,文章标题自动采集文章摘要采集:点击一则文章,即可获取该文章所有的摘要摘要内容到本地手机当中采集三:自动采集微信文章长按图片识别文字、文章摘要自动采集:采集时选择图片即可采集文章全部内容注意事项楼主采集的为bls/css转json代码文件如遇未匹配到模板字符值的图片即为不能采集优势数据多种批量处理新建批量查找对象将原始数据导入文本中将查找对象从图片保存到数据库(需用json格式)所有内容仅需简单点击即可采集操作方法楼主没有进行更多的讲解只有限定了楼主理解的优点与不足操作与正常采集无差别缺点1。
  
  数据规整效率不高2。手机版无法传递单独文件压缩可忽略采集分享欲采集中信息部分直接导出至本地手机浏览器、电脑软件服务器中。
  采集公众号文章可以用动态生成器呀,效率比excel快太多,目前专门做公众号文章数据采集这一块的,刚刚有人推荐他们,

超值资料:你用什么采集器好用,搜狗app,可以采集网易云音乐

采集交流优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2022-10-31 04:09 • 来自相关话题

  超值资料:你用什么采集器好用,搜狗app,可以采集网易云音乐
  文章采集软件appforum的产品介绍-专门做短视频平台的采集的,关注你的app前往官网看更多。
  你用什么采集器好用,
  1、微吼短视频采集器、
  2、兴云社,
  3、ev3
  3、
  4、
  
  5、
  6、
  7、
  8、
  9、10
  采集京东
  采集宝,我一直在用,
  推荐一个采集网易云音乐的app:云音乐助手-网易云音乐免费音乐搜索,在线试听,下载,音乐人,
  
  推荐使用qq音乐和网易云音乐,它们有自己的app,
  京东全景影像app。可以从百度地图画出近距离的全景。
  搜狗app,可以采集网易云音乐,支持京东全景,还有很多别的商城,
  采集云app是去年新兴的一个数据采集的app,直接用云采客app我测试搜索网易云音乐,我总共采集了1520条数据,
  1、首先打开软件,右上角搜索入口,
  2、开始采集后,会有提示页面让我们选择采集的商品,采集到的商品数是0,
  3、随便点击一个,点击保存,鼠标会变成键盘箭头指示,这个时候,
  4、采集到的图片就保存在本地啦,
  5、采集网易云音乐真的很简单,打开软件直接采集就行,不需要装任何软件, 查看全部

  超值资料:你用什么采集器好用,搜狗app,可以采集网易云音乐
  文章采集软件appforum的产品介绍-专门做短视频平台的采集的,关注你的app前往官网看更多。
  你用什么采集器好用,
  1、微吼短视频采集器、
  2、兴云社,
  3、ev3
  3、
  4、
  
  5、
  6、
  7、
  8、
  9、10
  采集京东
  采集宝,我一直在用,
  推荐一个采集网易云音乐的app:云音乐助手-网易云音乐免费音乐搜索,在线试听,下载,音乐人,
  
  推荐使用qq音乐和网易云音乐,它们有自己的app,
  京东全景影像app。可以从百度地图画出近距离的全景。
  搜狗app,可以采集网易云音乐,支持京东全景,还有很多别的商城,
  采集云app是去年新兴的一个数据采集的app,直接用云采客app我测试搜索网易云音乐,我总共采集了1520条数据,
  1、首先打开软件,右上角搜索入口,
  2、开始采集后,会有提示页面让我们选择采集的商品,采集到的商品数是0,
  3、随便点击一个,点击保存,鼠标会变成键盘箭头指示,这个时候,
  4、采集到的图片就保存在本地啦,
  5、采集网易云音乐真的很简单,打开软件直接采集就行,不需要装任何软件,

汇总:如何采集App的数据?

采集交流优采云 发表了文章 • 0 个评论 • 88 次浏览 • 2022-11-27 15:37 • 来自相关话题

  汇总:如何采集App的数据?
  1、本页面内容由
  企业和个人或源网独立上传,本单位不对页面内容(包括但不限于文字、图片、视频)的真实性和知识产权负责。2、我单位不保证或表明本网站内容
  的真实性、准确性和合法性,如因任何原因,因任何原因,对本网站内容或用户依赖本网站内容造成的任何损失或损害,我单位不承担直接责任和连带责任!
  如果您对本页面内容有异议或发现您的网站已显示,不想显示有关您网站的信息,请致电-27896180或QQ(1930338949),我们将立即处理,不收取任何手续费。
  
  相关新闻
  网站数据采集
和抓取?
  UCAYUN采集
AI伪原创工具与优采云
采集器
完美结合
  自媒体爆款征集工具的兴起——中水洲
  
  什么
  是否意味着公众号文章中存在原创
冲突,将以群组分享的方式发送?
  有没有好用的淘宝数据采集
软件?
  自媒体运营必采:一站式文章征集、伪原创工具、一键发布神器
  官方数据:数据治理的数字画像
  加入更敏捷的服务
  前言
  随着全网进入大数据时代,企业越来越注重利用大数据服务精细化营销、精细化运营。各种客户画像、员工画像理论如雨后春笋般涌现,数据应用的底层——数据治理,却鲜有一个整体的理论体系。如何防止治理工作本身“脱靶”,如何量化数据基础设施建设的贡献,需要为数据治理工作绘制一幅“数字画像”。这一命题的内涵和外延非常丰富。这里我们从两个角度来讨论:用户体验和架构质量。
  用户体验的数字肖像
  基于不同的视角,将用户分为外部客户、内部用户、管理人员、技术人员四类,针对具体的业务场景描述四类用户所经历的“技术赋能”。
  1、外部客户
  功能体验指数:功能体验指数用于衡量操作平台的易用性和直观性。可以通过各种埋点追踪用户的点击行为、页面停留时间、页面浏览深度。为了挖掘用户经常使用的功能,挖掘用户的实际需求,对常用功能进行功能改版优化,进行同行业产品对比,用户反馈调查等,重点关注流畅度和主要功能的实用性。
  平台服务指标:
  (1)服务平台一般采用API接口对外提供数据。因此,可以通过计算API调用率来计算其对外服务输出的活跃度。
  (2)数据服务带来的产品升值也是需要衡量的重要指标。将营销、运营等商业活动的价值提升按一定比例分配给相应的数据治理工作,从业务部门的角度评估数据治理工作对营销等活动的赋能。
  2.内部用户
  
  便捷性:以往业务部门向数据管理部门申请使用数据,通常是通过邮寄或行政手续的方式。这种方式无法实时跟踪申请进度,也无法在统一页面集中管理,导致相关人员在查询和沟通中出现混乱。费了很大力气。建立自动化、标准化的流程和在线操作工具,将大大方便流程。因此人工提取工单压降比可以作为衡量内部用户使用程度的指标。
  时效性:在线数据治理意味着资产地图和标准结构存储在用户的指尖,关键操作的全链路交付时间是触达内部用户的另一种直观体验。该指标可以通过统计每个节点的传输时间并计算相应的平均值来获得。
  贡献:不仅是底层的数据管理,数据的应用输出也能为用户带来实际的商业价值。BI工具的使用情况、提供的模型数量等指标表明用户对应用数据结果的满意度。
  3.管理
  质量提升:对于管理来说,保证数据仓库和数据湖的“清”是他们关心的问题。由于监管报送结果是银保监会对银行的重点考核指标,报送要求的数据质量达标率成为管理数据治理有效性最直观的体现。基于DQC的一系列指标也可以作为管理数据清洁度的体现。
  效率提升:除了监管要求,数据运营成本对于全行管理也至关重要。只有建立规范高效的数据结构,减少数据报表,降低存储和运维成本,才能实现精细化运营,保持高效盈利。
  4、技术人员
  数据字典打分:当企业对开发过程实施强管控时,数据字典的作用可以看作是社会法则的作用,其整体逻辑要经得起反复推敲。在数据字典的查找页面设置评分反馈是一种简单但有效的方法。页面上有计划的引导,体现了设计者对开发者体验的关注,让“吐槽”变成建议,优化解决使用数据字典时遇到的问题。
  II 建筑品质数码肖像
  全行统一的数据架构,在追求高效率的同时,要降低成本。根据《华为数据之道》中经典的信息架构四大范式,我们将从模型、分布、标准、资产四个角度分析架构使能能力。措施。
  1.型号
  公共层处理频率:公共层存储事实数据、维表数据等,支撑索引体系中的一级索引层。在建立指标时,对维度进行标准化和集约化,提高公共指标的可重用性,减少重复处理操作。因此,公共层数据模型的复用率可以作为评价公共层架构的指标之一。
  应用层引用频率:类似于人际关系网络拓扑结构中的核心图算法,该指标直接衡量数据在应用层的系统重要性,指导资产盘点目标。数据亲属关系是一个有向的、无权重的、自循环的网络图。最常被引用的资产通常来源于关键业务实体最准确、最及时的业务记录。这些资产最有可能被跨部门和业务领域调用,并且所有部门都需要可访问并能够访问相同的数据。索引还可以有效过滤掉“孤表”和临时表,减少资源投入和存储成本。
  
  2.分布
  数据覆盖:对于大型银行来说,数百个系统和数万张表分布在全国各地。收款是资产盘点的第一步。衡量采集数据在整个系统中的覆盖率,有助于我们明确当前采集的进度,定位未采集的数据源。
  数据冗余:数据冗余是指同一层数据的冗余,可以分为两个来源。第一,具有相同含义的数据存储在多个物理位置;其次,架构模型本身在设计中有很多重复的交叉项。
  数据容量:数据容量是对数据中心的整体描述,包括中心当前收录
的整体数据量的绝对值,以及数据量随时间的增长速度。数据容量高低都不理想,需要结合银行现状辩证看待。
  3.标准
  标准的稳定性:数据标准规范数据含义、结构等,应满足内容统一、定义不交叉等条件,避免数据标准内部“数据打架”。
  标准失败率:在标准技术规范完备、主题完整、标准已权威发布的前提下,标准失败率反映了数据标准“最后一公里”的执行情况。借助自动化工具,可以计算数据经过各层、分片后的退订率,智能发现潜在的退订问题。
  4、资产
  技术元数据统计:技术元数据连接源数据和数据仓库,记录数据从产生到消亡的过程。我们选取了系统覆盖率、系统内表级覆盖率、表名和字段名有效性、枚举值有效性等统计指标来表示技术资产在数据结构中的产出效益。
  企业活动命中率:数据资产是从业务流程和业务模型中提取的数字化描述。标签资产对业务行为的命中率、指标资产上报统计的命中率、用户访问上报资产的次数越高,资产内容映射企业活动的准确度越高。
  结论
  随着企业数字化转型的不断深入,“数据治理数字化画像”从方法论到实践都将趋于完善,内容价值、安全性能、用户体验也将随之提升。如何动态衡量数据治理工作的有效性,建立适合自身企业的“北极星指标”,是每一个处于智能化转型阶段的企业都必须研究的,它的成功将创造不可估量的商业价值。 查看全部

  汇总:如何采集App的数据?
  1、本页面内容由
  企业和个人或源网独立上传,本单位不对页面内容(包括但不限于文字、图片、视频)的真实性和知识产权负责。2、我单位不保证或表明本网站内容
  的真实性、准确性和合法性,如因任何原因,因任何原因,对本网站内容或用户依赖本网站内容造成的任何损失或损害,我单位不承担直接责任和连带责任!
  如果您对本页面内容有异议或发现您的网站已显示,不想显示有关您网站的信息,请致电-27896180或QQ(1930338949),我们将立即处理,不收取任何手续费。
  
  相关新闻
  网站数据采集
和抓取?
  UCAYUN采集
AI伪原创工具与优采云
采集器
完美结合
  自媒体爆款征集工具的兴起——中水洲
  
  什么
  是否意味着公众号文章中存在原创
冲突,将以群组分享的方式发送?
  有没有好用的淘宝数据采集
软件?
  自媒体运营必采:一站式文章征集、伪原创工具、一键发布神器
  官方数据:数据治理的数字画像
  加入更敏捷的服务
  前言
  随着全网进入大数据时代,企业越来越注重利用大数据服务精细化营销、精细化运营。各种客户画像、员工画像理论如雨后春笋般涌现,数据应用的底层——数据治理,却鲜有一个整体的理论体系。如何防止治理工作本身“脱靶”,如何量化数据基础设施建设的贡献,需要为数据治理工作绘制一幅“数字画像”。这一命题的内涵和外延非常丰富。这里我们从两个角度来讨论:用户体验和架构质量。
  用户体验的数字肖像
  基于不同的视角,将用户分为外部客户、内部用户、管理人员、技术人员四类,针对具体的业务场景描述四类用户所经历的“技术赋能”。
  1、外部客户
  功能体验指数:功能体验指数用于衡量操作平台的易用性和直观性。可以通过各种埋点追踪用户的点击行为、页面停留时间、页面浏览深度。为了挖掘用户经常使用的功能,挖掘用户的实际需求,对常用功能进行功能改版优化,进行同行业产品对比,用户反馈调查等,重点关注流畅度和主要功能的实用性。
  平台服务指标:
  (1)服务平台一般采用API接口对外提供数据。因此,可以通过计算API调用率来计算其对外服务输出的活跃度。
  (2)数据服务带来的产品升值也是需要衡量的重要指标。将营销、运营等商业活动的价值提升按一定比例分配给相应的数据治理工作,从业务部门的角度评估数据治理工作对营销等活动的赋能。
  2.内部用户
  
  便捷性:以往业务部门向数据管理部门申请使用数据,通常是通过邮寄或行政手续的方式。这种方式无法实时跟踪申请进度,也无法在统一页面集中管理,导致相关人员在查询和沟通中出现混乱。费了很大力气。建立自动化、标准化的流程和在线操作工具,将大大方便流程。因此人工提取工单压降比可以作为衡量内部用户使用程度的指标。
  时效性:在线数据治理意味着资产地图和标准结构存储在用户的指尖,关键操作的全链路交付时间是触达内部用户的另一种直观体验。该指标可以通过统计每个节点的传输时间并计算相应的平均值来获得。
  贡献:不仅是底层的数据管理,数据的应用输出也能为用户带来实际的商业价值。BI工具的使用情况、提供的模型数量等指标表明用户对应用数据结果的满意度。
  3.管理
  质量提升:对于管理来说,保证数据仓库和数据湖的“清”是他们关心的问题。由于监管报送结果是银保监会对银行的重点考核指标,报送要求的数据质量达标率成为管理数据治理有效性最直观的体现。基于DQC的一系列指标也可以作为管理数据清洁度的体现。
  效率提升:除了监管要求,数据运营成本对于全行管理也至关重要。只有建立规范高效的数据结构,减少数据报表,降低存储和运维成本,才能实现精细化运营,保持高效盈利。
  4、技术人员
  数据字典打分:当企业对开发过程实施强管控时,数据字典的作用可以看作是社会法则的作用,其整体逻辑要经得起反复推敲。在数据字典的查找页面设置评分反馈是一种简单但有效的方法。页面上有计划的引导,体现了设计者对开发者体验的关注,让“吐槽”变成建议,优化解决使用数据字典时遇到的问题。
  II 建筑品质数码肖像
  全行统一的数据架构,在追求高效率的同时,要降低成本。根据《华为数据之道》中经典的信息架构四大范式,我们将从模型、分布、标准、资产四个角度分析架构使能能力。措施。
  1.型号
  公共层处理频率:公共层存储事实数据、维表数据等,支撑索引体系中的一级索引层。在建立指标时,对维度进行标准化和集约化,提高公共指标的可重用性,减少重复处理操作。因此,公共层数据模型的复用率可以作为评价公共层架构的指标之一。
  应用层引用频率:类似于人际关系网络拓扑结构中的核心图算法,该指标直接衡量数据在应用层的系统重要性,指导资产盘点目标。数据亲属关系是一个有向的、无权重的、自循环的网络图。最常被引用的资产通常来源于关键业务实体最准确、最及时的业务记录。这些资产最有可能被跨部门和业务领域调用,并且所有部门都需要可访问并能够访问相同的数据。索引还可以有效过滤掉“孤表”和临时表,减少资源投入和存储成本。
  
  2.分布
  数据覆盖:对于大型银行来说,数百个系统和数万张表分布在全国各地。收款是资产盘点的第一步。衡量采集数据在整个系统中的覆盖率,有助于我们明确当前采集的进度,定位未采集的数据源。
  数据冗余:数据冗余是指同一层数据的冗余,可以分为两个来源。第一,具有相同含义的数据存储在多个物理位置;其次,架构模型本身在设计中有很多重复的交叉项。
  数据容量:数据容量是对数据中心的整体描述,包括中心当前收录
的整体数据量的绝对值,以及数据量随时间的增长速度。数据容量高低都不理想,需要结合银行现状辩证看待。
  3.标准
  标准的稳定性:数据标准规范数据含义、结构等,应满足内容统一、定义不交叉等条件,避免数据标准内部“数据打架”。
  标准失败率:在标准技术规范完备、主题完整、标准已权威发布的前提下,标准失败率反映了数据标准“最后一公里”的执行情况。借助自动化工具,可以计算数据经过各层、分片后的退订率,智能发现潜在的退订问题。
  4、资产
  技术元数据统计:技术元数据连接源数据和数据仓库,记录数据从产生到消亡的过程。我们选取了系统覆盖率、系统内表级覆盖率、表名和字段名有效性、枚举值有效性等统计指标来表示技术资产在数据结构中的产出效益。
  企业活动命中率:数据资产是从业务流程和业务模型中提取的数字化描述。标签资产对业务行为的命中率、指标资产上报统计的命中率、用户访问上报资产的次数越高,资产内容映射企业活动的准确度越高。
  结论
  随着企业数字化转型的不断深入,“数据治理数字化画像”从方法论到实践都将趋于完善,内容价值、安全性能、用户体验也将随之提升。如何动态衡量数据治理工作的有效性,建立适合自身企业的“北极星指标”,是每一个处于智能化转型阶段的企业都必须研究的,它的成功将创造不可估量的商业价值。

最热门:我Python采集了新榜热门内容,原来这就是别人能成为自媒体大佬的秘密!

采集交流优采云 发表了文章 • 0 个评论 • 215 次浏览 • 2022-11-26 12:16 • 来自相关话题

  最热门:我Python采集了新榜热门内容,原来这就是别人能成为自媒体大佬的秘密!
  什么值得写
  这个功能也很强大。比如你想写科技领域的内容,这个功能会为你推荐该类型的最新热门文章。
  这里只推荐三个功能,其他功能我就不写篇幅介绍了。大家可以自己探索一下,直接进入今天的话题,爬取哪些值得写的推荐热榜文章,学习一下其他搞自媒体的人是怎么写博客的。
  采集
目标
  网站:新列表编辑器
  工具使用
  开发工具:pycharm 开发环境:python3.7、Windows10 工具包:requests、execjs
  项目思路分析
  虽然这个网页放在今天还是比较实用的,以后可以在当前网页上选择合适的内容来写,但是有什么问题呢?网页上的数据都是加密的,辣条真是晚上睡不着。
  首先,爬虫常规操作找到目标数据的接口位置,打开抓包工具查看数据的加载方式,打开抓包工具瞬间数据没了
  
  当前网页应该已经通过开发者工具测试过,将抓包工具作为单独的页面打开
  单独打开是没有问题的。查找文件接口数据,确定请求的url地址
  数据的接口
https://edit.newrank.cn/xdnphb ... erial
  当前接口的请求方式为post,post请求表示需要传输数据
  该项目可以清楚地看到加载的数据的格式、日期和类型。数据页翻过日期。Nonece 和 xyz 是加密数据。简单判断一下,nonece和xyz应该是md5加密的。首先找到nonece和xyz的加密位置,可以使用全局搜索或者xhr断点调试的方法,只要能找到数据的加密位置即可,拉条这里直接使用xhr断点找到数据的发送位置
  通过抓包工具右侧的调用栈找到后续的执行流程。点击一一查看,找出发送的数据是从哪里产生的。传输的数据data是h。现在我们只需要找到h的生成位置即可。h 源自 u。来的u是c函数生成的,nonece,zyz是c函数生成的
  
  在location数据上打断点,查看数据的加载规律,nonece是u方法生成的9个参数中的随机值
  xyz加密后的数据是o的值加上&amp;nonece和nonece,o的参数是url加上appkey加上item的值
  "/xdnphb/editor/articleMaterial/searchArticleMaterial?AppKey=joker&item={"type":"lakh","period":"1#2021-09-18","order":"2","extra":"全部","ranklist_id":"","weixin_id":"","start_time":"2021-09-18"}&nonce=6a65cad87"
  xyz里有很多加密代码,这是什么狗屁东西
  直接搭建环境。不要硬编码js代码。把js代码拷贝到本地,先把加密函数带过来,把整个t函数拿过来本地,自己跑试试看
  大功告成,数据加密方式和加密规则都解决了。现在使用Python集成,向目标URL发送请求,获取数据并保存。js源码大家可以自己去推,只要t函数就可以了。
  显示结果
  外媒:如何让搜索引擎爱上我们的网站
  有句谚语:酒的香气不怕巷子深,但是我们做网站的时候不太喜欢这句话,网站建成后最怕的就是没人知道,更别说把它放在小巷深处了。
  我们创建网站的目的是什么?当然,通过我们的网站让其他人了解我们的公司和产品。如何让网站更好地被别人发现?我们可以通过投放广告或搜索引擎搜索来做到这一点。广告很简单,但成本也相对较高。既然是主动推动,观众未必是我们的准客户。因此,搜索引擎成为我们的主要考虑因素。
  那么搜索引擎如何找到我们呢?这就不得不提我们的主题:搜索引擎优化(SEO),这个概念已经不是什么新鲜事了,百度有大量的教程和培训机构,但仔细一看发现,大家似乎都在谈论怎么做内容,怎么做外部链接,有人说内容为王,外部链接为王, 有人说站组是小站的出路,也有人说聚合页面营销是优化的最佳方式。
  然而,很少有人系统地描述应该在哪个阶段使用这些方法。这导致很多站长看到后,纷纷在自己的网站上设置方法,然后开始每天盯着排名,嘿嘿,怎么还没涨呢!哎呀,排名下降了。各种猜测开始在我脑海中翻腾,我开始怀疑这种方法是否可靠。
  其实,并不是这种方法错了,而是用错了时间。因为SEO要谈的太多了,我就不在这里谈它是什么以及如何做。我说的是如何使用组合拳来创建漂亮的组合,以便我们的网站能够突破并成功获得良好的排名。
  因为SEO的知识涉及面很广,我们会分成几个模块,从网站开始,内部决定外部,无论是人还是搜索引擎他们喜欢一个网站,因为它有素材,在这里你可以知道你想知道什么,那么这就需要我们用心去运营我们的网站, 用心创造内容。那么如何留心呢?
  ▌选择我们的关键词
  关键词是用户通过搜索引擎找到我们的唯一途径,搜索引擎会关键词和我们的网页做一个
  映射关系,在搜索引擎数据库中,关键词是我们网页的代表符号,那么互联网上有那么多相关的内容,一个关键词可能代表非常非常多的页面,我们如何让我们的网页排名第一呢?这就是搜索引擎排名,我们要寻找符合我们的关键词,可能有很多关键词符合我们,我们在选择的时候一定要注意技巧。
  1.不要选择大关键词
  比如我现在负责易观产品的官方网站,我们的产品是大数据分析的,我们的客户在百度会用什么词来找?大数据分析这个词可能是首先想到的,但这个词的价值并不高,为什么?大数据分析知识、大数据分析模型、大数据分析产品等相关关键词可能会引发这个关键词,但对我们来说最有价值的是关键词大数据分析产品,那么我们就不能把精力花在这个大字上,应该把重点放在大数据分析产品这个字眼上。不要说大话,因为大词很难,价值低,而且在吸引客户方面不准确。
  2.挖掘符合我们的长尾关键词
  长尾关键词其实是我们关键词的补充,比如大数据分析产品,
  产品都是对大数据分析的补充,组合成一个新词,这个新词我们还可以挖掘更多的长尾关键词,比如大数据分析产品对比、大数据分析产品价格等等,不同的关键词我们必须有相应的登陆页面。
  如何挖关键词,我们可以通过相关工具帮我们,有很多免费工具供我们选择,国外关键词挖矿工具有谷歌趋势、谷歌搜索控制台等免费工具,国内我比较喜欢用爱站,虽然挖矿比较需要付费,但是免费也可以帮我们挖很多关键词。
  通过该工具,我们可以了解用户最常搜索哪些单词,并过滤掉对我们有价值的关键词作为我们的页面关键词。
  3. 通过竞争网站挖掘有价值的关键词
  这种方法需要我们打开我们友好的网站,看看他们的栏目页面标题(页面标题)用了什么关键词,你可以在搜索引擎搜索框中输入site:域名,看看他们的标题用了什么关键词,记录这些关键词,朋友是对手和老师,他们选择的关键词也会成为我们选词的关键参考。
  ▌ 结构优化,让搜索引擎进来谈恋爱搜索引擎通过自己的爬虫
  抓取我们的页面,比如百度的百度蜘蛛、谷歌的Googlebot等搜索引擎也有自己的爬虫,我们不再赘述。这些爬虫是帮助我们的网站被搜索引擎索引的好朋友,我们希望提供良好的服务。
  
  他们更喜欢网页
  符合W3C标准和结构规范的,比如文本很多,没有死胡同的页面,他们很懒惰,他们想知道哪个是主题,哪个是次要内容。没错,他们就是那么聪明和温暖。如何娱乐他们?
  1. TDK优化
  T:标题,是我们的页面标题,这个
  是它了解这个页面的第一个角度,我们希望用户用什么关键词来搜索这个页面,那么这里必须放相关的关键词。重要性不言而喻。
  D:描述,页面介绍,
  更实用的是,当页面在搜索引擎列表中时,这里可以简单总结一下我们做了什么,有的会把手机放在这里,方便直接沟通。
  K:关键词,关键词,现在存在的意义很低,你可以把我们页面的关键词放在这里,虽然没用。
  尤其是标题,我们要关注,里面的字,是直接决定我们能不能被搜索到的关键。
  2. 页面内容布局
  如前所述,网页的标题是蜘蛛判断我们页面做什么的中心点,所以我们页面的内容应该围绕这个主题开发。
  这里要提到的是关键词密度,我们的内容必须收录
这个标题的关键词,密度应该在2%到8%之间。否则,如果关键词写,这个标题就不会排名很好。
  3. H1标签不应被滥用
  我们在写页面的时候,往往不会考虑HTML元素的组合和使用,因为我们可以重置HTML原生的所有样式,即使我们用错了元素,页面渲染的效果还是那么漂亮,但是这里要说的是,我们的小蜘蛛很敏感,看元素用法不规范, 光不高兴,重的转身离开。所以我们要规范使用,最重要的是这个H1标签,
  我们都知道H1标签是识别主题的意思,当蜘蛛看到这个标签时,它会默认这个是当前页面的标题,
  和我们的标题A级,但是如果这个页面出现多个H1,蜘蛛就糊涂了,不明白这个页面的中心思想是哪个,要么随便找一个作为标题,要么直接去下一页。因此请记住,一个页面只有一个 H1 标签,所有其他副标题都替换为 H2,H3 用于较低级别。
  4. 导航结构设计
  网站导航是
  一般整个网站统一,有些企业网站会在导航上放一个首页,而且是排在第一位的,其实是可以删除的,但是为了方便用户返回首页一般很多人都这么放,如果有这个首页的字眼,建议不跟着链接, 为了不希望主页有这样的关键词。
  导航的位置非常重要,他是蜘蛛爬行的入口,导航
  级别越浅,蜘蛛收录
页面的概率就越高,所以把我们的核心页面放在导航入口是非常重要的,导航也是蜘蛛反复旅行的重要通道,也是很好的内在链接。
  导航这里记得用js动态加载分类,因为爬虫无法识别js动态加载的内容,如果二级分类是放在鼠标上出现,那么一定要在源码中拥有这个二级内容,只是暂时隐藏。不要通过数据请求获取它。
  
  5. 徽标部分优化
  每个网站的logo都有,但是这里往往很多人不会好好处理,因为这里一般都放的是首页地址,所以一般没有任何文字,一张图片链接到首页,往往区分权重,这里和导航首页关键词一样应该是链接地址做nofollow,首页是我们网站权重最大的地方, 我们期望他的入口都按照我们规定的关键词,就像一条水道,保持水流速的最好办法就是避免太多的间隙,这就是道理。
  6. 所有出站链接都应不关注
  网站一般都有备案信息,链接到国家工业和信息化局的网站,这样的链接要么被删除,要么不予关注,不允许分我们的权重。确保我们收录
的运河是最大的,并且水量按照我们计划的方向流动。引导蜘蛛正确行走并抓取抓取的页面。
  蜘蛛怎么能不喜欢这样具有标准化页面、清晰入口和清晰说明的网页?
  ▌ 借助工具,不断优化网站
  这里不得不提的是方舟是如何帮助我们优化方舟官网的,一个好的工具确实可以让我们事半功倍,当我们离开工具的时候,往往依靠以往的经验和猜测,通过测试来验证想法,这个过程往往需要很长时间。也可能有不准确的数据影响我们的判断,因此我们需要一个方便的工具。帮助我们及时发现问题,并在第一时间做出数据反馈,帮助我们及时改进。
  方舟的热图分析工具帮助我们做出结构匹配决策,一旦我们讨论过,体验一下旁边的演示按钮,是否会区分用户点击演示按钮,将下载按钮替换为一行文字也不会更好,当我们打开热图分析时,数据已经告诉我们结果。
  当我们进行页面的响应式设计时,我们在方舟事件分析中参考了设备纬度,以告诉我们应该关注哪些终端体验。
  知道哪些搜索引擎来得更多,针对相应的渠道进行优化,精准高效。
  我们可以计划下一次大迭代应该通过爬虫的访问时间和周期,这样爬虫就可以在第一时间更新我们的内容,爬虫访问的频率直观地呈现在我们眼前,通过查看过去的系统日志,爬虫轨迹已经成为历史。
  ▌ 坚持原著,蜘蛛的胃口越来越好
  优化是消除爬虫的障碍
  来到我们的网站,内容就是像我们这样的爬虫的根,没有内容结构是没用的,内容很差,都是抄袭的文章,爬虫不会收录这些页面,所以坚持原创内容留住这个小宝贝。
  搜索引擎最近升级了好几次,对文章相似度的判断越来越准确,过去大家调整了段落的顺序,把里面的字改成了原创,这就要求我们不要投机取巧,用心去创造。
  由于篇幅所限,很难写完一篇关于网站优化的文章,以及内部链接关键词、面包屑、图片技巧、页面聚合等知识点,我们会放在下一篇文章中。本文主要讲结构优化,关键词挖掘,导航技巧和内容,这也是我们网站前期要做好的几点。前面说的,方法没有好坏之分,关键是要用对的时机,希望大家在新网站开局就注意这些要点。
  易观Argo现已免费使用,有兴趣的同学可点击阅读原文下载安装,或扫描下方二维码试用。体验易观Argo带给我们优化网站的快感。
  在
  原创
文章上盖章,下载并安装易观Argo 查看全部

  最热门:我Python采集了新榜热门内容,原来这就是别人能成为自媒体大佬的秘密!
  什么值得写
  这个功能也很强大。比如你想写科技领域的内容,这个功能会为你推荐该类型的最新热门文章。
  这里只推荐三个功能,其他功能我就不写篇幅介绍了。大家可以自己探索一下,直接进入今天的话题,爬取哪些值得写的推荐热榜文章,学习一下其他搞自媒体的人是怎么写博客的。
  采集
目标
  网站:新列表编辑器
  工具使用
  开发工具:pycharm 开发环境:python3.7、Windows10 工具包:requests、execjs
  项目思路分析
  虽然这个网页放在今天还是比较实用的,以后可以在当前网页上选择合适的内容来写,但是有什么问题呢?网页上的数据都是加密的,辣条真是晚上睡不着。
  首先,爬虫常规操作找到目标数据的接口位置,打开抓包工具查看数据的加载方式,打开抓包工具瞬间数据没了
  
  当前网页应该已经通过开发者工具测试过,将抓包工具作为单独的页面打开
  单独打开是没有问题的。查找文件接口数据,确定请求的url地址
  数据的接口
https://edit.newrank.cn/xdnphb ... erial
  当前接口的请求方式为post,post请求表示需要传输数据
  该项目可以清楚地看到加载的数据的格式、日期和类型。数据页翻过日期。Nonece 和 xyz 是加密数据。简单判断一下,nonece和xyz应该是md5加密的。首先找到nonece和xyz的加密位置,可以使用全局搜索或者xhr断点调试的方法,只要能找到数据的加密位置即可,拉条这里直接使用xhr断点找到数据的发送位置
  通过抓包工具右侧的调用栈找到后续的执行流程。点击一一查看,找出发送的数据是从哪里产生的。传输的数据data是h。现在我们只需要找到h的生成位置即可。h 源自 u。来的u是c函数生成的,nonece,zyz是c函数生成的
  
  在location数据上打断点,查看数据的加载规律,nonece是u方法生成的9个参数中的随机值
  xyz加密后的数据是o的值加上&amp;nonece和nonece,o的参数是url加上appkey加上item的值
  "/xdnphb/editor/articleMaterial/searchArticleMaterial?AppKey=joker&item={"type":"lakh","period":"1#2021-09-18","order":"2","extra":"全部","ranklist_id":"","weixin_id":"","start_time":"2021-09-18"}&nonce=6a65cad87"
  xyz里有很多加密代码,这是什么狗屁东西
  直接搭建环境。不要硬编码js代码。把js代码拷贝到本地,先把加密函数带过来,把整个t函数拿过来本地,自己跑试试看
  大功告成,数据加密方式和加密规则都解决了。现在使用Python集成,向目标URL发送请求,获取数据并保存。js源码大家可以自己去推,只要t函数就可以了。
  显示结果
  外媒:如何让搜索引擎爱上我们的网站
  有句谚语:酒的香气不怕巷子深,但是我们做网站的时候不太喜欢这句话,网站建成后最怕的就是没人知道,更别说把它放在小巷深处了。
  我们创建网站的目的是什么?当然,通过我们的网站让其他人了解我们的公司和产品。如何让网站更好地被别人发现?我们可以通过投放广告或搜索引擎搜索来做到这一点。广告很简单,但成本也相对较高。既然是主动推动,观众未必是我们的准客户。因此,搜索引擎成为我们的主要考虑因素。
  那么搜索引擎如何找到我们呢?这就不得不提我们的主题:搜索引擎优化(SEO),这个概念已经不是什么新鲜事了,百度有大量的教程和培训机构,但仔细一看发现,大家似乎都在谈论怎么做内容,怎么做外部链接,有人说内容为王,外部链接为王, 有人说站组是小站的出路,也有人说聚合页面营销是优化的最佳方式。
  然而,很少有人系统地描述应该在哪个阶段使用这些方法。这导致很多站长看到后,纷纷在自己的网站上设置方法,然后开始每天盯着排名,嘿嘿,怎么还没涨呢!哎呀,排名下降了。各种猜测开始在我脑海中翻腾,我开始怀疑这种方法是否可靠。
  其实,并不是这种方法错了,而是用错了时间。因为SEO要谈的太多了,我就不在这里谈它是什么以及如何做。我说的是如何使用组合拳来创建漂亮的组合,以便我们的网站能够突破并成功获得良好的排名。
  因为SEO的知识涉及面很广,我们会分成几个模块,从网站开始,内部决定外部,无论是人还是搜索引擎他们喜欢一个网站,因为它有素材,在这里你可以知道你想知道什么,那么这就需要我们用心去运营我们的网站, 用心创造内容。那么如何留心呢?
  ▌选择我们的关键词
  关键词是用户通过搜索引擎找到我们的唯一途径,搜索引擎会关键词和我们的网页做一个
  映射关系,在搜索引擎数据库中,关键词是我们网页的代表符号,那么互联网上有那么多相关的内容,一个关键词可能代表非常非常多的页面,我们如何让我们的网页排名第一呢?这就是搜索引擎排名,我们要寻找符合我们的关键词,可能有很多关键词符合我们,我们在选择的时候一定要注意技巧。
  1.不要选择大关键词
  比如我现在负责易观产品的官方网站,我们的产品是大数据分析的,我们的客户在百度会用什么词来找?大数据分析这个词可能是首先想到的,但这个词的价值并不高,为什么?大数据分析知识、大数据分析模型、大数据分析产品等相关关键词可能会引发这个关键词,但对我们来说最有价值的是关键词大数据分析产品,那么我们就不能把精力花在这个大字上,应该把重点放在大数据分析产品这个字眼上。不要说大话,因为大词很难,价值低,而且在吸引客户方面不准确。
  2.挖掘符合我们的长尾关键词
  长尾关键词其实是我们关键词的补充,比如大数据分析产品,
  产品都是对大数据分析的补充,组合成一个新词,这个新词我们还可以挖掘更多的长尾关键词,比如大数据分析产品对比、大数据分析产品价格等等,不同的关键词我们必须有相应的登陆页面。
  如何挖关键词,我们可以通过相关工具帮我们,有很多免费工具供我们选择,国外关键词挖矿工具有谷歌趋势、谷歌搜索控制台等免费工具,国内我比较喜欢用爱站,虽然挖矿比较需要付费,但是免费也可以帮我们挖很多关键词。
  通过该工具,我们可以了解用户最常搜索哪些单词,并过滤掉对我们有价值的关键词作为我们的页面关键词。
  3. 通过竞争网站挖掘有价值的关键词
  这种方法需要我们打开我们友好的网站,看看他们的栏目页面标题(页面标题)用了什么关键词,你可以在搜索引擎搜索框中输入site:域名,看看他们的标题用了什么关键词,记录这些关键词,朋友是对手和老师,他们选择的关键词也会成为我们选词的关键参考。
  ▌ 结构优化,让搜索引擎进来谈恋爱搜索引擎通过自己的爬虫
  抓取我们的页面,比如百度的百度蜘蛛、谷歌的Googlebot等搜索引擎也有自己的爬虫,我们不再赘述。这些爬虫是帮助我们的网站被搜索引擎索引的好朋友,我们希望提供良好的服务。
  
  他们更喜欢网页
  符合W3C标准和结构规范的,比如文本很多,没有死胡同的页面,他们很懒惰,他们想知道哪个是主题,哪个是次要内容。没错,他们就是那么聪明和温暖。如何娱乐他们?
  1. TDK优化
  T:标题,是我们的页面标题,这个
  是它了解这个页面的第一个角度,我们希望用户用什么关键词来搜索这个页面,那么这里必须放相关的关键词。重要性不言而喻。
  D:描述,页面介绍,
  更实用的是,当页面在搜索引擎列表中时,这里可以简单总结一下我们做了什么,有的会把手机放在这里,方便直接沟通。
  K:关键词,关键词,现在存在的意义很低,你可以把我们页面的关键词放在这里,虽然没用。
  尤其是标题,我们要关注,里面的字,是直接决定我们能不能被搜索到的关键。
  2. 页面内容布局
  如前所述,网页的标题是蜘蛛判断我们页面做什么的中心点,所以我们页面的内容应该围绕这个主题开发。
  这里要提到的是关键词密度,我们的内容必须收录
这个标题的关键词,密度应该在2%到8%之间。否则,如果关键词写,这个标题就不会排名很好。
  3. H1标签不应被滥用
  我们在写页面的时候,往往不会考虑HTML元素的组合和使用,因为我们可以重置HTML原生的所有样式,即使我们用错了元素,页面渲染的效果还是那么漂亮,但是这里要说的是,我们的小蜘蛛很敏感,看元素用法不规范, 光不高兴,重的转身离开。所以我们要规范使用,最重要的是这个H1标签,
  我们都知道H1标签是识别主题的意思,当蜘蛛看到这个标签时,它会默认这个是当前页面的标题,
  和我们的标题A级,但是如果这个页面出现多个H1,蜘蛛就糊涂了,不明白这个页面的中心思想是哪个,要么随便找一个作为标题,要么直接去下一页。因此请记住,一个页面只有一个 H1 标签,所有其他副标题都替换为 H2,H3 用于较低级别。
  4. 导航结构设计
  网站导航是
  一般整个网站统一,有些企业网站会在导航上放一个首页,而且是排在第一位的,其实是可以删除的,但是为了方便用户返回首页一般很多人都这么放,如果有这个首页的字眼,建议不跟着链接, 为了不希望主页有这样的关键词。
  导航的位置非常重要,他是蜘蛛爬行的入口,导航
  级别越浅,蜘蛛收录
页面的概率就越高,所以把我们的核心页面放在导航入口是非常重要的,导航也是蜘蛛反复旅行的重要通道,也是很好的内在链接。
  导航这里记得用js动态加载分类,因为爬虫无法识别js动态加载的内容,如果二级分类是放在鼠标上出现,那么一定要在源码中拥有这个二级内容,只是暂时隐藏。不要通过数据请求获取它。
  
  5. 徽标部分优化
  每个网站的logo都有,但是这里往往很多人不会好好处理,因为这里一般都放的是首页地址,所以一般没有任何文字,一张图片链接到首页,往往区分权重,这里和导航首页关键词一样应该是链接地址做nofollow,首页是我们网站权重最大的地方, 我们期望他的入口都按照我们规定的关键词,就像一条水道,保持水流速的最好办法就是避免太多的间隙,这就是道理。
  6. 所有出站链接都应不关注
  网站一般都有备案信息,链接到国家工业和信息化局的网站,这样的链接要么被删除,要么不予关注,不允许分我们的权重。确保我们收录
的运河是最大的,并且水量按照我们计划的方向流动。引导蜘蛛正确行走并抓取抓取的页面。
  蜘蛛怎么能不喜欢这样具有标准化页面、清晰入口和清晰说明的网页?
  ▌ 借助工具,不断优化网站
  这里不得不提的是方舟是如何帮助我们优化方舟官网的,一个好的工具确实可以让我们事半功倍,当我们离开工具的时候,往往依靠以往的经验和猜测,通过测试来验证想法,这个过程往往需要很长时间。也可能有不准确的数据影响我们的判断,因此我们需要一个方便的工具。帮助我们及时发现问题,并在第一时间做出数据反馈,帮助我们及时改进。
  方舟的热图分析工具帮助我们做出结构匹配决策,一旦我们讨论过,体验一下旁边的演示按钮,是否会区分用户点击演示按钮,将下载按钮替换为一行文字也不会更好,当我们打开热图分析时,数据已经告诉我们结果。
  当我们进行页面的响应式设计时,我们在方舟事件分析中参考了设备纬度,以告诉我们应该关注哪些终端体验。
  知道哪些搜索引擎来得更多,针对相应的渠道进行优化,精准高效。
  我们可以计划下一次大迭代应该通过爬虫的访问时间和周期,这样爬虫就可以在第一时间更新我们的内容,爬虫访问的频率直观地呈现在我们眼前,通过查看过去的系统日志,爬虫轨迹已经成为历史。
  ▌ 坚持原著,蜘蛛的胃口越来越好
  优化是消除爬虫的障碍
  来到我们的网站,内容就是像我们这样的爬虫的根,没有内容结构是没用的,内容很差,都是抄袭的文章,爬虫不会收录这些页面,所以坚持原创内容留住这个小宝贝。
  搜索引擎最近升级了好几次,对文章相似度的判断越来越准确,过去大家调整了段落的顺序,把里面的字改成了原创,这就要求我们不要投机取巧,用心去创造。
  由于篇幅所限,很难写完一篇关于网站优化的文章,以及内部链接关键词、面包屑、图片技巧、页面聚合等知识点,我们会放在下一篇文章中。本文主要讲结构优化,关键词挖掘,导航技巧和内容,这也是我们网站前期要做好的几点。前面说的,方法没有好坏之分,关键是要用对的时机,希望大家在新网站开局就注意这些要点。
  易观Argo现已免费使用,有兴趣的同学可点击阅读原文下载安装,或扫描下方二维码试用。体验易观Argo带给我们优化网站的快感。
  在
  原创
文章上盖章,下载并安装易观Argo

福利:淘宝官方发货的微信小程序值得推荐吗?-月锋

采集交流优采云 发表了文章 • 0 个评论 • 41 次浏览 • 2022-11-25 08:32 • 来自相关话题

  福利:淘宝官方发货的微信小程序值得推荐吗?-月锋
  文章采集软件app:下载地址::软件使用步骤:
  1、用户可以通过软件完成图片录入,图片文件的格式转换,文字识别,标题识别,字体压缩等,
  
  2、软件支持添加不同文件作为自动机来运行,
  3、软件可以无需设置环境变量直接启动软件,
  4、按软件提示设置无线网卡,以后使用小程序时就可以不用再下载更多软件了!软件地址::,快速采集天猫、京东等一些知名网店的商品。
  
  【收集一些】云采集工具
  【已上传部分】
  有没有哪款也可以一键云采集淘宝图片的工具?-月锋的回答有哪些淘宝官方发货的微信小程序值得推荐?-月锋的回答自己做了一个小程序:采集下单的
  谢邀。题主有收集摄影类的图片吗?如果有的话,推荐一下优采云
采集器,免费、且采集效率高。此外还有可以试试雪球网,基本上想查某个网页的信息都可以找到,基本上国内外网站都能搜到。--如果不能满足题主需求,有没有免费又好用的工具?我用过一段时间,像爱采购这些,还是不能满足需求。 查看全部

  福利:淘宝官方发货的微信小程序值得推荐吗?-月锋
  文章采集软件app:下载地址::软件使用步骤:
  1、用户可以通过软件完成图片录入,图片文件的格式转换,文字识别,标题识别,字体压缩等,
  
  2、软件支持添加不同文件作为自动机来运行,
  3、软件可以无需设置环境变量直接启动软件,
  4、按软件提示设置无线网卡,以后使用小程序时就可以不用再下载更多软件了!软件地址::,快速采集天猫、京东等一些知名网店的商品。
  
  【收集一些】云采集工具
  【已上传部分】
  有没有哪款也可以一键云采集淘宝图片的工具?-月锋的回答有哪些淘宝官方发货的微信小程序值得推荐?-月锋的回答自己做了一个小程序:采集下单的
  谢邀。题主有收集摄影类的图片吗?如果有的话,推荐一下优采云
采集器,免费、且采集效率高。此外还有可以试试雪球网,基本上想查某个网页的信息都可以找到,基本上国内外网站都能搜到。--如果不能满足题主需求,有没有免费又好用的工具?我用过一段时间,像爱采购这些,还是不能满足需求。

事实:一个自定义的appstore,到底哪个好看呢?(组图)

采集交流优采云 发表了文章 • 0 个评论 • 43 次浏览 • 2022-11-24 06:11 • 来自相关话题

  事实:一个自定义的appstore,到底哪个好看呢?(组图)
  文章采集软件appstore的名字在下图红框位置(软件名称均来自appleglobalappstorestore)点击进入后选择【图标】-【创建appstore】-【图标】系统自动把最新的名称和描述传入,接下来我们点击【下载】。点击下载,就是下载完成的画面!在这个截图的当中找到一个自己需要的【图标】,如上图的酒杯。
  
  在桌面上将酒杯图标拖入我们的appstore,如下图,将已有的图标全部点开。接下来就可以进行自定义appstore,我们在左侧选择store里面的一个app,如上图选择的是【appstore上的应用程序】,这个应用程序我们在桌面可以看到的,如下图。接下来,就是继续进行自定义appstore,我们点击我们的【应用程序】,然后把【信息】发给我们需要进行自定义的appstore。
  
  接下来的操作是点击上方【我的】进行个人信息的注册登陆。完成以上操作,我们在appstore上看到的就是一个自定义的appstore!如果你要挑选最好看的appstore,其实这两个都不错,就是有时候不知道哪个好看了,最好看的appstore就是appstore自带的应用商店,里面有最新和最美的应用。那么好看的appstore到底哪个好看呢?这个就不是靠一篇文章就能说完的,最好的appstore还是要自己亲自去发掘。
  毕竟appstore里面大部分都是免费的,当然每个人可能都会有自己的偏好,或者喜欢收费的。我喜欢最美的应用,所以我选择了最美的appstore!。 查看全部

  事实:一个自定义的appstore,到底哪个好看呢?(组图)
  文章采集软件appstore的名字在下图红框位置(软件名称均来自appleglobalappstorestore)点击进入后选择【图标】-【创建appstore】-【图标】系统自动把最新的名称和描述传入,接下来我们点击【下载】。点击下载,就是下载完成的画面!在这个截图的当中找到一个自己需要的【图标】,如上图的酒杯。
  
  在桌面上将酒杯图标拖入我们的appstore,如下图,将已有的图标全部点开。接下来就可以进行自定义appstore,我们在左侧选择store里面的一个app,如上图选择的是【appstore上的应用程序】,这个应用程序我们在桌面可以看到的,如下图。接下来,就是继续进行自定义appstore,我们点击我们的【应用程序】,然后把【信息】发给我们需要进行自定义的appstore。
  
  接下来的操作是点击上方【我的】进行个人信息的注册登陆。完成以上操作,我们在appstore上看到的就是一个自定义的appstore!如果你要挑选最好看的appstore,其实这两个都不错,就是有时候不知道哪个好看了,最好看的appstore就是appstore自带的应用商店,里面有最新和最美的应用。那么好看的appstore到底哪个好看呢?这个就不是靠一篇文章就能说完的,最好的appstore还是要自己亲自去发掘。
  毕竟appstore里面大部分都是免费的,当然每个人可能都会有自己的偏好,或者喜欢收费的。我喜欢最美的应用,所以我选择了最美的appstore!。

事实:打开摄像头找美女或者帅哥合成自己需要的信息截图

采集交流优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2022-11-23 20:25 • 来自相关话题

  事实:打开摄像头找美女或者帅哥合成自己需要的信息截图
  文章采集软件appfuture,可以给朋友圈发布的广告添加自定义的图片,点击mark即可保存。
  把需要的信息截图下来,然后用按钮也可以了。ps:我的网站里面也有你需要的信息。
  上有个插件叫weixin,叫啥不记得了,
  有趣的问题,
  
  目前貌似没有具体可行的插件。题主自己动手丰衣足食,应该很快就能找到想要的。
  打开摄像头,
  同问啊,怎么让别人帮忙扩个图,找好多都不行,
  苹果安卓都可以哦,不过要转发给好友,如果想自己制作类似的,可以直接去打开摄像头找美女或者帅哥合成自己需要的图片,
  楼主可以试试,一直从事图片的工作,这个是可以实现的,要求也不高,就是你的照片要足够吸引人,
  
  找我就行了,免费的。
  搜索一下,现在已经有了,但我不知道叫什么名字,
  来看看我制作的的吧
  像下面这个差不多可以了
  如果你真的想弄,可以直接百度一下,有很多制作教程。另外我觉得这种年轻人制作图片,大多是直接把照片转换成动态gif格式的,再下载,分享。这种要求应该不高。图片来源于网络, 查看全部

  事实:打开摄像头找美女或者帅哥合成自己需要的信息截图
  文章采集软件appfuture,可以给朋友圈发布的广告添加自定义的图片,点击mark即可保存。
  把需要的信息截图下来,然后用按钮也可以了。ps:我的网站里面也有你需要的信息。
  上有个插件叫weixin,叫啥不记得了,
  有趣的问题,
  
  目前貌似没有具体可行的插件。题主自己动手丰衣足食,应该很快就能找到想要的。
  打开摄像头,
  同问啊,怎么让别人帮忙扩个图,找好多都不行,
  苹果安卓都可以哦,不过要转发给好友,如果想自己制作类似的,可以直接去打开摄像头找美女或者帅哥合成自己需要的图片,
  楼主可以试试,一直从事图片的工作,这个是可以实现的,要求也不高,就是你的照片要足够吸引人,
  
  找我就行了,免费的。
  搜索一下,现在已经有了,但我不知道叫什么名字,
  来看看我制作的的吧
  像下面这个差不多可以了
  如果你真的想弄,可以直接百度一下,有很多制作教程。另外我觉得这种年轻人制作图片,大多是直接把照片转换成动态gif格式的,再下载,分享。这种要求应该不高。图片来源于网络,

完整解决方案:采集南阳核酸检测app

采集交流优采云 发表了文章 • 0 个评论 • 302 次浏览 • 2022-11-22 17:17 • 来自相关话题

  完整解决方案:采集南阳核酸检测app
  新版合集app::8096/tool/nycj10950.apk分享给大家。这是专门为南洋核酸检测志愿者打造的掌上服务平台。通过本软件,您可以方便的采集
前来做核酸检测的核酸居民信息,提高核酸检测水平。检测效率高,有需要的用户快来yx007下载吧!
  采集
南洋软件介绍
  通过扫码方式进行数据录入和采集,还可以方便后续查询,提高医护人员的采集效率。这里还有相关的学习资料,欢迎使用。
  采集
南洋软件特色
  1、通过信息采集一体机自动识别二代居民身份证信息,并自动录入。
  2、用户可以通过软件注册核酸信息,查询核酸结果,非常方便。
  
  3、采样完成后,24小时内可获得检测结果报告,可直接查询。
  采集
南洋软件功能
  1.享受更便捷的采集,手机查看数据,体验各种服务。
  2、用户可以直接使用身份查询信息,可以了解各种采样记录。
  3、健康管理质量高,及时了解各种医疗信息,更好的管理。
  南洋软件亮点集锦
  
  1、集群服务,提供最全面的服务,推荐最热门的应用
  2.全程评价,服务好不好,流程快不快,请打分
  3.个性化订阅,按需订阅喜欢的应用
  南洋软件评测合集
  1、为用户带来更多好用的方式,随时满足采集
需求。
  2、各地区的风险登记查询都很好,使用方便简单。
  3、软件方便采集
报名信息,同时每天实时更新,将最新的动态推送给大家。
  解决方案:【CLS数据淘金第四期】网络流日志-云联网日志分析
  【CLS数据淘金第四期】网络流量日志-云网络日志分析
  日志服务 CLS
  腾讯云开发者
  Qcloud社区
  腾讯云官方社区号,汇聚技术开发者,分享技术干货,打造技术影响力交流社区。
  发表于
  收录
在集合中
  介绍
  Cloud Connect Network(CCN)覆盖全球20+区域,提供云上专有网络(VPC)、VPC与本地数据中心(IDC)内网互联服务,具备全网多点互联和路由能力如自学习、链路选择、故障快速收敛等。
  用户可以使用云日志服务(CLS)更快速、方便地采集
云网络流量日志,通过CLS提供的搜索分析、仪表盘、告警等功能,发现和定位云网络问题,支持业务服务。
  云联网流日志分析场景
  (一)预警业务问题
  小秦是某在线教育产品的运维人员。在线教育师生分布在多个地域,VPC较多。直播平台需要构建覆盖多个区域的高质量互联互通,确保跨区域的视频和语音传输清晰无延迟。
  在这种情况下,云联网服务就成了最佳选择。
  使用云组网后,远在天边的老师和同学终于可以无延迟地沟通了。但在课程高峰期,由于带宽限制,仍有部分学员出现卡顿现象。为了保证服务质量,需要在流量激增时及时检测并扩容。
  
  为此,小秦通过CLS日志服务对云联网流量日志进行监控和告警。监控拒绝流量的百分比。
  如图所示,每隔5分钟,查询最近5分钟被拒绝流量的比例。当比率大于 1% 时,将触发警报。声明如下:
  log-status:OK | select round(sum(case when action = 'REJECT' then 1.00 else 0.00 end) / cast(count(*) as double) * 100,2) as "reject占比(%)"
  (二)定位并解决业务问题
  一转眼,又是一个开学季。这一天,小琴的手机和邮箱都收到了云网拒绝流量比例的告警通知。
  小琴打开了CLS的CCN Flow Log_Advanced Analysis Dashboard,过滤掉最上面流量类型为REJECT(拒绝)的流日志。
  再查看被拒流量的线路分布,发现主要集中在ap-guangzhou和ap-shanghai之间。
  分析语句如下:
  log-status:OK | select concat(concat('srcRegion : ',srcregionid, ' , dstRegion : '), dstregionid) as region, sum(bytes) as bytes group by region order by bytes desc limit 20
  小秦查看了被拒绝流量的源IP和目的IP分布,发现IP对分布均匀,排除了个别IP恶意占用带宽的情况。
  分析语句如下:
  log-status:OK | select sum(bytes) as total, concat(concat('srcIP : ',srcaddr, ' , dstIP : '), dstaddr) as region_ip group by region_ip order by total desc limit 20
  接下来,小琴查看了被拒绝流量的协议分布和端口分布。协议和端口占比不集中在某一类,排除因协议和端口原因被拒。
  
  分析语句如下:
  log-status:OK | select sum(bytes) as bytes,concat(concat(concat(cast(protocol as varchar),' srcport:'),srcport,' dstport:'),dstport) as protocol group by protocol limit 10
  最后,小秦认为,本次拒绝流量比例上升,是由于正常使用线路的用户数量激增,需要进行带宽扩容。
  于是小秦查看了线路的带宽趋势。发现ap-guangzhou TO ap-shanghai线和ap-shanghai TO ap-guangzhou线目前峰值在7Gb/s左右。
  分析语句如下:
  log-status:OK | select histogram(cast(__TIMESTAMP__ as timestamp), interval 1 MINUTE) as time, sum(bytes)/60.00*8 as bandwidth, concat(concat('srcRegion : ',srcregionid, ' , dstRegion : '), dstregionid) as region_ip group by time, region_ip limit 10000
  带着以上结论,小琴登录腾讯云联网控制台,调整了两条线路的带宽上限,很快就解决了业务问题!为学生提供高质量的学习体验。
  演示体验
  CLS日志服务免费提供CCN云联网流量日志Demo快速体验,一键开箱即用,CCN检索分析全景体验,预设仪表盘,实时告警等功能。
  产品使用问题和技术咨询,欢迎加入CLS粉丝群,直接与日志达人1v1对话。还有很多粉丝福利,快来加入我们吧。
  欢迎关注“腾讯云开发者”,期待您的“围观”~
  预览时无法单击选项卡 查看全部

  完整解决方案:采集南阳核酸检测app
  新版合集app::8096/tool/nycj10950.apk分享给大家。这是专门为南洋核酸检测志愿者打造的掌上服务平台。通过本软件,您可以方便的采集
前来做核酸检测的核酸居民信息,提高核酸检测水平。检测效率高,有需要的用户快来yx007下载吧!
  采集
南洋软件介绍
  通过扫码方式进行数据录入和采集,还可以方便后续查询,提高医护人员的采集效率。这里还有相关的学习资料,欢迎使用。
  采集
南洋软件特色
  1、通过信息采集一体机自动识别二代居民身份证信息,并自动录入。
  2、用户可以通过软件注册核酸信息,查询核酸结果,非常方便。
  
  3、采样完成后,24小时内可获得检测结果报告,可直接查询。
  采集
南洋软件功能
  1.享受更便捷的采集,手机查看数据,体验各种服务。
  2、用户可以直接使用身份查询信息,可以了解各种采样记录。
  3、健康管理质量高,及时了解各种医疗信息,更好的管理。
  南洋软件亮点集锦
  
  1、集群服务,提供最全面的服务,推荐最热门的应用
  2.全程评价,服务好不好,流程快不快,请打分
  3.个性化订阅,按需订阅喜欢的应用
  南洋软件评测合集
  1、为用户带来更多好用的方式,随时满足采集
需求。
  2、各地区的风险登记查询都很好,使用方便简单。
  3、软件方便采集
报名信息,同时每天实时更新,将最新的动态推送给大家。
  解决方案:【CLS数据淘金第四期】网络流日志-云联网日志分析
  【CLS数据淘金第四期】网络流量日志-云网络日志分析
  日志服务 CLS
  腾讯云开发者
  Qcloud社区
  腾讯云官方社区号,汇聚技术开发者,分享技术干货,打造技术影响力交流社区。
  发表于
  收录
在集合中
  介绍
  Cloud Connect Network(CCN)覆盖全球20+区域,提供云上专有网络(VPC)、VPC与本地数据中心(IDC)内网互联服务,具备全网多点互联和路由能力如自学习、链路选择、故障快速收敛等。
  用户可以使用云日志服务(CLS)更快速、方便地采集
云网络流量日志,通过CLS提供的搜索分析、仪表盘、告警等功能,发现和定位云网络问题,支持业务服务。
  云联网流日志分析场景
  (一)预警业务问题
  小秦是某在线教育产品的运维人员。在线教育师生分布在多个地域,VPC较多。直播平台需要构建覆盖多个区域的高质量互联互通,确保跨区域的视频和语音传输清晰无延迟。
  在这种情况下,云联网服务就成了最佳选择。
  使用云组网后,远在天边的老师和同学终于可以无延迟地沟通了。但在课程高峰期,由于带宽限制,仍有部分学员出现卡顿现象。为了保证服务质量,需要在流量激增时及时检测并扩容。
  
  为此,小秦通过CLS日志服务对云联网流量日志进行监控和告警。监控拒绝流量的百分比。
  如图所示,每隔5分钟,查询最近5分钟被拒绝流量的比例。当比率大于 1% 时,将触发警报。声明如下:
  log-status:OK | select round(sum(case when action = 'REJECT' then 1.00 else 0.00 end) / cast(count(*) as double) * 100,2) as "reject占比(%)"
  (二)定位并解决业务问题
  一转眼,又是一个开学季。这一天,小琴的手机和邮箱都收到了云网拒绝流量比例的告警通知。
  小琴打开了CLS的CCN Flow Log_Advanced Analysis Dashboard,过滤掉最上面流量类型为REJECT(拒绝)的流日志。
  再查看被拒流量的线路分布,发现主要集中在ap-guangzhou和ap-shanghai之间。
  分析语句如下:
  log-status:OK | select concat(concat('srcRegion : ',srcregionid, ' , dstRegion : '), dstregionid) as region, sum(bytes) as bytes group by region order by bytes desc limit 20
  小秦查看了被拒绝流量的源IP和目的IP分布,发现IP对分布均匀,排除了个别IP恶意占用带宽的情况。
  分析语句如下:
  log-status:OK | select sum(bytes) as total, concat(concat('srcIP : ',srcaddr, ' , dstIP : '), dstaddr) as region_ip group by region_ip order by total desc limit 20
  接下来,小琴查看了被拒绝流量的协议分布和端口分布。协议和端口占比不集中在某一类,排除因协议和端口原因被拒。
  
  分析语句如下:
  log-status:OK | select sum(bytes) as bytes,concat(concat(concat(cast(protocol as varchar),' srcport:'),srcport,' dstport:'),dstport) as protocol group by protocol limit 10
  最后,小秦认为,本次拒绝流量比例上升,是由于正常使用线路的用户数量激增,需要进行带宽扩容。
  于是小秦查看了线路的带宽趋势。发现ap-guangzhou TO ap-shanghai线和ap-shanghai TO ap-guangzhou线目前峰值在7Gb/s左右。
  分析语句如下:
  log-status:OK | select histogram(cast(__TIMESTAMP__ as timestamp), interval 1 MINUTE) as time, sum(bytes)/60.00*8 as bandwidth, concat(concat('srcRegion : ',srcregionid, ' , dstRegion : '), dstregionid) as region_ip group by time, region_ip limit 10000
  带着以上结论,小琴登录腾讯云联网控制台,调整了两条线路的带宽上限,很快就解决了业务问题!为学生提供高质量的学习体验。
  演示体验
  CLS日志服务免费提供CCN云联网流量日志Demo快速体验,一键开箱即用,CCN检索分析全景体验,预设仪表盘,实时告警等功能。
  产品使用问题和技术咨询,欢迎加入CLS粉丝群,直接与日志达人1v1对话。还有很多粉丝福利,快来加入我们吧。
  欢迎关注“腾讯云开发者”,期待您的“围观”~
  预览时无法单击选项卡

事实:动态站长采集机器人通过采集基本的网站数据一般没问题

采集交流优采云 发表了文章 • 0 个评论 • 71 次浏览 • 2022-11-22 02:19 • 来自相关话题

  事实:动态站长采集机器人通过采集基本的网站数据一般没问题
  文章采集软件app非常多,常见的如专业一点的如百度风云采集器,六类云采集器等等,另外像麦兜、飞采数据等数据采集软件也可以,还有的就是给电商做采集的采集器,通过抓取后台的数据,同时做标签批量采集,总之一般软件都是采集方便,但是有时效性、数据量大的话还是需要手动统计,那对于小白推荐用动态站长采集机器人的采集软件,搭配最近比较火的动态插件,基本可以满足采集内容上亿的要求,可以看一下下面的安装教程及介绍,希望对你有帮助。
  动态站长采集机器人通过采集基本的网站数据一般没问题,一般网站内容上亿的话就需要采集器自己的采集器是好用的。
  
  一、前期准备工作
  二、采集命令说明
  三、采集效果展示
  
  首先,上线发布一下自己所有的公众号的公众号名称,服务号和企业号,技术名称的名称等,在后台搜索栏输入公众号的名称等即可。然后:进入一个公众号的内容页面,然后点击进入自定义菜单栏,进入我要采集的内容页面,这里面的是我们所有采集到的内容。点击保存,就开始自动采集了,全部采集完成之后点击右上角关闭就行了。
  麦兜采集器。超好用的采集器。操作简单,还能免费试用。
  可以百度搜索一下listinghome,挺好用的,老板找我要采集,商家可以免费试用一个月,码字不易, 查看全部

  事实:动态站长采集机器人通过采集基本的网站数据一般没问题
  文章采集软件app非常多,常见的如专业一点的如百度风云采集器,六类云采集器等等,另外像麦兜、飞采数据等数据采集软件也可以,还有的就是给电商做采集的采集器,通过抓取后台的数据,同时做标签批量采集,总之一般软件都是采集方便,但是有时效性、数据量大的话还是需要手动统计,那对于小白推荐用动态站长采集机器人的采集软件,搭配最近比较火的动态插件,基本可以满足采集内容上亿的要求,可以看一下下面的安装教程及介绍,希望对你有帮助。
  动态站长采集机器人通过采集基本的网站数据一般没问题,一般网站内容上亿的话就需要采集器自己的采集器是好用的。
  
  一、前期准备工作
  二、采集命令说明
  三、采集效果展示
  
  首先,上线发布一下自己所有的公众号的公众号名称,服务号和企业号,技术名称的名称等,在后台搜索栏输入公众号的名称等即可。然后:进入一个公众号的内容页面,然后点击进入自定义菜单栏,进入我要采集的内容页面,这里面的是我们所有采集到的内容。点击保存,就开始自动采集了,全部采集完成之后点击右上角关闭就行了。
  麦兜采集器。超好用的采集器。操作简单,还能免费试用。
  可以百度搜索一下listinghome,挺好用的,老板找我要采集,商家可以免费试用一个月,码字不易,

整套解决方案:采集软件

采集交流优采云 发表了文章 • 0 个评论 • 63 次浏览 • 2022-11-21 09:21 • 来自相关话题

  整套解决方案:采集软件
  
  有没有不需要电脑的采集软件?我想要更容易操作的东西。[图片]聚客宝来告诉您:操作简单、快捷、方便,在手机上即可轻松完成操作。高德地图、百度地图、腾讯地图、阿里巴巴、美团、慧聪网、企业黄页等网站同时采集,9000万+企业信息,10亿多客户联系方式,覆盖全国。该软件已经过仔细筛选。过滤掉重复和不准确的信息,为您采集
尽可能准确的来源信息。[图片] 1.关键词采集 关键词搜索,通过高德地图、百度地图、腾讯地图三大地图的实时采集...
  
  解决方案:CMS建站系统PageAdmin和Drupal8哪个好?
  pageadmin cms,多站点,站群系统,可以创建多站点,站点,后台,用户中心可以绑定独立域名。pageadmin cms自定义表单、字段、自定义数据表,支持一对一、一对多自定义字段,可以应对复杂的数据内容需求。pageadmin cms先进的模板设计,支持master pages、partial pages等公共页面,提高复用性,让网站模板更加高效便捷。千万级负载,缓存+后台缓存+专业数据优化,大数据大流量下也能快速响应。pageadmin cms扩展灵活,支持多终端,具有可拆卸插件设计,可为小程序、APP等终端提供数据接口。
  pageadmin cms是一个知名的cms网站管理系统。它目前在中国有很多用户。许多网站管理员使用它来建立博客、门户网站、学校门户网站和信息门户网站。这个系统的后台非常灵活。可扩展性,自定义表格和自定义字段非常灵活,安全性也很高。
  
  pageadmin cms网站搭建完成后,需要修改模板。对此,我建议,如果你对css基础不了解,可以自己定制一个个性化的模板。模板标题网站,不仅会造成搜索引擎蜘蛛的审美疲劳,也会让用户产生审美疲劳,所以个性化的模板是非常有必要的。
  pageadmin cms 改善网站内容并提高内容质量。前面说的是运营网站的基础,提高网站内容的质量是运营网站的核心。也是能够反映pageadmin cms网站能否继续运营,能否获取流量的关键环节。在这里我想指出,内容质量的提升并不一定需要使用大量的原创文章。事实上,一些与网站内容相关的精彩内容采集
也很有效。此外,每天都会更新一两篇与网站相关的文章。高质量的内容也是必不可少的,只有这样你才能持续吸引用户访问你的网站。
  相比织梦,pageadmin cms在安全方面更加专业,多用于一些对网站安全要求比较高的网站。比如企业网站会用到这个cms。国内很多建站公司都比较喜欢用这个cms为用户建站。此外,pageadmin cms 的框架相对较新。使用目前网络上最流行的mvc模式,制作模板比织梦方便多了。pageadmin cms网上有很多免费模板,但都是老版模板。鉴于pageadmin cms模板制作比较简单,所以制作一个属于自己的网站模板并不是那么难。
  
  pageadmin cms可以增加应用市场,在线安装应用插件。可以增加自己的自定义信息和用户信息回收站功能。pageadmin cms信息表增加复制功能和Url识别功能,使url在多站点场景下更加人性化。pageadmin cms增加优化的递归算法,提高后台多级菜单的构建速度,增加api管理功能,方便api查看和调用。同时在后台增加了自定义路由的可视化管理界面。
  pageadmin cms管理员增加多角色支持,方便灵活组合权限,增加登录安全性,每次登录后刷新验证码。让每个后台都支持独立的域名绑定,支持内网IP,可以将后台与外网完全隔离。pageadmin cms用户登录增加手机+短信验证码支持,可开启关闭。底层增加跨域支持,方便多域名、APP或小程序等多终端开发。pageadmin cms管理列表增加附件和附件组的下载和图片组的直接展示。修复404页面返回302状态的bug,
  pageadmin cms解决了后台添加成员不验证密码复杂度的bug。修改字段不能设置角色和成员组权限的bug可以修复后台数据库工具运行多行SQL错误的bug,也可以修复模板引擎重复引用程序集影响加载速度的bug。 查看全部

  整套解决方案:采集软件
  
  有没有不需要电脑的采集软件?我想要更容易操作的东西。[图片]聚客宝来告诉您:操作简单、快捷、方便,在手机上即可轻松完成操作。高德地图、百度地图、腾讯地图、阿里巴巴、美团、慧聪网、企业黄页等网站同时采集,9000万+企业信息,10亿多客户联系方式,覆盖全国。该软件已经过仔细筛选。过滤掉重复和不准确的信息,为您采集
尽可能准确的来源信息。[图片] 1.关键词采集 关键词搜索,通过高德地图、百度地图、腾讯地图三大地图的实时采集...
  
  解决方案:CMS建站系统PageAdmin和Drupal8哪个好?
  pageadmin cms,多站点,站群系统,可以创建多站点,站点,后台,用户中心可以绑定独立域名。pageadmin cms自定义表单、字段、自定义数据表,支持一对一、一对多自定义字段,可以应对复杂的数据内容需求。pageadmin cms先进的模板设计,支持master pages、partial pages等公共页面,提高复用性,让网站模板更加高效便捷。千万级负载,缓存+后台缓存+专业数据优化,大数据大流量下也能快速响应。pageadmin cms扩展灵活,支持多终端,具有可拆卸插件设计,可为小程序、APP等终端提供数据接口。
  pageadmin cms是一个知名的cms网站管理系统。它目前在中国有很多用户。许多网站管理员使用它来建立博客、门户网站、学校门户网站和信息门户网站。这个系统的后台非常灵活。可扩展性,自定义表格和自定义字段非常灵活,安全性也很高。
  
  pageadmin cms网站搭建完成后,需要修改模板。对此,我建议,如果你对css基础不了解,可以自己定制一个个性化的模板。模板标题网站,不仅会造成搜索引擎蜘蛛的审美疲劳,也会让用户产生审美疲劳,所以个性化的模板是非常有必要的。
  pageadmin cms 改善网站内容并提高内容质量。前面说的是运营网站的基础,提高网站内容的质量是运营网站的核心。也是能够反映pageadmin cms网站能否继续运营,能否获取流量的关键环节。在这里我想指出,内容质量的提升并不一定需要使用大量的原创文章。事实上,一些与网站内容相关的精彩内容采集
也很有效。此外,每天都会更新一两篇与网站相关的文章。高质量的内容也是必不可少的,只有这样你才能持续吸引用户访问你的网站。
  相比织梦,pageadmin cms在安全方面更加专业,多用于一些对网站安全要求比较高的网站。比如企业网站会用到这个cms。国内很多建站公司都比较喜欢用这个cms为用户建站。此外,pageadmin cms 的框架相对较新。使用目前网络上最流行的mvc模式,制作模板比织梦方便多了。pageadmin cms网上有很多免费模板,但都是老版模板。鉴于pageadmin cms模板制作比较简单,所以制作一个属于自己的网站模板并不是那么难。
  
  pageadmin cms可以增加应用市场,在线安装应用插件。可以增加自己的自定义信息和用户信息回收站功能。pageadmin cms信息表增加复制功能和Url识别功能,使url在多站点场景下更加人性化。pageadmin cms增加优化的递归算法,提高后台多级菜单的构建速度,增加api管理功能,方便api查看和调用。同时在后台增加了自定义路由的可视化管理界面。
  pageadmin cms管理员增加多角色支持,方便灵活组合权限,增加登录安全性,每次登录后刷新验证码。让每个后台都支持独立的域名绑定,支持内网IP,可以将后台与外网完全隔离。pageadmin cms用户登录增加手机+短信验证码支持,可开启关闭。底层增加跨域支持,方便多域名、APP或小程序等多终端开发。pageadmin cms管理列表增加附件和附件组的下载和图片组的直接展示。修复404页面返回302状态的bug,
  pageadmin cms解决了后台添加成员不验证密码复杂度的bug。修改字段不能设置角色和成员组权限的bug可以修复后台数据库工具运行多行SQL错误的bug,也可以修复模板引擎重复引用程序集影响加载速度的bug。

最新版:采集北京APP2022最新安卓版v1.0.8.2最新安卓版

采集交流优采云 发表了文章 • 0 个评论 • 209 次浏览 • 2022-11-18 00:13 • 来自相关话题

  最新版:采集北京APP2022最新安卓版v1.0.8.2最新安卓版
  采集北京APP2022最新安卓版,这是一款非常好用的标本取样应用软件工具。这个软件里面有很多人脸识别内容和各种采集功能。非常全面,还可以为您提供各种优质服务。里面的很多资料和数据采集都非常全面。喜欢的朋友,快来289下载体验吧。
  软件说明
  采集北京APP是一款带来更多贴心功能的应用,您可以免费进入体验,超级简单的个人信息注册流程,享受优质服务,直接了解北京我们的各种健康相关信息也可以得到各种数据。
  软件特点:
  1、完成个人信息后,根据实际情况选择采样点和选择采样方式,非常方便;
  2.输入身份证号码,可查询近期参加过核酸检测筛查采样的居民记录;
  
  3、注册后可提高抽样效率,二维码可注册,随时使用,防止现场失误。
  软件亮点:
  1、系统基于身份识别技术,完美融合十合一采集模式;
  2、专为北京地区医护人员设计的核酸采集工具,可实现数据录入和扫码采集;
  3、也可以方便后期查询,提高医护人员的采集效率。还有相关的学习资料。
  软件特点:
  1、信息采集速度是以往人工登记方式的3倍以上,实验室标本登记速度是3倍以上;
  
  2、标本采集人员只需提前下载并安装手机APP应用,通过短短5分钟的培训,即可轻松掌握操作要领;
  3.软件的功能还是很不错的,使用的方法也比较独特,可以用来做采集核酸检测。
  软件点评:
  1、软件操作简单方便。您只需为核酸人员拍照,自动为您生成文件;
  2、帮助您管理自己的核酸信息,满足您对核酸管理的一切需求;
  3、多种模板和表格,可以为大家进行各种填表任务,超级方便。
  外媒:今日头条 Android &#39;秒&#39; 级编译速度优化
  背景介绍
  Android 项目一般使用 gradle 作为构建打包工具,而其执行速度慢也一直为人所诟病,对于今日头条 Android 项目这种千万行级别的大型工程来说,全量编译一次的时间可能高达六七分钟,在某些需要快速验证功能的场景,改动一行代码的增量编译甚至也需要等两三分钟,这般龟速严重影响了开发体验与效率,因此针对 gradle 编译构建耗时进行优化显得尤为重要。
  在今日头条 Android 项目上,编译构建速度的优化和恶化一直在交替执行,18 年时由于模块化拆分等影响,clean build 一次的耗时达到了顶峰 7 分 30s 左右,相关同学通过模块 aar 化,maven 代理加速,以及增量 java 编译等优化手段,将 clean build 耗时优化到 4 分钟,增量编译优化到 20~30s 。但是后面随着 kotlin 的大规模使用,自定义 transform 以及 apt 库泛滥,又将增量编译速度拖慢到 2 分 30s ,且有进一步恶化的趋势。为了优化现有不合理的编译耗时,防止进一步的恶化,最近的 5,6 双月又针对编译耗时做了一些列专项优化(kapt,transform,dexBuilder,build-cache 等) 并添加了相关的防恶化管控方案。 从 4.27 截止到 6.29 ,整体的优化效果如下:
  历史优化方案
  由于 18 年左右客户端基础技术相关同学已经对今日头条 Android 工程做了许多 gradle 相关的优化,且这些优化是近期优化的基础,因此先挑选几个具有代表性的方案进行介绍,作为下文的背景同步。
  maven 代理优化 sync 时间背景
  gradle 工程往往会在 repositories 中添加一些列的 maven 仓库地址,作为组件依赖获取的查找路径,早期在今日头条的项目中配置了十几个 maven 的地址,但是依赖获取是按照 maven 仓库配置的顺序依次查找的,如果某个组件存在于最后一个仓库中,那前面的十几个仓库得依次发起网络请求查找,并在网络请求返回失败后才查找下一个,如果项目中大多组件都在较后仓库的位置,累加起来的查找时间就会很长。
  优化方案使用公司内部搭建的 maven 私服,在私服上设置代理仓库,为其他仓库配置代理(例如 google、jcenter、mavenCentral 等仓库),代理仓库创建好后,在 Negative Cache 配置项中关闭其 cache 开关:如果查找时没有找到某版本依赖库时会缓存失败结果,一段时间内不会重新去 maven 仓库查找对应依赖库,即使 maven 仓库中已经有该版本的依赖库,查找时仍然返回失败的结果。建立仓库组,将所有仓库归放到一个统一的仓库组里,依赖查找时只需要去这个组仓库中查找,这样能大大降低多次发起网络请求遍历仓库的耗时。模块 aar 化背景
  今日头条项目进行了多次组件化和模块化的重构,分拆出了 200 多个子模块,这些子模块如果全都 include 进项目,那么在 clean build 的时候,所有子模块的代码需要重新编译,而对于大多数开发人员来说,基本上只关心自己负责的少数几个模块,根本不需要改动其他模块的代码,这些其他 project 的配置和编译时间就成为了不必要的代价。
  优化方案
  对于以上子模块过多的解决方案是:将所有模块发布成 aar ,在项目中全部默认通过 maven 依赖这些编译好的组件,而在需要修改某个模块时,通过配置项将该模块的依赖形式改为源码依赖,做到在编译时只编译改动的模块。但是这样做会导致模块渐渐的又全部变为源码依赖的形式,除非规定每次修改完对应模块后,开发人员自己手动将模块发布成 aar ,并改回依赖形式。这种严重依赖开发人员自觉,并且在模块数量多依赖关系复杂的时候会显得异常繁琐,因此为了开发阶段的便利,设计了一整套更完整细致的方案:
  开发时,从主分支拉取的代码一定是全 aar 依赖的,除了 app 模块没有任何子模块是源码引入。需要修改对应模块时,通过修改 local.properties 里的 INCLUDES 参数指定源码引入的模块。开发完成后,push 代码至远端,触发代码合并流程后,在 ci 预编译过程与合码目标分支对比,检测修改的模块,将这些模块按照依赖关系依次发布成 aar ,并在工程中修改依赖为新版本的 aar, 这一步保证了每次代码合入完成后,主分支上的依赖都是全 aar 依赖的。收益
  通过上述改造,将源码模块切换成 aar 依赖后,clean build 耗时从 7,8 分钟降低至 4,5 分钟,收益接近 50%,效果显著。
  增量 java/kotlin 编译背景
  在非 clean build 的情况下,更改 java/kotlin 代码虽然会做增量编译,但是为了绝对的正确性,gradle 会根据一些列依赖关系计算,选择需要重新编译的代码,这个计算粒度比较粗,稍微改动一个类的代码,就可能导致大量代码重新执行 apt, 编译等流程。
  由于 gradle 作为通用框架,其设计的基本原则是绝对的正确,因此很容易导致增量编译失效,在实际开发中,为了快速编译展示结果,可以在编译正确性和编译速度上做一个折中的方案:
  禁用原创的 javac/kotlinCompile 等 task, 自行实现代码增量修改判断,只编译修改的代码。动态禁用 kapt 相关的 task, 降低 kapt,kaptGenerateStub 等 task 的耗时。
  以上方案(下文全部简称为 fastbuild) 虽然在涉及常量修改,方法签名变更方面 存在一定的问题(常量内联等),但是能换来增量编译从 2 分多降低至 20~30s,极大的提升编译效率,且有问题的场景并不常见,因此整体上该方案是利大于弊的。
  编译耗时恶化
  通过上文介绍的几个优化方案和其他优化方式,在 18 年时,今日头条 Android 项目的整体编译速度(clean build 4~5min, fast 增量编译 20~30s)在同量级的大型工程中来说是比较快的 ,然而后期随着业务发展的需求,编译脚本添加了很多新的逻辑:
  kotlin 大规模使用,kapt 新增了很多注解处理逻辑。引入对 java8 语法的支持 , java8 语法的 desugar(脱糖)操作增加了编译耗时。大量的字节码插桩需求,添加了许多 transform ,大幅度提升了增量编译耗时。
  这些逻辑的引入,使得增量编译耗时恶化到 2 分 30s,即使采用 fastbuild,改动一行代码编译也需要 1 分 30s 之多,开发体验非常差。而下文将着重描述最近一段时间对上述问题的优化过程。
  近期优化方案app 壳模块 kapt 优化背景
  今日头条工程经过多次模块化,组件化重构后, app 模块(NewsArticle)的大部分代码都已经迁移到子模块(上文已经介绍过子模块可以采用 aar 化用于编译速度优化,app 模块只剩下一个壳而已。
  但是从 build profile 数据(执行 gradle 命令时添加 --profile 参数会在编译完成后输出相关 task 耗时的统计文件) 中发现到一个异常 case:明明只有 2 个类的 app 模块 kapt(annotationProcessor 注解处理) 相关耗时近 1 分钟。
  通过进一步观察,虽然 app 模块拆分后只有 2 个简单类的代码,但是却用了 6 种 kapt 库, 且实际生效的只是其中 ServiceImpl 一个注解 (内部 ServiceManager 框架,用于指示生产 Proxy 类,对模块之间代码调用进行解耦)。如此一顿操作猛如虎,每次编译却只生成固定的两个 Proxy 类,与 53s 的高耗时相比,投入产出比极低。
  优化方案
  把固定生成的 Proxy 类从 generate 目录移动到 src 目录,然后禁止 app 模块中 kapt 相关 task ,并添加相关管控方案(如下图: 检测到不合理情况后立刻抛出异常),防止其他人添加新增的 kapt 库。
  收益在 mac clean build 中平均有 40s 收益在 ci clean build 中平均有 20s 收益kapt 隔离优化背景
  通过上文介绍在 app 模块发现的异常的 kapt case, 进而发现在工程中为了方便,定义了一个 library.gradle ,该文件的作用是定义项目中通用的 Android dsl 配置和共有的基础依赖,因此项目中所有子模块均 apply 了这个文件,但是这个文件陆陆续续的被不同的业务添加新的 kapt 注解处理库,在全源码编译时,所有子模块都得执行 library 模块中定义的全部 6 个 kapt ,即使该模块没有任何注解相关的处理也不例外。
  而上述情况的问题在于:相比纯 java 模块的注解处理,kotlin 代码需要先通过 kaptGenerateStub 将 kt 文件转换成为 java ,让 apt 处理程序能够统一的面向 java 做注解扫描和处理。但是上面讲到其实有很多模块是根本不会有任何实际 kapt 处理过程的,却白白的做了一次 kt 转 java 的操作,源码引入的模块越多,这种无意义的耗时累加起来也非常可观。
  为了能够弄清楚到底有哪些子模块真正用到了 kapt ,哪些没用到可以禁用掉 kapt 相关 task ,对项目中所有子模块进行了一遍扫描:
  获取 kapt configuration 的所有依赖,可以得到 kapt 依赖库的 jar 包,利用 asm 获取所有 annotation.遍历所有 subproject 的 sourceset 下所有 .java,.kt 源文件,解析 import 信息,看是否有步骤 1 中解析的 annotationpackage task 完成后遍历 所有 subproject 所有 generate/apt ,generate/kapt 目录下生成的 java 文件
  使用上述方案,通过全源码打包最终扫描出来大概是 70+模块不会进行任何 kapt 的实际输出,且将这些不会进行输出的 kapt,kaptGenerateStub 的 task 耗时累加起来较高 217s (由于 task 并发执行所以实际总时长可能要少一些).
  获取到不实际生成 kapt 内容的模块后,开始对这些模块进行细粒度的拆分,让它们从 apply library.gradle 改为没有 kapt 相关的 library-api.gradle ,该文件除了禁用 kapt 外,与 library 逻辑一致。
  但是这样做算是在背后偷偷做了些更改,很可能后续新来的同学不知道有这种优化手段,可能新增了注解后却没有任何输出且找不到原因,而优化效果最好是尽量少给业务同学带来困扰。为了避免这种情况,便对这些 library-api 模块依赖的注解做隔离优化,即:把这些模块依赖的注解库全部 自动 exclude 掉,在尝试使用注解时会因获取不到引用(如下图所示),第一时间发现到依赖被移除的问题。
  另一方面在编译出现错误时,对应 gradle 插件会自动解析找不到的符号,如果发现该符号是被隔离优化的注解,会提示将 library-api 替换成 library,尽可能降低优化方案对业务的负面影响。
  收益mac 全源码场景中有 58s 左右的加速收益。ci 机器上由于 cpu 核数更多 ,task 并发性能更好,只有 10s 左右的收益。transform 优化背景
  transform 作为 Android gradle plugin 提供给开发者的 API,用于在 apk 构建过程中,对 class 字节码,resources 等文件内容进行插桩修改,例如官方的 dex, proguard 等功能均由此 api 实现。
  对于今日头条这种大型工程来说,有很多诸如性能插桩、自动埋点插桩等相关需求,因此基于此 api 开发了大量 transform,用于实现特定功能,但是这些 transform 基本上都是不支持增量编译的,即使只改动了一行代码,这 些 transform 都会遍历所有 class 文件,解析字节码中的方法字段信息,关键是这类 transform 数量有十几个,将这些遍历耗时乘以 10 累加之后,增量编译耗时自然居高不下。
  根据分析,其中性能插桩等相关 transform 做的一些面向线上的插桩方案是完全可以只在 release 打包时打开的,因此可以直接在 debug 编译时禁用这些功能,用于提升开发期间的编译速度。而剩下的 9 个 transform 特征比较相似,可能在一些插桩细节上有所不同,它们大致的处理逻辑为:
  在各个模块中使用 apt processor 采集模块 xx 注解的 class 信息然后生成一个 xxCollect 类,该类的作用是采集好 apt 阶段解析到的本模块的类信息将所有模块采集到的信息进行汇总,利用 transform 阶段扫描出所有的 xxCollect 信息,通过 javaassit 或者 asm 往一个 xxCollectMgr 的某个 collectXxx 方法插桩注入之前收到的信息业务代码可通过 xxCollectMgr 的 collectXxx 方法获取到在各个模块动态生成的所有 xxCollect 信息。(例: 页面路由相关框架便是通过该逻辑采集到所有子模块的路由注册信息)
  由于这 9 个自定义 transform 的功能如此类似,便决定将这些 transform 合并成一个,这样同一个文件的读写操作只执行一次,并且可以做定制化的增量编译优化。虽然公司内有类似的 transform 合并优化方案 byteX ( 已在 github 开源),但是由于今日头条项目在 debug 阶段未开启该功能,且 ByteX 做了一些诸如 ClassGrapth 的构建,对类文件做两次遍历等操作,对于实现类信息采集和信息注入 这个功能来说,byteX 显得比较重 ,于是仍然针对类信息采集注入功能这个细分场景开发了一个收敛框架。
  收益
  该框架完成了内部 9 种类信息采集注入相关框架的收敛,编译耗时的绝对值加速了 25s 左右,且由于提供了统一的增量缓存功能,使得改动一行代码的耗时可以从 2 分 30s 降低到 35~40s ,实现了增量编译速度大的飞跃。最关键的是将所有自定义 transform 统一管控后,后续可以做统一定制化的需求,进一步优化编译速度。
  dexBuilder 优化背景
  在 Android debug 编译 过程中,最主要的耗时在 transform 上,而上文 介绍 今日头条项目自定义 transform 已经被高度优化过,剩下的 dexBuilder(将 class 转换成 dex ) ,dexMerge 等 task 耗时就成为了性能瓶颈,dexBuilder 全量编译耗时 60s 左右,增量编译耗时 22s 左右。
  根据 DexArchiveBuilderTransform 关键方法 launchProcessing 里面关键一行 isDirectoryBased,如果是目录类型的输入,会根据具体变动 class 文件做增量的 dex 编译 ,但是如果是 jar 输入类型,那只要 jar 里任何一个类变动,则整个 jar 所有类都需要重执行 dex,但是由于 gradle 的依赖特性,基本上只有 app 模块是目录类的输入,其他 library 都是 jar 输入类型,对于比较大的业务模块 ,如果该模块有几千个类,那每改动一次类,就会有几千类连带重新 执行 dex 编译。
  dexBuilder 增量效果量化
  在优化前为了得到真正的重新执行 dex 编译的数值,做到最佳优化,设计了一套 hook dex 编译流程的方法(该方法理论上可以 hook Android gradle plugin 任意类:大致就是 hook classLoader ,提前用 asm 修改 D8DexArchiveBuilder 中的 convert 方法
  通过对 D8DexArchiveBuilder 的 hook ,统计到优化前改动一行代码会连带着 24968 个类重新执行 dex 编译,增量效果非常差。
  优化方案
  既然 jar 输入相比于 目录输入来说增量编译效果非常差,那么可以想到 hook TransformInvocation 中的 input 方法,动态将 project 的 jar 类型输入(JarInput)映射为一个 目录输入(DirectoryInput),那么子模块修改对应代码时,只重新编译目录中被修改的 class 为 dex(而不是原来的整个 jar 内所有 class 重新执行 dex 编译),整体 dex 重新编译的数量将大幅度减少。实现具体方案如下:
  而 jar 转 目录的映射细节为:
  在第一次增量修改完成后,重新执行 dex 编译的类数量降低至 2152 个,但是其中仍然有很多迷惑的不该执行 dex 编译的类,预期是修改多少类,就重新执行 多少次 dex,因此继续对其中原因进行进一步的探索
  desugarGraph 异常
  由于 java8 的字节码有些指令在 Android 虚拟机中并不能得到支持,会在编译流程中,将这些指令进行脱糖,转换成已有的指令,而 d8 中 desugar 的流程合并到了 dexBuilder 中,为了避免某些类 desugar 后,依赖它的类的行为正确,需要把依赖它的所有类重新执行一遍 dex 编译。
  而 d8 会根据 DesugaringGraph 查找 desguar 有变动的类及其依赖的 jar 包,如图下面获得到的 addtionalPaths 是 desguar 类可能直接间接相关的 jar 包,即使这些 jar 包没有任何文件内容变更,其中所有类也得重新全部执行一次 dex 编译。
  DesugaringGraph 逻辑概述
  该类用来辅助获取依赖或间接依赖到变更文件的所有文件,而它的生成逻辑为: 全量或增量编译类的时候记录类型之间的依赖和被依赖关系,依赖关系的判断条件有
  
  父类直接实现的接口调用 dynamic 方法指令时的返回类型
  DesugaringGraph 不仅记录了类依赖的类,和依赖它的类,同时也记录了一个文件路径收录了哪些类
  如果文件路径是 class 文件,那路径就收录 1 个类如果路径是 jar 文件,收录这个 jar 下所有类。
  在增量编译时检查到变动的文件时,会检查这个文件路径收录的所有类, 然后递归查找所有直接/间接依赖它的类,并且找到这些依赖它的类后,会把这个类所在的 jar 包作为额外的处理类型(即使 jar 本身没有任何变动,里面所有的类仍然需要重新 dex 编译)
  顺着这个解析关系,找到了一个不正常的 jar 包 bdjson_api ,这个 jar 只有 3 个文件 (IBDJson,BDJsonCollector, BDJsonConstants) 。但是 BDJsonCollector 是一个 stub 类,每次执行 transform 会采集到其他类的信息然后往该类的方法中注入,因此该文件每次编译时都会变动。 这个类本身并没有多少直接依赖它的类,主要是 它所在的 jar 包还有个 IBDJson 接口。
  按照之前的 DesugaringGraph 依赖关系,所有 IBDJson 接口的实现类被判断为依赖它,然后这些实现类如果出现在某个 dynamic 方法中,又会被层层查找,查找完了之后,还得计算所有依赖类所在的 jar 包,jar 包中其他没有依赖它的类也会被重新 dex 编译, 在这个 case 的依赖查找中,连带重新执行 dex 编译的类数量并不多,大概为 4 个 jar 包共 2000 多个类重新执行了无意义的 dex 流程,但是如果是其他 sdk jar 包,则可能就会给 dexBuilder 增量带来毁灭性的打击。 上述问题的解决方法:
  把每次都会修改的 Stub 注入类和其他接口类分离,放在不同 jar 包。(需要改造业务,比较麻烦)动态把这个 sdk jar 输入转换成目录输入。(上文介绍的方法,也与上面 jar 转目录的初衷相符,只不过是漏掉了这个 case,但是却意外证明了:除了收录业务代码多的 project 的 jar 输入需要转换为目录外,sdk jar 同样有必要)
  修复后修改一行代码重新执行 dex 的数量为 10 ,其中 9 个是每次 transform 会修改的 stub 类,1 个是实际修改类。做到了真正的 改多少类,执行多次 dex 编译。
  收益
  assemebleDebug 的增量编译中从原来(上文 transform 优化后)的 35s~40s 是降低至均值 17s,在 fast build 中效果最明显(屏蔽了 apt),第二次增量编译能突破到 9s 实现秒级编译。
  而经过上面所有的优化后,耗时数据里耗时最严重的 dexBuilder 和 dex-merge 基本都降低在 1s 左右,自定义 transform 也是 1s 左右,其他 task 基本都是零点几秒。在不使用 hotfix 方案的情况下(由于今日头条项目使用了过多的自定义 transform 和插件方案,所以不好使用 instantrun 等 hostfix 方案),相关 task 的耗时基本达到了优化的极限。
  build-cache 优化踩坑
  Build-cache 是 gralde 提供的一个编译缓存方案,目的是在构建过程中当两个 task 的输入相同时,可以复用缓存内容,直接跳过 task 的执行拿到缓存好的执行结果。由于缓存结果既可以放在本地磁盘,也可以从远程获取,因此容易想到利用 ci 提前 构建缓存包,在其他 ci 机器和开发时利用缓存包获得加速效果。
  那么如何判断 task 可以直接获取 之前 task 的缓存内容作为输出呢?定义为可缓存的 task ,会定义一些缓存相关的属性,task 执行时通过文件指纹,缓存属性等一大堆属性计算出缓存 key ,用于查找是否命中缓存,计算维度有:
  但是原生的 build-cahce 在缓存命中率上惨不忍睹,公司内抖音团队基于 gradle4.x 的源码做过一些提高命中率的修改,不过今日头条用的 gradle 版本是 5.1 ,受抖音团队的启发,也对 gradle5.1 源码做了些定制化的修改,用于 dump 缓存 key 的计算流程,快速发现缓存问题。相比于抖音发现的一些影响缓存命中的问题,额外发现了一些诸如 mbox , kapt 元素遍历顺序不固定的问题,这里只挑一个典型的 apt 顺序不一致的问题进行介绍:
  apt 顺序不一致导致的缓存失效问题
  经过修改 gradle5.1 源码后对编译流程的信息采集,发现有的 task 缓存无法命中是因为 kapt 时,很多生成代码块逻辑是一样的,但是顺序不一样(如下图 demo :下面两个生成方法的逻辑一致,但是判断顺序不一致,这应该是在 processor 中通过 RoundEnviroment 获取到 注解元素 elemnts 顺序不一致导致的 )
  其内部的原因可能是文件遍历目录时获取子文件的顺序不一致,导致了子文件对应注解元素的顺序也不一致, 总之这个操作影响了生成文件内代码的顺序,也影响了该文件的 hash 计算结果,导致 build-cache 在计算 javac task 的 key 时会错乱导致缓存无法命中。
  解决方案
  但是注意到 AbstractProcessor 的核心方法 process 的两个参数都是接口,因此想到可以代理原来的 RoundEnvironment 接口,将其 getElementXx 的方法经过固定排序后返回,使得 apt 注解元素的顺序能够固定下来。
  由于篇幅影响,其他影响缓存命中相关的 case 略(主要是一些涉及到文件绝对路径, classPath 相关的问题)
  收益由于大多开发场景是引入多少模块就修改多少模块内容,很难获得命中缓存, 收益很小主要是全源码场景能稳定获得一些编译加速,基本上在 22~99s 左右。编译耗时防恶化管控
  在今日头条这种大型工程中,有很多业务部门参与开发,仅 Android 工程 开发人员就有几百人且人员变动频繁,因此内部任何一项优化工作必然是得搭配上一些管控措施的,否则一边优化一边恶化,空浪费人力。
  为此制定了一些管控方案,首先是 debug 阶段的 新增 transform 管控,设置为白名单形式,如果在开发阶段新增了 transform 直接终止编译流程,通过说明文档告知管控的规则,当然,管控的目的是尽可能减少一些不必要的不合理的编译问题,并不是与业务团队作对,如果某一个操作拖慢了整体的编译耗时,但是在 app 性能/稳定性方面有更大收益,且无法在编译期做更多的优化,仍然是允许添加的,只不过是得提前把这个问题暴露出来而已,能更快的找出更多的解决思路,比如引导使用 byteX 等 transform 收敛方案。
  另一方面的是合码流程方面的阻塞 : 今日头条 为了保障 app 的性能稳定性,在合码流程上设置了许多自动化的卡点: 如 包大小检测,插件依赖变更检查, so 变更检查,启动性能检测等,检测到对应问题(如包大小增加异常)会阻塞合码流程。为了管控编译速度 ,使其不至于恶化的太快,也加上了对应的 基于 task 级别的管控,当某一个 task 耗时异常波动,或者新增全新类型的 task 时,能够自动的发现问题,通过机器人将相关人员拉到 mr 讨论群中, 尽量在 合码完成前能发现问题。
  总结
  为了持续稳定的保持较快的编译速度,可能需要做到以下几点:
  项目需要有良好的工程结构,对业务模块进行适当粒度的拆分,做好 aar/源码的切换不仅能节省 javac/kotlinCompile 的耗时,也是其他优化方案的基础。工程配置要有区分度,不要所有子模块都用同样的配置,比如根本不会用到 kapt 功能的模块就别打开 kapt task 了。transform 若无必要,无须新加,或者按级别划分,如今日头条在 debug,devMode,release 不同的构建级别用到的 transform 数量是不一致的,尽量让绝大多数人能获得相对最快的编译速度体验,而不会被用不到的功能拖慢速度。一定要新增的 transform 可以先多用现有的增量方案,如 byteX 以及本文提供的类信息注入框架, 尽量把不要的文件 io 合并。很多高耗时的 官方 task(dexBuilder) 都是有直接或间接的办法提升其效率的,并且如果除了耗时之外有其他的衡量手段,如本文提到的重新 dex 率,通过量化数据可以快速的发现问题,进而找到耗时的罪魁祸首。与 app 性能优化等工作类似,编译速度优化既需要持续进行,也需要一定的问题发现手段,尽量避免问题出现很长一段时间后再去查找原因(那时候可能业务依赖程度会非常高,难以修改)。更多分享
  背景介绍
  Android 项目一般使用 gradle 作为构建打包工具,而其执行速度慢也一直为人所诟病,对于今日头条 Android 项目这种千万行级别的大型工程来说,全量编译一次的时间可能高达六七分钟,在某些需要快速验证功能的场景,改动一行代码的增量编译甚至也需要等两三分钟,这般龟速严重影响了开发体验与效率,因此针对 gradle 编译构建耗时进行优化显得尤为重要。
  在今日头条 Android 项目上,编译构建速度的优化和恶化一直在交替执行,18 年时由于模块化拆分等影响,clean build 一次的耗时达到了顶峰 7 分 30s 左右,相关同学通过模块 aar 化,maven 代理加速,以及增量 java 编译等优化手段,将 clean build 耗时优化到 4 分钟,增量编译优化到 20~30s 。但是后面随着 kotlin 的大规模使用,自定义 transform 以及 apt 库泛滥,又将增量编译速度拖慢到 2 分 30s ,且有进一步恶化的趋势。为了优化现有不合理的编译耗时,防止进一步的恶化,最近的 5,6 双月又针对编译耗时做了一些列专项优化(kapt,transform,dexBuilder,build-cache 等) 并添加了相关的防恶化管控方案。 从 4.27 截止到 6.29 ,整体的优化效果如下:
  历史优化方案
  由于 18 年左右客户端基础技术相关同学已经对今日头条 Android 工程做了许多 gradle 相关的优化,且这些优化是近期优化的基础,因此先挑选几个具有代表性的方案进行介绍,作为下文的背景同步。
  maven 代理优化 sync 时间背景
  gradle 工程往往会在 repositories 中添加一些列的 maven 仓库地址,作为组件依赖获取的查找路径,早期在今日头条的项目中配置了十几个 maven 的地址,但是依赖获取是按照 maven 仓库配置的顺序依次查找的,如果某个组件存在于最后一个仓库中,那前面的十几个仓库得依次发起网络请求查找,并在网络请求返回失败后才查找下一个,如果项目中大多组件都在较后仓库的位置,累加起来的查找时间就会很长。
  优化方案使用公司内部搭建的 maven 私服,在私服上设置代理仓库,为其他仓库配置代理(例如 google、jcenter、mavenCentral 等仓库),代理仓库创建好后,在 Negative Cache 配置项中关闭其 cache 开关:如果查找时没有找到某版本依赖库时会缓存失败结果,一段时间内不会重新去 maven 仓库查找对应依赖库,即使 maven 仓库中已经有该版本的依赖库,查找时仍然返回失败的结果。建立仓库组,将所有仓库归放到一个统一的仓库组里,依赖查找时只需要去这个组仓库中查找,这样能大大降低多次发起网络请求遍历仓库的耗时。模块 aar 化背景
  今日头条项目进行了多次组件化和模块化的重构,分拆出了 200 多个子模块,这些子模块如果全都 include 进项目,那么在 clean build 的时候,所有子模块的代码需要重新编译,而对于大多数开发人员来说,基本上只关心自己负责的少数几个模块,根本不需要改动其他模块的代码,这些其他 project 的配置和编译时间就成为了不必要的代价。
  优化方案
  对于以上子模块过多的解决方案是:将所有模块发布成 aar ,在项目中全部默认通过 maven 依赖这些编译好的组件,而在需要修改某个模块时,通过配置项将该模块的依赖形式改为源码依赖,做到在编译时只编译改动的模块。但是这样做会导致模块渐渐的又全部变为源码依赖的形式,除非规定每次修改完对应模块后,开发人员自己手动将模块发布成 aar ,并改回依赖形式。这种严重依赖开发人员自觉,并且在模块数量多依赖关系复杂的时候会显得异常繁琐,因此为了开发阶段的便利,设计了一整套更完整细致的方案:
  开发时,从主分支拉取的代码一定是全 aar 依赖的,除了 app 模块没有任何子模块是源码引入。需要修改对应模块时,通过修改 local.properties 里的 INCLUDES 参数指定源码引入的模块。开发完成后,push 代码至远端,触发代码合并流程后,在 ci 预编译过程与合码目标分支对比,检测修改的模块,将这些模块按照依赖关系依次发布成 aar ,并在工程中修改依赖为新版本的 aar, 这一步保证了每次代码合入完成后,主分支上的依赖都是全 aar 依赖的。收益
  通过上述改造,将源码模块切换成 aar 依赖后,clean build 耗时从 7,8 分钟降低至 4,5 分钟,收益接近 50%,效果显著。
  增量 java/kotlin 编译背景
  在非 clean build 的情况下,更改 java/kotlin 代码虽然会做增量编译,但是为了绝对的正确性,gradle 会根据一些列依赖关系计算,选择需要重新编译的代码,这个计算粒度比较粗,稍微改动一个类的代码,就可能导致大量代码重新执行 apt, 编译等流程。
  由于 gradle 作为通用框架,其设计的基本原则是绝对的正确,因此很容易导致增量编译失效,在实际开发中,为了快速编译展示结果,可以在编译正确性和编译速度上做一个折中的方案:
  禁用原创的 javac/kotlinCompile 等 task, 自行实现代码增量修改判断,只编译修改的代码。动态禁用 kapt 相关的 task, 降低 kapt,kaptGenerateStub 等 task 的耗时。
  以上方案(下文全部简称为 fastbuild) 虽然在涉及常量修改,方法签名变更方面 存在一定的问题(常量内联等),但是能换来增量编译从 2 分多降低至 20~30s,极大的提升编译效率,且有问题的场景并不常见,因此整体上该方案是利大于弊的。
  编译耗时恶化
  通过上文介绍的几个优化方案和其他优化方式,在 18 年时,今日头条 Android 项目的整体编译速度(clean build 4~5min, fast 增量编译 20~30s)在同量级的大型工程中来说是比较快的 ,然而后期随着业务发展的需求,编译脚本添加了很多新的逻辑:
  kotlin 大规模使用,kapt 新增了很多注解处理逻辑。引入对 java8 语法的支持 , java8 语法的 desugar(脱糖)操作增加了编译耗时。大量的字节码插桩需求,添加了许多 transform ,大幅度提升了增量编译耗时。
  这些逻辑的引入,使得增量编译耗时恶化到 2 分 30s,即使采用 fastbuild,改动一行代码编译也需要 1 分 30s 之多,开发体验非常差。而下文将着重描述最近一段时间对上述问题的优化过程。
  近期优化方案app 壳模块 kapt 优化背景
  今日头条工程经过多次模块化,组件化重构后, app 模块(NewsArticle)的大部分代码都已经迁移到子模块(上文已经介绍过子模块可以采用 aar 化用于编译速度优化,app 模块只剩下一个壳而已。
  但是从 build profile 数据(执行 gradle 命令时添加 --profile 参数会在编译完成后输出相关 task 耗时的统计文件) 中发现到一个异常 case:明明只有 2 个类的 app 模块 kapt(annotationProcessor 注解处理) 相关耗时近 1 分钟。
  通过进一步观察,虽然 app 模块拆分后只有 2 个简单类的代码,但是却用了 6 种 kapt 库, 且实际生效的只是其中 ServiceImpl 一个注解 (内部 ServiceManager 框架,用于指示生产 Proxy 类,对模块之间代码调用进行解耦)。如此一顿操作猛如虎,每次编译却只生成固定的两个 Proxy 类,与 53s 的高耗时相比,投入产出比极低。
  优化方案
  把固定生成的 Proxy 类从 generate 目录移动到 src 目录,然后禁止 app 模块中 kapt 相关 task ,并添加相关管控方案(如下图: 检测到不合理情况后立刻抛出异常),防止其他人添加新增的 kapt 库。
  收益在 mac clean build 中平均有 40s 收益在 ci clean build 中平均有 20s 收益kapt 隔离优化背景
  通过上文介绍在 app 模块发现的异常的 kapt case, 进而发现在工程中为了方便,定义了一个 library.gradle ,该文件的作用是定义项目中通用的 Android dsl 配置和共有的基础依赖,因此项目中所有子模块均 apply 了这个文件,但是这个文件陆陆续续的被不同的业务添加新的 kapt 注解处理库,在全源码编译时,所有子模块都得执行 library 模块中定义的全部 6 个 kapt ,即使该模块没有任何注解相关的处理也不例外。
  而上述情况的问题在于:相比纯 java 模块的注解处理,kotlin 代码需要先通过 kaptGenerateStub 将 kt 文件转换成为 java ,让 apt 处理程序能够统一的面向 java 做注解扫描和处理。但是上面讲到其实有很多模块是根本不会有任何实际 kapt 处理过程的,却白白的做了一次 kt 转 java 的操作,源码引入的模块越多,这种无意义的耗时累加起来也非常可观。
  为了能够弄清楚到底有哪些子模块真正用到了 kapt ,哪些没用到可以禁用掉 kapt 相关 task ,对项目中所有子模块进行了一遍扫描:
  获取 kapt configuration 的所有依赖,可以得到 kapt 依赖库的 jar 包,利用 asm 获取所有 annotation.遍历所有 subproject 的 sourceset 下所有 .java,.kt 源文件,解析 import 信息,看是否有步骤 1 中解析的 annotationpackage task 完成后遍历 所有 subproject 所有 generate/apt ,generate/kapt 目录下生成的 java 文件
  使用上述方案,通过全源码打包最终扫描出来大概是 70+模块不会进行任何 kapt 的实际输出,且将这些不会进行输出的 kapt,kaptGenerateStub 的 task 耗时累加起来较高 217s (由于 task 并发执行所以实际总时长可能要少一些).
  
  获取到不实际生成 kapt 内容的模块后,开始对这些模块进行细粒度的拆分,让它们从 apply library.gradle 改为没有 kapt 相关的 library-api.gradle ,该文件除了禁用 kapt 外,与 library 逻辑一致。
  但是这样做算是在背后偷偷做了些更改,很可能后续新来的同学不知道有这种优化手段,可能新增了注解后却没有任何输出且找不到原因,而优化效果最好是尽量少给业务同学带来困扰。为了避免这种情况,便对这些 library-api 模块依赖的注解做隔离优化,即:把这些模块依赖的注解库全部 自动 exclude 掉,在尝试使用注解时会因获取不到引用(如下图所示),第一时间发现到依赖被移除的问题。
  另一方面在编译出现错误时,对应 gradle 插件会自动解析找不到的符号,如果发现该符号是被隔离优化的注解,会提示将 library-api 替换成 library,尽可能降低优化方案对业务的负面影响。
  收益mac 全源码场景中有 58s 左右的加速收益。ci 机器上由于 cpu 核数更多 ,task 并发性能更好,只有 10s 左右的收益。transform 优化背景
  transform 作为 Android gradle plugin 提供给开发者的 API,用于在 apk 构建过程中,对 class 字节码,resources 等文件内容进行插桩修改,例如官方的 dex, proguard 等功能均由此 api 实现。
  对于今日头条这种大型工程来说,有很多诸如性能插桩、自动埋点插桩等相关需求,因此基于此 api 开发了大量 transform,用于实现特定功能,但是这些 transform 基本上都是不支持增量编译的,即使只改动了一行代码,这 些 transform 都会遍历所有 class 文件,解析字节码中的方法字段信息,关键是这类 transform 数量有十几个,将这些遍历耗时乘以 10 累加之后,增量编译耗时自然居高不下。
  根据分析,其中性能插桩等相关 transform 做的一些面向线上的插桩方案是完全可以只在 release 打包时打开的,因此可以直接在 debug 编译时禁用这些功能,用于提升开发期间的编译速度。而剩下的 9 个 transform 特征比较相似,可能在一些插桩细节上有所不同,它们大致的处理逻辑为:
  在各个模块中使用 apt processor 采集模块 xx 注解的 class 信息然后生成一个 xxCollect 类,该类的作用是采集好 apt 阶段解析到的本模块的类信息将所有模块采集到的信息进行汇总,利用 transform 阶段扫描出所有的 xxCollect 信息,通过 javaassit 或者 asm 往一个 xxCollectMgr 的某个 collectXxx 方法插桩注入之前收到的信息业务代码可通过 xxCollectMgr 的 collectXxx 方法获取到在各个模块动态生成的所有 xxCollect 信息。(例: 页面路由相关框架便是通过该逻辑采集到所有子模块的路由注册信息)
  由于这 9 个自定义 transform 的功能如此类似,便决定将这些 transform 合并成一个,这样同一个文件的读写操作只执行一次,并且可以做定制化的增量编译优化。虽然公司内有类似的 transform 合并优化方案 byteX ( 已在 github 开源),但是由于今日头条项目在 debug 阶段未开启该功能,且 ByteX 做了一些诸如 ClassGrapth 的构建,对类文件做两次遍历等操作,对于实现类信息采集和信息注入 这个功能来说,byteX 显得比较重 ,于是仍然针对类信息采集注入功能这个细分场景开发了一个收敛框架。
  收益
  该框架完成了内部 9 种类信息采集注入相关框架的收敛,编译耗时的绝对值加速了 25s 左右,且由于提供了统一的增量缓存功能,使得改动一行代码的耗时可以从 2 分 30s 降低到 35~40s ,实现了增量编译速度大的飞跃。最关键的是将所有自定义 transform 统一管控后,后续可以做统一定制化的需求,进一步优化编译速度。
  dexBuilder 优化背景
  在 Android debug 编译 过程中,最主要的耗时在 transform 上,而上文 介绍 今日头条项目自定义 transform 已经被高度优化过,剩下的 dexBuilder(将 class 转换成 dex ) ,dexMerge 等 task 耗时就成为了性能瓶颈,dexBuilder 全量编译耗时 60s 左右,增量编译耗时 22s 左右。
  根据 DexArchiveBuilderTransform 关键方法 launchProcessing 里面关键一行 isDirectoryBased,如果是目录类型的输入,会根据具体变动 class 文件做增量的 dex 编译 ,但是如果是 jar 输入类型,那只要 jar 里任何一个类变动,则整个 jar 所有类都需要重执行 dex,但是由于 gradle 的依赖特性,基本上只有 app 模块是目录类的输入,其他 library 都是 jar 输入类型,对于比较大的业务模块 ,如果该模块有几千个类,那每改动一次类,就会有几千类连带重新 执行 dex 编译。
  dexBuilder 增量效果量化
  在优化前为了得到真正的重新执行 dex 编译的数值,做到最佳优化,设计了一套 hook dex 编译流程的方法(该方法理论上可以 hook Android gradle plugin 任意类:大致就是 hook classLoader ,提前用 asm 修改 D8DexArchiveBuilder 中的 convert 方法
  通过对 D8DexArchiveBuilder 的 hook ,统计到优化前改动一行代码会连带着 24968 个类重新执行 dex 编译,增量效果非常差。
  优化方案
  既然 jar 输入相比于 目录输入来说增量编译效果非常差,那么可以想到 hook TransformInvocation 中的 input 方法,动态将 project 的 jar 类型输入(JarInput)映射为一个 目录输入(DirectoryInput),那么子模块修改对应代码时,只重新编译目录中被修改的 class 为 dex(而不是原来的整个 jar 内所有 class 重新执行 dex 编译),整体 dex 重新编译的数量将大幅度减少。实现具体方案如下:
  而 jar 转 目录的映射细节为:
  在第一次增量修改完成后,重新执行 dex 编译的类数量降低至 2152 个,但是其中仍然有很多迷惑的不该执行 dex 编译的类,预期是修改多少类,就重新执行 多少次 dex,因此继续对其中原因进行进一步的探索
  desugarGraph 异常
  由于 java8 的字节码有些指令在 Android 虚拟机中并不能得到支持,会在编译流程中,将这些指令进行脱糖,转换成已有的指令,而 d8 中 desugar 的流程合并到了 dexBuilder 中,为了避免某些类 desugar 后,依赖它的类的行为正确,需要把依赖它的所有类重新执行一遍 dex 编译。
  而 d8 会根据 DesugaringGraph 查找 desguar 有变动的类及其依赖的 jar 包,如图下面获得到的 addtionalPaths 是 desguar 类可能直接间接相关的 jar 包,即使这些 jar 包没有任何文件内容变更,其中所有类也得重新全部执行一次 dex 编译。
  DesugaringGraph 逻辑概述
  该类用来辅助获取依赖或间接依赖到变更文件的所有文件,而它的生成逻辑为: 全量或增量编译类的时候记录类型之间的依赖和被依赖关系,依赖关系的判断条件有
  父类直接实现的接口调用 dynamic 方法指令时的返回类型
  DesugaringGraph 不仅记录了类依赖的类,和依赖它的类,同时也记录了一个文件路径收录了哪些类
  如果文件路径是 class 文件,那路径就收录 1 个类如果路径是 jar 文件,收录这个 jar 下所有类。
  在增量编译时检查到变动的文件时,会检查这个文件路径收录的所有类, 然后递归查找所有直接/间接依赖它的类,并且找到这些依赖它的类后,会把这个类所在的 jar 包作为额外的处理类型(即使 jar 本身没有任何变动,里面所有的类仍然需要重新 dex 编译)
  顺着这个解析关系,找到了一个不正常的 jar 包 bdjson_api ,这个 jar 只有 3 个文件 (IBDJson,BDJsonCollector, BDJsonConstants) 。但是 BDJsonCollector 是一个 stub 类,每次执行 transform 会采集到其他类的信息然后往该类的方法中注入,因此该文件每次编译时都会变动。 这个类本身并没有多少直接依赖它的类,主要是 它所在的 jar 包还有个 IBDJson 接口。
  按照之前的 DesugaringGraph 依赖关系,所有 IBDJson 接口的实现类被判断为依赖它,然后这些实现类如果出现在某个 dynamic 方法中,又会被层层查找,查找完了之后,还得计算所有依赖类所在的 jar 包,jar 包中其他没有依赖它的类也会被重新 dex 编译, 在这个 case 的依赖查找中,连带重新执行 dex 编译的类数量并不多,大概为 4 个 jar 包共 2000 多个类重新执行了无意义的 dex 流程,但是如果是其他 sdk jar 包,则可能就会给 dexBuilder 增量带来毁灭性的打击。 上述问题的解决方法:
  把每次都会修改的 Stub 注入类和其他接口类分离,放在不同 jar 包。(需要改造业务,比较麻烦)动态把这个 sdk jar 输入转换成目录输入。(上文介绍的方法,也与上面 jar 转目录的初衷相符,只不过是漏掉了这个 case,但是却意外证明了:除了收录业务代码多的 project 的 jar 输入需要转换为目录外,sdk jar 同样有必要)
  修复后修改一行代码重新执行 dex 的数量为 10 ,其中 9 个是每次 transform 会修改的 stub 类,1 个是实际修改类。做到了真正的 改多少类,执行多次 dex 编译。
  收益
  assemebleDebug 的增量编译中从原来(上文 transform 优化后)的 35s~40s 是降低至均值 17s,在 fast build 中效果最明显(屏蔽了 apt),第二次增量编译能突破到 9s 实现秒级编译。
  而经过上面所有的优化后,耗时数据里耗时最严重的 dexBuilder 和 dex-merge 基本都降低在 1s 左右,自定义 transform 也是 1s 左右,其他 task 基本都是零点几秒。在不使用 hotfix 方案的情况下(由于今日头条项目使用了过多的自定义 transform 和插件方案,所以不好使用 instantrun 等 hostfix 方案),相关 task 的耗时基本达到了优化的极限。
  build-cache 优化踩坑
  Build-cache 是 gralde 提供的一个编译缓存方案,目的是在构建过程中当两个 task 的输入相同时,可以复用缓存内容,直接跳过 task 的执行拿到缓存好的执行结果。由于缓存结果既可以放在本地磁盘,也可以从远程获取,因此容易想到利用 ci 提前 构建缓存包,在其他 ci 机器和开发时利用缓存包获得加速效果。
  那么如何判断 task 可以直接获取 之前 task 的缓存内容作为输出呢?定义为可缓存的 task ,会定义一些缓存相关的属性,task 执行时通过文件指纹,缓存属性等一大堆属性计算出缓存 key ,用于查找是否命中缓存,计算维度有:
  但是原生的 build-cahce 在缓存命中率上惨不忍睹,公司内抖音团队基于 gradle4.x 的源码做过一些提高命中率的修改,不过今日头条用的 gradle 版本是 5.1 ,受抖音团队的启发,也对 gradle5.1 源码做了些定制化的修改,用于 dump 缓存 key 的计算流程,快速发现缓存问题。相比于抖音发现的一些影响缓存命中的问题,额外发现了一些诸如 mbox , kapt 元素遍历顺序不固定的问题,这里只挑一个典型的 apt 顺序不一致的问题进行介绍:
  apt 顺序不一致导致的缓存失效问题
  经过修改 gradle5.1 源码后对编译流程的信息采集,发现有的 task 缓存无法命中是因为 kapt 时,很多生成代码块逻辑是一样的,但是顺序不一样(如下图 demo :下面两个生成方法的逻辑一致,但是判断顺序不一致,这应该是在 processor 中通过 RoundEnviroment 获取到 注解元素 elemnts 顺序不一致导致的 )
  其内部的原因可能是文件遍历目录时获取子文件的顺序不一致,导致了子文件对应注解元素的顺序也不一致, 总之这个操作影响了生成文件内代码的顺序,也影响了该文件的 hash 计算结果,导致 build-cache 在计算 javac task 的 key 时会错乱导致缓存无法命中。
  解决方案
  但是注意到 AbstractProcessor 的核心方法 process 的两个参数都是接口,因此想到可以代理原来的 RoundEnvironment 接口,将其 getElementXx 的方法经过固定排序后返回,使得 apt 注解元素的顺序能够固定下来。
  由于篇幅影响,其他影响缓存命中相关的 case 略(主要是一些涉及到文件绝对路径, classPath 相关的问题)
  收益由于大多开发场景是引入多少模块就修改多少模块内容,很难获得命中缓存, 收益很小主要是全源码场景能稳定获得一些编译加速,基本上在 22~99s 左右。编译耗时防恶化管控
  在今日头条这种大型工程中,有很多业务部门参与开发,仅 Android 工程 开发人员就有几百人且人员变动频繁,因此内部任何一项优化工作必然是得搭配上一些管控措施的,否则一边优化一边恶化,空浪费人力。
  为此制定了一些管控方案,首先是 debug 阶段的 新增 transform 管控,设置为白名单形式,如果在开发阶段新增了 transform 直接终止编译流程,通过说明文档告知管控的规则,当然,管控的目的是尽可能减少一些不必要的不合理的编译问题,并不是与业务团队作对,如果某一个操作拖慢了整体的编译耗时,但是在 app 性能/稳定性方面有更大收益,且无法在编译期做更多的优化,仍然是允许添加的,只不过是得提前把这个问题暴露出来而已,能更快的找出更多的解决思路,比如引导使用 byteX 等 transform 收敛方案。
  另一方面的是合码流程方面的阻塞 : 今日头条 为了保障 app 的性能稳定性,在合码流程上设置了许多自动化的卡点: 如 包大小检测,插件依赖变更检查, so 变更检查,启动性能检测等,检测到对应问题(如包大小增加异常)会阻塞合码流程。为了管控编译速度 ,使其不至于恶化的太快,也加上了对应的 基于 task 级别的管控,当某一个 task 耗时异常波动,或者新增全新类型的 task 时,能够自动的发现问题,通过机器人将相关人员拉到 mr 讨论群中, 尽量在 合码完成前能发现问题。
  总结
  为了持续稳定的保持较快的编译速度,可能需要做到以下几点:
  项目需要有良好的工程结构,对业务模块进行适当粒度的拆分,做好 aar/源码的切换不仅能节省 javac/kotlinCompile 的耗时,也是其他优化方案的基础。工程配置要有区分度,不要所有子模块都用同样的配置,比如根本不会用到 kapt 功能的模块就别打开 kapt task 了。transform 若无必要,无须新加,或者按级别划分,如今日头条在 debug,devMode,release 不同的构建级别用到的 transform 数量是不一致的,尽量让绝大多数人能获得相对最快的编译速度体验,而不会被用不到的功能拖慢速度。一定要新增的 transform 可以先多用现有的增量方案,如 byteX 以及本文提供的类信息注入框架, 尽量把不要的文件 io 合并。很多高耗时的 官方 task(dexBuilder) 都是有直接或间接的办法提升其效率的,并且如果除了耗时之外有其他的衡量手段,如本文提到的重新 dex 率,通过量化数据可以快速的发现问题,进而找到耗时的罪魁祸首。与 app 性能优化等工作类似,编译速度优化既需要持续进行,也需要一定的问题发现手段,尽量避免问题出现很长一段时间后再去查找原因(那时候可能业务依赖程度会非常高,难以修改)。更多分享
  字节跳动分布式表格存储系统的演进
  字节跳动自研强一致在线 KV&表格存储实践 - 上篇
  字节跳动自研强一致在线 KV &表格存储实践 - 下篇
  字节跳动在 Go 网络库上的实践
  字节跳动-GIP-Android 平台架构团队
  字节跳动-GIP-Android 平台架构团队以服务今日头条产品为主,同时协助公司其他产品,在产品性能、稳定性等用户体验,研发流程,编译优化,架构方向上不断优化和深入探索,以满足产品快速迭代的同时,保持较高的用户体验。我们长期招聘 Android 平台架构方向的同学,在北京,深圳均有相关岗位,想深入交流或者需要部门内推、投递简历的可以联系邮箱 (标题注明 : 字节跳动-GIP 平台 android 部门直推)
  欢迎关注字节跳动技术团队 查看全部

  最新版:采集北京APP2022最新安卓版v1.0.8.2最新安卓版
  采集北京APP2022最新安卓版,这是一款非常好用的标本取样应用软件工具。这个软件里面有很多人脸识别内容和各种采集功能。非常全面,还可以为您提供各种优质服务。里面的很多资料和数据采集都非常全面。喜欢的朋友,快来289下载体验吧。
  软件说明
  采集北京APP是一款带来更多贴心功能的应用,您可以免费进入体验,超级简单的个人信息注册流程,享受优质服务,直接了解北京我们的各种健康相关信息也可以得到各种数据。
  软件特点:
  1、完成个人信息后,根据实际情况选择采样点和选择采样方式,非常方便;
  2.输入身份证号码,可查询近期参加过核酸检测筛查采样的居民记录;
  
  3、注册后可提高抽样效率,二维码可注册,随时使用,防止现场失误。
  软件亮点:
  1、系统基于身份识别技术,完美融合十合一采集模式;
  2、专为北京地区医护人员设计的核酸采集工具,可实现数据录入和扫码采集;
  3、也可以方便后期查询,提高医护人员的采集效率。还有相关的学习资料。
  软件特点:
  1、信息采集速度是以往人工登记方式的3倍以上,实验室标本登记速度是3倍以上;
  
  2、标本采集人员只需提前下载并安装手机APP应用,通过短短5分钟的培训,即可轻松掌握操作要领;
  3.软件的功能还是很不错的,使用的方法也比较独特,可以用来做采集核酸检测。
  软件点评:
  1、软件操作简单方便。您只需为核酸人员拍照,自动为您生成文件;
  2、帮助您管理自己的核酸信息,满足您对核酸管理的一切需求;
  3、多种模板和表格,可以为大家进行各种填表任务,超级方便。
  外媒:今日头条 Android &#39;秒&#39; 级编译速度优化
  背景介绍
  Android 项目一般使用 gradle 作为构建打包工具,而其执行速度慢也一直为人所诟病,对于今日头条 Android 项目这种千万行级别的大型工程来说,全量编译一次的时间可能高达六七分钟,在某些需要快速验证功能的场景,改动一行代码的增量编译甚至也需要等两三分钟,这般龟速严重影响了开发体验与效率,因此针对 gradle 编译构建耗时进行优化显得尤为重要。
  在今日头条 Android 项目上,编译构建速度的优化和恶化一直在交替执行,18 年时由于模块化拆分等影响,clean build 一次的耗时达到了顶峰 7 分 30s 左右,相关同学通过模块 aar 化,maven 代理加速,以及增量 java 编译等优化手段,将 clean build 耗时优化到 4 分钟,增量编译优化到 20~30s 。但是后面随着 kotlin 的大规模使用,自定义 transform 以及 apt 库泛滥,又将增量编译速度拖慢到 2 分 30s ,且有进一步恶化的趋势。为了优化现有不合理的编译耗时,防止进一步的恶化,最近的 5,6 双月又针对编译耗时做了一些列专项优化(kapt,transform,dexBuilder,build-cache 等) 并添加了相关的防恶化管控方案。 从 4.27 截止到 6.29 ,整体的优化效果如下:
  历史优化方案
  由于 18 年左右客户端基础技术相关同学已经对今日头条 Android 工程做了许多 gradle 相关的优化,且这些优化是近期优化的基础,因此先挑选几个具有代表性的方案进行介绍,作为下文的背景同步。
  maven 代理优化 sync 时间背景
  gradle 工程往往会在 repositories 中添加一些列的 maven 仓库地址,作为组件依赖获取的查找路径,早期在今日头条的项目中配置了十几个 maven 的地址,但是依赖获取是按照 maven 仓库配置的顺序依次查找的,如果某个组件存在于最后一个仓库中,那前面的十几个仓库得依次发起网络请求查找,并在网络请求返回失败后才查找下一个,如果项目中大多组件都在较后仓库的位置,累加起来的查找时间就会很长。
  优化方案使用公司内部搭建的 maven 私服,在私服上设置代理仓库,为其他仓库配置代理(例如 google、jcenter、mavenCentral 等仓库),代理仓库创建好后,在 Negative Cache 配置项中关闭其 cache 开关:如果查找时没有找到某版本依赖库时会缓存失败结果,一段时间内不会重新去 maven 仓库查找对应依赖库,即使 maven 仓库中已经有该版本的依赖库,查找时仍然返回失败的结果。建立仓库组,将所有仓库归放到一个统一的仓库组里,依赖查找时只需要去这个组仓库中查找,这样能大大降低多次发起网络请求遍历仓库的耗时。模块 aar 化背景
  今日头条项目进行了多次组件化和模块化的重构,分拆出了 200 多个子模块,这些子模块如果全都 include 进项目,那么在 clean build 的时候,所有子模块的代码需要重新编译,而对于大多数开发人员来说,基本上只关心自己负责的少数几个模块,根本不需要改动其他模块的代码,这些其他 project 的配置和编译时间就成为了不必要的代价。
  优化方案
  对于以上子模块过多的解决方案是:将所有模块发布成 aar ,在项目中全部默认通过 maven 依赖这些编译好的组件,而在需要修改某个模块时,通过配置项将该模块的依赖形式改为源码依赖,做到在编译时只编译改动的模块。但是这样做会导致模块渐渐的又全部变为源码依赖的形式,除非规定每次修改完对应模块后,开发人员自己手动将模块发布成 aar ,并改回依赖形式。这种严重依赖开发人员自觉,并且在模块数量多依赖关系复杂的时候会显得异常繁琐,因此为了开发阶段的便利,设计了一整套更完整细致的方案:
  开发时,从主分支拉取的代码一定是全 aar 依赖的,除了 app 模块没有任何子模块是源码引入。需要修改对应模块时,通过修改 local.properties 里的 INCLUDES 参数指定源码引入的模块。开发完成后,push 代码至远端,触发代码合并流程后,在 ci 预编译过程与合码目标分支对比,检测修改的模块,将这些模块按照依赖关系依次发布成 aar ,并在工程中修改依赖为新版本的 aar, 这一步保证了每次代码合入完成后,主分支上的依赖都是全 aar 依赖的。收益
  通过上述改造,将源码模块切换成 aar 依赖后,clean build 耗时从 7,8 分钟降低至 4,5 分钟,收益接近 50%,效果显著。
  增量 java/kotlin 编译背景
  在非 clean build 的情况下,更改 java/kotlin 代码虽然会做增量编译,但是为了绝对的正确性,gradle 会根据一些列依赖关系计算,选择需要重新编译的代码,这个计算粒度比较粗,稍微改动一个类的代码,就可能导致大量代码重新执行 apt, 编译等流程。
  由于 gradle 作为通用框架,其设计的基本原则是绝对的正确,因此很容易导致增量编译失效,在实际开发中,为了快速编译展示结果,可以在编译正确性和编译速度上做一个折中的方案:
  禁用原创的 javac/kotlinCompile 等 task, 自行实现代码增量修改判断,只编译修改的代码。动态禁用 kapt 相关的 task, 降低 kapt,kaptGenerateStub 等 task 的耗时。
  以上方案(下文全部简称为 fastbuild) 虽然在涉及常量修改,方法签名变更方面 存在一定的问题(常量内联等),但是能换来增量编译从 2 分多降低至 20~30s,极大的提升编译效率,且有问题的场景并不常见,因此整体上该方案是利大于弊的。
  编译耗时恶化
  通过上文介绍的几个优化方案和其他优化方式,在 18 年时,今日头条 Android 项目的整体编译速度(clean build 4~5min, fast 增量编译 20~30s)在同量级的大型工程中来说是比较快的 ,然而后期随着业务发展的需求,编译脚本添加了很多新的逻辑:
  kotlin 大规模使用,kapt 新增了很多注解处理逻辑。引入对 java8 语法的支持 , java8 语法的 desugar(脱糖)操作增加了编译耗时。大量的字节码插桩需求,添加了许多 transform ,大幅度提升了增量编译耗时。
  这些逻辑的引入,使得增量编译耗时恶化到 2 分 30s,即使采用 fastbuild,改动一行代码编译也需要 1 分 30s 之多,开发体验非常差。而下文将着重描述最近一段时间对上述问题的优化过程。
  近期优化方案app 壳模块 kapt 优化背景
  今日头条工程经过多次模块化,组件化重构后, app 模块(NewsArticle)的大部分代码都已经迁移到子模块(上文已经介绍过子模块可以采用 aar 化用于编译速度优化,app 模块只剩下一个壳而已。
  但是从 build profile 数据(执行 gradle 命令时添加 --profile 参数会在编译完成后输出相关 task 耗时的统计文件) 中发现到一个异常 case:明明只有 2 个类的 app 模块 kapt(annotationProcessor 注解处理) 相关耗时近 1 分钟。
  通过进一步观察,虽然 app 模块拆分后只有 2 个简单类的代码,但是却用了 6 种 kapt 库, 且实际生效的只是其中 ServiceImpl 一个注解 (内部 ServiceManager 框架,用于指示生产 Proxy 类,对模块之间代码调用进行解耦)。如此一顿操作猛如虎,每次编译却只生成固定的两个 Proxy 类,与 53s 的高耗时相比,投入产出比极低。
  优化方案
  把固定生成的 Proxy 类从 generate 目录移动到 src 目录,然后禁止 app 模块中 kapt 相关 task ,并添加相关管控方案(如下图: 检测到不合理情况后立刻抛出异常),防止其他人添加新增的 kapt 库。
  收益在 mac clean build 中平均有 40s 收益在 ci clean build 中平均有 20s 收益kapt 隔离优化背景
  通过上文介绍在 app 模块发现的异常的 kapt case, 进而发现在工程中为了方便,定义了一个 library.gradle ,该文件的作用是定义项目中通用的 Android dsl 配置和共有的基础依赖,因此项目中所有子模块均 apply 了这个文件,但是这个文件陆陆续续的被不同的业务添加新的 kapt 注解处理库,在全源码编译时,所有子模块都得执行 library 模块中定义的全部 6 个 kapt ,即使该模块没有任何注解相关的处理也不例外。
  而上述情况的问题在于:相比纯 java 模块的注解处理,kotlin 代码需要先通过 kaptGenerateStub 将 kt 文件转换成为 java ,让 apt 处理程序能够统一的面向 java 做注解扫描和处理。但是上面讲到其实有很多模块是根本不会有任何实际 kapt 处理过程的,却白白的做了一次 kt 转 java 的操作,源码引入的模块越多,这种无意义的耗时累加起来也非常可观。
  为了能够弄清楚到底有哪些子模块真正用到了 kapt ,哪些没用到可以禁用掉 kapt 相关 task ,对项目中所有子模块进行了一遍扫描:
  获取 kapt configuration 的所有依赖,可以得到 kapt 依赖库的 jar 包,利用 asm 获取所有 annotation.遍历所有 subproject 的 sourceset 下所有 .java,.kt 源文件,解析 import 信息,看是否有步骤 1 中解析的 annotationpackage task 完成后遍历 所有 subproject 所有 generate/apt ,generate/kapt 目录下生成的 java 文件
  使用上述方案,通过全源码打包最终扫描出来大概是 70+模块不会进行任何 kapt 的实际输出,且将这些不会进行输出的 kapt,kaptGenerateStub 的 task 耗时累加起来较高 217s (由于 task 并发执行所以实际总时长可能要少一些).
  获取到不实际生成 kapt 内容的模块后,开始对这些模块进行细粒度的拆分,让它们从 apply library.gradle 改为没有 kapt 相关的 library-api.gradle ,该文件除了禁用 kapt 外,与 library 逻辑一致。
  但是这样做算是在背后偷偷做了些更改,很可能后续新来的同学不知道有这种优化手段,可能新增了注解后却没有任何输出且找不到原因,而优化效果最好是尽量少给业务同学带来困扰。为了避免这种情况,便对这些 library-api 模块依赖的注解做隔离优化,即:把这些模块依赖的注解库全部 自动 exclude 掉,在尝试使用注解时会因获取不到引用(如下图所示),第一时间发现到依赖被移除的问题。
  另一方面在编译出现错误时,对应 gradle 插件会自动解析找不到的符号,如果发现该符号是被隔离优化的注解,会提示将 library-api 替换成 library,尽可能降低优化方案对业务的负面影响。
  收益mac 全源码场景中有 58s 左右的加速收益。ci 机器上由于 cpu 核数更多 ,task 并发性能更好,只有 10s 左右的收益。transform 优化背景
  transform 作为 Android gradle plugin 提供给开发者的 API,用于在 apk 构建过程中,对 class 字节码,resources 等文件内容进行插桩修改,例如官方的 dex, proguard 等功能均由此 api 实现。
  对于今日头条这种大型工程来说,有很多诸如性能插桩、自动埋点插桩等相关需求,因此基于此 api 开发了大量 transform,用于实现特定功能,但是这些 transform 基本上都是不支持增量编译的,即使只改动了一行代码,这 些 transform 都会遍历所有 class 文件,解析字节码中的方法字段信息,关键是这类 transform 数量有十几个,将这些遍历耗时乘以 10 累加之后,增量编译耗时自然居高不下。
  根据分析,其中性能插桩等相关 transform 做的一些面向线上的插桩方案是完全可以只在 release 打包时打开的,因此可以直接在 debug 编译时禁用这些功能,用于提升开发期间的编译速度。而剩下的 9 个 transform 特征比较相似,可能在一些插桩细节上有所不同,它们大致的处理逻辑为:
  在各个模块中使用 apt processor 采集模块 xx 注解的 class 信息然后生成一个 xxCollect 类,该类的作用是采集好 apt 阶段解析到的本模块的类信息将所有模块采集到的信息进行汇总,利用 transform 阶段扫描出所有的 xxCollect 信息,通过 javaassit 或者 asm 往一个 xxCollectMgr 的某个 collectXxx 方法插桩注入之前收到的信息业务代码可通过 xxCollectMgr 的 collectXxx 方法获取到在各个模块动态生成的所有 xxCollect 信息。(例: 页面路由相关框架便是通过该逻辑采集到所有子模块的路由注册信息)
  由于这 9 个自定义 transform 的功能如此类似,便决定将这些 transform 合并成一个,这样同一个文件的读写操作只执行一次,并且可以做定制化的增量编译优化。虽然公司内有类似的 transform 合并优化方案 byteX ( 已在 github 开源),但是由于今日头条项目在 debug 阶段未开启该功能,且 ByteX 做了一些诸如 ClassGrapth 的构建,对类文件做两次遍历等操作,对于实现类信息采集和信息注入 这个功能来说,byteX 显得比较重 ,于是仍然针对类信息采集注入功能这个细分场景开发了一个收敛框架。
  收益
  该框架完成了内部 9 种类信息采集注入相关框架的收敛,编译耗时的绝对值加速了 25s 左右,且由于提供了统一的增量缓存功能,使得改动一行代码的耗时可以从 2 分 30s 降低到 35~40s ,实现了增量编译速度大的飞跃。最关键的是将所有自定义 transform 统一管控后,后续可以做统一定制化的需求,进一步优化编译速度。
  dexBuilder 优化背景
  在 Android debug 编译 过程中,最主要的耗时在 transform 上,而上文 介绍 今日头条项目自定义 transform 已经被高度优化过,剩下的 dexBuilder(将 class 转换成 dex ) ,dexMerge 等 task 耗时就成为了性能瓶颈,dexBuilder 全量编译耗时 60s 左右,增量编译耗时 22s 左右。
  根据 DexArchiveBuilderTransform 关键方法 launchProcessing 里面关键一行 isDirectoryBased,如果是目录类型的输入,会根据具体变动 class 文件做增量的 dex 编译 ,但是如果是 jar 输入类型,那只要 jar 里任何一个类变动,则整个 jar 所有类都需要重执行 dex,但是由于 gradle 的依赖特性,基本上只有 app 模块是目录类的输入,其他 library 都是 jar 输入类型,对于比较大的业务模块 ,如果该模块有几千个类,那每改动一次类,就会有几千类连带重新 执行 dex 编译。
  dexBuilder 增量效果量化
  在优化前为了得到真正的重新执行 dex 编译的数值,做到最佳优化,设计了一套 hook dex 编译流程的方法(该方法理论上可以 hook Android gradle plugin 任意类:大致就是 hook classLoader ,提前用 asm 修改 D8DexArchiveBuilder 中的 convert 方法
  通过对 D8DexArchiveBuilder 的 hook ,统计到优化前改动一行代码会连带着 24968 个类重新执行 dex 编译,增量效果非常差。
  优化方案
  既然 jar 输入相比于 目录输入来说增量编译效果非常差,那么可以想到 hook TransformInvocation 中的 input 方法,动态将 project 的 jar 类型输入(JarInput)映射为一个 目录输入(DirectoryInput),那么子模块修改对应代码时,只重新编译目录中被修改的 class 为 dex(而不是原来的整个 jar 内所有 class 重新执行 dex 编译),整体 dex 重新编译的数量将大幅度减少。实现具体方案如下:
  而 jar 转 目录的映射细节为:
  在第一次增量修改完成后,重新执行 dex 编译的类数量降低至 2152 个,但是其中仍然有很多迷惑的不该执行 dex 编译的类,预期是修改多少类,就重新执行 多少次 dex,因此继续对其中原因进行进一步的探索
  desugarGraph 异常
  由于 java8 的字节码有些指令在 Android 虚拟机中并不能得到支持,会在编译流程中,将这些指令进行脱糖,转换成已有的指令,而 d8 中 desugar 的流程合并到了 dexBuilder 中,为了避免某些类 desugar 后,依赖它的类的行为正确,需要把依赖它的所有类重新执行一遍 dex 编译。
  而 d8 会根据 DesugaringGraph 查找 desguar 有变动的类及其依赖的 jar 包,如图下面获得到的 addtionalPaths 是 desguar 类可能直接间接相关的 jar 包,即使这些 jar 包没有任何文件内容变更,其中所有类也得重新全部执行一次 dex 编译。
  DesugaringGraph 逻辑概述
  该类用来辅助获取依赖或间接依赖到变更文件的所有文件,而它的生成逻辑为: 全量或增量编译类的时候记录类型之间的依赖和被依赖关系,依赖关系的判断条件有
  
  父类直接实现的接口调用 dynamic 方法指令时的返回类型
  DesugaringGraph 不仅记录了类依赖的类,和依赖它的类,同时也记录了一个文件路径收录了哪些类
  如果文件路径是 class 文件,那路径就收录 1 个类如果路径是 jar 文件,收录这个 jar 下所有类。
  在增量编译时检查到变动的文件时,会检查这个文件路径收录的所有类, 然后递归查找所有直接/间接依赖它的类,并且找到这些依赖它的类后,会把这个类所在的 jar 包作为额外的处理类型(即使 jar 本身没有任何变动,里面所有的类仍然需要重新 dex 编译)
  顺着这个解析关系,找到了一个不正常的 jar 包 bdjson_api ,这个 jar 只有 3 个文件 (IBDJson,BDJsonCollector, BDJsonConstants) 。但是 BDJsonCollector 是一个 stub 类,每次执行 transform 会采集到其他类的信息然后往该类的方法中注入,因此该文件每次编译时都会变动。 这个类本身并没有多少直接依赖它的类,主要是 它所在的 jar 包还有个 IBDJson 接口。
  按照之前的 DesugaringGraph 依赖关系,所有 IBDJson 接口的实现类被判断为依赖它,然后这些实现类如果出现在某个 dynamic 方法中,又会被层层查找,查找完了之后,还得计算所有依赖类所在的 jar 包,jar 包中其他没有依赖它的类也会被重新 dex 编译, 在这个 case 的依赖查找中,连带重新执行 dex 编译的类数量并不多,大概为 4 个 jar 包共 2000 多个类重新执行了无意义的 dex 流程,但是如果是其他 sdk jar 包,则可能就会给 dexBuilder 增量带来毁灭性的打击。 上述问题的解决方法:
  把每次都会修改的 Stub 注入类和其他接口类分离,放在不同 jar 包。(需要改造业务,比较麻烦)动态把这个 sdk jar 输入转换成目录输入。(上文介绍的方法,也与上面 jar 转目录的初衷相符,只不过是漏掉了这个 case,但是却意外证明了:除了收录业务代码多的 project 的 jar 输入需要转换为目录外,sdk jar 同样有必要)
  修复后修改一行代码重新执行 dex 的数量为 10 ,其中 9 个是每次 transform 会修改的 stub 类,1 个是实际修改类。做到了真正的 改多少类,执行多次 dex 编译。
  收益
  assemebleDebug 的增量编译中从原来(上文 transform 优化后)的 35s~40s 是降低至均值 17s,在 fast build 中效果最明显(屏蔽了 apt),第二次增量编译能突破到 9s 实现秒级编译。
  而经过上面所有的优化后,耗时数据里耗时最严重的 dexBuilder 和 dex-merge 基本都降低在 1s 左右,自定义 transform 也是 1s 左右,其他 task 基本都是零点几秒。在不使用 hotfix 方案的情况下(由于今日头条项目使用了过多的自定义 transform 和插件方案,所以不好使用 instantrun 等 hostfix 方案),相关 task 的耗时基本达到了优化的极限。
  build-cache 优化踩坑
  Build-cache 是 gralde 提供的一个编译缓存方案,目的是在构建过程中当两个 task 的输入相同时,可以复用缓存内容,直接跳过 task 的执行拿到缓存好的执行结果。由于缓存结果既可以放在本地磁盘,也可以从远程获取,因此容易想到利用 ci 提前 构建缓存包,在其他 ci 机器和开发时利用缓存包获得加速效果。
  那么如何判断 task 可以直接获取 之前 task 的缓存内容作为输出呢?定义为可缓存的 task ,会定义一些缓存相关的属性,task 执行时通过文件指纹,缓存属性等一大堆属性计算出缓存 key ,用于查找是否命中缓存,计算维度有:
  但是原生的 build-cahce 在缓存命中率上惨不忍睹,公司内抖音团队基于 gradle4.x 的源码做过一些提高命中率的修改,不过今日头条用的 gradle 版本是 5.1 ,受抖音团队的启发,也对 gradle5.1 源码做了些定制化的修改,用于 dump 缓存 key 的计算流程,快速发现缓存问题。相比于抖音发现的一些影响缓存命中的问题,额外发现了一些诸如 mbox , kapt 元素遍历顺序不固定的问题,这里只挑一个典型的 apt 顺序不一致的问题进行介绍:
  apt 顺序不一致导致的缓存失效问题
  经过修改 gradle5.1 源码后对编译流程的信息采集,发现有的 task 缓存无法命中是因为 kapt 时,很多生成代码块逻辑是一样的,但是顺序不一样(如下图 demo :下面两个生成方法的逻辑一致,但是判断顺序不一致,这应该是在 processor 中通过 RoundEnviroment 获取到 注解元素 elemnts 顺序不一致导致的 )
  其内部的原因可能是文件遍历目录时获取子文件的顺序不一致,导致了子文件对应注解元素的顺序也不一致, 总之这个操作影响了生成文件内代码的顺序,也影响了该文件的 hash 计算结果,导致 build-cache 在计算 javac task 的 key 时会错乱导致缓存无法命中。
  解决方案
  但是注意到 AbstractProcessor 的核心方法 process 的两个参数都是接口,因此想到可以代理原来的 RoundEnvironment 接口,将其 getElementXx 的方法经过固定排序后返回,使得 apt 注解元素的顺序能够固定下来。
  由于篇幅影响,其他影响缓存命中相关的 case 略(主要是一些涉及到文件绝对路径, classPath 相关的问题)
  收益由于大多开发场景是引入多少模块就修改多少模块内容,很难获得命中缓存, 收益很小主要是全源码场景能稳定获得一些编译加速,基本上在 22~99s 左右。编译耗时防恶化管控
  在今日头条这种大型工程中,有很多业务部门参与开发,仅 Android 工程 开发人员就有几百人且人员变动频繁,因此内部任何一项优化工作必然是得搭配上一些管控措施的,否则一边优化一边恶化,空浪费人力。
  为此制定了一些管控方案,首先是 debug 阶段的 新增 transform 管控,设置为白名单形式,如果在开发阶段新增了 transform 直接终止编译流程,通过说明文档告知管控的规则,当然,管控的目的是尽可能减少一些不必要的不合理的编译问题,并不是与业务团队作对,如果某一个操作拖慢了整体的编译耗时,但是在 app 性能/稳定性方面有更大收益,且无法在编译期做更多的优化,仍然是允许添加的,只不过是得提前把这个问题暴露出来而已,能更快的找出更多的解决思路,比如引导使用 byteX 等 transform 收敛方案。
  另一方面的是合码流程方面的阻塞 : 今日头条 为了保障 app 的性能稳定性,在合码流程上设置了许多自动化的卡点: 如 包大小检测,插件依赖变更检查, so 变更检查,启动性能检测等,检测到对应问题(如包大小增加异常)会阻塞合码流程。为了管控编译速度 ,使其不至于恶化的太快,也加上了对应的 基于 task 级别的管控,当某一个 task 耗时异常波动,或者新增全新类型的 task 时,能够自动的发现问题,通过机器人将相关人员拉到 mr 讨论群中, 尽量在 合码完成前能发现问题。
  总结
  为了持续稳定的保持较快的编译速度,可能需要做到以下几点:
  项目需要有良好的工程结构,对业务模块进行适当粒度的拆分,做好 aar/源码的切换不仅能节省 javac/kotlinCompile 的耗时,也是其他优化方案的基础。工程配置要有区分度,不要所有子模块都用同样的配置,比如根本不会用到 kapt 功能的模块就别打开 kapt task 了。transform 若无必要,无须新加,或者按级别划分,如今日头条在 debug,devMode,release 不同的构建级别用到的 transform 数量是不一致的,尽量让绝大多数人能获得相对最快的编译速度体验,而不会被用不到的功能拖慢速度。一定要新增的 transform 可以先多用现有的增量方案,如 byteX 以及本文提供的类信息注入框架, 尽量把不要的文件 io 合并。很多高耗时的 官方 task(dexBuilder) 都是有直接或间接的办法提升其效率的,并且如果除了耗时之外有其他的衡量手段,如本文提到的重新 dex 率,通过量化数据可以快速的发现问题,进而找到耗时的罪魁祸首。与 app 性能优化等工作类似,编译速度优化既需要持续进行,也需要一定的问题发现手段,尽量避免问题出现很长一段时间后再去查找原因(那时候可能业务依赖程度会非常高,难以修改)。更多分享
  背景介绍
  Android 项目一般使用 gradle 作为构建打包工具,而其执行速度慢也一直为人所诟病,对于今日头条 Android 项目这种千万行级别的大型工程来说,全量编译一次的时间可能高达六七分钟,在某些需要快速验证功能的场景,改动一行代码的增量编译甚至也需要等两三分钟,这般龟速严重影响了开发体验与效率,因此针对 gradle 编译构建耗时进行优化显得尤为重要。
  在今日头条 Android 项目上,编译构建速度的优化和恶化一直在交替执行,18 年时由于模块化拆分等影响,clean build 一次的耗时达到了顶峰 7 分 30s 左右,相关同学通过模块 aar 化,maven 代理加速,以及增量 java 编译等优化手段,将 clean build 耗时优化到 4 分钟,增量编译优化到 20~30s 。但是后面随着 kotlin 的大规模使用,自定义 transform 以及 apt 库泛滥,又将增量编译速度拖慢到 2 分 30s ,且有进一步恶化的趋势。为了优化现有不合理的编译耗时,防止进一步的恶化,最近的 5,6 双月又针对编译耗时做了一些列专项优化(kapt,transform,dexBuilder,build-cache 等) 并添加了相关的防恶化管控方案。 从 4.27 截止到 6.29 ,整体的优化效果如下:
  历史优化方案
  由于 18 年左右客户端基础技术相关同学已经对今日头条 Android 工程做了许多 gradle 相关的优化,且这些优化是近期优化的基础,因此先挑选几个具有代表性的方案进行介绍,作为下文的背景同步。
  maven 代理优化 sync 时间背景
  gradle 工程往往会在 repositories 中添加一些列的 maven 仓库地址,作为组件依赖获取的查找路径,早期在今日头条的项目中配置了十几个 maven 的地址,但是依赖获取是按照 maven 仓库配置的顺序依次查找的,如果某个组件存在于最后一个仓库中,那前面的十几个仓库得依次发起网络请求查找,并在网络请求返回失败后才查找下一个,如果项目中大多组件都在较后仓库的位置,累加起来的查找时间就会很长。
  优化方案使用公司内部搭建的 maven 私服,在私服上设置代理仓库,为其他仓库配置代理(例如 google、jcenter、mavenCentral 等仓库),代理仓库创建好后,在 Negative Cache 配置项中关闭其 cache 开关:如果查找时没有找到某版本依赖库时会缓存失败结果,一段时间内不会重新去 maven 仓库查找对应依赖库,即使 maven 仓库中已经有该版本的依赖库,查找时仍然返回失败的结果。建立仓库组,将所有仓库归放到一个统一的仓库组里,依赖查找时只需要去这个组仓库中查找,这样能大大降低多次发起网络请求遍历仓库的耗时。模块 aar 化背景
  今日头条项目进行了多次组件化和模块化的重构,分拆出了 200 多个子模块,这些子模块如果全都 include 进项目,那么在 clean build 的时候,所有子模块的代码需要重新编译,而对于大多数开发人员来说,基本上只关心自己负责的少数几个模块,根本不需要改动其他模块的代码,这些其他 project 的配置和编译时间就成为了不必要的代价。
  优化方案
  对于以上子模块过多的解决方案是:将所有模块发布成 aar ,在项目中全部默认通过 maven 依赖这些编译好的组件,而在需要修改某个模块时,通过配置项将该模块的依赖形式改为源码依赖,做到在编译时只编译改动的模块。但是这样做会导致模块渐渐的又全部变为源码依赖的形式,除非规定每次修改完对应模块后,开发人员自己手动将模块发布成 aar ,并改回依赖形式。这种严重依赖开发人员自觉,并且在模块数量多依赖关系复杂的时候会显得异常繁琐,因此为了开发阶段的便利,设计了一整套更完整细致的方案:
  开发时,从主分支拉取的代码一定是全 aar 依赖的,除了 app 模块没有任何子模块是源码引入。需要修改对应模块时,通过修改 local.properties 里的 INCLUDES 参数指定源码引入的模块。开发完成后,push 代码至远端,触发代码合并流程后,在 ci 预编译过程与合码目标分支对比,检测修改的模块,将这些模块按照依赖关系依次发布成 aar ,并在工程中修改依赖为新版本的 aar, 这一步保证了每次代码合入完成后,主分支上的依赖都是全 aar 依赖的。收益
  通过上述改造,将源码模块切换成 aar 依赖后,clean build 耗时从 7,8 分钟降低至 4,5 分钟,收益接近 50%,效果显著。
  增量 java/kotlin 编译背景
  在非 clean build 的情况下,更改 java/kotlin 代码虽然会做增量编译,但是为了绝对的正确性,gradle 会根据一些列依赖关系计算,选择需要重新编译的代码,这个计算粒度比较粗,稍微改动一个类的代码,就可能导致大量代码重新执行 apt, 编译等流程。
  由于 gradle 作为通用框架,其设计的基本原则是绝对的正确,因此很容易导致增量编译失效,在实际开发中,为了快速编译展示结果,可以在编译正确性和编译速度上做一个折中的方案:
  禁用原创的 javac/kotlinCompile 等 task, 自行实现代码增量修改判断,只编译修改的代码。动态禁用 kapt 相关的 task, 降低 kapt,kaptGenerateStub 等 task 的耗时。
  以上方案(下文全部简称为 fastbuild) 虽然在涉及常量修改,方法签名变更方面 存在一定的问题(常量内联等),但是能换来增量编译从 2 分多降低至 20~30s,极大的提升编译效率,且有问题的场景并不常见,因此整体上该方案是利大于弊的。
  编译耗时恶化
  通过上文介绍的几个优化方案和其他优化方式,在 18 年时,今日头条 Android 项目的整体编译速度(clean build 4~5min, fast 增量编译 20~30s)在同量级的大型工程中来说是比较快的 ,然而后期随着业务发展的需求,编译脚本添加了很多新的逻辑:
  kotlin 大规模使用,kapt 新增了很多注解处理逻辑。引入对 java8 语法的支持 , java8 语法的 desugar(脱糖)操作增加了编译耗时。大量的字节码插桩需求,添加了许多 transform ,大幅度提升了增量编译耗时。
  这些逻辑的引入,使得增量编译耗时恶化到 2 分 30s,即使采用 fastbuild,改动一行代码编译也需要 1 分 30s 之多,开发体验非常差。而下文将着重描述最近一段时间对上述问题的优化过程。
  近期优化方案app 壳模块 kapt 优化背景
  今日头条工程经过多次模块化,组件化重构后, app 模块(NewsArticle)的大部分代码都已经迁移到子模块(上文已经介绍过子模块可以采用 aar 化用于编译速度优化,app 模块只剩下一个壳而已。
  但是从 build profile 数据(执行 gradle 命令时添加 --profile 参数会在编译完成后输出相关 task 耗时的统计文件) 中发现到一个异常 case:明明只有 2 个类的 app 模块 kapt(annotationProcessor 注解处理) 相关耗时近 1 分钟。
  通过进一步观察,虽然 app 模块拆分后只有 2 个简单类的代码,但是却用了 6 种 kapt 库, 且实际生效的只是其中 ServiceImpl 一个注解 (内部 ServiceManager 框架,用于指示生产 Proxy 类,对模块之间代码调用进行解耦)。如此一顿操作猛如虎,每次编译却只生成固定的两个 Proxy 类,与 53s 的高耗时相比,投入产出比极低。
  优化方案
  把固定生成的 Proxy 类从 generate 目录移动到 src 目录,然后禁止 app 模块中 kapt 相关 task ,并添加相关管控方案(如下图: 检测到不合理情况后立刻抛出异常),防止其他人添加新增的 kapt 库。
  收益在 mac clean build 中平均有 40s 收益在 ci clean build 中平均有 20s 收益kapt 隔离优化背景
  通过上文介绍在 app 模块发现的异常的 kapt case, 进而发现在工程中为了方便,定义了一个 library.gradle ,该文件的作用是定义项目中通用的 Android dsl 配置和共有的基础依赖,因此项目中所有子模块均 apply 了这个文件,但是这个文件陆陆续续的被不同的业务添加新的 kapt 注解处理库,在全源码编译时,所有子模块都得执行 library 模块中定义的全部 6 个 kapt ,即使该模块没有任何注解相关的处理也不例外。
  而上述情况的问题在于:相比纯 java 模块的注解处理,kotlin 代码需要先通过 kaptGenerateStub 将 kt 文件转换成为 java ,让 apt 处理程序能够统一的面向 java 做注解扫描和处理。但是上面讲到其实有很多模块是根本不会有任何实际 kapt 处理过程的,却白白的做了一次 kt 转 java 的操作,源码引入的模块越多,这种无意义的耗时累加起来也非常可观。
  为了能够弄清楚到底有哪些子模块真正用到了 kapt ,哪些没用到可以禁用掉 kapt 相关 task ,对项目中所有子模块进行了一遍扫描:
  获取 kapt configuration 的所有依赖,可以得到 kapt 依赖库的 jar 包,利用 asm 获取所有 annotation.遍历所有 subproject 的 sourceset 下所有 .java,.kt 源文件,解析 import 信息,看是否有步骤 1 中解析的 annotationpackage task 完成后遍历 所有 subproject 所有 generate/apt ,generate/kapt 目录下生成的 java 文件
  使用上述方案,通过全源码打包最终扫描出来大概是 70+模块不会进行任何 kapt 的实际输出,且将这些不会进行输出的 kapt,kaptGenerateStub 的 task 耗时累加起来较高 217s (由于 task 并发执行所以实际总时长可能要少一些).
  
  获取到不实际生成 kapt 内容的模块后,开始对这些模块进行细粒度的拆分,让它们从 apply library.gradle 改为没有 kapt 相关的 library-api.gradle ,该文件除了禁用 kapt 外,与 library 逻辑一致。
  但是这样做算是在背后偷偷做了些更改,很可能后续新来的同学不知道有这种优化手段,可能新增了注解后却没有任何输出且找不到原因,而优化效果最好是尽量少给业务同学带来困扰。为了避免这种情况,便对这些 library-api 模块依赖的注解做隔离优化,即:把这些模块依赖的注解库全部 自动 exclude 掉,在尝试使用注解时会因获取不到引用(如下图所示),第一时间发现到依赖被移除的问题。
  另一方面在编译出现错误时,对应 gradle 插件会自动解析找不到的符号,如果发现该符号是被隔离优化的注解,会提示将 library-api 替换成 library,尽可能降低优化方案对业务的负面影响。
  收益mac 全源码场景中有 58s 左右的加速收益。ci 机器上由于 cpu 核数更多 ,task 并发性能更好,只有 10s 左右的收益。transform 优化背景
  transform 作为 Android gradle plugin 提供给开发者的 API,用于在 apk 构建过程中,对 class 字节码,resources 等文件内容进行插桩修改,例如官方的 dex, proguard 等功能均由此 api 实现。
  对于今日头条这种大型工程来说,有很多诸如性能插桩、自动埋点插桩等相关需求,因此基于此 api 开发了大量 transform,用于实现特定功能,但是这些 transform 基本上都是不支持增量编译的,即使只改动了一行代码,这 些 transform 都会遍历所有 class 文件,解析字节码中的方法字段信息,关键是这类 transform 数量有十几个,将这些遍历耗时乘以 10 累加之后,增量编译耗时自然居高不下。
  根据分析,其中性能插桩等相关 transform 做的一些面向线上的插桩方案是完全可以只在 release 打包时打开的,因此可以直接在 debug 编译时禁用这些功能,用于提升开发期间的编译速度。而剩下的 9 个 transform 特征比较相似,可能在一些插桩细节上有所不同,它们大致的处理逻辑为:
  在各个模块中使用 apt processor 采集模块 xx 注解的 class 信息然后生成一个 xxCollect 类,该类的作用是采集好 apt 阶段解析到的本模块的类信息将所有模块采集到的信息进行汇总,利用 transform 阶段扫描出所有的 xxCollect 信息,通过 javaassit 或者 asm 往一个 xxCollectMgr 的某个 collectXxx 方法插桩注入之前收到的信息业务代码可通过 xxCollectMgr 的 collectXxx 方法获取到在各个模块动态生成的所有 xxCollect 信息。(例: 页面路由相关框架便是通过该逻辑采集到所有子模块的路由注册信息)
  由于这 9 个自定义 transform 的功能如此类似,便决定将这些 transform 合并成一个,这样同一个文件的读写操作只执行一次,并且可以做定制化的增量编译优化。虽然公司内有类似的 transform 合并优化方案 byteX ( 已在 github 开源),但是由于今日头条项目在 debug 阶段未开启该功能,且 ByteX 做了一些诸如 ClassGrapth 的构建,对类文件做两次遍历等操作,对于实现类信息采集和信息注入 这个功能来说,byteX 显得比较重 ,于是仍然针对类信息采集注入功能这个细分场景开发了一个收敛框架。
  收益
  该框架完成了内部 9 种类信息采集注入相关框架的收敛,编译耗时的绝对值加速了 25s 左右,且由于提供了统一的增量缓存功能,使得改动一行代码的耗时可以从 2 分 30s 降低到 35~40s ,实现了增量编译速度大的飞跃。最关键的是将所有自定义 transform 统一管控后,后续可以做统一定制化的需求,进一步优化编译速度。
  dexBuilder 优化背景
  在 Android debug 编译 过程中,最主要的耗时在 transform 上,而上文 介绍 今日头条项目自定义 transform 已经被高度优化过,剩下的 dexBuilder(将 class 转换成 dex ) ,dexMerge 等 task 耗时就成为了性能瓶颈,dexBuilder 全量编译耗时 60s 左右,增量编译耗时 22s 左右。
  根据 DexArchiveBuilderTransform 关键方法 launchProcessing 里面关键一行 isDirectoryBased,如果是目录类型的输入,会根据具体变动 class 文件做增量的 dex 编译 ,但是如果是 jar 输入类型,那只要 jar 里任何一个类变动,则整个 jar 所有类都需要重执行 dex,但是由于 gradle 的依赖特性,基本上只有 app 模块是目录类的输入,其他 library 都是 jar 输入类型,对于比较大的业务模块 ,如果该模块有几千个类,那每改动一次类,就会有几千类连带重新 执行 dex 编译。
  dexBuilder 增量效果量化
  在优化前为了得到真正的重新执行 dex 编译的数值,做到最佳优化,设计了一套 hook dex 编译流程的方法(该方法理论上可以 hook Android gradle plugin 任意类:大致就是 hook classLoader ,提前用 asm 修改 D8DexArchiveBuilder 中的 convert 方法
  通过对 D8DexArchiveBuilder 的 hook ,统计到优化前改动一行代码会连带着 24968 个类重新执行 dex 编译,增量效果非常差。
  优化方案
  既然 jar 输入相比于 目录输入来说增量编译效果非常差,那么可以想到 hook TransformInvocation 中的 input 方法,动态将 project 的 jar 类型输入(JarInput)映射为一个 目录输入(DirectoryInput),那么子模块修改对应代码时,只重新编译目录中被修改的 class 为 dex(而不是原来的整个 jar 内所有 class 重新执行 dex 编译),整体 dex 重新编译的数量将大幅度减少。实现具体方案如下:
  而 jar 转 目录的映射细节为:
  在第一次增量修改完成后,重新执行 dex 编译的类数量降低至 2152 个,但是其中仍然有很多迷惑的不该执行 dex 编译的类,预期是修改多少类,就重新执行 多少次 dex,因此继续对其中原因进行进一步的探索
  desugarGraph 异常
  由于 java8 的字节码有些指令在 Android 虚拟机中并不能得到支持,会在编译流程中,将这些指令进行脱糖,转换成已有的指令,而 d8 中 desugar 的流程合并到了 dexBuilder 中,为了避免某些类 desugar 后,依赖它的类的行为正确,需要把依赖它的所有类重新执行一遍 dex 编译。
  而 d8 会根据 DesugaringGraph 查找 desguar 有变动的类及其依赖的 jar 包,如图下面获得到的 addtionalPaths 是 desguar 类可能直接间接相关的 jar 包,即使这些 jar 包没有任何文件内容变更,其中所有类也得重新全部执行一次 dex 编译。
  DesugaringGraph 逻辑概述
  该类用来辅助获取依赖或间接依赖到变更文件的所有文件,而它的生成逻辑为: 全量或增量编译类的时候记录类型之间的依赖和被依赖关系,依赖关系的判断条件有
  父类直接实现的接口调用 dynamic 方法指令时的返回类型
  DesugaringGraph 不仅记录了类依赖的类,和依赖它的类,同时也记录了一个文件路径收录了哪些类
  如果文件路径是 class 文件,那路径就收录 1 个类如果路径是 jar 文件,收录这个 jar 下所有类。
  在增量编译时检查到变动的文件时,会检查这个文件路径收录的所有类, 然后递归查找所有直接/间接依赖它的类,并且找到这些依赖它的类后,会把这个类所在的 jar 包作为额外的处理类型(即使 jar 本身没有任何变动,里面所有的类仍然需要重新 dex 编译)
  顺着这个解析关系,找到了一个不正常的 jar 包 bdjson_api ,这个 jar 只有 3 个文件 (IBDJson,BDJsonCollector, BDJsonConstants) 。但是 BDJsonCollector 是一个 stub 类,每次执行 transform 会采集到其他类的信息然后往该类的方法中注入,因此该文件每次编译时都会变动。 这个类本身并没有多少直接依赖它的类,主要是 它所在的 jar 包还有个 IBDJson 接口。
  按照之前的 DesugaringGraph 依赖关系,所有 IBDJson 接口的实现类被判断为依赖它,然后这些实现类如果出现在某个 dynamic 方法中,又会被层层查找,查找完了之后,还得计算所有依赖类所在的 jar 包,jar 包中其他没有依赖它的类也会被重新 dex 编译, 在这个 case 的依赖查找中,连带重新执行 dex 编译的类数量并不多,大概为 4 个 jar 包共 2000 多个类重新执行了无意义的 dex 流程,但是如果是其他 sdk jar 包,则可能就会给 dexBuilder 增量带来毁灭性的打击。 上述问题的解决方法:
  把每次都会修改的 Stub 注入类和其他接口类分离,放在不同 jar 包。(需要改造业务,比较麻烦)动态把这个 sdk jar 输入转换成目录输入。(上文介绍的方法,也与上面 jar 转目录的初衷相符,只不过是漏掉了这个 case,但是却意外证明了:除了收录业务代码多的 project 的 jar 输入需要转换为目录外,sdk jar 同样有必要)
  修复后修改一行代码重新执行 dex 的数量为 10 ,其中 9 个是每次 transform 会修改的 stub 类,1 个是实际修改类。做到了真正的 改多少类,执行多次 dex 编译。
  收益
  assemebleDebug 的增量编译中从原来(上文 transform 优化后)的 35s~40s 是降低至均值 17s,在 fast build 中效果最明显(屏蔽了 apt),第二次增量编译能突破到 9s 实现秒级编译。
  而经过上面所有的优化后,耗时数据里耗时最严重的 dexBuilder 和 dex-merge 基本都降低在 1s 左右,自定义 transform 也是 1s 左右,其他 task 基本都是零点几秒。在不使用 hotfix 方案的情况下(由于今日头条项目使用了过多的自定义 transform 和插件方案,所以不好使用 instantrun 等 hostfix 方案),相关 task 的耗时基本达到了优化的极限。
  build-cache 优化踩坑
  Build-cache 是 gralde 提供的一个编译缓存方案,目的是在构建过程中当两个 task 的输入相同时,可以复用缓存内容,直接跳过 task 的执行拿到缓存好的执行结果。由于缓存结果既可以放在本地磁盘,也可以从远程获取,因此容易想到利用 ci 提前 构建缓存包,在其他 ci 机器和开发时利用缓存包获得加速效果。
  那么如何判断 task 可以直接获取 之前 task 的缓存内容作为输出呢?定义为可缓存的 task ,会定义一些缓存相关的属性,task 执行时通过文件指纹,缓存属性等一大堆属性计算出缓存 key ,用于查找是否命中缓存,计算维度有:
  但是原生的 build-cahce 在缓存命中率上惨不忍睹,公司内抖音团队基于 gradle4.x 的源码做过一些提高命中率的修改,不过今日头条用的 gradle 版本是 5.1 ,受抖音团队的启发,也对 gradle5.1 源码做了些定制化的修改,用于 dump 缓存 key 的计算流程,快速发现缓存问题。相比于抖音发现的一些影响缓存命中的问题,额外发现了一些诸如 mbox , kapt 元素遍历顺序不固定的问题,这里只挑一个典型的 apt 顺序不一致的问题进行介绍:
  apt 顺序不一致导致的缓存失效问题
  经过修改 gradle5.1 源码后对编译流程的信息采集,发现有的 task 缓存无法命中是因为 kapt 时,很多生成代码块逻辑是一样的,但是顺序不一样(如下图 demo :下面两个生成方法的逻辑一致,但是判断顺序不一致,这应该是在 processor 中通过 RoundEnviroment 获取到 注解元素 elemnts 顺序不一致导致的 )
  其内部的原因可能是文件遍历目录时获取子文件的顺序不一致,导致了子文件对应注解元素的顺序也不一致, 总之这个操作影响了生成文件内代码的顺序,也影响了该文件的 hash 计算结果,导致 build-cache 在计算 javac task 的 key 时会错乱导致缓存无法命中。
  解决方案
  但是注意到 AbstractProcessor 的核心方法 process 的两个参数都是接口,因此想到可以代理原来的 RoundEnvironment 接口,将其 getElementXx 的方法经过固定排序后返回,使得 apt 注解元素的顺序能够固定下来。
  由于篇幅影响,其他影响缓存命中相关的 case 略(主要是一些涉及到文件绝对路径, classPath 相关的问题)
  收益由于大多开发场景是引入多少模块就修改多少模块内容,很难获得命中缓存, 收益很小主要是全源码场景能稳定获得一些编译加速,基本上在 22~99s 左右。编译耗时防恶化管控
  在今日头条这种大型工程中,有很多业务部门参与开发,仅 Android 工程 开发人员就有几百人且人员变动频繁,因此内部任何一项优化工作必然是得搭配上一些管控措施的,否则一边优化一边恶化,空浪费人力。
  为此制定了一些管控方案,首先是 debug 阶段的 新增 transform 管控,设置为白名单形式,如果在开发阶段新增了 transform 直接终止编译流程,通过说明文档告知管控的规则,当然,管控的目的是尽可能减少一些不必要的不合理的编译问题,并不是与业务团队作对,如果某一个操作拖慢了整体的编译耗时,但是在 app 性能/稳定性方面有更大收益,且无法在编译期做更多的优化,仍然是允许添加的,只不过是得提前把这个问题暴露出来而已,能更快的找出更多的解决思路,比如引导使用 byteX 等 transform 收敛方案。
  另一方面的是合码流程方面的阻塞 : 今日头条 为了保障 app 的性能稳定性,在合码流程上设置了许多自动化的卡点: 如 包大小检测,插件依赖变更检查, so 变更检查,启动性能检测等,检测到对应问题(如包大小增加异常)会阻塞合码流程。为了管控编译速度 ,使其不至于恶化的太快,也加上了对应的 基于 task 级别的管控,当某一个 task 耗时异常波动,或者新增全新类型的 task 时,能够自动的发现问题,通过机器人将相关人员拉到 mr 讨论群中, 尽量在 合码完成前能发现问题。
  总结
  为了持续稳定的保持较快的编译速度,可能需要做到以下几点:
  项目需要有良好的工程结构,对业务模块进行适当粒度的拆分,做好 aar/源码的切换不仅能节省 javac/kotlinCompile 的耗时,也是其他优化方案的基础。工程配置要有区分度,不要所有子模块都用同样的配置,比如根本不会用到 kapt 功能的模块就别打开 kapt task 了。transform 若无必要,无须新加,或者按级别划分,如今日头条在 debug,devMode,release 不同的构建级别用到的 transform 数量是不一致的,尽量让绝大多数人能获得相对最快的编译速度体验,而不会被用不到的功能拖慢速度。一定要新增的 transform 可以先多用现有的增量方案,如 byteX 以及本文提供的类信息注入框架, 尽量把不要的文件 io 合并。很多高耗时的 官方 task(dexBuilder) 都是有直接或间接的办法提升其效率的,并且如果除了耗时之外有其他的衡量手段,如本文提到的重新 dex 率,通过量化数据可以快速的发现问题,进而找到耗时的罪魁祸首。与 app 性能优化等工作类似,编译速度优化既需要持续进行,也需要一定的问题发现手段,尽量避免问题出现很长一段时间后再去查找原因(那时候可能业务依赖程度会非常高,难以修改)。更多分享
  字节跳动分布式表格存储系统的演进
  字节跳动自研强一致在线 KV&表格存储实践 - 上篇
  字节跳动自研强一致在线 KV &表格存储实践 - 下篇
  字节跳动在 Go 网络库上的实践
  字节跳动-GIP-Android 平台架构团队
  字节跳动-GIP-Android 平台架构团队以服务今日头条产品为主,同时协助公司其他产品,在产品性能、稳定性等用户体验,研发流程,编译优化,架构方向上不断优化和深入探索,以满足产品快速迭代的同时,保持较高的用户体验。我们长期招聘 Android 平台架构方向的同学,在北京,深圳均有相关岗位,想深入交流或者需要部门内推、投递简历的可以联系邮箱 (标题注明 : 字节跳动-GIP 平台 android 部门直推)
  欢迎关注字节跳动技术团队

汇总:文章采集软件app推荐文章大全及推荐软件大全(二)

采集交流优采云 发表了文章 • 0 个评论 • 65 次浏览 • 2022-11-17 02:16 • 来自相关话题

  汇总:文章采集软件app推荐文章大全及推荐软件大全(二)
  文章采集软件app推荐文章采集软件大全
  1、输入关键词搜索
  2、百度搜索
  3、搜狗搜索
  4、360搜索
  5、淘宝网
  6、58同城
  7、咸鱼
  8、搜狗微信搜索
  9、百度新闻搜索1
  0、搜狗搜索1
  1、当当1
  2、今日头条1
  3、yahootrends1
  4、百度经验1
  5、qq网站1
  6、天涯社区1
  7、qq邮箱1
  8、123061
  9、b站动态2
  0、支付宝2
  1、豆瓣2
  2、陌陌2
  3、陌陌资讯专区2
  4、微博搜索2
  5、优酷2
  6、知乎2
  7、果壳2
  9、百度新闻3
  0、智慧社区3
  1、直播大咖3
  2、大众点评3
  3、人人网3
  4、kiki3
  6、douban3
  7、百度经验3
  
  8、淘宝网3
  9、天涯4
  0、地图4
  1、360云搜4
  1、百度百科4
  2、360网盘4
  3、360浏览器4
  4、百度云资源4
  5、有道词典4
  6、欧朋词典4
  7、云搜客4
  8、迅雷云播4
  9、中国移动电信数据网盘5
  0、微云5
  1、汽车之家5
  2、友盟5
  3、1155
  4、天猫5
  5、一搜5
  6、百度翻译5
  7、雅虎搜索5
  8、google翻译5
  9、ghost翻译6
  0、foxmail6
  1、qq翻译6
  2、腾讯翻译君6
  3、163搜索6
  4、沃百科6
  5、eset安全卫士6
  6、乐网6
  7、迅雷查看器6
  8、dzgi.yy6
  9、好搜7
  0、即刻7
  1、虾米7
  2、百度驱动器7
  3、英文搜索7
  
  4、ed2k录音机7
  5、音网7
  6、站长之家7
  7、小黄油7
  8、网络电台7
  9、轻听7
  9、uc8
  1、搜狗搜索8
  2、qq影音8
  3、socialboy8
  4、qq音乐8
  5、hao1238
  5、电脑管家8
  6、腾讯家庭8
  6、31679
  0、搜狗图片9
  1、adsafe9
  2、必应9
  3、牛津高阶9
  4、快图9
  5、chrome9
  5、reddit9
  6、5289
  8、kelvinz-san9
  8、常用语9
  8、鲁大师9
  9、正则表达式9
  9、搜狗百科10
  0、黑鸟101
  0、芒果tv102
  0、qq客户端102
  1、百度云视频102
  2、某讯视频102
  3、站长之家102
  4、yy视频102
  5、搜狐视频102
  6、5689202
  2、保卫萝卜2022 查看全部

  汇总:文章采集软件app推荐文章大全及推荐软件大全(二)
  文章采集软件app推荐文章采集软件大全
  1、输入关键词搜索
  2、百度搜索
  3、搜狗搜索
  4、360搜索
  5、淘宝网
  6、58同城
  7、咸鱼
  8、搜狗微信搜索
  9、百度新闻搜索1
  0、搜狗搜索1
  1、当当1
  2、今日头条1
  3、yahootrends1
  4、百度经验1
  5、qq网站1
  6、天涯社区1
  7、qq邮箱1
  8、123061
  9、b站动态2
  0、支付宝2
  1、豆瓣2
  2、陌陌2
  3、陌陌资讯专区2
  4、微博搜索2
  5、优酷2
  6、知乎2
  7、果壳2
  9、百度新闻3
  0、智慧社区3
  1、直播大咖3
  2、大众点评3
  3、人人网3
  4、kiki3
  6、douban3
  7、百度经验3
  
  8、淘宝网3
  9、天涯4
  0、地图4
  1、360云搜4
  1、百度百科4
  2、360网盘4
  3、360浏览器4
  4、百度云资源4
  5、有道词典4
  6、欧朋词典4
  7、云搜客4
  8、迅雷云播4
  9、中国移动电信数据网盘5
  0、微云5
  1、汽车之家5
  2、友盟5
  3、1155
  4、天猫5
  5、一搜5
  6、百度翻译5
  7、雅虎搜索5
  8、google翻译5
  9、ghost翻译6
  0、foxmail6
  1、qq翻译6
  2、腾讯翻译君6
  3、163搜索6
  4、沃百科6
  5、eset安全卫士6
  6、乐网6
  7、迅雷查看器6
  8、dzgi.yy6
  9、好搜7
  0、即刻7
  1、虾米7
  2、百度驱动器7
  3、英文搜索7
  
  4、ed2k录音机7
  5、音网7
  6、站长之家7
  7、小黄油7
  8、网络电台7
  9、轻听7
  9、uc8
  1、搜狗搜索8
  2、qq影音8
  3、socialboy8
  4、qq音乐8
  5、hao1238
  5、电脑管家8
  6、腾讯家庭8
  6、31679
  0、搜狗图片9
  1、adsafe9
  2、必应9
  3、牛津高阶9
  4、快图9
  5、chrome9
  5、reddit9
  6、5289
  8、kelvinz-san9
  8、常用语9
  8、鲁大师9
  9、正则表达式9
  9、搜狗百科10
  0、黑鸟101
  0、芒果tv102
  0、qq客户端102
  1、百度云视频102
  2、某讯视频102
  3、站长之家102
  4、yy视频102
  5、搜狐视频102
  6、5689202
  2、保卫萝卜2022

完美:阿里巴巴星历做一个比手淘热点还准的节日表

采集交流优采云 发表了文章 • 0 个评论 • 34 次浏览 • 2022-11-16 10:45 • 来自相关话题

  完美:阿里巴巴星历做一个比手淘热点还准的节日表
  文章采集软件app,从这些简单的app任务中,可以找到我们需要的数据采集软件。如果大家想找专业的datagrid采集工具,可以登录我们datagrid官网,下载。
  /
  
  请问你用哪款爬虫软件呢?
  1,你可以用百度搜下你的目标网站,里面都有用python做的爬虫网站和一些教程2,你可以用虫部落,虫部落里面有很多爬虫集,可以自己找下,下载使用。比如说我曾经用python自己搭建过一个常用功能网站的数据抓取,一个小时内就全部爬下来了。
  在dw上爬数据
  
  使用python爬虫是有方向的,如果你想爬阿里等电商,肯定会学到爬手淘的爬虫。如果你想爬阿里的爬虫,那么你可以用python爬虫在python和ruby(python都可以快速开发爬虫)之间来回跳跃。
  手淘今日热点|阿里巴巴星历做一个比手淘热点还准的节日表做一个比手淘更大的抓取页面利用电商信息和python实现爬取淘宝网交易数据(分页数据)
  豆瓣电影豆瓣电影一大堆电影不是有条件限制么?比如只能在电影名中看到制作者的信息,或者你觉得它应该在哪里,
  你可以考虑django,电商的用户有一个巨大的痛点:买东西之前首先得看看有没有什么电商的banner广告,有广告则不能下单。怎么办呢?搞一个爬虫抓呀,抓到了还可以做成一个机器人来帮你看广告是否可信。阿里云电商数据库也可以接入django,可以做一个简单的电商投票,选出一个最大的因为最值得信赖的价格最便宜的产品进行促销。如果想深入了解django,请看我的专栏文章:都老师的专栏-django高级教程。 查看全部

  完美:阿里巴巴星历做一个比手淘热点还准的节日表
  文章采集软件app,从这些简单的app任务中,可以找到我们需要的数据采集软件。如果大家想找专业的datagrid采集工具,可以登录我们datagrid官网,下载。
  /
  
  请问你用哪款爬虫软件呢?
  1,你可以用百度搜下你的目标网站,里面都有用python做的爬虫网站和一些教程2,你可以用虫部落,虫部落里面有很多爬虫集,可以自己找下,下载使用。比如说我曾经用python自己搭建过一个常用功能网站的数据抓取,一个小时内就全部爬下来了。
  在dw上爬数据
  
  使用python爬虫是有方向的,如果你想爬阿里等电商,肯定会学到爬手淘的爬虫。如果你想爬阿里的爬虫,那么你可以用python爬虫在python和ruby(python都可以快速开发爬虫)之间来回跳跃。
  手淘今日热点|阿里巴巴星历做一个比手淘热点还准的节日表做一个比手淘更大的抓取页面利用电商信息和python实现爬取淘宝网交易数据(分页数据)
  豆瓣电影豆瓣电影一大堆电影不是有条件限制么?比如只能在电影名中看到制作者的信息,或者你觉得它应该在哪里,
  你可以考虑django,电商的用户有一个巨大的痛点:买东西之前首先得看看有没有什么电商的banner广告,有广告则不能下单。怎么办呢?搞一个爬虫抓呀,抓到了还可以做成一个机器人来帮你看广告是否可信。阿里云电商数据库也可以接入django,可以做一个简单的电商投票,选出一个最大的因为最值得信赖的价格最便宜的产品进行促销。如果想深入了解django,请看我的专栏文章:都老师的专栏-django高级教程。

最新版本:墨多app软件下载

采集交流优采云 发表了文章 • 0 个评论 • 34 次浏览 • 2022-11-13 16:48 • 来自相关话题

  最新版本:墨多app软件下载
  魔多app是一款专注于销售行业的APP。这个APP可以帮助我们的销售人员减少工作量,让每个销售人员足不出户就能掌握很多信息。有很多小工具和文章是的帮助销售人员更好地工作,你还在等什么,现在就下载玩吧。
  Modo应用简介
  1. 搜索
  通过首页顶部的搜索栏点击进入搜索界面,在输入框中搜索文章、视频或用户。文章进入文章详情,视频进入视频详情,用户进入用户个人中心。
  2、客户来源
  客户来源分为全景客户来源、分类客户来源和范围客户来源。地图包括高德比地图、百度地图、腾讯地到三河,输入或选择官步子和产业点集鱼北采集,就会搜索到对应的商户。
  3.客源管理
  点击首页或客源采集页面的客源管理进入该页面,选择客源来源,选择关键词即可查看。床部可以进行导出到通讯、导出到表格、群发、清空数据、清除通讯等操作,也可以根据客源背后的按钮独立操作。
  四、语言库
  可迪可以在发短信界面点击选择模板和我的壳面,点击文字进入这个壳面类别。您可以使用右侧的加号进入该语言的添加页面。可以添加白色定义。点击复制词类下的词,长按编辑,可以自定义添加。
  五、全网源码
  
  在首页,点击全网进入该页面。点击进入wab链接。
  6.获客视频
  您可以点击主页上的视频进入此页面。点击进入视频详情,点击搜索进入搜索页面。点击获客类别右侧的加号,进入获客类别排序界面。
  7.获客文章
  您可以通过首页文章让客户进入这个页面。单击以输入 文章 详细信息。点击搜索进入搜索页面,点击获客类别右侧的加号进入类别排序页面。
  摩多应用功能
  对于广大从事营销工作的人来说,平台可以很好的满足你的需求,操作也很简单;
  涵盖的小工具还是很齐全的,随时打开手机可以自由选择,不同的内容详细划分;
  而且还有很多招聘技巧可以免费为你提供,无论你从事什么行业,都能让你满意。
  
  魔多应用亮点
  1.魔多app是一款基于强大的程序管理和多种渠道模式的挖掘和开发的优质工具营销软件。软件具有不同模式的数据系统,对各种客户来源进行汇总和管理,使用更加方便。
  2、通过完善的管理和资源导入模式,软件建立了非常完善的数据获客模式,让所有用户都能浏览到不同的文章和视频,可以转发扩大流量。
  3、同时软件建立了非常强大的采集管理模式,会自动汇总整理不同类型的客户源数据并根据客户需求进行开发管理,还可以导入表格。
  魔多应用功能
  1.随时轻松管理和导入。魔多app中建立了一个非常强大的数据采集网络模式,让所有用户都可以在不同的模式下管理和发布,数据可以更轻松地采集和获取。
  2. 优质模式,直观,用户在使用软件过程中可以更轻松地管理不同类型,通过海量户采集和统计模式管理所有内容,更好的处理不同的要求。
  3、营销数据随时发布。用户可以通过软件轻松制作各种海报数据和不同模式的文章和短视频。它们可以轻松导入和更轻松地管理。
  小编点评
  帮助我们的销售人员更好地工作!
  解决方案:pbootcms网站建设网络科技类模板 SEO优化网络建站公司网站源码下载
  (自适应手机)pbootcms网站建设网络技术模板SEO优化网络建设公司网站源码下载,Pbootcms内核开发网站模板,该模板适用于建站公司网站、SEO优化网站等企业,当然其他行业也可以,只需要用其他行业替换文字和图片;
  PC+WAP,相同的背景,即时数据同步,应用简单!附带测试数据!
  
<p>友好的seo,所有页面都可以完全自定义标题/关键词/描述,PHP程序(php≥7.0, 查看全部

  最新版本:墨多app软件下载
  魔多app是一款专注于销售行业的APP。这个APP可以帮助我们的销售人员减少工作量,让每个销售人员足不出户就能掌握很多信息。有很多小工具和文章是的帮助销售人员更好地工作,你还在等什么,现在就下载玩吧。
  Modo应用简介
  1. 搜索
  通过首页顶部的搜索栏点击进入搜索界面,在输入框中搜索文章、视频或用户。文章进入文章详情,视频进入视频详情,用户进入用户个人中心。
  2、客户来源
  客户来源分为全景客户来源、分类客户来源和范围客户来源。地图包括高德比地图、百度地图、腾讯地到三河,输入或选择官步子和产业点集鱼北采集,就会搜索到对应的商户。
  3.客源管理
  点击首页或客源采集页面的客源管理进入该页面,选择客源来源,选择关键词即可查看。床部可以进行导出到通讯、导出到表格、群发、清空数据、清除通讯等操作,也可以根据客源背后的按钮独立操作。
  四、语言库
  可迪可以在发短信界面点击选择模板和我的壳面,点击文字进入这个壳面类别。您可以使用右侧的加号进入该语言的添加页面。可以添加白色定义。点击复制词类下的词,长按编辑,可以自定义添加。
  五、全网源码
  
  在首页,点击全网进入该页面。点击进入wab链接。
  6.获客视频
  您可以点击主页上的视频进入此页面。点击进入视频详情,点击搜索进入搜索页面。点击获客类别右侧的加号,进入获客类别排序界面。
  7.获客文章
  您可以通过首页文章让客户进入这个页面。单击以输入 文章 详细信息。点击搜索进入搜索页面,点击获客类别右侧的加号进入类别排序页面。
  摩多应用功能
  对于广大从事营销工作的人来说,平台可以很好的满足你的需求,操作也很简单;
  涵盖的小工具还是很齐全的,随时打开手机可以自由选择,不同的内容详细划分;
  而且还有很多招聘技巧可以免费为你提供,无论你从事什么行业,都能让你满意。
  
  魔多应用亮点
  1.魔多app是一款基于强大的程序管理和多种渠道模式的挖掘和开发的优质工具营销软件。软件具有不同模式的数据系统,对各种客户来源进行汇总和管理,使用更加方便。
  2、通过完善的管理和资源导入模式,软件建立了非常完善的数据获客模式,让所有用户都能浏览到不同的文章和视频,可以转发扩大流量。
  3、同时软件建立了非常强大的采集管理模式,会自动汇总整理不同类型的客户源数据并根据客户需求进行开发管理,还可以导入表格。
  魔多应用功能
  1.随时轻松管理和导入。魔多app中建立了一个非常强大的数据采集网络模式,让所有用户都可以在不同的模式下管理和发布,数据可以更轻松地采集和获取。
  2. 优质模式,直观,用户在使用软件过程中可以更轻松地管理不同类型,通过海量户采集和统计模式管理所有内容,更好的处理不同的要求。
  3、营销数据随时发布。用户可以通过软件轻松制作各种海报数据和不同模式的文章和短视频。它们可以轻松导入和更轻松地管理。
  小编点评
  帮助我们的销售人员更好地工作!
  解决方案:pbootcms网站建设网络科技类模板 SEO优化网络建站公司网站源码下载
  (自适应手机)pbootcms网站建设网络技术模板SEO优化网络建设公司网站源码下载,Pbootcms内核开发网站模板,该模板适用于建站公司网站、SEO优化网站等企业,当然其他行业也可以,只需要用其他行业替换文字和图片;
  PC+WAP,相同的背景,即时数据同步,应用简单!附带测试数据!
  
<p>友好的seo,所有页面都可以完全自定义标题/关键词/描述,PHP程序(php≥7.0,

解决方案:高德地图腾讯地图手机端数据采集软件; 地图数据采集软件APP

采集交流优采云 发表了文章 • 0 个评论 • 227 次浏览 • 2022-11-13 13:17 • 来自相关话题

  解决方案:高德地图腾讯地图手机端数据采集软件; 地图数据采集软件APP
  高德地图腾讯地图移动端数据采集软件;地图数据采集软件APP
  Q 同 V:862685179 地址:
  Map Data采集软件手机app版特点
  — 1、采集地图最专业,一般采集软件是网页采集,采集速度很慢。
  — 2.采集最快的速度,让您在最短时间内获得最想要的信息,为获得大量客户提供有力保障。
  
  — 3. 最精确的搜索,可以按区域搜索,根据需要的关键词,可以精确到县级区域。
  — 4. 操作最简单,让用户快速上手,完全专注于自己的搜索需求。
  — 5、搜索领域最广最精细,搜索行业最全,360行可搜索。
  — 6、实时保存采集结果和断点,即中断采集后,采集会自动继续上一个采集,无需从头开始采集,大大提高效率。
  — 7. 多张地图,多张关键词,多个城市同时采集。
  — 8.在采集的同时,可以发短信和拨打手机采集,非常方便。
  地图数据采集Master手机app版对比其他地图采集软件的优势
  
  — 1.地图数据采集Master手机app版首先是运行在Android手机上的软件,其他地图数据采集软件一般在电脑上。
  — 2.地图数据采集Master手机app版运行在手机上,使用起来非常方便,比如上班路上,出差,甚至吃饭的时候都可以用更不用说工作时,随时随地做生意是PC版所没有的优势。
  — 3.地图数据采集Master手机app版本可以在采集时向采集收到的电话号码发送短信和拨打电话,片刻不影响业务发展。
  — 4. 手机版采集地图数据采集Master手机app版可轻松导入通讯录,手机版采集远胜电脑版地图数据采集。采集软件很方便。
  — 5. 地图数据采集Master手机app版本可以同时使用三张地图采集,不像很多地图数据采集软件采集完成一张地图然后手动切换到另一张地图一张地图采集,我们的软件采集效率更高。
  — 6.地图数据采集Master手机app版本可以同时搜索多个区域和多个关键词,非常方便。
  — 7. 县 采集 的支持。
  解决方案:乐天商品采集器
  “乐天商品采集器”是乐天商品的特殊采集器。仅限于乐天类别的最大显示结果数(150 页)。为了捕获所有商品,该软件内置了自动价格拆分模式。价格区间不断拆分查询,直到展示列表小于等于150页,然后爬取商品URL。采集 使用这种价格拆分模式可以尽可能爬取所有商品。(此价格拆分模型适用于任何对展示次数有页面限制的电子商务网站)
  该软件分为两个模块。第一个模块专门用于爬取商品的url,可以爬取任意category(),以及搜索结果列表等;第二个模块导入产品 URL 来抓取产品信息,结果是 ZENCART 格式的 CSV。您可以使用“Zencart 产品批量上传工具”自动发布到 ZENCART网站。
  
   查看全部

  解决方案:高德地图腾讯地图手机端数据采集软件; 地图数据采集软件APP
  高德地图腾讯地图移动端数据采集软件;地图数据采集软件APP
  Q 同 V:862685179 地址:
  Map Data采集软件手机app版特点
  — 1、采集地图最专业,一般采集软件是网页采集,采集速度很慢。
  — 2.采集最快的速度,让您在最短时间内获得最想要的信息,为获得大量客户提供有力保障。
  
  — 3. 最精确的搜索,可以按区域搜索,根据需要的关键词,可以精确到县级区域。
  — 4. 操作最简单,让用户快速上手,完全专注于自己的搜索需求。
  — 5、搜索领域最广最精细,搜索行业最全,360行可搜索。
  — 6、实时保存采集结果和断点,即中断采集后,采集会自动继续上一个采集,无需从头开始采集,大大提高效率。
  — 7. 多张地图,多张关键词,多个城市同时采集。
  — 8.在采集的同时,可以发短信和拨打手机采集,非常方便。
  地图数据采集Master手机app版对比其他地图采集软件的优势
  
  — 1.地图数据采集Master手机app版首先是运行在Android手机上的软件,其他地图数据采集软件一般在电脑上。
  — 2.地图数据采集Master手机app版运行在手机上,使用起来非常方便,比如上班路上,出差,甚至吃饭的时候都可以用更不用说工作时,随时随地做生意是PC版所没有的优势。
  — 3.地图数据采集Master手机app版本可以在采集时向采集收到的电话号码发送短信和拨打电话,片刻不影响业务发展。
  — 4. 手机版采集地图数据采集Master手机app版可轻松导入通讯录,手机版采集远胜电脑版地图数据采集。采集软件很方便。
  — 5. 地图数据采集Master手机app版本可以同时使用三张地图采集,不像很多地图数据采集软件采集完成一张地图然后手动切换到另一张地图一张地图采集,我们的软件采集效率更高。
  — 6.地图数据采集Master手机app版本可以同时搜索多个区域和多个关键词,非常方便。
  — 7. 县 采集 的支持。
  解决方案:乐天商品采集
  “乐天商品采集器”是乐天商品的特殊采集器。仅限于乐天类别的最大显示结果数(150 页)。为了捕获所有商品,该软件内置了自动价格拆分模式。价格区间不断拆分查询,直到展示列表小于等于150页,然后爬取商品URL。采集 使用这种价格拆分模式可以尽可能爬取所有商品。(此价格拆分模型适用于任何对展示次数有页面限制的电子商务网站)
  该软件分为两个模块。第一个模块专门用于爬取商品的url,可以爬取任意category(),以及搜索结果列表等;第二个模块导入产品 URL 来抓取产品信息,结果是 ZENCART 格式的 CSV。您可以使用“Zencart 产品批量上传工具”自动发布到 ZENCART网站。
  
  

最新发布:标本采集最新版本应用截图

采集交流优采云 发表了文章 • 0 个评论 • 152 次浏览 • 2022-11-07 02:20 • 来自相关话题

  最新发布:标本采集最新版本应用截图
  标本采集最新版是一款数据采集软件,软件功能操作非常简单。有很多采集模板,可以自由使用,大大提升数据采集@采集的效率可以让用户获得足够全面的数据信息,还可以在线搜索对应的数据。
  《标本采集最新版》软件亮点:
  1、通过查看标本数据信息,可以快速了解自己的身体是否健康。
  2、软件的操作页面看起来非常简单直观,新用户也可以快速上手。
  
  3、如对软件功能不了解,可随时与平台客服人员沟通。
  《标本采集最新版》软件特点:
  1、这些采集信息会不断更新,以便用户获取最权威的数据。
  2、多种采集方式自由选择,通过摄像头采集数据。
  
  3、本软件的适用范围很广,本软件可以处理各种数据采集作业。
  4、所有数据信息都可以在线保存,用户可以随时查看自己之前保存的数据。
  《标本采集最新版本》编辑点评:
  样本采集 提供的最新版本的功能和技术非常完善,有专业的技术团队维护功能,大家在操作软件时可以感受到非常稳定的性能体验。
  最新版:抖音批量采集下载工具(电脑版)
  
  今天介绍的抖音批量采集下载工具可以采集一个作者的所有作品、单个视频作品、某个主题挑战下的指定数量的作品、指定数量的作品使用某种音乐。还可以检测作者的作品更新、话题挑战、音乐等,只有在有新作品时才下载新作品。
  温馨提示:我之前在公众号(AD School)推荐过几个抖音批量下载软件,但全部无效。今天介绍的软件不应该总是有效的。如有必要,请尽快使用。
  
  软件使用方法:打开手机抖音软件,复制链接,将链接发送给微信文件传输助手,登录微信电脑版,从文件传输助手复制链接,然后点击抖音Batch采集下载工具的主程序(抖音采集tool20210401.exe),软件会自动获取剪贴板上的抖音链接,并自动开始采集下载,下载完成后会弹出下载日志。
  下载的视频保存在软件目录下的一个文件夹中,文件夹名称为:Work Save。 查看全部

  最新发布:标本采集最新版本应用截图
  标本采集最新版是一款数据采集软件,软件功能操作非常简单。有很多采集模板,可以自由使用,大大提升数据采集@采集的效率可以让用户获得足够全面的数据信息,还可以在线搜索对应的数据。
  《标本采集最新版》软件亮点:
  1、通过查看标本数据信息,可以快速了解自己的身体是否健康。
  2、软件的操作页面看起来非常简单直观,新用户也可以快速上手。
  
  3、如对软件功能不了解,可随时与平台客服人员沟通。
  《标本采集最新版》软件特点:
  1、这些采集信息会不断更新,以便用户获取最权威的数据。
  2、多种采集方式自由选择,通过摄像头采集数据。
  
  3、本软件的适用范围很广,本软件可以处理各种数据采集作业。
  4、所有数据信息都可以在线保存,用户可以随时查看自己之前保存的数据。
  《标本采集最新版本》编辑点评:
  样本采集 提供的最新版本的功能和技术非常完善,有专业的技术团队维护功能,大家在操作软件时可以感受到非常稳定的性能体验。
  最新版:抖音批量采集下载工具(电脑版)
  
  今天介绍的抖音批量采集下载工具可以采集一个作者的所有作品、单个视频作品、某个主题挑战下的指定数量的作品、指定数量的作品使用某种音乐。还可以检测作者的作品更新、话题挑战、音乐等,只有在有新作品时才下载新作品。
  温馨提示:我之前在公众号(AD School)推荐过几个抖音批量下载软件,但全部无效。今天介绍的软件不应该总是有效的。如有必要,请尽快使用。
  
  软件使用方法:打开手机抖音软件,复制链接,将链接发送给微信文件传输助手,登录微信电脑版,从文件传输助手复制链接,然后点击抖音Batch采集下载工具的主程序(抖音采集tool20210401.exe),软件会自动获取剪贴板上的抖音链接,并自动开始采集下载,下载完成后会弹出下载日志。
  下载的视频保存在软件目录下的一个文件夹中,文件夹名称为:Work Save。

最新版:文章采集阅读软件 V1.1 正式版

采集交流优采云 发表了文章 • 0 个评论 • 89 次浏览 • 2022-11-06 22:44 • 来自相关话题

  最新版:文章采集阅读软件 V1.1 正式版
  文章采集阅读软件(网站文章采集工具)是一个很好用又好用的文章采集阅读辅助工具。这个文章采集阅读软件功能强大,功能全面,易于使用。使用后,可以帮助用户更轻松方便地采集阅读文章。软件采用E语言编写,不仅可以采集文本,还可以简单的替换部分文本,或者添加文本,可以帮助有需要的用户采集大量文章阅读,同时还提供了替换或删除指定文本的简单功能。欢迎有需要的朋友下载使用。
  使用说明:
  最近学到的帖子+常规。
  写了一个培训软件。
  
  编程自己在新手中还是新手,请忽略。
  匹配可能不准确请勿喷。
  您可以简单地替换一些文本或添加文本。
  执行 软文 也应该有效。
  用E语言编写的程序。
  
  指示:
  1.下载解压后的文件,解压后找到“采集reading.exe”,双击打开
  2.过一会会出现界面,欢迎使用
  3.点击开始采集,然后找到需要的文章进行读取或替换或删除
  免费的:网站SEO优化:免费帝国采集做法分享
  SEO优化帝国采集
  今天小编就继续给大家分享一些关于帝国采集和做网站的SEO技巧和问题解决方法,以及如何通过与帝国cms做一个SEO方法采集 收录 100,000 个 采集 站。Empirecms作为老牌内容管理系统,拥有大量用户。但是,许多用户也遇到了同样的问题。一开始他们用Empire采集探索帝国自带的采集器,后来觉得不够强大,挖矿速度也很慢。要么采集不可用,要么无法入库,一直停留在导入临时库页面不动,超时。我是如何解决这些问题的?然后我们可以切换到第三方采集 软件,它不仅解决了上述问题,而且使 网站 工作。目前,收录 稳定在 120,000 左右。
  
  收录120,000
  帝国采集做网站怎么做SEO优化?学会选择 关键词 非常重要。SEO中最重要的是对关键词的优化,包括如何选择核心关键词、长尾关键词;如何查看 关键词 的受欢迎程度,竞争,还要了解一些分词技巧。内容优化,包括文章文章中的关键词密度、位置、内链等。了解什么样的网站结构容易被搜索引擎使用收录,网站域名基础知识,网站网址静态和动态,有什么好处做网站SEO优化的站长和同学都知道,每天网站应该定期发布一些文章,但是如果有几个网站 可以这样发布,如果网站这样手动更新太多的话,效率难免会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。可以这样发布,如果网站有太多这样的手动更新,效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。可以这样发布,如果网站有太多这样的手动更新,效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。如果网站这样的手动更新太多,效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。如果网站这样的手动更新太多,效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。软件完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。软件完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。
  
  帝国cms采集
  这样一来,cms在帝国的采集用户的难题就迎刃而解了。只有解决了内容问题,我们才有时间和精力做网站的SEO优化。对小编来说,三个月10万的网站收录很容易搭建。一般SEO优化网站一个多月就会看到效果,搭建一个需要三个月左右。网站收录到10万不值一提。借助全网免费的采集软件,文章的内容全部由采集返回。我想每个人都想知道如何优化它来达到这样的效果。首先,在网站SEO优化方面还是有一些内容可以和大家分享的:一、我认为主页的标题和描述非常重要。对于小编的每一个网站,我都会认真思考一下标题和描述应该怎么写。写得好,优化效率更高。采集是帝国采集的优秀工具,站群的搭建简单方便,所以我们需要在标题关键词中收录行业等,既包括标题和描述,所以目前这个网站可以轻松收录达到100,000。其次,关键词的密度也是需要考虑的问题。关键词出现在网站首页的频率,关键词的密度在2-8%,这是比较合理的关键词内的密度访问。关键词 SEO内链是提高关键词排名的重要途径之一。它可以准确地告诉蜘蛛链接地址的主要内容是什么。如果你想网站能得到更好的关键词@关键词排名,建议大家使用关键词内链功能。
  我先分享一些关于帝国采集的经验。当然,网站收录可以上升,不仅仅是小编提到的几点,SEO是一个多维度、长期的过程。网站很多地方都需要做SEO优化。看似深奥,其实很简单。搜索引擎已经给出了相应的规则。我们只需要按照这些规则做好SEO优化,网站自然网站@收录排名也就上去了! 查看全部

  最新版:文章采集阅读软件 V1.1 正式版
  文章采集阅读软件(网站文章采集工具)是一个很好用又好用的文章采集阅读辅助工具。这个文章采集阅读软件功能强大,功能全面,易于使用。使用后,可以帮助用户更轻松方便地采集阅读文章。软件采用E语言编写,不仅可以采集文本,还可以简单的替换部分文本,或者添加文本,可以帮助有需要的用户采集大量文章阅读,同时还提供了替换或删除指定文本的简单功能。欢迎有需要的朋友下载使用。
  使用说明:
  最近学到的帖子+常规。
  写了一个培训软件。
  
  编程自己在新手中还是新手,请忽略。
  匹配可能不准确请勿喷。
  您可以简单地替换一些文本或添加文本。
  执行 软文 也应该有效。
  用E语言编写的程序。
  
  指示:
  1.下载解压后的文件,解压后找到“采集reading.exe”,双击打开
  2.过一会会出现界面,欢迎使用
  3.点击开始采集,然后找到需要的文章进行读取或替换或删除
  免费的:网站SEO优化:免费帝国采集做法分享
  SEO优化帝国采集
  今天小编就继续给大家分享一些关于帝国采集和做网站的SEO技巧和问题解决方法,以及如何通过与帝国cms做一个SEO方法采集 收录 100,000 个 采集 站。Empirecms作为老牌内容管理系统,拥有大量用户。但是,许多用户也遇到了同样的问题。一开始他们用Empire采集探索帝国自带的采集器,后来觉得不够强大,挖矿速度也很慢。要么采集不可用,要么无法入库,一直停留在导入临时库页面不动,超时。我是如何解决这些问题的?然后我们可以切换到第三方采集 软件,它不仅解决了上述问题,而且使 网站 工作。目前,收录 稳定在 120,000 左右。
  
  收录120,000
  帝国采集做网站怎么做SEO优化?学会选择 关键词 非常重要。SEO中最重要的是对关键词的优化,包括如何选择核心关键词、长尾关键词;如何查看 关键词 的受欢迎程度,竞争,还要了解一些分词技巧。内容优化,包括文章文章中的关键词密度、位置、内链等。了解什么样的网站结构容易被搜索引擎使用收录,网站域名基础知识,网站网址静态和动态,有什么好处做网站SEO优化的站长和同学都知道,每天网站应该定期发布一些文章,但是如果有几个网站 可以这样发布,如果网站这样手动更新太多的话,效率难免会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。可以这样发布,如果网站有太多这样的手动更新,效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。可以这样发布,如果网站有太多这样的手动更新,效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。如果网站这样的手动更新太多,效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。如果网站这样的手动更新太多,效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。效率必然会比较低。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。有什么办法可以提高效率吗?内置的帝国采集刚刚说真的满足不了我们的采集需求。我们可以使用全网免费的采集软件来完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。软件完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。软件完成网站任务的采集。主要是因为软件有:永远免费,可以同时选择多个数据源采集,可以同时创建几十个或几百个采集任务,每个任务只需要导入批量关键词,挂机采集,操作简单易用,可实时查看采集数据,预览采集文章本地或远程,并支持过滤关键词。
  
  帝国cms采集
  这样一来,cms在帝国的采集用户的难题就迎刃而解了。只有解决了内容问题,我们才有时间和精力做网站的SEO优化。对小编来说,三个月10万的网站收录很容易搭建。一般SEO优化网站一个多月就会看到效果,搭建一个需要三个月左右。网站收录到10万不值一提。借助全网免费的采集软件,文章的内容全部由采集返回。我想每个人都想知道如何优化它来达到这样的效果。首先,在网站SEO优化方面还是有一些内容可以和大家分享的:一、我认为主页的标题和描述非常重要。对于小编的每一个网站,我都会认真思考一下标题和描述应该怎么写。写得好,优化效率更高。采集是帝国采集的优秀工具,站群的搭建简单方便,所以我们需要在标题关键词中收录行业等,既包括标题和描述,所以目前这个网站可以轻松收录达到100,000。其次,关键词的密度也是需要考虑的问题。关键词出现在网站首页的频率,关键词的密度在2-8%,这是比较合理的关键词内的密度访问。关键词 SEO内链是提高关键词排名的重要途径之一。它可以准确地告诉蜘蛛链接地址的主要内容是什么。如果你想网站能得到更好的关键词@关键词排名,建议大家使用关键词内链功能。
  我先分享一些关于帝国采集的经验。当然,网站收录可以上升,不仅仅是小编提到的几点,SEO是一个多维度、长期的过程。网站很多地方都需要做SEO优化。看似深奥,其实很简单。搜索引擎已经给出了相应的规则。我们只需要按照这些规则做好SEO优化,网站自然网站@收录排名也就上去了!

分享:公众号文章采集的两种方案,搜狗和微信App采集

采集交流优采云 发表了文章 • 0 个评论 • 82 次浏览 • 2022-11-06 12:59 • 来自相关话题

  分享:公众号文章采集的两种方案,搜狗和微信App采集
  更新于 2018-06-05
  许多答案无用或不再有效,这是我的解决方案。
  如果只采集公众号文章微信,要求不是很严格,可以去搜狗。这种方案成本低,相对简单,但缺点也很明显。这是一个临时的 文章 链接。如果要转成永久链接,还是要通过app界面。.
  
  另一种解决方案是从微信APP本身添加抓取软件采集,成本会高很多,但是可以采集的数据类型很多,包括但不限于:历史页面文章 ,阅读喜欢,评论等。
  为了更直观,我做了一张图来对比搜狗和微信App采集的两种方案。
  我自己使用这两种方案,也提供封装好的接口。具体要求将取决于成本和场景来选择使用哪一种。
  
  简单的一句话总结就是,搜狗有微信App,但搜狗没有微信App,但无论软硬成本,微信方案都比搜狗方案贵很多。
  题外话,图片指的是微信中的搜索界面。我自己已经实现了,可以获取搜索公众号和文章的返回数据,只是作为微信批量添加软件的练习,因为这个接口用处不大,所以没有解包已打开,如果需要,可以单独联系我。很多人可能会认为采集和搜索界面不太可能给微信添加抓取软件,因为这个数据根本就不是http协议。但我想说的是,有时 采集data 不一定要在请求中截取。解决方案有很多,但成本也会变得非常大(开发成本和上线成本)。
  另外,关于公众号文章的读物采集,可以看我的另一个回答知乎:
  技术文章:为什么我的博客百度只收录了首页?
  1.熊掌号和百度小程序
  面对这种问题,首先要检查的是网站是否配置了熊掌ID和百度小程序。从目前来看,Bear's Paw ID 正在解决网站收录。锋利的武器。
  对于企业网站来说,百度小程序的配置是一个快速的排名通道。从目前来看,仍是红利期。
  建议有能力的企业网站可以尝试配置。
  2. 网站信息架构
  对于新站点,百度爬虫的爬取频率非常有限。如果你的网站信息架构设计不合理,一定程度上会影响网站收录中的相关页面。主要包括:
  
  3.新站原创保护
  一个全新的网站上线,而不是一个旧的域名,理论上,这个域名是没有可信度的。其实这个时候,我们需要尽可能的保留网站上的优质内容,先被索引,而不是被采集。为此原因:
  4. 网站日志分析
  对于网站的日志分析,是解决百度缺少收录网站其他页面的一个非常有效的工具。它可以清楚地了解用户和蜘蛛对整个站点的访问:
  5. 网站资源分配
  从多年的SEO经验来看,任何网站的收录排名都是基于一定的资源,包括:
  网站内容质量
  
  如果你的网站书伪原创代笔,或者采集内容,那么百度收录网站首页是很正常的。对于新网站,一定不要选择提交旧内容。
  站外外部链接
  出现页面没有被百度收录列出的另一个原因是缺乏外链资源的支持,蜘蛛无法第一时间抓取到新的内容。为此,您可能需要编写一些高质量的内容,发布在高权威网站上,并通过外部链接的形式,指向经常更新的页面。
  站内链建设
  与熊掌ID相比,其实我们可以忽略内链的存在,如果不配置熊掌ID,那么内链有利于提高新内容被发现的概率。
  当您的页面长时间没有收录时,您可以适当利用内部链接来构建站点内的信息流。
  总结:百度只有收录一个主页的原因有很多,以上只是一些小细节。 查看全部

  分享:公众号文章采集的两种方案,搜狗和微信App采集
  更新于 2018-06-05
  许多答案无用或不再有效,这是我的解决方案。
  如果只采集公众号文章微信,要求不是很严格,可以去搜狗。这种方案成本低,相对简单,但缺点也很明显。这是一个临时的 文章 链接。如果要转成永久链接,还是要通过app界面。.
  
  另一种解决方案是从微信APP本身添加抓取软件采集,成本会高很多,但是可以采集的数据类型很多,包括但不限于:历史页面文章 ,阅读喜欢,评论等。
  为了更直观,我做了一张图来对比搜狗和微信App采集的两种方案。
  我自己使用这两种方案,也提供封装好的接口。具体要求将取决于成本和场景来选择使用哪一种。
  
  简单的一句话总结就是,搜狗有微信App,但搜狗没有微信App,但无论软硬成本,微信方案都比搜狗方案贵很多。
  题外话,图片指的是微信中的搜索界面。我自己已经实现了,可以获取搜索公众号和文章的返回数据,只是作为微信批量添加软件的练习,因为这个接口用处不大,所以没有解包已打开,如果需要,可以单独联系我。很多人可能会认为采集和搜索界面不太可能给微信添加抓取软件,因为这个数据根本就不是http协议。但我想说的是,有时 采集data 不一定要在请求中截取。解决方案有很多,但成本也会变得非常大(开发成本和上线成本)。
  另外,关于公众号文章的读物采集,可以看我的另一个回答知乎:
  技术文章:为什么我的博客百度只收录了首页?
  1.熊掌号和百度小程序
  面对这种问题,首先要检查的是网站是否配置了熊掌ID和百度小程序。从目前来看,Bear's Paw ID 正在解决网站收录。锋利的武器。
  对于企业网站来说,百度小程序的配置是一个快速的排名通道。从目前来看,仍是红利期。
  建议有能力的企业网站可以尝试配置。
  2. 网站信息架构
  对于新站点,百度爬虫的爬取频率非常有限。如果你的网站信息架构设计不合理,一定程度上会影响网站收录中的相关页面。主要包括:
  
  3.新站原创保护
  一个全新的网站上线,而不是一个旧的域名,理论上,这个域名是没有可信度的。其实这个时候,我们需要尽可能的保留网站上的优质内容,先被索引,而不是被采集。为此原因:
  4. 网站日志分析
  对于网站的日志分析,是解决百度缺少收录网站其他页面的一个非常有效的工具。它可以清楚地了解用户和蜘蛛对整个站点的访问:
  5. 网站资源分配
  从多年的SEO经验来看,任何网站的收录排名都是基于一定的资源,包括:
  网站内容质量
  
  如果你的网站书伪原创代笔,或者采集内容,那么百度收录网站首页是很正常的。对于新网站,一定不要选择提交旧内容。
  站外外部链接
  出现页面没有被百度收录列出的另一个原因是缺乏外链资源的支持,蜘蛛无法第一时间抓取到新的内容。为此,您可能需要编写一些高质量的内容,发布在高权威网站上,并通过外部链接的形式,指向经常更新的页面。
  站内链建设
  与熊掌ID相比,其实我们可以忽略内链的存在,如果不配置熊掌ID,那么内链有利于提高新内容被发现的概率。
  当您的页面长时间没有收录时,您可以适当利用内部链接来构建站点内的信息流。
  总结:百度只有收录一个主页的原因有很多,以上只是一些小细节。

干货分享:说说虫虫营销助手百度应用文档教程

采集交流优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2022-11-02 18:26 • 来自相关话题

  干货分享:说说虫虫营销助手百度应用文档教程
  说说bug营销助手百度应用文档教程
  1. 文章 发布
  
  发布支持百度目前所有的WEB2.0应用,用户可以点击图片单独操作,也可以点击一键发布。如果相关账号没有注册,用户可以先注册账号,也可以进入已有账号进行操作。百度应用中的网站都在默认组中。
  2. 文章采集
  文章采集目前支持百度空间、图书馆、百科和旅行,点击对应图片开始采集。
  
  3. 网站提交
  这部分的主要对象是企业用户。百度推出了搜索开放平台等各类企业APP应用接口。用户只需提交相关企业文件。达到各种效果。比如Bugs官方申请的软件下载应用,用户只需要在百度输入“Bugs营销助手”,百度首页就会出现相关下载页面的地址,排名非常高。用户点击软件中的相关图片后,软件会引导用户到具体的申请提交地址。用户提交具体企业信息后,等待百度审批。
  更多北碚商城产品介绍:软文营销服务全球电影资讯网软文中国企业金融网发帖软文发帖示例
  教程:SEO批量在线翻译伪原创软件
  SEO翻译伪原创把我们原来的中文翻译成其他词,然后再反译成中文,语义不会改变,但是词和主谓宾结构会发生相应的变化。同义词替换为文章伪原创,SEO翻译伪原创更符合用户阅读习惯,去重率更高。
  在制定 SEO 策略时,充满活力的内容是构建新内容的跳板。通过SEO翻译伪原创,我们可以向国外同行业的文章学习和采集资料。SEO翻译伪原创有视觉指定采集和批量文章翻译,集成的翻译页面让我们可以选择翻译、谷歌翻译、有道翻译等翻译渠道。多种选择有助于确保翻译质量和翻译数量。
  SEO翻译伪原创不仅适用于在线采集任务,它还可以为保存在本地文件夹中的文章完成批量翻译伪原创发布,具有独特的翻译优化它允许我们识别原文的标签和段落,使翻译后的文章符合用户的阅读习惯,而不是全部靠在一起,不美观。
  SEO翻译伪原创支持文章敏感词删除、图片本地化和关键词锚文本插入等SEO技术。文章干净、有条理和搜索引擎友好的收录,用户更有可能找到我们的内容,因为内容充满活力,专注于内在兴趣的主题。通过创建有价值和有见地的帖子,人们会留在我们的页面上,从而降低跳出率。
  
  通过搜索全球同行 网站文章 来展示我们的专业知识,然后提炼和制作动态内容。它使我们在竞争中脱颖而出,并展示了我们的垂直专业知识。考虑到这一点,让我们看看这些技巧,以帮助编写我们的动态内容。
  当我们创建动态内容时,我们需要牢记我们的读者。研究表明,75% 的用户从未滚动过第一个搜索结果页面。我们的目标是生成始终与我们的用户相关且与我们的业务相关的内容。最好关注动态内容,例如“如何构建有效的电话系统”,因为这些主题永远不会过时并且总是受到追捧。总有人想更多地了解我们的专业主题。通过在我们的 网站 中收录初学者指南和常见问题解答,我们可以为这些新用户提供宝贵的资源。
  这些关键字确保我们的帖子出现在搜索结果中并针对 SEO 进行了优化。SEO Translator 伪原创 拥有诸如 关键词 Mining 等工具,可以为我们的内容找到最佳的 SEO 关键字。上述工具探索了关键字的指标,这些指标表明我们的主题是否存在竞争和搜索兴趣。这允许用户应用程序确定我们的内容将如何使用可用的关键字进行排名。这是关于通过有价值且可访问的内容引起注意。
  
  如果竞争对手在我们想要的关键字上发布并且他们的参与度很高,那么可能值得使用另一个关键字。超越他们的流量需要时间和金钱,因此关注另一个可以主导搜索结果的关键字是有意义的。
  对于网站的SEO优化,无论是挖掘关键词,还是指定网站采集获取素材,都应该多从文章新颖性和人气话题开始。搜索引擎和用户都很好奇,行业突发的信息和爆炸性话题往往是大家关注的焦点,而我们的素材获取可以通过SEO翻译伪原创工具在全平台、全网搜索到.
  SEO翻译伪原创让我们摆脱了文字的束缚,可以在网上搜索到我们想要的内容和素材。通过批量SEO翻译,我们可以为我们的网站源源不断地更新内容。SEO翻译的分享就到这里了伪原创,喜欢的话记得点三个链接哦。返回搜狐,查看更多 查看全部

  干货分享:说说虫虫营销助手百度应用文档教程
  说说bug营销助手百度应用文档教程
  1. 文章 发布
  
  发布支持百度目前所有的WEB2.0应用,用户可以点击图片单独操作,也可以点击一键发布。如果相关账号没有注册,用户可以先注册账号,也可以进入已有账号进行操作。百度应用中的网站都在默认组中。
  2. 文章采集
  文章采集目前支持百度空间、图书馆、百科和旅行,点击对应图片开始采集。
  
  3. 网站提交
  这部分的主要对象是企业用户。百度推出了搜索开放平台等各类企业APP应用接口。用户只需提交相关企业文件。达到各种效果。比如Bugs官方申请的软件下载应用,用户只需要在百度输入“Bugs营销助手”,百度首页就会出现相关下载页面的地址,排名非常高。用户点击软件中的相关图片后,软件会引导用户到具体的申请提交地址。用户提交具体企业信息后,等待百度审批。
  更多北碚商城产品介绍:软文营销服务全球电影资讯网软文中国企业金融网发帖软文发帖示例
  教程:SEO批量在线翻译伪原创软件
  SEO翻译伪原创把我们原来的中文翻译成其他词,然后再反译成中文,语义不会改变,但是词和主谓宾结构会发生相应的变化。同义词替换为文章伪原创,SEO翻译伪原创更符合用户阅读习惯,去重率更高。
  在制定 SEO 策略时,充满活力的内容是构建新内容的跳板。通过SEO翻译伪原创,我们可以向国外同行业的文章学习和采集资料。SEO翻译伪原创有视觉指定采集和批量文章翻译,集成的翻译页面让我们可以选择翻译、谷歌翻译、有道翻译等翻译渠道。多种选择有助于确保翻译质量和翻译数量。
  SEO翻译伪原创不仅适用于在线采集任务,它还可以为保存在本地文件夹中的文章完成批量翻译伪原创发布,具有独特的翻译优化它允许我们识别原文的标签和段落,使翻译后的文章符合用户的阅读习惯,而不是全部靠在一起,不美观。
  SEO翻译伪原创支持文章敏感词删除、图片本地化和关键词锚文本插入等SEO技术。文章干净、有条理和搜索引擎友好的收录,用户更有可能找到我们的内容,因为内容充满活力,专注于内在兴趣的主题。通过创建有价值和有见地的帖子,人们会留在我们的页面上,从而降低跳出率。
  
  通过搜索全球同行 网站文章 来展示我们的专业知识,然后提炼和制作动态内容。它使我们在竞争中脱颖而出,并展示了我们的垂直专业知识。考虑到这一点,让我们看看这些技巧,以帮助编写我们的动态内容。
  当我们创建动态内容时,我们需要牢记我们的读者。研究表明,75% 的用户从未滚动过第一个搜索结果页面。我们的目标是生成始终与我们的用户相关且与我们的业务相关的内容。最好关注动态内容,例如“如何构建有效的电话系统”,因为这些主题永远不会过时并且总是受到追捧。总有人想更多地了解我们的专业主题。通过在我们的 网站 中收录初学者指南和常见问题解答,我们可以为这些新用户提供宝贵的资源。
  这些关键字确保我们的帖子出现在搜索结果中并针对 SEO 进行了优化。SEO Translator 伪原创 拥有诸如 关键词 Mining 等工具,可以为我们的内容找到最佳的 SEO 关键字。上述工具探索了关键字的指标,这些指标表明我们的主题是否存在竞争和搜索兴趣。这允许用户应用程序确定我们的内容将如何使用可用的关键字进行排名。这是关于通过有价值且可访问的内容引起注意。
  
  如果竞争对手在我们想要的关键字上发布并且他们的参与度很高,那么可能值得使用另一个关键字。超越他们的流量需要时间和金钱,因此关注另一个可以主导搜索结果的关键字是有意义的。
  对于网站的SEO优化,无论是挖掘关键词,还是指定网站采集获取素材,都应该多从文章新颖性和人气话题开始。搜索引擎和用户都很好奇,行业突发的信息和爆炸性话题往往是大家关注的焦点,而我们的素材获取可以通过SEO翻译伪原创工具在全平台、全网搜索到.
  SEO翻译伪原创让我们摆脱了文字的束缚,可以在网上搜索到我们想要的内容和素材。通过批量SEO翻译,我们可以为我们的网站源源不断地更新内容。SEO翻译的分享就到这里了伪原创,喜欢的话记得点三个链接哦。返回搜狐,查看更多

给力:新媒体、人力不足、收集欲强怎么办?

采集交流优采云 发表了文章 • 0 个评论 • 36 次浏览 • 2022-11-02 03:10 • 来自相关话题

  给力:新媒体、人力不足、收集欲强怎么办?
  文章采集软件app推荐过很多了,作为收集爱好者,我的回答范围覆盖了分答、知乎、天天快报、今日头条、微博、小红书、豆瓣、lofter、instagram等平台。不过这不够啊,对于新媒体、人力不足、收集欲强的小伙伴们,该怎么办呢?会收集各大平台数据库已经足够容纳全网数据了,这次再推荐6款收集整理工具。想要收集资料的小伙伴们要看仔细了,这几款工具都是第三方或者个人开发的,部分可免费试用。收集本地数据进入全网数据库。
  1、资料王这是一款资料收集的小工具,但我觉得没有什么奇奇怪怪的特点。不过资料太多,收集不容易,比如聊天记录,别人发来一个快递的图片,需要在快递公司的数据库里找,这个时候就需要看图。除此之外,还要搜索最新的热点,并且确定它是否收录自己的内容,是否能识别自己的文章,并且选择分享等。这个要花一些时间和功夫。收集自己的数据。
  
  2、douyinput需要先注册一个账号,然后按照图片注册一个链接,就可以开始收集数据了。如果不小心点开了,就会出现各种方法,这里不细说了。这是我最喜欢的收集数据工具,我是从behance、emoji表情开始收集的。这种软件最好结合一些表情包使用,比如我在douyinput搜索emoji表情,有6个不同的emoji表情可供自己选择,如果想要把它放在头像上,需要搭配上表情包。
  wikihow是我发现的另一个收集方法,它也是进入全网数据库。我用过网易云课堂、腾讯课堂、尚德机构云课堂等等,都可以通过百度云。下载一些课程讲座的ppt,还有一些小教程。
  3、camtasiastudio一键将图片导入到屏幕上,以后还能看视频,可能各大收集工具都有类似功能。各种软件都支持,最重要的是免费的。
  
  4、colordirectio这个工具能识别一下你图片右下角的颜色,几个字,数字,会很快形成一条相应的数据链接,如果就是一张图片,一个文字等,你想要都能搜到。如果你想搜索文字,只是输入一串数字,也能搜索到。
  5、keepspider想要获取某图片的某些关键字,如果不是全网图片,就只能自己拼接自己的关键字。想要搜图片,还能识别你的关键字,有点类似以图搜字。除此之外,还能识别自己的文章。
  6、云笔记不多说,只放一张图,你就能知道云笔记是一个什么东西。这些工具你看都看了,别忘了每天多浏览几遍,有时你也会搜到很好的文章和思路。 查看全部

  给力:新媒体、人力不足、收集欲强怎么办?
  文章采集软件app推荐过很多了,作为收集爱好者,我的回答范围覆盖了分答、知乎、天天快报、今日头条、微博、小红书、豆瓣、lofter、instagram等平台。不过这不够啊,对于新媒体、人力不足、收集欲强的小伙伴们,该怎么办呢?会收集各大平台数据库已经足够容纳全网数据了,这次再推荐6款收集整理工具。想要收集资料的小伙伴们要看仔细了,这几款工具都是第三方或者个人开发的,部分可免费试用。收集本地数据进入全网数据库。
  1、资料王这是一款资料收集的小工具,但我觉得没有什么奇奇怪怪的特点。不过资料太多,收集不容易,比如聊天记录,别人发来一个快递的图片,需要在快递公司的数据库里找,这个时候就需要看图。除此之外,还要搜索最新的热点,并且确定它是否收录自己的内容,是否能识别自己的文章,并且选择分享等。这个要花一些时间和功夫。收集自己的数据。
  
  2、douyinput需要先注册一个账号,然后按照图片注册一个链接,就可以开始收集数据了。如果不小心点开了,就会出现各种方法,这里不细说了。这是我最喜欢的收集数据工具,我是从behance、emoji表情开始收集的。这种软件最好结合一些表情包使用,比如我在douyinput搜索emoji表情,有6个不同的emoji表情可供自己选择,如果想要把它放在头像上,需要搭配上表情包。
  wikihow是我发现的另一个收集方法,它也是进入全网数据库。我用过网易云课堂、腾讯课堂、尚德机构云课堂等等,都可以通过百度云。下载一些课程讲座的ppt,还有一些小教程。
  3、camtasiastudio一键将图片导入到屏幕上,以后还能看视频,可能各大收集工具都有类似功能。各种软件都支持,最重要的是免费的。
  
  4、colordirectio这个工具能识别一下你图片右下角的颜色,几个字,数字,会很快形成一条相应的数据链接,如果就是一张图片,一个文字等,你想要都能搜到。如果你想搜索文字,只是输入一串数字,也能搜索到。
  5、keepspider想要获取某图片的某些关键字,如果不是全网图片,就只能自己拼接自己的关键字。想要搜图片,还能识别你的关键字,有点类似以图搜字。除此之外,还能识别自己的文章。
  6、云笔记不多说,只放一张图,你就能知道云笔记是一个什么东西。这些工具你看都看了,别忘了每天多浏览几遍,有时你也会搜到很好的文章和思路。

操作方法:文章采集器-楼主会自动识别文章及摘要,只需点选即可采集

采集交流优采云 发表了文章 • 0 个评论 • 72 次浏览 • 2022-10-31 05:14 • 来自相关话题

  操作方法:文章采集器-楼主会自动识别文章及摘要,只需点选即可采集
  
  文章采集软件app文章采集器-楼主会自动识别文章及摘要,只需点选即可采集这里有不同样式需求的自动采集一:自动采集图片自动采集:以【北京楼盘】为例,单击“浏览”按钮,即可看到了一张需要采集的图片,本地图片可直接点击保存图片至本地手机当中采集二:自动采集文章本地图片采集:采集时需点击图片,即可获取该文章所有的文章的内容集,文章标题自动采集文章摘要采集:点击一则文章,即可获取该文章所有的摘要摘要内容到本地手机当中采集三:自动采集微信文章长按图片识别文字、文章摘要自动采集:采集时选择图片即可采集文章全部内容注意事项楼主采集的为bls/css转json代码文件如遇未匹配到模板字符值的图片即为不能采集优势数据多种批量处理新建批量查找对象将原始数据导入文本中将查找对象从图片保存到数据库(需用json格式)所有内容仅需简单点击即可采集操作方法楼主没有进行更多的讲解只有限定了楼主理解的优点与不足操作与正常采集无差别缺点1。
  
  数据规整效率不高2。手机版无法传递单独文件压缩可忽略采集分享欲采集中信息部分直接导出至本地手机浏览器、电脑软件服务器中。
  采集公众号文章可以用动态生成器呀,效率比excel快太多,目前专门做公众号文章数据采集这一块的,刚刚有人推荐他们, 查看全部

  操作方法:文章采集器-楼主会自动识别文章及摘要,只需点选即可采集
  
  文章采集软件app文章采集器-楼主会自动识别文章及摘要,只需点选即可采集这里有不同样式需求的自动采集一:自动采集图片自动采集:以【北京楼盘】为例,单击“浏览”按钮,即可看到了一张需要采集的图片,本地图片可直接点击保存图片至本地手机当中采集二:自动采集文章本地图片采集:采集时需点击图片,即可获取该文章所有的文章的内容集,文章标题自动采集文章摘要采集:点击一则文章,即可获取该文章所有的摘要摘要内容到本地手机当中采集三:自动采集微信文章长按图片识别文字、文章摘要自动采集:采集时选择图片即可采集文章全部内容注意事项楼主采集的为bls/css转json代码文件如遇未匹配到模板字符值的图片即为不能采集优势数据多种批量处理新建批量查找对象将原始数据导入文本中将查找对象从图片保存到数据库(需用json格式)所有内容仅需简单点击即可采集操作方法楼主没有进行更多的讲解只有限定了楼主理解的优点与不足操作与正常采集无差别缺点1。
  
  数据规整效率不高2。手机版无法传递单独文件压缩可忽略采集分享欲采集中信息部分直接导出至本地手机浏览器、电脑软件服务器中。
  采集公众号文章可以用动态生成器呀,效率比excel快太多,目前专门做公众号文章数据采集这一块的,刚刚有人推荐他们,

超值资料:你用什么采集器好用,搜狗app,可以采集网易云音乐

采集交流优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2022-10-31 04:09 • 来自相关话题

  超值资料:你用什么采集器好用,搜狗app,可以采集网易云音乐
  文章采集软件appforum的产品介绍-专门做短视频平台的采集的,关注你的app前往官网看更多。
  你用什么采集器好用,
  1、微吼短视频采集器、
  2、兴云社,
  3、ev3
  3、
  4、
  
  5、
  6、
  7、
  8、
  9、10
  采集京东
  采集宝,我一直在用,
  推荐一个采集网易云音乐的app:云音乐助手-网易云音乐免费音乐搜索,在线试听,下载,音乐人,
  
  推荐使用qq音乐和网易云音乐,它们有自己的app,
  京东全景影像app。可以从百度地图画出近距离的全景。
  搜狗app,可以采集网易云音乐,支持京东全景,还有很多别的商城,
  采集云app是去年新兴的一个数据采集的app,直接用云采客app我测试搜索网易云音乐,我总共采集了1520条数据,
  1、首先打开软件,右上角搜索入口,
  2、开始采集后,会有提示页面让我们选择采集的商品,采集到的商品数是0,
  3、随便点击一个,点击保存,鼠标会变成键盘箭头指示,这个时候,
  4、采集到的图片就保存在本地啦,
  5、采集网易云音乐真的很简单,打开软件直接采集就行,不需要装任何软件, 查看全部

  超值资料:你用什么采集器好用,搜狗app,可以采集网易云音乐
  文章采集软件appforum的产品介绍-专门做短视频平台的采集的,关注你的app前往官网看更多。
  你用什么采集器好用,
  1、微吼短视频采集器、
  2、兴云社,
  3、ev3
  3、
  4、
  
  5、
  6、
  7、
  8、
  9、10
  采集京东
  采集宝,我一直在用,
  推荐一个采集网易云音乐的app:云音乐助手-网易云音乐免费音乐搜索,在线试听,下载,音乐人,
  
  推荐使用qq音乐和网易云音乐,它们有自己的app,
  京东全景影像app。可以从百度地图画出近距离的全景。
  搜狗app,可以采集网易云音乐,支持京东全景,还有很多别的商城,
  采集云app是去年新兴的一个数据采集的app,直接用云采客app我测试搜索网易云音乐,我总共采集了1520条数据,
  1、首先打开软件,右上角搜索入口,
  2、开始采集后,会有提示页面让我们选择采集的商品,采集到的商品数是0,
  3、随便点击一个,点击保存,鼠标会变成键盘箭头指示,这个时候,
  4、采集到的图片就保存在本地啦,
  5、采集网易云音乐真的很简单,打开软件直接采集就行,不需要装任何软件,

官方客服QQ群

微信人工客服

QQ人工客服


线