Win10解决gpedit.msc无效问题

Win10家庭版解决gpedit.msc无效的问题在安装Oracle Database时候,安装过程报了一个错误,搜索后网友提供的解决方法是通过设置修改本地组的一些配置,但是我这Win10家庭版使用 “win + r” 输入 “gpedit.msc” 会提示找不到…哎,解决它。接下来是解决步骤:建立gpedit.cmd文件,在桌面建文件比较方便打开文件并输入以下内容:@echo offpushd “%dp0"dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package3*.mum >List.txtdir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package3*.mum >>List.txtfor /f %%i in (‘findstr /i . List.txt 2^>nul’) do dism /online /norestart /add-package:“C:\Windows\servicing\Packages%%i"pause右键点击Run as AdministratorDeployment Image Servicing and Management toolVersion: 10.0.16299.15Image Version: 10.0.16299.1029Processing 1 of 1 - Adding package Microsoft-Windows-GroupPolicy-ClientExtensions-Package31bf3856ad364e35amd64en-US10.0.16299.15[==========================100.0%==========================]The operation completed successfully.Deployment Image Servicing and Management toolVersion: 10.0.16299.15Image Version: 10.0.16299.1029Processing 1 of 1 - Adding package Microsoft-Windows-GroupPolicy-ClientExtensions-Package31bf3856ad364e35amd64zh-CN10.0.16299.15[==========================100.0%==========================]The operation completed successfully.Deployment Image Servicing and Management toolVersion: 10.0.16299.15Image Version: 10.0.16299.1029Processing 1 of 1 - Adding package Microsoft-Windows-GroupPolicy-ClientExtensions-Package31bf3856ad364e35amd64~~10.0.16299.15[==========================100.0%==========================]The operation completed successfully.Deployment Image Servicing and Management toolVersion: 10.0.16299.15Image Version: 10.0.16299.1029Processing 1 of 1 - Adding package Microsoft-Windows-GroupPolicy-ClientTools-Package31bf3856ad364e35amd64en-US10.0.16299.15[==========================100.0%==========================]The operation completed successfully.Deployment Image Servicing and Management toolVersion: 10.0.16299.15Image Version: 10.0.16299.1029Processing 1 of 1 - Adding package Microsoft-Windows-GroupPolicy-ClientTools-Package31bf3856ad364e35amd64zh-CN10.0.16299.15[==========================100.0%==========================]The operation completed successfully.Deployment Image Servicing and Management toolVersion: 10.0.16299.15Image Version: 10.0.16299.1029Processing 1 of 1 - Adding package Microsoft-Windows-GroupPolicy-ClientTools-Package31bf3856ad364e35~amd64~~10.0.16299.15[==========================100.0%==========================]The operation completed successfully.Press any key to continue . . .出现以上提示说明运行成功win + R,输入gpedit.msc验证,出现下方图片即完成接下来去解决Oracle的问题,顺便记录Oracle 18c的安装过程。 ...

April 15, 2019 · 1 min · jiezi

2019 DDCTF write up

MISC北京地铁Color Threshold提示:AES ECB密钥为小写字母提示2:密钥不足位用0补全提示3:不要光记得隐写不看图片本身啊…MulTzor原文为英语,请破解12ce98ec4c4d79e38bf9454a71fecafa5a196ce58fb5795771ea87f41c5a71fd82f04e5076eacae6454a6ce887b5595779ef86f058196ce58fb54b5c6bf98fe7521959e186fc594a38e484b56b566ae18eb56b586aada3dc1c4d77ad98f05d5d38fe9ff74f4d79e39efc5d5538ec87fa49576cfecafa5a1955e298e659147be28ef058196aec8efc53197be287f8495771ee8be1555676fecafa5a196ce58fb57d4171fecae5534e7dff99b5485179f9cafd5d5d38ef8ff052197de389fc4c517dff8ff11c4c6be484f21c7c76e48df85d1975ec89fd55577dfec4b5685171fecaec555c74e98ff11c5471e183e15d4b61ad83fb485c74e183f259577be8cae254507be5c6b55d5577e38db54b506ce5cae154586cad8ce7535438e29efd594b38e98ff64e4068f98ff11c7860e499b54e587ce485b55d577cad9ef0505c68ff83fb485c6aad9ee75d576be083e64f5077e399b91c4e79fecaf2554f7de3cae1545c38ee85f1595779e08fb569556cff8bbb1c6d70e499b54b586bad89fa524a71e98fe7595d38ef93b54b5c6bf98fe752194bf89ae759547dadabf950507de9cad6535475ec84f1594b38c99dfc5b516cadaebb1c7c71fe8ffb54566fe898b5485638e58be359197ae88ffb1c1b7ce889fc4f506ee8c8b5485638f982f01c7874e183f058196ee489e1534b61a3e09f68517dadaffb555e75eccaf85d5a70e484f04f196fe898f01c5838eb8bf8555561ad85f31c4977ff9ef45e557dad89fc4c517dffcaf85d5a70e484f04f196fe49efd1c4b77f985e71c4a7bff8bf85e557dff99bb1c7e77e28eb553497dff8be155577fad9ae7535a7de99fe7594a34ad9ae753497dff86ec1c5c76eb85e75f5c7ca1cae2534c74e9cafd5d4f7dad87f4585c38f982f01c4974f88df753586ae9cad052507fe08bb551587be583fb59196de388e7595873ec88f9591738c585e2594f7dffc6b551566bf9cafa5a196ce58fb57b5c6ae08bfb1c5471e183e15d4b61ad8cfa4e5a7dfec6b54f5c7bff8fe11c4a7dff9cfc5f5c6bad8bfb58197be49cfc505079e3caf45b5c76ee83f04f196ce58be11c4c6be88eb5795771ea87f41c5c75fd86fa455c7cad9afa534b38e29af04e586ce484f21c496ae289f0584c6ae899b91c5876e9cafc48196fec99b548517dfe8fb54c5677ffcae54e567be88ee04e5c6bad9efd5d4d38ec86f9534e7de9cae1545c38c884fc5b5479ad87f45f5171e38fe61c4d77ad88f01c4b7dfb8fe74f5c35e884f255577de898f0581979e38eb548517dad89fc4c517dff99b5485638ef8fb54e5c79e9c49f366d70e8cad2594b75ec84b54c556dea88fa5d4b7ca08fe4495068fd8ff11c7c76e48df85d197ae889f4515c38c38bef55195fe898f85d5761aa99b54c4b71e389fc4c5874ad89e745496ce2c7e6454a6ce887bb1c706cad9df44f197aff85fe595738ef93b548517dadbafa50506be5cad259577dff8bf91c6a6cec8cf31b4a38ce83e5545c6aada8e04e5c79f8cafc52195ce889f0515b7dffcaa4050a2aa1cae2554d70ad9efd591979e48eb5535f38cb98f0525a70a099e04c4974e48ff11c5076f98ff950507fe884f6591975ec9ef04e5079e1cafa5e4d79e484f058197eff85f81c5838ca8fe7515876ad99e5451738cccaf853576ce5caf7595f77ff8fb548517dad85e0485b6ae88bfe1c567eadbdfa4e557cadbdf44e1951c4c6b55d4d38eccaf653577ee898f0525a7dad82f0505d38e38ff44e194fec98e65d4e34ad9efd591948e286fc4f5138ce83e5545c6aada8e04e5c79f8cae654586ae88eb5554d6badaffb555e75ecc7f74e5c79e683fb5b196ce889fd525069f88fe61c5876e9cae1595a70e385f9535e61ad9dfc485138f982f01c7f6ae884f6541979e38eb57e4b71f983e6541738c99fe755577fad9efd59195fe898f85d5738e484e35d4a71e284b5535f38dd85f95d577ca1caf6534b7dadbafa50506be5cad6554970e898b57e4c6ae88be01c497dff99fa52577de1cae2594b7dad8fe35d5a6dec9ef0581538fb83f41c6b77e08bfb555834ad9efa1c7f6aec84f659196fe58fe759196ce58fec1c5c6bf98bf750506be58ff11c4d70e8cac57f195aff9ffb53196be48dfb5d556bad83fb485c74e183f259577be8cae648586ce485fb1c4e71f982b57a4b7de389fd1c5f79ee83f9554d71e899b54f4c68fd85e7481738de9ff65f5c6bfe8ce050197be285e5594b79f983fa521979e085fb5b196ce58fb56c5674e899b91c4d70e8cad34e5c76ee82b91c5876e9cae1545c38cf98fc48506be5caf448195ae18fe15f5174e893b56c586ae6caf653576ce484e0595d38f884e1555538c79ffb591929b4dea510196fe58ffb1c7f6aec84f659196bf898e759577ce898f058196ce2cae1545c38ca8fe7515876fec49f367f6ae287b5485171fecaf7595e71e384fc525e34ad9efd59195aff83e1554a70adadfa4a5c6ae387f0524d38ce85f1591979e38eb57f4068e58fe71c6a7be585fa501930caa9b37f6a31ad8be11c7b74e89ef654557df4cac55d4b73ad88e055556cad9fe51c5876ad8fed485c76fe83e359197bff93e5485876ec86ec48507bad89f44c587ae486fc484036ada3fb554d71ec86f9451538f982f01c5d7dee98ec4c4d71e284b54b586bad87f4555774f4cafa5a1954f88ce14b587eeb8fb5147e7dff87f4521979e498b55a566aee8fbc1c5876e9caf41c5f7dfacadd595c6aadc2d2594b75ec84b55d4b75f4c3b5515c6bfe8bf2594a34ad8be61c4d70e8cade4e507dea99f85d4b71e38fb5147e7dff87f4521976ec9cec15197de09af953407de9caf8495a70ad87fa4e5c38fe8ff6494b7dad9ae7535a7de99fe7594a38eb85e71c4c6be484f21c7c76e48df85d1738cc86f452194cf898fc525e34ad8bb57f5875ef98fc585e7dadbffb554f7dff99fc484038e08be1545c75ec9efc5f5079e3caf4525d38e185f2555a71ec84b91c496ae29cfc585c7cad87e05f5138e28cb548517dad85e7555e71e38bf91c4d70e484fe55577fad9efd5d4d38e18ff11c4d77ad9efd59197ce899fc5b5738e28cb548517dad89e745496cec84f450406ce489f450197ae287f7591975ec89fd55577dfecae154586cad9df04e5c38e484e6484b6de08ffb485874ad83fb1c5c6ee884e1495874e193b55e4b7dec81fc525e38f982f01c5779fb8bf91c7c76e48df85d1738c585e2594f7dffc6b548517dada1e7555c7ffe87f44e5076e8cafc524d6ae28ee05f5c7cad8bfb1c7c76e48df85d196ee898e6555676ad9dfc485138eccaf3534c6af982b54e566ce298b55a566aad83e14f194da088fa5d4d6ba1cae7594a6de19efc525e38e484b55d1968ff85f953577fe88eb54c5c6ae485f11c4e70e884b548517dfe8fb5515c6bfe8bf2594a38ee85e0505d38e385e11c5b7dad8ef05f4b61fd9ef0581738da83e154196ce58fb55f5868f99fe7591977ebcae759557dfb8bfb48197be49afd594b38e68fec4f1979e38eb548517dad9fe6591977ebcaf8495a70ad8cf44f4d7dffcac06f1956ec9cec1c5b77e088f04f1538ff8ff2495579ffc6b54e5868e48eb54e5c79e983fb5b1977ebcac0115b77ec9eb5515c6bfe8bf2594a38ff8fe649547de9c49f366d70e8caf350587fad83e606195cc9a9c17a427ab88ca1055c2abcdaa30a0b2bbddbf45f097ebb8ca65d0f2dbfdca40c0f7ebc97[PWN] strikeWireshark简单的流量分析联盟决策大会为了共同的利益,【组织1】和【组织2】成立了联盟,并遵守共同约定的协议。为了让协议的制定和修改更加公平,组织1和组织2共同决定:当三位以上【组织1】成员和三位以上【组织2】成员同意时,才可以制定或修改协议。为了实现这一功能,联盟的印章被锁在密码保险柜中,而保险柜的密码只通过Shamir秘密分享方案分享给【组织1】和【组织2】的每一位成员。现在,【组织1】的【成员1】、【成员2】、【成员4】,【组织2】的【成员3】、【成员4】、【成员5】一致同意制定新的协议。请还原出这套方案的设计思路,按照这套方案的思路恢复出保险柜密码,取出印章吧!p =C45467BBF4C87D781F903249243DF8EE868EBF7B090203D2AB0EDA8EA48719ECE9B914F9F5D0795C23BF627E3ED40FBDE968251984513ACC2B627B4A483A6533组织1成员1 =729FB38DB9E561487DCE6BC4FB18F4C7E1797E6B052AFAAF56B5C189D847EAFC4F29B4EB86F6E678E0EDB1777357A0A33D24D3301FC9956FFBEA5EA6B6A3D50E组织1成员2 =478B973CC7111CD31547FC1BD1B2AAD19522420979200EBA772DECC1E2CFFCAE34771C49B5821E9C0DDED7C24879484234C8BE8A0B607D8F7AF0AAAC7C7F19C6组织1成员4 =BFCFBAD74A23B3CC14AF1736C790A7BC11CD08141FB805BCD9227A6E9109A83924ADEEDBC343464D42663AB5087AE26444A1E42B688A8ADCD7CF2BA7F75CD89D组织2成员3 =9D3D3DBDDA2445D0FE8C6DFBB84C2C30947029E912D7FB183C425C645A85041419B89E25DD8492826BD709A0A494BE36CEF44ADE376317E7A0C70633E3091A61组织2成员4 =79F9F4454E84F32535AA25B8988C77283E4ECF72795014286707982E57E46004B946E42FB4BE9D22697393FC7A6C33A27CE0D8BFC990A494C12934D61D8A2BA8组织2成员5 =2A074DA35B3111F1B593F869093E5D5548CCBB8C0ADA0EBBA936733A21C513ECF36B83B7119A6F5BEC6F472444A3CE2368E5A6EBF96603B3CD10EAE858150510Reversewindows reverse1windows reverse2Confusedconfused, need your flag.obfuscating macros提交格式:DDCTF{最短的正确输入},使得程序输出WELL DONE!黑盒破解II-时间谜题黑盒破解II-时间谜题去年大家已经破解掉了黑盒子系统,现在飞船的发动机引擎已经可以启动了,但常规的飞行速度是不能保证我们安全逃离的,速度与时间很重要!该如何做呢?挑战一下吧。你可以输入一串精心构造的数据来触发超常规的引擎启动获得逃离,但别被他骗了,不过无论怎样,当你看到Flag时就已经成功了。注:请运行在>= windows 7 x64 系统之上,程序正确输出格式:Flag:DDCTF{….}

April 15, 2019 · 1 min · jiezi

前嗅ForeSpider脚本教程-链接过滤脚本

今天,小编给大家带来的教程为:前嗅ForeSpider脚本教程-链接过滤脚本,应用场景,地址/标题过滤。具体内容如下:一.应用场景当可视化抽取到的链接包含不想要的链接地址时,需要进行过滤。可能用到的类是:string,使用到的全局对象是VALUE。二.地址过滤场景:链接地址有规律。示例:可视化配置百度搜索之后的链接抽取,过滤掉不是列表链接和翻页链接的所有链接。脚本实例:If(VALUE.Find(“wd=”)!=-1||VALUE.Find(“url=”)!=-1) return true; //return true代表保留链接else return false; //return false代表过滤链接三.标题过滤场景:链接标题有规律。示例:过滤掉所有标题不为空字符串的链接,并返回链接标题为”关键词”。脚本实例:f(VALUE!=””) return false; //代表过滤链接else return “关键词”; //否则保留并覆盖标题为关键词

April 15, 2019 · 1 min · jiezi

C#/.NET基于Topshelf创建Windows服务程序及服务的安装和卸载

本文首发于码友网–一个专注.NET/.NET Core开发的编程爱好者社区。文章目录C#/.NET基于Topshelf创建Windows服务的系列文章目录:C#/.NET基于Topshelf创建Windows服务程序及服务的安装和卸载 (1)在C#/.NET应用程序开发中创建一个基于Topshelf的应用程序守护进程(服务) (2)C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案 (3)前言对于使用Windows操作系统的人来说,Windows Service(Windows服务)应该不会陌生。在Windows操作系统中,我们可以在"运行"窗口中运行service.msc:即可打开一个查看Windows服务的窗口,如图:Windows服务基本都是一些后台运行的服务进程,没有UI界面,每个服务处理着各自独立的任务并且有专门的启动或者停止策略。所以,Windows服务在很多情况下会被用来者处理一些定时任务或者调度。那么,对于.NET的开发者来说,可不可以自己创建Windows服务呢,如何使用C#创建Windows服务呢?本文就为大家分享一种基于Topshelf创建的Windows服务的方法。创建Topshelf服务项目首先打开Visual Studio(本文使用的是Visual Studio 2019),打开新建项目的对话框,选择.NET Framework的控制台应用程序(Console App(.NET Framework)),如图:注:只可选择控制台应用程序点击"下一步",在项目名称中输入TopshelfDemoService,.NET Framework 选择4.6.2,其中选项根据自己情况填写即可,最后点击"创建"按钮。安装Topshelf组件在TopshelfDemoService项目中,打开Nuget包管理工具,搜索Topshelf,在搜索结果中选中Topshelf,点击"安装",如图:编写Topshelf服务的示例程序代码Topshelf组件安装完成后,我们就可以开始编写服务的示例代码了。首先,创建一个名为HealthMonitorService.cs的类(其作用假设为定时监控某个系统的运行健康状况),在其中分别创建方法:Start()和Stop()以及一个定时器,让定时器定时执行检查系统健康状况的任务(这里模拟的每秒向控制台输出一条文本信息),完整的代码如下:using System;using System.Timers;namespace TopshelfDemoService{ internal class HealthMonitorService { private readonly Timer _timer; public HealthMonitorService() { _timer = new Timer(1000) { AutoReset = true }; _timer.Elapsed += (sender, eventArgs) => Console.WriteLine(“执行系统健康检查任务,所有指标均正常。执行时间:{0}”, DateTime.Now); } public void Start() { _timer.Start(); } public void Stop() { _timer.Stop(); } }}再创建一个名为MyServiceConfigure.cs的服务配置类,这个类主要用来配置Topshelf服务的各种运行参数,代码如下:using System;using Topshelf;namespace TopshelfDemoService{ internal class MyServiceConfigure { internal static void Configure() { var rc = HostFactory.Run(host => // 1 { host.Service<HealthMonitorService>(service => // 2 { service.ConstructUsing(() => new HealthMonitorService()); // 3 service.WhenStarted(s => s.Start()); // 4 service.WhenStopped(s => s.Stop()); // 5 }); host.RunAsLocalSystem(); // 6 host.EnableServiceRecovery(service => // 7 { service.RestartService(3); // 8 }); host.SetDescription(“Windows service based on topshelf”); // 9 host.SetDisplayName(“Topshelf demo service”); // 10 host.SetServiceName(“TopshelfDemoService”); // 11 host.StartAutomaticallyDelayed(); // 12 }); var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode()); // 13 Environment.ExitCode = exitCode; } }}注:其中数字的含义请见本文末尾的解释。最后,打开Program.cs文件,开启Topshelf服务,如下:namespace TopshelfDemoService{ class Program { static void Main(string[] args) { MyServiceConfigure.Configure(); } }}好了,完成到这里,整个示例程序就写好了,按F5运行示例程序,你将看到如下类似的控制台信息:可以看到,我们创建的TopshelfDemoService服务每秒向控制台打印了一条文本信息,这和我们的预期是吻合的。这样,我们就成功创建了一个基于Topshelf的Windows服务,当然,这也只是一个简单和示例服务程序,其中没有复杂的业务逻辑和配置等等。这些都等待你去发掘。作为Windows服务安装和卸载我们刚才运行的只是一个控制台应用程序,如果将这个控制台应用程序关掉,定时任务也会被停止了。如果我们希望定时任务可以一直运行,那需要将这个控制台应用程序作为服务安装到Windows服务进程中,如何操作呢?非常简单的安装和卸载命令。首先,以管理员身份打开一个命令行工具,进入到控制台应用程序所在目录。安装安装服务运行如下命令:TopshelfDemoService.exe install打开Windows服务查看窗口(刷新),可以看到Topshelf demo service已经在服务列表中了,如图:这时,我们只需要按照Windows服务来操作这个服务即可。卸载如果需要卸载服务,则运行如下命令:TopshelfDemoService.exe uninstallTopshelf配置参数说明1.设置服务主机使用HostFactory.Run()来创建并运行一个Topshelft服务。2.设置Topshelf使用类型HealthMonitorService作为服务类。3.配置如何创建一个服务的实例,这里采用的是使用关键字new来实例化一个HealthMonitorService对象,你也可以使用IoCp容器来实例化服务对象。4.设置当服务启动时执行的操作。5.设置当服务停止时执行的操作。6.设置将服务以本地系统身份运行。7.启动恢复服务模式(当服务意外停止后自动恢复)。8.设置第一次自动恢复服务的延迟时间为3分钟。9.设置Topshelf服务在Windows服务中的描述信息。10.设置Topshelf服务在Windows服务中的显示名称。11.设置Topshelf服务在Windows服务中的服务名称。12.设置Topshelf服务随Windows启动时自动运行(延迟)。13.设置服务的退出代码。示例代码托管和下载本示例代码托管地址可以在原出处找到:示例代码下载地址 ...

April 12, 2019 · 1 min · jiezi

前嗅ForeSpider脚本教程-链接抽取:自定义链接写脚本

今天,小编给大家带来的教程为:前嗅ForeSpider脚本教程-链接抽取中,自定义链接写脚本的实战教程。具体内容如下:场景:当采集的链接不存在于任何位置,或者想要采集自定义的链接。示例:天猫商品评论的链接。商品评论的链接不在源码中,只能自己拼接评论链接。点击评论翻页,观察翻页规律。取其中某一链接地址在网页中查看请求返回信息。删除个别不一致的请求参数,观察结果是否变化。可得到最简链接地址。https://rate.tmall.com/list_d…¤tPage=2&append=0&content=1&tagId=&posi=&picture=&groupId=&ua=&callback=脚本实例:for(int i=0;i<10;i++){//取10页评论url u;u.title = “第+i+”页评论”;u.urlname = “https://rate.tmall.com/list_detail_rate.htm?itemId=566879444630&spuId=950725258&sellerId=134363478&order=3¤tPage=”+i+”&append=0&content=1&tagId=&posi=&picture=&groupId=&ua=&callback=”;//第i页的评论链接地址u.entryid = CHANN.id;u.tmplid = 2;RESULT.AddLink(u);}

April 12, 2019 · 1 min · jiezi

前嗅ForeSpider脚本教程-链接抽取:链接在POST请求里写脚本

今天,小编给大家带来的教程为:前嗅ForeSpider脚本教程-链接抽取中,链接在POST请求里写脚本的实战教程。具体内容如下:当链接地址在源码中不存在,存在于post请求中时,需要使用浏览器的开发者工具来查找链接数据。1.链接需要循环场景:一组链接存在于JSON的某个数组中。示例:采集豆瓣电影,列表页的电影链接。查看源文件可知,源文件中只有一部分数据,而下拉列表出现的其他电影信息不存在源码中,此时我们需要在请求的响应正文中查找数据。在该页面右键点击“审查元素”,下拉,点击“加载更多”,出现一个请求包,查看Response,发现链接地址存在于,返回正文中。将Response中的信息粘贴到json查看器中,以notepad++插件“JSON Viewer”为例,定位数据存在路径。脚本实例:var urs = “https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=60”;var groc = EXTRACT.OpenDoc(CHANN,urs,0);if(groc){ var jsonStr = groc.GetDom().GetSource().ToStr(); jScript js; var json = js.RunJson(jsonStr); var arr = json.subjects; for(int i=0;i<arr.size;i++) { url u; u.title=””; u.urlname=arr[i].url; u.entryid=CHANN.id; u.tmplid=2; RESULT.AddLink(u); }}2.不循环场景:少数链接是JSON的某个键值。示例:暂无。

April 11, 2019 · 1 min · jiezi

coursera视频无法播放--hosts文件修改

因为coursera可以访问,但是视频源被墙,目前暂时可以通过修改hosts文件来解决,速度还是稍微有一点慢,但是正常学习完全没有问题!hosts 文件所在位置c:/windows/system32/drivers/etc/hosts将下面的ip加域名复制到文件中52.84.167.78 d3c33hcgiwev3.cloudfront.net52.84.246.90 d3c33hcgiwev3.cloudfront.net52.84.246.252 d3c33hcgiwev3.cloudfront.net52.84.246.144 d3c33hcgiwev3.cloudfront.net52.84.246.72 d3c33hcgiwev3.cloudfront.net52.84.246.106 d3c33hcgiwev3.cloudfront.net52.84.246.135 d3c33hcgiwev3.cloudfront.net52.84.246.114 d3c33hcgiwev3.cloudfront.net52.84.246.90 d3c33hcgiwev3.cloudfront.net52.84.246.227 d3c33hcgiwev3.cloudfront.netwin+R cmd 呼出命令行输入ipconfig /flushdns刷新所有 dns内容

April 11, 2019 · 1 min · jiezi

【CTF】利用volatility与Gimp实现Windows内存取证

0x01 题目要求题目提供了一个大小为256MB的内存镜像,显然我们需要从当中找到一些有趣的东西。0x02 分析过程既然是内存取证,首先就想到一个强大的取证工具——volatility该工具在kali当中已集成,位于应用程序->数字取证->volatility。下面就针对该镜像,记录一下使用该工具进行内存取证的过程。1. volatilityvolatility命令手册:https://github.com/volatility…我这里只列举一些常用的命令1. 镜像基本信息volatility -f mem.data imageinfo关键看Suggested Profile(s)项,这里是工具判断该镜像的架构,同时也会提供相应架构的命令用于分析该镜像,本题中可能性最大的架构是Win7SP1x64,然后在调用命令时加上–profile=Win7SP1x64就可以了,继续往下看。2. 列举可使用的命令volatility -f mem.data –profile=Win7SP1x64 –help常用的命令如下:命令功能cmdline/cmdscan列出历史cmd命令filescan扫描文件,可配合grep使用netscan扫描建立的连接和套接字,类似于netstatpslist/psscan列出进程列表svcscan扫描windows服务列表screenshot显示GDI样式的截屏memdump从内存dump进程的内存dumpfiles从内存dump文件3. 搜索进程首先我们要看一下出题人在镜像里干了什么。volatility -f mem.data –profile=Win7SP1x64 pslist可以看到这里有3个应用程序进程,分别是:wordpad写字板 MineSweeper扫雷 mspaint画图,而且再看看启动时间,mspaint相隔之后的进程有长达10分钟时间,emmm,出题人应该是就在这段时间写的flag。接下来我们就看一下有没有什么可疑的文件留存。4. 查看可疑文件查看文档volatility -f mem.data –profile=Win7SP1x64 filescan | grep “doc|docx|rtf"没有。。。查看图片volatility -f mem.data –profile=Win7SP1x64 filescan | grep “jpg|jpeg|png|tif|gif|bmp"也没有。。。查看桌面volatility -f mem.data –profile=Win7SP1x64 filescan | grep “Desktop"难道出题人还用扫雷来做个图???(开个玩笑)看来flag并没有保存为文件,看看有没有其他突破口。5. 查看截图volatility -f mem.data –profile=Win7SP1x64 screenshot –dump-dir=./导出的图片如下说实话我根本看不出来这是个什么界面。。。6. 其他调查查看命令行输入volatility -f mem.data –profile=Win7SP1x64 cmdline查看系统用户名volatility -f mem.data –profile=Win7SP1x64 printkey -K “SAM\Domains\Account\Users\Names"查看网络连接volatility -f mem.data –profile=Win7SP1x64 netscan在做了很多无用功之后,只能去求助Google了,结果搜出来2篇文章,比较有参考价值:google-ctf-2016-forensic1:https://www.rootusers.com/goo…从内存导出raw图片:https://w00tsec.blogspot.com/…上述文章介绍了一种方法,通过利用volatility将进程内存dump下来,然后利用Gimp打开内存数据,查看镜像中的系统界面,于是我们开始实施。2.Gimp使用volatility dump内存:(2768是mspaint的pid)volatility -f mem.data –profile=Win7SP1x64 memdump -p 2768 –dump-dir=./将2768.dmp重命名为2768.data,使用Gimp打开,打开方式选择"原始图像数据"出现这样一个界面,做如下操作:图像类型:RGB Alpha调整三个属性:高度调整到合适值就不用变了,我的最大是733。确定一个宽度,通常是常见的显示器分辨率,然后不断调整位移,使之出现可见的图像,也就是镜像中的系统界面。(接下来就是我不断测试的过程,测试了2小时。。。)分辨率是1920时:可以看见3个程序,之前的GDI纯白色框线界面就是扫雷的结算界面,写字板里写的也不是flag,看来就只有画图里有flag了。分辨率是1024时:扫雷界面。证明在不同分辨率下,会显示不同的界面。分辨率是1568时:部分画图界面,可能离成功不远了。分辨率是1457时:getFlag!事后发现,微调位移为图像的左右方向平移,大幅调节位移则是图像的上下方向平移。而宽度不变时,始终显示的都是同一幅图像。0x03 小结一下为了凑够3点,就写一下小结吧谷哥大法好,樯外确实有很多好的题解熟悉使用各类取证分析工具,是快速解出此题的关键可以参透出题人心理,猜测可能的flag位置 ...

April 10, 2019 · 1 min · jiezi

前嗅ForeSpider脚本教程-链接抽取:链接在源码的js变量里写脚本

今天,小编给大家带来的教程为:前嗅ForeSpider脚本教程-链接抽取中,链接在源码的js变量里写脚本的实战教程。具体内容如下:链接地址可在源码中查找到。在目标网页右键,选择“查看源代码”,键盘点击“ctrl+F”,查找目标链接所在位置。目标链接存在于js变量中。1.链接需要循环场景:要抽取的一组链接都在源码中出现,集中分布。示例:获取今日头条热点新闻列表页链接查看列表页第一条链接,链接地址为“https://www.toutiao.com/group/6637244114360336900/”,在该网页,鼠标右键,选择查看源代码,“Ctrl+F”查找字符串“6637244114360336900”,定位其位置。观察可知,中文字符都以”u”开头的字符串表示,显示为unicode编码格式,由“站长工具”在线转编码之后即可展示中文。此外链接地址分割符“/”加了转义符“”,不过软件已经帮助我们做了转义处理,此处无需担心,直接赋值即可。将转义后的字符串放置于JSON查看器中(以notepad++的插件“JSON Viewer”为例),则可观察到数据形式为json。脚本实例:var str=DOM.GetSource().ToStr(); //获取本链接地址网页源码var jsonStr=DOM.UnEscape(str.Middle(“data = “,”]};”)+"]}"); //截取数据所在字符串jScript js;//定义JS变量var obj=js.RunJson(jsonStr);//解析JSON串,并返回JSON对象var ar=obj.real_time_news;//获取目标数据所在数组for(int i=0;i<ar.size;i++)//通过循环添加链接 { url u; u.title=ar[i].title; u.urlname=“https://www.toutiao.com”+ar[i].open_url; u.entryid=CHANN.id; u.tmplid=2; RESULT.AddLink(u); }2.链接不循环场景:要抽取少数链接,位置分散,如天猫分类页(三级分类)。实例:暂无。

April 10, 2019 · 1 min · jiezi

前嗅ForeSpider脚本教程-链接抽取:应用场景及链接在源码的html标签里写脚本

今天,小编给大家带来的教程为:前嗅ForeSpider脚本教程中,链接抽取的应用场景,以及链接在源码的html标签里写脚本的实战教程。具体内容如下:一.应用场景当需要手动添加链接时,可添加链接脚本。在“链接脚本处”,可能用到的类为extractor 、result、url、grabDoc、dom。二.链接在源码的html标签里链接地址可在源码中查找到。在目标网页右键,选择“查看源代码”,键盘点击“ctrl+F”,查找目标链接所在位置。目标链接存在于标签中。1.链接需要循环场景:比如翻页等规律相同的一系列目标链接,存在于一个大的ul标签或者div标签里。示例:获取CSDN首页文章列表链接。在该网页右键选择“查看源文件”,查找第一条链接的链接地址,定位目标数据位置。将该源码粘贴到notepad++中,选择语言为html,搜索目标数据的所在位置“ul”标签的id值。由图可知,列表页文章链接位于每个li中的a标签的href中。脚本实例:暂无。2.链接不循环场景:获取更多链接,链接不像翻页那页具有自增性的规律。示例:获取该网站更多的招标公告信息。获取更多的招标公告信息,需要点击“更多”按钮。在该网页右键选择“查看源文件”,定位链接所在位置。因"<a>“标签名,和父级<div>的class属性都在多处存在,因此需要再向上查找节点,直到id为tab2-list的<div>。脚本实例:var div = DOM.FindId(“tab2-list”);//先查找divvar a = DOM.FindClass(“more”,“a”,div );//从上一行找到的div开始查找,class属性为more的a标签。url u;u.urlname = “http://www.bgpc.gov.cn”+a.href; //拼接完整的链接地址u.title = “更多”; //填写titleu.entryId = CHANN.id;u.tmplId = 2;RESULT.AddLink(u);

April 9, 2019 · 1 min · jiezi

Repeater和Retimer的区别

OverviewRepeater和Retimer都属于信号调理(Signal Conditioning)芯片,它们的作用都是信号均衡和增强作用,但是在具体实现功能方面有些区别。Repeater也叫Redriver,只是在物理层对信号做均衡(EQ)和重新增强(De-emphasis),例如TI的DS100KR800在接收端集成了CTLE,可以对10.3125Gbps(5GHz)的接收信号提供最大36dB的增强,能够把由于ISI影响而几乎闭合的眼图重新打开;在发送侧提供最大-12dB的de-emphasis。Retimer除了具有Repeater的全部功能以外,额外增加了CDR功能,能够有效去除接收信号的jitterAdvanced Retimer (Retimer with DFE)除了具备Retimer的全部功能以外,还集成了多个tap的DFE,可以有效减少接收信号的Crosstalkrepeater和retimer的对比Repeater和Retimer的应用场景图中的器件都是TI公司的信号调理器件,其中:DS100RT410: 普通retimerDS100DF410: 带DFE的retimer图中的器件是TI公司的器件,其中:DS100KR401: repeater

April 8, 2019 · 1 min · jiezi

前嗅ForeSpider脚本教程-频道脚本:脚本采集数据

今天,小编给大家带来的教程为:前嗅ForeSpider脚本教程中频道脚本脚本采集数据的实战教程。具体内容如下:一.场景此处为高手操作,配置的频道脚本接管所有采集流程,无需再做任何配置。二.示例获取下图商品的评论。三.脚本实例var gdoc = EXTRACT.OpenDoc(this,“http://product.dangdang.com/index.php?r=comment%2Flist&productId=26315044&categoryPath=01.05.12.00.00.00&mainProductId=26315044&mediumId=0&pageIndex=1&sortType=1&filterType=1&isSystem=1&tagId=0&tagFilterCount=0&template=publish",0);if(gdoc){ jScript js; record rec; dom d; var jsonStr = gdoc.GetDom().GetSource().ToStr(); var json = js.RunJson(d.UnEscape(jsonStr)); var domm = OpenDom(json.data.list.html); var div = domm.FindClass(“item_wrap”); var itemCom = div.Child;while(itemCom){ record re; re.hk = 1; re.content = domm.FindClass(“describe_detail”,“div”,itemCom); RESULT.AddRec(re,1); itemCom = itemCom.next; } EXTRACT.CloseDoc(gdoc); }

April 8, 2019 · 1 min · jiezi

前嗅ForeSpider脚本教程:频道脚本使用场景及配置关键词搜索

今天,小编给大家带来的教程为:前嗅ForeSpider脚本教程中频道脚本的应用场景以及脚本配置关键词搜索的实战教程。具体内容如下:一.频道脚本使用场景当需要手动创建采集源列表,或者完全使用脚本采集数据时,在“频道脚本”处,你可能用到的类为extractor 、result。你可以定义类的对象来使用其成员方法,也可以使用EXTRACT、RESULT两个全局对象。关于这两个类的详细说明以及该场景的更多示例,可以点击“教程->脚本教程->脚本示例->频道脚本”来查看相关内容。二.脚本配置关键词搜索1.关键词不含验证码场景:当一类链接中只需要替换一部分字符串,即可得到目标链接。则可以将这部分字符串作为关键词,添加频道脚本,达到链接抽取的目的。示例:暂无。2.关键词含验证码场景:当通过可视化方式不能获取验证码刷新事件时,需要手动寻找验证码刷新请求并填写至相应输入框,与此同时,添加验证码参数至参数列表。示例:采集京东店铺工商信息。使用开发者工具(以搜狗浏览器为例,在浏览器中按F12打开)抓包,在目标网页右键点击“审查元素”,选择“NetWork”,先清空所有缓存信息,点击验证码图片,查找验证码刷新请求:“https://mall.jd.com/sys/vc/cr…”。可以发现每次刷新验证码,请求链接中random参数的值都不同,则需要查找random生成的js事件。在网页源码中找到以下代码。填写js刷新事件于文本框内,值得注意的是,只需修改this.src的值即可。脚本实例:var key = EXTRACT.GetSearch(this);var form = key.Search();url u;var postData;while(form){var ocrCode = form.verifyCode;u.urlname = “https://mall.jd.com/"+"showLicence-"+form.text+".html";u.title = ocrCode;u.entryid = this.id;u.tmplid = 1;postData = “verifyCode="+ocrCode;var d = EXTRACT.OpenDoc(this,u.urlname,postData,0);if(d){this.Run(d,1);EXTRACT.CloseDoc(d); }form = key.Search(); }key.End();

April 4, 2019 · 1 min · jiezi

前嗅ForeSpider脚本教程:字段处理脚本

字段处理脚本用于清洗字段的取值。点击某个字段后,在字段处理的下拉菜单中选择脚本处理后,需要配置的脚本。这一步是通过脚本进一步清洗获取的数据。一.可用全局对象(只读)EXTRACT: 当前采集引擎[ 对象类型: extractor ]DATADB: 当前连接的数据库[ 对象类型: dataBase ]RESULT: 当前结果集对象[ 对象类型: result ]URL: 当前采集的链接对象[ 对象类型: url ]URLTEXT : 描述当前链接采集的所有状态及属性的对象[ 对象类型: urltext ]DOC: 当前采集的文档对象[ 对象类型: grabDoc ]DOM: 当前采集文档的dom对象[ 对象类型: dom ]ITEM: 当前dom树被取值节点[ 对象类型: domItem ]TMPL: 当前文档模板对象[ 对象类型: tmplTmpl ]DATA: 当前数据抽取对象[ 对象类型: tmplData ]REC: 当前记录集对象[ 对象类型: record ]VALUE: 当前字段获取的字符串类型的值。[ 对象类型: string ]二.this对象当前数据字段抽取[ tmplVal ]对象三.脚本返回值必须返回处理后的的数据结果[返回类型: string]四.示例<div class=“lumn_left01”><a>商品大类</a>><a><a>商品列表</a>><a>商品品牌</a>></div>【网页源码】以下脚本将取数据“商品大类”的右串:return DOM.GetTextAll(DOM.FindClass(“lumn_left01”,div)).Right(“商品大类”);取出的结果为:>商品列表>商品品牌注释:GetTextAll:取出其中所有的文本。 FindClass:通过标签class属性值查找标签节点。 Right: 返回字符串右边的字符串。 以下脚本将清除数据前后的空白符:return VALUE.TrimAll();

April 3, 2019 · 1 min · jiezi

2019“嘉韦思杯”上海市高校网络安全邀请赛write up

ReverseAuthint __cdecl main(int argc, const char **argv, const char **envp){ const CHAR *v3; // ebx HMODULE v4; // eax void (__stdcall *v5)(HMODULE, LPCSTR); // eax char v7; // [esp+1h] [ebp-157h] char v8[4]; // [esp+15h] [ebp-143h] int v9; // [esp+20h] [ebp-138h] int v10; // [esp+26h] [ebp-132h] int v11; // [esp+2Ah] [ebp-12Eh] int v12; // [esp+2Eh] [ebp-12Ah] int v13; // [esp+32h] [ebp-126h] int v14; // [esp+36h] [ebp-122h] int v15; // [esp+3Ah] [ebp-11Eh] __int16 v16; // [esp+3Eh] [ebp-11Ah] int v17; // [esp+40h] [ebp-118h] int v18; // [esp+44h] [ebp-114h] int v19; // [esp+48h] [ebp-110h] int v20; // [esp+4Ch] [ebp-10Ch] int v21; // [esp+50h] [ebp-108h] int v22; // [esp+54h] [ebp-104h] int v23; // [esp+58h] [ebp-100h] int v24; // [esp+5Ch] [ebp-FCh] int v25; // [esp+60h] [ebp-F8h] int v26; // [esp+64h] [ebp-F4h] int v27; // [esp+68h] [ebp-F0h] int v28; // [esp+6Ch] [ebp-ECh] int v29; // [esp+70h] [ebp-E8h] char v30; // [esp+74h] [ebp-E4h] int a_2; // [esp+75h] [ebp-E3h] int v32; // [esp+79h] [ebp-DFh] int v33; // [esp+7Dh] [ebp-DBh] int v34; // [esp+81h] [ebp-D7h] int v35; // [esp+85h] [ebp-D3h] int v36; // [esp+89h] [ebp-CFh] int v37; // [esp+8Dh] [ebp-CBh] int v38; // [esp+91h] [ebp-C7h] __int16 v39; // [esp+95h] [ebp-C3h] int a_1; // [esp+97h] [ebp-C1h] int v41; // [esp+9Bh] [ebp-BDh] int v42; // [esp+9Fh] [ebp-B9h] int v43; // [esp+A3h] [ebp-B5h] int v44; // [esp+A7h] [ebp-B1h] int v45; // [esp+ABh] [ebp-ADh] int v46; // [esp+AFh] [ebp-A9h] int v47; // [esp+B3h] [ebp-A5h] char v48; // [esp+B7h] [ebp-A1h] int v49; // [esp+B8h] [ebp-A0h] int v50; // [esp+BEh] [ebp-9Ah] int v51; // [esp+C2h] [ebp-96h] int v52; // [esp+C6h] [ebp-92h] int v53; // [esp+CAh] [ebp-8Eh] int v54; // [esp+CEh] [ebp-8Ah] int v55; // [esp+D2h] [ebp-86h] int v56; // [esp+D6h] [ebp-82h] int v57; // [esp+DAh] [ebp-7Eh] char v58; // [esp+DEh] [ebp-7Ah] int v59; // [esp+DFh] [ebp-79h] int v60; // [esp+E3h] [ebp-75h] int v61; // [esp+E7h] [ebp-71h] int v62; // [esp+EBh] [ebp-6Dh] int v63; // [esp+EFh] [ebp-69h] int v64; // [esp+F3h] [ebp-65h] int v65; // [esp+F7h] [ebp-61h] int v66; // [esp+FBh] [ebp-5Dh] int16 v67; // [esp+FFh] [ebp-59h] int v68; // [esp+101h] [ebp-57h] int v69; // [esp+105h] [ebp-53h] char v70; // [esp+109h] [ebp-4Fh] int v71; // [esp+10Ah] [ebp-4Eh] int v72; // [esp+10Eh] [ebp-4Ah] int v73; // [esp+112h] [ebp-46h] int v74; // [esp+116h] [ebp-42h] int v75; // [esp+11Ah] [ebp-3Eh] int v76; // [esp+11Eh] [ebp-3Ah] int v77; // [esp+122h] [ebp-36h] int v78; // [esp+126h] [ebp-32h] int v79; // [esp+12Ah] [ebp-2Eh] int v80; // [esp+12Eh] [ebp-2Ah] int v81; // [esp+132h] [ebp-26h] int v82; // [esp+136h] [ebp-22h] int v83; // [esp+13Ah] [ebp-1Eh] int v84; // [esp+13Eh] [ebp-1Ah] int v85; // [esp+142h] [ebp-16h] int v86; // [esp+146h] [ebp-12h] int v87; // [esp+14Ah] [ebp-Eh] int16 v88; // [esp+14Eh] [ebp-Ah] int *v89; // [esp+150h] [ebp-8h] v89 = &argc; sub_402940(); puts( " . \n" " | ROBOTIC AUTHENTICATION SYSTEM\n" " /\/\ (. .) /\n" " ||' |#| \n" " ||__.-\"-\"-.___ \n" " —| . . |–.\ \n" " | : : | ,||,\n" " `..-..’ \/\/\n" " || || \n" " || || \n" " ||| \n"); v49 = 0x539; v50 = 0x60646D51; v51 = 0x64216472; v52 = 0x7364756F; v53 = 0x64697521; v54 = 0x73686721; v55 = 0x51217572; v56 = 0x76727260; v57 = 0x3B65736E; v58 = 1; a_1 = 0x60646D51; v41 = 0x64216472; v42 = 0x7364756F; v43 = 0x64697521; v44 = 0x73686721; v45 = 0x51217572; v46 = 0x76727260; v47 = 0x3B65736E; v48 = 1; v59 = 0x60646D51; v60 = 0x64216472; v61 = 0x7364756F; v62 = 0x64697521; v63 = 0x62647221; v64 = 0x21656F6E; v65 = 0x72726051; v66 = 0x65736E76; v67 = 315; v31 = 0x60646D51; v32 = 0x64216472; v33 = 0x7364756F; v34 = 0x64697521; v35 = 0x62647221; v36 = 0x21656F6E; v37 = 0x72726051; v38 = 0x65736E76; v39 = 315; v68 = 0x6F6F3074; v69 = 0x666D3367; v70 = 3; v28 = 0x6F6F3074; v29 = 0x666D3367; v30 = 3; v71 = 0x6F73646A; v72 = 0x33326D64; v73 = 0x6D6D652F; v74 = 0x13F0101; v24 = 0x6F73646A; v25 = 0x33326D64; v26 = 0x6D6D652F; v27 = 0x13F0101; v75 = 0x57656540; v76 = 0x6E756264; v77 = 0x44656473; v78 = 0x71646279; v79 = 0x6F6E6875; v80 = 0x656F6049; v81 = 0x173646D; v17 = 0x57656540; v18 = 0x6E756264; v19 = 0x44656473; v20 = 0x71646279; v21 = 0x6F6E6875; v22 = 0x656F6049; v23 = 0x173646D; v82 = 0x21746E58; v83 = 0x2F6F6876; v84 = 0x6F6E4221; v85 = 0x75607366; v86 = 0x75606D74; v87 = 0x726F6E68; v88 = 0x120; v10 = 0x21746E58; v11 = 0x2F6F6876; v12 = 0x6F6E4221; v13 = 0x75607366; v14 = 0x75606D74; v15 = 0x726F6E68; v16 = 0x120; v9 = 0x539; strcpy(v8, “r0b0RUlez!”); dword_40AD94 = (int)&v9; dword_40ADA0 = (int)&v49; dword_40AD8C = (char *)&a_1; dword_40AD90 = (char *)&a_2; dword_40AD98 = (int)&v28; lpProcName = (LPCSTR)&v17; lpModuleName = (LPCSTR)&v24; dword_40ADA4 = (char *)&v10; sub_401500(0); v3 = lpProcName; v4 = GetModuleHandleA(lpModuleName); v5 = (void (__stdcall *)(HMODULE, LPCSTR))GetProcAddress(v4, v3); v5((HMODULE)1, (LPCSTR)sub_40157F); puts(dword_40AD8C); scanf("%20s", &v7); if ( !strcmp(&v7, v8) ) { puts(“You passed level1!”); sub_4015EA(0); } return 0;}进入sub_401500函数int __cdecl sub_401500(signed int a1){ int result; // eax _BYTE *i; // [esp+1Ch] [ebp-Ch] if ( a1 <= 9 ) return sub_401500(a1 + 1); for ( i = (_BYTE *)dword_40AD94; ; ++i ) { result = dword_40ADA0; if ( (unsigned int)i >= dword_40ADA0 ) break; *i ^= 1u; } return result;}发现是将main函数中的数据与1进行异或这个先放后面输入v7 r0b0RUlez! 进入到了sub_4015EA函数int __cdecl sub_4015EA(signed int a1){ if ( a1 <= 9 ) return sub_4015EA(a1 + 1); puts(dword_40AD90); dword_40ADA8 = 0x401619; __debugbreak(); return 0;}看一下这个函数的汇编代码.text:004015EA arg_0 = dword ptr 8.text:004015EA.text:004015EA push ebp.text:004015EB mov ebp, esp.text:004015ED sub esp, 18h.text:004015F0 cmp [ebp+arg_0], 9.text:004015F4 jg short loc_401607.text:004015F6 add [ebp+arg_0], 1.text:004015FA mov eax, [ebp+arg_0].text:004015FD mov [esp], eax.text:00401600 call sub_4015EA.text:00401605 jmp short locret_401625.text:00401607 ; —————————————————————————.text:00401607.text:00401607 loc_401607: ; CODE XREF: sub_4015EA+A↑j.text:00401607 mov eax, ds:dword_40AD90.text:0040160C mov [esp], eax ; char *.text:0040160F call puts.text:00401614 call $+5.text:00401619 pop eax.text:0040161A mov ds:dword_40ADA8, eax.text:0040161F int 3 ; Trap to Debugger.text:00401620 mov eax, 0.text:00401625.text:00401625 locret_401625: ; CODE XREF: sub_4015EA+1B↑j.text:00401625 leave.text:00401626 retn.text:00401626 sub_4015EA endp经过动态调试发现还会跳转到sub_40157F函数 解题脚本:data = “74306F6F67336D66"string =““for x in range(0,len(data),2): string += chr(eval(“0x”+data[x:x+2])^1^2)print string所以最后的flag为:r0b0RUlez!w3lld0neobfuse ...

April 2, 2019 · 5 min · jiezi

前嗅ForeSpider脚本教程:字段取值脚本

字段取值脚本是字段的取值类型选择脚本取值时,需要配置的脚本。这一步是通过脚本来获取字段的填充值。注意:一旦有了字段取值脚本,则字段处理脚本将失效。一.可用全局对象(只读)EXTRACT: 当前采集引擎[ 对象类型: extractor ]DATADB: 当前连接的数据库[ 对象类型: dataBase ]RESULT: 当前结果集对象[ 对象类型: result ]URL: 当前采集的链接对象[ 对象类型: url ]URLTEXT : 描述当前链接采集的所有状态及属性的对象[ 对象类型: urltext ]DOC: 当前采集的文档对象[ 对象类型: grabDoc ]DOM: 当前采集文档的dom对象[ 对象类型: dom ]ITEM: 当前dom树被取值节点[ 对象类型: domItem ]TMPL: 当前文档模板对象[ 对象类型: tmplTmpl ]DATA: 当前数据抽取对象[ 对象类型: tmplData ]REC: 当前记录集对象[ 对象类型: record ]二.this对象当前数据字段抽取 [ tmplVal ] 对象。三.脚本返回值必须返回获取的数据值 [返回类型:string]四.示例<div class=“lumn_left01”><a>商品大类</a>><a><a>商品列表</a>><a>商品品牌</a>></div>【网页源码】以下脚本将取数据中所有文本:return DOM.GetTextAll(DOM.FindClass(“lumn_left01”,div));取出的结果为:商品大类>商品列表>商品品牌>注释:GetTextAll:取出其中所有的文本。 FindClass:通过标签class属性值查找标签节点。 Right: 返回字符串右边的字符串。 以下脚本直接取值为当前的dom节点所有文本:return DOM.GetText(ITEM);

April 2, 2019 · 1 min · jiezi

Django后台 + Wordpress主题快速搭建个人博客

既然学习了Python Web怎么能没有自己的一个小站呢?没有自己精心打造的一个小站怎么敢说自己学习过 Python Web呢?说的再多不如直接干,我的个人网站也已经部署上线。Django后台 + Wordpress主题,只要自己看上的主题都可以让它变成自己的为什么要选择 Wordpress 主题呢?自己在刚开始学习Python Web时最大的困惑就是:Django后台开发没什么难度,但是想搭起自己的一个站点却难的让我无从下手,什么 HTML、CSS、Jquery、JS、AJAX的前端知识太多,听起来就头大,即使学会了前端技术,你能写出一个自己满意的前端页面吗?没有一点审美和设计能力,好像并不大行。当我遇到 Wordpress 时,这一切都变得如此简单,Wordpress社区有丰富的主题,可以挑出自己喜欢的随意摆弄,只需能看懂前端代码即可,加上 Django 类似API式的视图和前端模板语法,简直完美结合。当初学习 Django 一心想搭起一个自己满意的小站,但始终未完成心愿,了解到 Wordpress 后让我打开了新思路,我的个人网站,是 Django1.11 + 崔庆才个人博客 Wordpress 欲思主题搭建:https://www.stormsha.com/初学Python web时对前端不熟练是其实是最难的点,为了让更多的人少走弯路,自己写了一下个人博客搭建的教程,这个教程我希望靠每个浏览过的人都能给出更多建议把它完善,所以希望更多的人看到,提出意见,帮助更多的人

April 1, 2019 · 1 min · jiezi

前嗅ForeSpider脚本教程:数据过滤脚本

数据过滤脚本与数据抽取脚本并列的脚本,它的作用是对抽取的数据进行过滤。注意:一旦有了数据过滤脚本则数据抽取脚本将失效,即“数据处理” 下拉菜单必须选择“数据过滤脚本”。一.可用全局对象(只读)EXTRACT:当前采集引擎[ 对象类型:extractor ]DATADB:当前连接的数据库[ 对象类型:dataBase ]RESULT:当前结果集对象[ 对象类型:result ]URL:当前采集的链接对象[ 对象类型:url ]URLTEXT : 描述当前链接采集的所有状态及属性的对象[ 对象类型: urltext ]DOC:当前采集的文档对象[ 对象类型:grabDoc ]DOM:当前采集文档的dom对象[ 对象类型:dom ]ITEM:模板区域的dom树节点(如果模板未选择区域则为dom树的根节点)[ 对象类型:domItem ]TMPL:当前文档模板对象[ 对象类型:tmplTmpl ]REC:当前记录集对象[ 对象类型:record ]二.this对象当前数据记录[record ]对象。三.脚本返回值返回true(非0)则保留记录,不返回或者返回false(0)则丢弃记录。四.示例:示例一:只保留正文内容长度为1000~3000字符的记录。if(this.content.length>=1000 && this.content.length<=3000) return true; else return false;示例二:以下脚本过滤掉字段content为空的的记录(即content字段必须有值)。if(this.content) return true; else return false;

April 1, 2019 · 1 min · jiezi

查看什么进程正在阻挡Windows进入休眠

合上笔记本,准备装进背包的时候,才发现,这家伙又没有进入休眠状态,而是开机状态,这都快夏天了,贴在背上,实在恼人。想来一定是有啥进程阻挡了休眠的进程。powercfg /requestsEnumerates application and driver Power Requests. Power Requests prevent the computer from automatically powering off the display or entering a low-power sleep mode.运行结果如下:DISPLAY:无。SYSTEM:[DRIVER] Realtek High Definition Audio (HDAUDIO\FUNC_01&VEN_10EC&DEV_0298&SUBSYS_17AA505D&REV_1001\4&31b5f570&0&0001)音频流当前正在使用中。AWAYMODE:无。执行:无。PERFBOOST:无。ACTIVELOCKSCREEN:无。不知道是谁在使用声卡,我关掉虚拟机,然后再次休眠,成功了。不管咋样,多了解一点,总没有坏处。参考链接:https://docs.microsoft.com/en…

March 31, 2019 · 1 min · jiezi

apache2.4安装之后不能加载curl拓展

在win7下安装好apache24和php7.*之后,一切运行如常,直到那次报错curl_init()方法不存在……在命令行打印php -m,curl拓展能够加载,but!phpinfo()里面没有!!查看Apache24启动日志,发现一行问题:PHP Startup: Unable to load dynamic library ‘D:/server/php7/ext/php_curl.dll网上查了n多博主日志,无非就是三个文件放到windows下啊,又是放到Apache24的bin下面啊,或者是在配置里面进行加载。我全部尝试了,结果还是不行。恩,锻炼自己耐性,挺好的~无果之后,静思两天,决定卸载apache,重新安装,在浏览器敲下回车键,框架打印phpinfo()的瞬间,仿佛从天而降一阵神光,不知道大家对薇恩苍穹之光那款皮肤有没有了解,反正就是那种感觉。恩,没错,加载成功了……nice!附上Apache24的下载链接:传送门再次编辑,无非就是吐槽,我第一次下载是用的这一个源,这个坑货。。。

March 29, 2019 · 1 min · jiezi

前嗅ForeSpider脚本教程:数据抽取脚本

数据抽取脚本与数据过滤并列的脚本,它的作用是对抽取的数据进行过滤。数据处理脚本是数据抽取中的脚本。点击“数据抽取”节点,在“数据脚本”的下拉菜单必须选择“数据抽取脚本”。配置了数据处理脚本,数据的抽取流程将被改变:1.如果脚本未正确返回dom区域节点,则该数据抽取的规则将完全由该脚本控制。2.如果脚本返回了一个正确的dom区域节点,则此数据抽取以返回的区域节点为基准,区域外的数据则优先当做垃圾信息处理。注意:一旦有了数据抽取脚本则数据过滤脚本将失效,即“数据脚本”的下拉菜单必须选择“数据抽取脚本”。一.可用全局对象(只读)EXTRACT: 当前采集引擎[ 对象类型: extractor ]DATADB: 当前连接的数据库[ 对象类型: dataBase ]RESULT: 当前结果集对象[ 对象类型: result ]URL: 当前采集的链接对象[ 对象类型: url ]URLTEXT : 描述当前链接采集的所有状态及属性的对象[ 对象类型: urltext ]DOC: 当前采集的文档对象[ 对象类型: grabDoc ]DOM: 当前采集文档的dom对象[ 对象类型: dom ]ITEM: 模板区域的dom树节点(如果模板未选择区域则为dom树的根节点)[ 对象类型: domItem ]TMPL: 当前文档模板对象[ 对象类型: tmplTmpl ]REC: 当前记录集对象[ 对象类型: record ]二.this对象当前数据抽取[tmplData]对象三.脚本返回值如果欲采集某个特征区域内的数据,则必须返回该区域的dom节点对象( domItem对象); 否则该数据抽取则完全由脚本控制。示例在数据模板表单各字段的区域特征定位无法取值时,就要写数据抽取脚本。1.数据抽取脚本基本的样式record infoTable; //一个新的取值记录infoTable.(字段名)infoTable.hkkey = MD5(URL.urlname); infoTable.title = title;、infoTable.goods_id = itemId;infoTable.platform = “";RESULT.AddRec(infoTable, TMPL.fstdoc.schemaid); //输出2.采集第一个Form表单中的数据return DOM.FindName(“form”);

March 29, 2019 · 1 min · jiezi

前嗅ForeSpider脚本教程:链接过滤脚本

链接过滤脚本是地址和标题过滤中的脚本, 过滤类型必须选择脚本过滤时过滤脚本才能生效,过滤脚本用于处理复杂的链接或标题过滤需求。一.可用全局对象(只读)EXTRACT: 当前采集引擎[ 对象类型: extractor ]DATADB: 当前连接的数据库[ 对象类型: dataBase ]RESULT: 当前结果集对象[ 对象类型: result ]URL: 当前采集的链接对象[ 对象类型: url ]URLTEXT : 描述当前链接采集的所有状态及属性的对象[ 对象类型: urltext ]DOC: 当前采集的文档对象[ 对象类型: grabDoc ]DOM: 当前采集文档的dom对象[ 对象类型: dom ]ITEM: 当前链接dom树的href标签节点[ 对象类型: domItem ]TMPL: 当前文档模板对象[ 对象类型: tmplTmpl ]LINK:当前链接抽取对象[ 对象类型: tmplLink ]VALUE:当前被过滤的字符串[ 对象类型: string ]二.this对象当前链接过滤[tmplFilter]对象。三.脚本返回值返回非0保留,否则过滤。示例:1.以下脚本过滤空白链接:if(VALUE) return true;else return false;2.【标题过滤】以下脚本过滤标题的长度小于5个字符的链接:if(VALUE.length>=5) return true; else return false;

March 28, 2019 · 1 min · jiezi

前嗅ForeSpider脚本教程:链接脚本

链接脚本是链接抽取中的脚本。配置了链接脚本,链接的抽取流程将被改变:1.如果脚本未正确返回dom区域节点,则该链接抽取的规则将完全由该脚本控制。2.如果脚本返回了一个正确的dom区域节点,则此链接抽取以返回的区域节点为基准,区域外的链接将被过滤掉。一.可用全局对象(只读)EXTRACT: 当前采集引擎[ 对象类型: extractor ]DATADB: 当前连接的数据库[ 对象类型: dataBase ]RESULT: 当前结果集对象[ 对象类型: result ]URL: 当前采集的链接对象[ 对象类型: url ]URLTEXT : 描述当前链接采集的所有状态及属性的对象[ 对象类型: urltext ]DOC: 当前采集的文档对象[ 对象类型: grabDoc ]DOM: 当前采集文档的dom对象[ 对象类型: dom ]ITEM: 模板区域的dom树节点(如果模板未选择区域则为dom树的根节点)[ 对象类型: domItem ]TMPL: 当前文档模板对象[ 对象类型: tmplTmpl ]二.this对象当前链接抽取[tmplLink]对象。三.脚本返回值如果要采集某个特征区域内的链接,则必须返回该区域的dom节点( domItem对象)。 否则该链接抽取则完全由脚本控制。示例采集第一个Form表单中的链接:return DOM.FindName(“form”); 在链接模板需要的链接无法用爬虫过滤得到,就要写链接脚本。下面是每个链接脚本必有的代码:url u;u.title = “";u.urlname = “";u.tmplid = 3;u.entryid = CHANN.id;RESULT.AddLink(u);

March 27, 2019 · 1 min · jiezi

前嗅ForeSpider脚本教程:模板脚本

链接脚本是频道的模板中的脚本。配置了模板脚本,模板的处理流程将被改变:1.如果脚本未正确返回dom区域节点,则该模板的采集则完全由该脚本控制。2.如果脚本返回了一个正确的dom区域节点,则该模板的所有流程(链接抽取或数据抽取)都以该区域节点为基准,区域外的信息和数据将优先作为垃圾数据处理。一.可用全局对象(只读)EXTRACT: 当前采集引擎[ 对象类型: extractor ]DATADB: 当前连接的数据库[ 对象类型: dataBase ]RESULT: 当前结果集对象[ 对象类型: result ]URL: 当前采集的链接对象[ 对象类型: url ]URLTEXT : 描述当前链接采集的所有状态及属性的对象[ 对象类型: urltext ]DOC: 当前采集的文档对象[ 对象类型: grabDoc ]DOM: 当前采集文档的dom对象[ 对象类型: dom ]TMPL:当前结果集对象[ 对象类型: tmplTmpl ]:等价于this对象二.this对象当前模板 [tmplTmpl] 对象。三.脚本返回值:如果需要进行数据操作必须return 文档区域(domItem对象);否则返回0。示例:以下脚本查找网页(文档)中的第一个表格对象,如果找到表格则从表格中提取链接或数据;否则不处理当前页面:return DOM.FindName(“table”);如果想要特定的链接,比如关键词搜索这样的,就会用模板脚本,下面是每个模板脚本必有的代码:url u;u.title = “";u.urlname = “";u.tmplid = 3;u.entryid = CHANN.id;RESULT.AddLink(u);

March 26, 2019 · 1 min · jiezi

vue-router 起步步骤

1.在main.js中导入vue-router和组件import VueRouter from ‘vue-router’; // 导入vue-router并将它命名为VueRouterimport goods from ‘./components/goods/goods’; // 引入组件import seller from ‘./components/seller/seller’;2.为组件设置URL,通过url可以动态的加载组件const urls = [ { path: ‘/goods’, component: goods }, { path: ‘/rating’, component: rating }, { path: ‘*’, redirect: ‘/goods’ } //无效路径重点向到’/goods’];//定义一个常量来将url和组件绑定起来3.配置vue-router对象并挂载const router = new VueRouter( //新建一个vue-router对象 { routes: urls 将组件 (components) 映射到路由 (routes), }); new Vue({ el: ‘#app’, router, //注册你新建的vue-router对象 render: h => h(App)});4.配置连接的出口,实现动态的加载组件<router-view></router-view> //通过模板中放置元素来确定vue-router渲染组件的位置现在,可以通过url动态加载我们的组件5.将连接入口,挂载到网页上<router-link to="/goods">商品</router-link> //本质上是个a标签,to关联了跳转的url可以通过点击商品和评论完成页面局部的刷新步骤总结1.在main.js中导入vue-router和自定义的组件2.常量定义url和组件的关联3.创建vue-router对象并导入组件关系,并注册4.在模板中定义渲染的出口 <router-view></router-view> 和入口<router-link to=" “>商品</router-link> 官方起步文档:https://router.vuejs.org/zh/g…

March 26, 2019 · 1 min · jiezi

redis安装之后注册系统服务

安装redis为系统服务 命令行: redis-server.exe –service-install redis.windows.conf –loglevel verbose打开redis.conf修改requirepass值requirepass yourpassword //此处注意,行前不能有空格保存,重启

March 25, 2019 · 1 min · jiezi

前嗅ForeSpider脚本教程:标准对象(二)

一.采集文档类grabDocgrabDoc 类为ForeSpider网页(或文件)的采集文档类, 定义了一个当前的采集文档。。1.类成员:无2.成员方法:二.采集记录集类resultgrabDoc 类为ForeSpider网页(或文件)的采集文档类, 定义了一个当前的采集文档。1.类成员:无2.成员方法:三.JavaScript操作类jScriptjScript 类为JavaScript代码操作类,ForeSpider通过该类把JavaScript联系起来,通过此类可以提取JavaScript代码里面的数据。1.类成员:无2.成员方法:四.KeyForm操作类KeyFormkeyForm 类为关键词搜索的检索表类,用于操作关键词搜索检索条件。1.类成员:2.成员方法:无五.html标签属性类domAttrdomAttr 类为html的dom文档树标签节点的属性类,通过该类访问和操作dom的节点属性。1.类成员:2.成员方法:无六.keySearch操作类keySearchkeySearch 类为关键词搜索类,用于操作关键词搜索相关操作。1.类成员:无2.成员方法:

March 20, 2019 · 1 min · jiezi

前嗅ForeSpider脚本教程:标准对象(一)

今天,小编主要为大家介绍一下:前嗅ForeSpider脚本中的标准对象:爬虫链接类url,urltext采集的所有状态及属性类,html标签节点类domItem和(html)dom类dom。具体内容如下:一.爬虫链接类urlurl 类为ForeSpider采集链接地址类,描述了一个链接地址及如何采集的相关属性和操作。常用的属性是:urlname, title, entryid, tmplid这四个属性。1.类成员:2.成员方法:二.urltext采集的所有状态及属性类urltext 描述当前链接采集的所有状态及属性。1.类成员:2.成员方法:无三.html标签节点类domItemdomItem 类为html的dom文档树标签节点类,通过该类访问和操作dom的标签节点。1.类成员:2.成员方法:无四.(html)dom类domdom 类为html的dom文档操作类,该类定义了html文档的所有操作方法和属性。1.类成员:无2.成员方法:

March 19, 2019 · 1 min · jiezi

Apache Maven 的介绍和安装

Maven 简介什么是 MavenApache Maven,是一个软件项目管理及自动构建工具,由Apache软件基金会所提供,一个开源项目,由 Java 开发,并且只是用来管理 Java 项目的。Maven 的好处节省空间: Maven 项目的体积相比传统项目小很多,因为 Maven 将 Jar 包和项目分开了, 通过依赖管理来管理Jar包。一键构建项目: Maven 可以完成的工作:编译、测试、运行、打包、部署。 Maven 自带 Tomcat 插件,能直接用 mvn tomcat:run 命令部署运行项目,同时将项目代码编译。提高大型项目的开发效率Maven 的安装配置下载地址Apache 官网:https://maven.apache.org/down…Apache 官方镜像地址:https://mirrors.tuna.tsinghua…安装配置解压配置环境变量: 在 Path 里添加 Maven 目录里的 bin 文件夹的完整路径。Maven 仓库三种仓库本地仓库 (自己维护)本地仓库的配置只需要修改settings.xml文件就可以远程仓库(私服) (公司维护)中央仓库 (Maven 团队维护)三种仓库的关系Maven 的目录结构Maven 的命令常用命令需要进到项目目录中执行clean 清理编译好的文件compile 只编译主目录的文件test 只编译并运行 test 的目录的文件package 打包并放到 target 文件夹中install 把项目发布到本地仓库命令的生命周期(命令的执行顺序)clean 生命周期cleandefault 生命周期 compile test package installsite 生命周期 site 生成站点的说明文档命令和生命周期的阶段的关系不同的生命周期的命令可以同时执行。例如:mvn clean package

March 18, 2019 · 1 min · jiezi

前嗅ForeSpider脚本教程:基础对象(三)

今天,小编主要为大家介绍一下:前嗅ForeSpider脚本中的基础对象,主要内容包括:记录类record,记录集类records,数据表类dataTable,dataInRet类。具体内容如下:一.记录类recordrecord 类为数据记录类。1.类成员:2.成员方法:二.记录集类recordsrecords 类为数据记录集类,是数据记录的集合。1.类成员:2.成员方法:三.数据表类dataTabledataTable 类为数据表操作类。1.类成员:无2.成员方法:四.dataInRet类dataInRet 类为数据表Insert,Plus, Sub的返回对象。1.类成员:2.成员方法:无

March 18, 2019 · 1 min · jiezi

Docker for windows教程

下载和安装第一步:下载docker安装包(链接:https://www.docker.com/get-started)第二步:安装,双击下载好的安装包安装完成开始入门进入开始页面,同时,打开一个cmd窗口,鉴于国内网络问题,后续拉取Docker镜像十分缓慢,需要配置国内镜像加速,在系统右下角托盘Docker 图标内右键菜单选择Settings,打开配置窗口后左侧导航菜单选择Daemon,在Registry mirrors 一栏中填写官方中国加速器地址https://registry.docker-cn.com ,之后点击Apply保存后Docker就会重启并应用配置的镜像地址了。查看docker版本,然后运行hello-world程序,如果出现下面的界面则表示docker已经安装完成常用命令删除镜像(image)docker rm image-name常见问题Error response from daemon: conflict: unable to delete fce289e99eb9 (must be forced) - image is being used by stopped container a11e5a20d7bb解决办法:强制删除 docker rmi -f image-id

March 15, 2019 · 1 min · jiezi

前嗅ForeSpider脚本教程:基础对象(二)

今天,小编给大家介绍一下:前嗅ForeSpider脚本中的基础对象,主要内容有:数组类array、键值对类hash、文件类file、字段操作类field。具体内容如下:一.数组类arrayarray 类为数组类。1.类成员2.成员方法3.脚本应用如果在导航栏的采集预览中找到多个栏目,我们需要的个别栏目在爬虫的链接过滤中很难得到的时候。那就可以在网页源码中找到需要的链接和栏目标题,用如下脚本4.示例array city;//定义一个数组city = [{name:“北京”,url:"/zhaopin/diqu/beijing/"},{name:“天津”,url:"/zhaopin/diqu/tianjin/"},{name:“河北”,url:"/zhaopin/diqu/huabei/"}]; for(int i = 0;i < city.length; i++){ url u; u.title = city[i].name; //需要输出的栏目标题 u.urlname = “http://www.gaoxiaojob.com”+city[i].url; //拼接出需要的栏目链接 u.tmplid = 2; //指定处理模板 u.entryid = CHANN.id; RESULT.AddLink(u); //输出} 脚本的输出结果二.键值对类hashhash 类为键值对类。1.类成员2.成员方法Iter遍历hash样例:hash hs;hs.aa = 1;hs.bb = 2;hs.Iter(function(n,v){ echo(n+":" + v +"<br>");});三.文件类filefile 类为文件操作类。1.类成员2.成员方法四.字段操作类fieldfield 类为数据字段操作类。1.类成员2.成员方法

March 15, 2019 · 1 min · jiezi

windows下使用git拉取github上的项目

1 首先在windows下安装git(这个教程网上非常多,我就附个链接吧 )git安装2 本地打开git bash3 使用ssh-keygen命令生成自己的公钥和私钥。首先输入ssh-keygen,这里会提示你输入私钥保存的位置,直接回车使用默认位置即可,后面会两次提示输入密码 直接回车这里标红的两个文件 id_rsa和id_rsa.pub分别是私钥和公钥4 查看生成的秘钥 此时打开C:UsersAdministrator.ssh 文件夹(.ssh文件夹默认是隐藏的,要查看需要设置显示隐藏文件,或直接输入路径)。这是存放秘钥的文件夹。其中id_rsa是私钥文件,id_rsa.pub是公钥文件。5进入https://github.com,如果没有先注册账号,登录github。进入你的项目,依次点击setting->deploy keys->add deploy key6 添加公钥(公钥就是第三步中生成的id_rsa.pub文件) 填写表单 (titile可以随意填写,key就是将id_rsa.pub中的内容复制粘贴即可。) 勾选 allow write acssess, 点击add key.7本地拉取项目 git clone git@githb.com/xxxxx.git(你的git仓库地址,就是左侧code选项卡中,如下图标红的位置)注意 如果在拉取的过程中报错 Permission denied (publickey) 可以参考https://www.cnblogs.com/eooox…

March 15, 2019 · 1 min · jiezi

windows server系统,登录系统提示按下 ctrl+alt+delete

不管是 阿里云 腾讯云 还是其他华为云 百度云等等的windows服务器,基本上都是每次在网页端的远程登陆windows系统都会提示题目中的信息。因为这些云计算厂商提供的网页端登陆,都相当于“本地登陆”,按下 ctrl+alt+delete 登陆时本地登陆特有的一个安全设置。 新手使用windows server 相关系统之后,总会觉得怪怪的,虽然都是windows系统,但是毕竟服务器几乎都是安装的服务器系统,也就是server版本。服务器系统,与家庭系统,从设计之初就有着大量的细节区别。虽然经过调整,普通应用场景下二者几乎可以互相替代,但是在面对极端情况的时候,就会表现出各自的不足。windows Server 系统特点:用途单一,无家庭娱乐类工具,连续工作能力强,安全防御配置更严格windows 系统特点:针对于个人工作学习生活实用,往往具备影音组件,漂亮的UI,游戏视频音乐等等软件齐全回到本文题目:Windows Server系统,为了保证运维人员可靠,避免程序自动操控,新装的系统往往要求手动输入ctrl+alt+delete实现进入登录页面。这一举措看似多余,实际上对于病毒程序的防御有着很关键的作用。现在很多情况下这个操作其实作用没有以前那么大了,这个设置可以通过组策略关掉:1,打开“运行”,输入“gepdit.msc”,点击“确定”。2,点击“windows设置”,点击“安全设置”,点击“本地策略”。3,点击“安全选项”,找到“无须按ctrl+alt+del”,点击“已启动”。4,点击“确定”即可完成设置。**原文地址: https://www.opengps.cn/Blog/V… 文章的更新编辑依此链接为准。欢迎关注源站原创文章!

March 15, 2019 · 1 min · jiezi

前嗅ForeSpider脚本教程:基础对象(一)

今天,小编为大家介绍一下:前嗅ForeSpider脚本中的基础对象。主要内容有:基础对象var、字符串string、数字类number、时间类time。具体内容如下:一.基础对象varvar 类为基本类,任何一个变量或常量都是var类,任何其他的对象类都派生域var类。1.类成员2.成员方法二.字符串stringstring 类为基础类,一个用双引号或单引号引用的字符串自动初始化为一个string类。1.类成员2.成员方法3.Format函数样例① 转换说明符:%a(%A) 浮点数、十六进制数字和p-(P-)记数法(C99)%c 字符%d 有符号十进制整数%f 浮点数(包括float和doulbe)%e(%E) 浮点数指数输出[e-(E-)记数法]%g(%G) 浮点数不显无意义的零"0"%i 有符号十进制整数(与%d相同)%u 无符号十进制整数%o 八进制整数%x(%X) 十六进制整数0f(0F) e.g. 0x1234%p 指针%s 字符串%% 输出字符%② 例子:string str;var str2 =str.Format("%d11%s",7,“fff”);echo(str2);//输出结果为711fff三.数字类numbernumber 类为基础类,任何数字或浮点数皆为number类。1.类成员2.成员方法四.时间类timetime 类为时间操作类,一旦申明便创建一个时间对象,默认值为当前时间。1.类成员2.成员方法3.示例定义一个时间对象time Now;

March 14, 2019 · 1 min · jiezi

教你利用Windows访问控制搞事情

开篇福利FkUpdateWin10自动更新是真的烦人,每次按照网上的步骤禁用自动更新后,不用过多久系统又自动恢复了Update!于是自己研究了访问控制,利用访问控制原理修改服务对应的注册表权限,让系统无法修改服务的状态,达到永久禁用自动更新的效果!目前为止尚未发现Bug,所以共享给大家使用!只希望大家给文章点点赞!永久禁用Windows自动更新 - 下载连接FileLocker利用访问控制原理修改文件和上层目录的权限,使得文件不可被删除。目前为止也只能防止文件误删!之后可能会添加防止移动、防止修改等功能!防止文件误删 - 下载链接概念普及常用术语ACL(Access Control List) - Windows访问控制列表DACL(Discretionary Access Control List) - 任意访问控制列表SACL(System Access Control List) - 系统访问控制列表ACE(Access Control Entries) - 访问控制条目SD(Security Descriptor) - 安全描述符SID(Security Identifier) - 安全标识符AccessToken - 访问令牌详细解释从简单到复杂的依次解释SID,用于标识用户,组和计算机帐户,首次创建帐户时会获得一个唯一的SID用于标识该账户。简单来说就如同每个大学生入学都会分配一个唯一的学号,这个学号就是你的证明ACL,用来说明某个对象的访问权限,由DACL和SACL组成,具体的某项权限称为ACE。简单来说就如同大学校园里的各项规定,任何一个对象都有它特定的规则,假设某个具体对象为教室里的电脑,学生们只能看,而老师们可以操控,这就是教室里的电脑这个对象的访问权限SD,包含与安全对象相关的一些安全信息,包括该对象的所有者和所属组的SID,DACL,SACL以及一组控制位(用于限定所有者SID,DACL和SACL)AccessToken,用来控制对安全对象的访问,访问令牌包含登录会话的安全信息,主要用来标识用户,用户组的权限。系统在用户登录时创建访问令牌,并且该用户执行的每个进程都具有该令牌的副本注意1:SACL主要用于审核和记录访问的,DACL才是具体的权限列表,所以我们平时讲的ACL通常是指DACL注意2:SD是为了方便编程提出的概念(一个结构体而已),实际上操作系统是利用AccessToken和ACL来确定对某个文件、进程等的访问权限权限检查过程每个计算机账户在登录是都会获得一个访问令牌AccessToken,这个令牌会说明当前用户的权限!而每个文件或其它对象都有它自己的访问控制列表ACL,即说明哪些账户拥有哪些权限!当该账户尝试读取或改写某个文件时,操作系统会将当前账户的访问令牌权限和目标文件每个具体的权限(ACE)按顺序作比较(只与SID相同的ACE进行比较),直到发生以下事件:一、拒绝访问的ACE明确拒绝对线程访问令牌中列出的其中一个受托者请求的任何访问权限二、线程访问令牌中列出的受托者的一个或多个允许访问的ACE明确授予所有请求的访问权限三、已检查所有ACE,并且仍然至少有一个未明确允许的请求访问权限,在这种情况下,隐式拒绝访问注意:访问控制列表ACL中的ACE有几大原则(拒绝大于允许、权限最小化、权限继承性以及权限累加)动手实践查看文件ACL讲了半天ACL是不是感觉太抽象了,来实际看看什么是ACL吧!你只需要在任意文件上右键-属性-安全-高级就能看到该文件的ACL了!其中权限选项卡中就是DACL,审核选项卡中就是SACL,所有者拥有对DACL的完全控制权其中SYSTEM用户组拥有对该文件的读取权限,这样一条具体的某个用户的某项权限就是ACL中的访问控制条目(ACE)简单修改权限修改当前用户组对某个文件只有读取权限,假如当前用户组是管理员的话还需要修改Administrators组的权限!第一步右键-属性-安全并选中当前用户点击编辑第二步只勾选允许-读取,发现不可勾选第三步禁用继承,必须要禁用继承否则不可更改,点击高级-更改权限并取消勾选包括可从该对象的父项继承的权限,弹窗选择添加,然后确定第四步重复第二步,并更改Administrators组的权限第五步尝试改写该文件,会提示没有权限注意:文件夹拥有继承和传播属性,文件拥有继承属性,继承属性很好理解就是直接复制父目录的ACL,传播就是当前文件夹是否允许子文件或子文件夹继承FkUpdate核心讲解服务相关开启关闭服务,必须用到的几个API:OpenSCManagerOpenServiceStartServiceControlServiceQueryServiceStatusChangeServiceConfigCloseServiceHandle注册表ACL相关核心API:GetNamedSecurityInfoSetNamedSecurityInfoSetEntriesInAclGetExplicitEntriesFromAclAllocateAndInitializeSidDeleteAce具体思路禁用自动更新:第一步停止Update服务,第二步Update启动状态改为禁用,第三步Update注册表所有者改为当前用户,第四步禁用继承并添加,第五步修改所有用户组的权限为只读,第六步注册表所有者改为SYSTEM恢复自动更新:第一步Update注册表所有者改为当前用户,第二步删除所有ACL,第三步启用继承,第四步注册表所有者改为SYSTEM,第五步Update服务状态改为自动,第六步启动Update服务BOOL enableUpdate() { changeObjectOwner(updateReg, FALSE); enInherit(updateReg); changeObjectOwner(updateReg, TRUE); changeStartType(updateServ, SERVICE_AUTO_START); startSrv(updateServ); return TRUE;}BOOL disableUpdate() { PACL pOldDACL = NULL, pNewDACL = NULL; DWORD dwRes = 0, dwSize = 0, i = 0; PSECURITY_DESCRIPTOR pSD; SID_NAME_USE eUse = SidTypeUnknown; PEXPLICIT_ACCESS pEa; ULONG uCount; stopSrv(updateServ); changeStartType(updateServ, SERVICE_DISABLED); changeObjectOwner(updateReg, FALSE); // disInheritDelete(updateReg); enInherit(updateReg); disInheritCopy(updateReg); dwRes = GetNamedSecurityInfo(updateReg, SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION, NULL, NULL, &pOldDACL, NULL, &pSD); if (dwRes != ERROR_SUCCESS) { printf(“GetNamedSecurityInfo Error %u\n”, dwRes); return FALSE; } if (ERROR_SUCCESS == GetExplicitEntriesFromAcl(pOldDACL, &uCount, &pEa)) { for (i = 0; i < uCount; i++) { pEa[i].grfAccessPermissions = GENERIC_READ; } } if (ERROR_SUCCESS != SetEntriesInAcl(uCount, pEa, NULL, &pNewDACL)) { printf(“Failed SetEntriesInAcl\n”); return FALSE; } dwRes = SetNamedSecurityInfo(updateReg, SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION, NULL, NULL, pNewDACL, NULL); if (ERROR_SUCCESS == dwRes) { printf(“Successfully Changed DACL\n”); } changeObjectOwner(updateReg, TRUE); if (pOldDACL) LocalFree(pOldDACL); if (pNewDACL) LocalFree(pNewDACL); if (pSD) LocalFree(pSD); if(pEa) LocalFree(pEa); return TRUE;}FileLocker核心讲解文件相关核心API:GetFileAttributessplitPath(自己封装路径分割)ACL相关核心API:GetNamedSecurityInfoSetNamedSecurityInfoSetEntriesInAclGetExplicitEntriesFromAclAllocateAndInitializeSidDeleteAce核心思路锁文件:第一步获取上层目录的路径,第二步上层目录禁用继承,第三步上层目录设置拒绝删除子文件的属性,第四步当前文件禁用继承,第五步当前文件添加拒绝删除的属性,第六步更改文件所有者为SYSTEM恢复文件:第一步获取上层目录的路径,第二步上层目录启用继承并删除之前的ACL,第三步当前文件启用继承并删除之前的ACL,第四步更改文件的所有者为SYSTEMBOOL lockFile(LPTSTR lpMyFile) { DWORD dwRes, i; PACL pOldDACL = NULL, pNewDACL = NULL; PSECURITY_DESCRIPTOR pSD = NULL; PEXPLICIT_ACCESS pEa; ULONG uCount; CHAR lpFileName[MAX_PATH] = { 0 }; /* 首先得到上层目录路径 / splitPath(lpMyFile, lpFileName); / 上层目录拥有者改为Admin / changeObjectOwner(lpFileName, FALSE); / 禁止上层目录继承 / disInheritCopy(lpFileName); / 保存一份原始DACL / dwRes = GetNamedSecurityInfo(lpFileName, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pOldDACL, NULL, &pSD); if (dwRes != ERROR_SUCCESS) { printf(“GetNamedSecurityInfo Error %u\n”, dwRes); return FALSE; } / 设置拒绝删除子文件夹的属性 / if (ERROR_SUCCESS == GetExplicitEntriesFromAcl(pOldDACL, &uCount, &pEa)) { for (i = 0; i < uCount; i++) { / public enum ACCESS_MASK { READ_FILE = 0x000001, WRITE_FILE = 0x000002, CREATE_SUBDIR = 0x000004, READ_EXT_ATTR = 0x000008, WRITE_EXT_ATTR = 0x000010, EXECUTE = 0x000020, DELETE_DIR = 0x000040, READ_FILE_ATTR = 0x000080, WRITE_FILE_ATTR = 0x000100, DELETE = 0x010000, READ_SD = 0x020000, WRITE_DACL = 0x040000, WRITE_OWNER = 0x080000, SYNCHRONIZE = 0x100000, SHARE_READ = READ_FILE | READ_EXT_ATTR | EXECUTE | READ_FILE_ATTR | READ_SD | SYNCHRONIZE, SHARE_CHANGE = SHARE_READ | WRITE_FILE | CREATE_SUBDIR | WRITE_EXT_ATTR | WRITE_FILE_ATTR | DELETE, SHARE_FULL = SHARE_CHANGE | DELETE_DIR | WRITE_DACL | WRITE_OWNER } / pEa[i].grfAccessPermissions = 0x40; pEa[i].grfAccessMode = DENY_ACCESS; pEa[i].grfInheritance = NO_INHERITANCE; } } if (ERROR_SUCCESS != SetEntriesInAcl(uCount, pEa, pOldDACL, &pNewDACL)) { printf(“Failed SetEntriesInAcl\n”); return FALSE; } / 设置新的DACL / dwRes = SetNamedSecurityInfo(lpFileName, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION, NULL, NULL, pNewDACL, NULL); if (dwRes != ERROR_SUCCESS) { printf(“SetNamedSecurityInfo Error %u\n”, dwRes); return FALSE; } / 上层目录拥有者改回System / changeObjectOwner(lpFileName, TRUE); / 当前文件或目录的拥有者改为Admin / changeObjectOwner(lpMyFile, FALSE); / 当前文件或目录禁止继承 / disInheritCopy(lpMyFile); / 保留当前文件或目录的DACL / dwRes = GetNamedSecurityInfo(lpMyFile, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pOldDACL, NULL, &pSD); if (dwRes != ERROR_SUCCESS) { printf(“GetNamedSecurityInfo Error %u\n”, dwRes); return FALSE; } / 设置拒绝属性 / if (ERROR_SUCCESS == GetExplicitEntriesFromAcl(pOldDACL, &uCount, &pEa)) { for (i = 0; i < uCount; i++) { pEa[i].grfAccessPermissions = DELETE; pEa[i].grfAccessMode = DENY_ACCESS; pEa[i].grfInheritance = NO_INHERITANCE; } } if (ERROR_SUCCESS != SetEntriesInAcl(uCount, pEa, pOldDACL, &pNewDACL)) { printf(“Failed SetEntriesInAcl\n”); return FALSE; } / 设置新的DACL / dwRes = SetNamedSecurityInfo(lpMyFile, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION, NULL, NULL, pNewDACL, NULL); if (dwRes != ERROR_SUCCESS) { printf(“SetNamedSecurityInfo Error %u\n”, dwRes); return FALSE; } changeObjectOwner(lpMyFile, TRUE); / SECURITY_DESCRIPTOR SD; InitializeSecurityDescriptor(&SD, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(&SD, TRUE, NULL, FALSE); / if (pOldDACL) LocalFree(pOldDACL); if (pNewDACL) LocalFree(pNewDACL); if (pSD) LocalFree(pSD); if (pEa) LocalFree(pEa); return TRUE;}BOOL recoveryFile(LPTSTR lpMyFile) { CHAR lpFileName[MAX_PATH] = { 0 }; / 首先得到上层目录路径 */ splitPath(lpMyFile, lpFileName); changeObjectOwner(lpFileName, FALSE); enInherit(lpFileName); changeObjectOwner(lpFileName, TRUE); changeObjectOwner(lpMyFile, FALSE); enInherit(lpMyFile); changeObjectOwner(lpMyFile, TRUE); return TRUE;}END ...

March 13, 2019 · 3 min · jiezi

Metronic学习之路(一)

使用GULP构建工具对Metronic进行管理部署gulp打开终端并进入到 Metronic 的 theme 根目录,运行以下代码$ npm install //安装程序的依赖包发现 npm install 报 node-sass 错误原因: npm install 的时候所下载的 node-sass 文件夹是空的在 C:UsersadminAppDataRoamingnpm-cachenode-sass3.13.1 下面可以看到解决方法:自己单独用 npm i node-sass 下载一遍会在 C:Users姓名AppDataRoamingnpm-cachenode-sass4.7.2 下面会有一个文件 win32-x64-57_binding.node ,把这个文件复制到 3.13.1 下面然后重新 npm install 就解决了全局安装gulp$ npm install gulp -g测试 gulp,在终端输入 gulp报错 Cannot find module ‘gulp-prettify’ 模块找不到进入 npm 搜索包名并安装$ npm i gulp-prettify再次执行 gulp 命令,出现错误$ gulp[09:53:07] Using gulpfile F:\web\metronic_v4.5.2\theme\gulpfile.js[09:53:07] Task never defined: default[09:53:07] To list available tasks, try running: gulp –tasks说明 gulp 部署成功,只是默认任务还没有配置,需要看看 gulpfile.js 列出的其他任务。如果有其他问题,请参考[转]初探前端自动化神器(Gulp)[转]Bootstrap 之 Metronic 模板的学习之路 - (7)GULP 前端自动化工具gulp 任务运用gulp localhost安装 Connect 插件npm install–save-dev gulp-connectnpm install –save-dev 可以简化为 npm i -D为 web 服务器定义一个任务, gulpfile.js 文件中添加gulp.task(’localhost’, function() { connect.server();});只要在终端/命令行中执行 gulp, 就可以启动 web 服务器,然后可以在浏览器中打开 localhost:8080gulp localhost-live给 connect.server() 方法传入一个参数gulp.task(’localhost-live’, function() { connect.server({ livereload: true });});SASS 编译gulp sass打开终端进入到 gulpfile.js 所在的 theme 目录。输入 gulp sass 命令执行手工构建任务。发现报错It’s not clear which file to import for ‘@import “file”’.由于 sass _filename.scss 不允许出现 同名无下划线 filename.scss ,写文件全称试试解决:components-md.scss 中@import ‘_components.scss’; 继续执行 gulp sass,发现报错Message: sass\global_components.scssError: Import directives may not be used within control directives or mixins. on line 7 of sass/global/_components.scss from line 8 of sass/global/components-md.scss解决:_components.scss 中// General CSS Reset@if $theme-style == “square” { @import ‘components/_reset-rounds’;}去掉 @if 判断继续执行 gulp sass ,出现新的报错Error: Undefined variable: “$general-border-radius”. on line 134 of sass/apps/inbox.scss border-radius: $general-border-radius;解决:global/_variables.scss 中@if $theme-type == “material-design” {$general-border-radius: 2px !default;} @else {$general-border-radius: 4px !default;}在 @if 前添加$general-border-radius: 2px !default;继续执行 gulp sass ,出现新的报错The following tasks did not complete: testGulp Did you forget to signal async completion?官方方法:在不使用文件流的情况下,向task的函数里传入一个名叫done的回调函数,以结束task。参考gulp.task(’testGulp’, done => { console.log(‘Hello World!’); done();});gulp sass:watch输入 gulp sass:watch 运行 scss 实时监控 css 文件的编译,编译后的 css 文件会输出到 assets 目录。Error: watching ./sass//*.scss: watch task has to be a function (optionally generated by using gulp.parallel or gulp.series) at Gulp.watch (F:\web\metronic_v4.5.2\theme\node_modules\gulp\index.js:28:11) at F:\web\metronic_v4.5.2\theme\gulpfile.js:59:10 at taskWrapper (F:\web\metronic_v4.5.2\theme\node_modules\undertaker\lib\set-task.js:13:15) at bound (domain.js:395:14) at runBound (domain.js:408:12) at asyncRunner (F:\web\metronic_v4.5.2\theme\node_modules\async-done\index.js:55:18) at process._tickCallback (internal/process/next_tick.js:61:11)分析:这个是由于require引入的包的版本问题导致的。在不同的版本里,接口参数发生了变化。在gulp4.0之后已经只能接受watch第二个参数必须为函数。解决办法:修改gulpfile.jsgulp.task(‘sass:watch’, function () { gulp.watch(’./sass//*.scss’,gulp.series(‘sass’));});RTL SASS 编译因为 RTL 的主题文件和默认的主题文件不在同一个目录,一个在 theme_rtl ,一个在 theme,所以,在 theme_rtl 目录下,需要对 gulp 进行重新部署。然后进入 gulpfile.js 位于的 theme_rtl 目录。确定最新修改的 SCSS 已通过 gulp sass 或 gulp sass:watch 命令编译。运行 gulp rtlcss 命令执行 css 文件的 RTL 版本修改任务。编译后的 RTL css 会被输出到 assets 目录.CSS 和 JS 文件的压缩在命令行下进入 theme 目录。运行 gulp minify 执行 css 和 js 文件压缩任务.压缩后的文件会输出到 html 目录.HTML 格式化gulp prettify 该命令可以将 HTML 格式化缩进,对于 pre 和 code 两个标签内的内容不进行格式化。 ...

March 13, 2019 · 2 min · jiezi

前嗅ForeSpider脚本教程:运算符与运算顺序

今天小编为大家介绍的是:前嗅ForeSpider脚本中的运算符和运算顺序,具体内容有:脚本支持的运算符、运算顺序、运算级别以及默认类型转换顺序。一.ForeSpider脚本支持的运算符1.一般运算符:2.比较运算符:3.赋值运算:4.自增自减运算:5.移位运算:二.运算顺序与运算级别ForeSpider脚本在进行运算时先判断是否有括号(零级运算符),优先计算,然后依次计算一级运算、二级运算…最后是五级赋值运算。对于同级运算则从左到右依次计算。1.零级运算符:( )2.一级运算符:++,–3.二级运算符:,/,%4.三级运算符:+,-4.四级运算符:>>,<<5.五级运算符:>,>=,<,<=,==,!=6.六级运算符:=,+=,-=,=,/=,%=x = 3+25; //先乘除后加减最后计算等号(x的值是13)if(x>15-5) return true; //先减法后比较(这里返回true)else return false三.默认类型转换顺序ForeSpider脚本默认的类型转换顺序为: int(整型)->long(长整形)->float(浮点数)->string(字符串)。x = 3.0+25; //x为浮点数y = “hello” + 5; //y的结果为字符串: “hello5”

March 13, 2019 · 1 min · jiezi

HTTP与HTTPS的作用与区别

1、HTTPHTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的www文件都必须遵守这个标准。HTTP是一个基于TCP/IP通信协议来传递数据。有关HTTP的详细教程如下链接描述2、HTTPSHTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。有关HHTPS的详细教程如下链接描述SSL(Secure Sockets Layer)中文叫做“安全嵌套层”。TLS(Transport Layer Security)中文叫做“传输层安全协议”3、HTTP和HTTPS的区别超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。HTTPS和HTTP的区别主要为以下四点:(1)https协议需要到ca申请证书,一般免费证书很少,需要交费。(2)http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。(3)http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。(4)http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。4、对称加密和非对称加密链接描述1、“加密”就是把“明文”变成“密文”的过程;“解密”就是把“密文”变成“明文”的过程,在这个过程中都需要“密钥”来参与数学运算。2、对称加密指的就是加密和解密使用同一个秘钥,所以叫做对称加密。对称加密只有一个秘钥,作为私钥。常见的对称加密算法:DES,AES,3DES等等。3、非对称加密指的是:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密。 常见的非对称加密算法:RSA,ECC4、对称加密和非对称加密的区别对称加密算法相比非对称加密算法来说,加解密的效率要高得多。但是缺陷在于对于秘钥的管理上,以及在非安全信道中通讯时,密钥交换的安全性不能保障。所以在实际的网络环境中,会将两者混合使用.例如针对C/S模型, (1) 服务端计算出一对秘钥pub/pri。将私钥保密,将公钥公开。 (2) 客户端请求服务端时,拿到服务端的公钥pub。 (3) 客户端通过AES计算出一个对称加密的秘钥X。 然后使用pub将X进行加密。 (4)客户端将加密后的密文发送给服务端。服务端通过pri解密获得X。 (5)然后两边的通讯内容就通过对称密钥X以对称加密算法来加解密。

March 12, 2019 · 1 min · jiezi

前嗅ForeSpider脚本教程:基本语句

今天,小编主要为大家介绍一下:前嗅ForeSpider脚本中的基本语句。内容包括:顺序语句,条件语句,循环语句,开关语句和返回语句。1.顺序语句ForeSpider脚本语法规则类似JavaScript、C++等标准语言,每一条语句用分号隔开,例如:x = 1; y =2; z=x+y;或者,一行一条语句,例如:x=1y=2z = x+y多个变量声明之间可以用逗号,例如:var x=0,y=‘hello’;中间的通常为语句块,例如:if(true){echo(“true”);}2.条件语句[if else]ForeSpider脚本的条件语句是用if开始,有如下三种形式(1)if(case)var x = 1;if(x){echo(x);}(2)if(case) else{}var x = 1;if(x){echo(x);}else{echo(“x is empty”);}(3)if(case){} else if{}else if{}var x = 1;if(x<0){echo(“x < 0”);}else if(x>0){echo(“x is “+ x);}else{echo(“x is empty”);}3.循环语句[for]ForeSpider脚本的循环语句for,有如下三种形式(1)for(init;end case;change){express}.//例如以下代码,输出09的数字for(i=0;i<10;i++){ echo(i);}(2)for(init;end case;change){express}.//当您要遍历一个对象或数组时,可以使用for 循环第二种形式。//i:设置一个变量i,当obj为数组时,i就是下标,当obj为对象时,i就是成员变量名//obj:可以是一个对象或者数组。//下面的例子显示数组中的全部元素的值:obj = [“x”,“y”];for(i in obj){ echo(i+”:"+obj[i]);}(3)for(init;end case;change){express}.//当您要遍历一个对象或数组时,也可以使用for 循环第三种形式。//i:设置一个变量i,当obj为数组时,i就是下标,当obj为对象时,i就是成员变量名//obj:可以是一个对象或者数组。//v:代表数组中元素的值或者对象中成员变量的值。//下面的例子显示对象中的全部成员变量的值:obj = {aa:1, bb: 2};for(i in obj each v){ echo(i+”:"+v);}4.循环语句[while]while(case)//例如以下代码,输出09的数字i=0;while(i<10){echo(i);i++;}5.开关语句[switch]switch(var){case v1:express;case v2:express;default:express;}。例如://根据变量i的不同值控制不同的输出for(i=0;i<5;i++){ switch(i){ case 0:echo(“it is zero”); case 1:echo(“it is 1”); default:echo(i); }}//根据字符串str的值输出不同结果var str = “hello”;for(i=0;i<5;i++){ str+=i; switch(str){ case"hello0":echo(str); case “hello01”:echo(“it is” + str); default:echo(str.length); }}6.返回语句[return]传出函数或者代码段的返回值。 ...

March 12, 2019 · 1 min · jiezi

Windows RabbitMQ安装

Windows RabbitMQ安装安装ErlangErlang云盘下载地址官网配置环境ERLANG_HOME - D:\dev_tools\erl7.1\erts-7.1path - %ERLANG_HOME%安装RabbitMQRabbitMQ云盘下载地址官网默认端口为15672配置环境激活 RabbitMQ’s Management Plugin可视化打开dos,输入"?D:\dev_tools\RabbitMQ Server\rabbitmq_server-3.6.5\sbin\rabbitmq-plugins.bat" enable rabbitmq_management完成提示The following plugins have been enabled: mochiweb webmachine rabbitmq_web_dispatch amqp_client rabbitmq_management_agent rabbitmq_managementApplying plugin configuration to rabbit@DESKTOP-5J52E61… started 6 plugins.管理员身份启动服务net stop RabbitMQ && net start RabbitMQ创建用户,密码,绑定角色进入安装目录下的sbincd /d D:\dev_tools\RabbitMQ Server\rabbitmq_server-3.6.5\sbin查看已有用户及用户的角色:rabbitmqctl.bat list_users新增用户:rabbitmqctl.bat add_user username password再次查看用户列表D:\dev_tools\RabbitMQ Server\rabbitmq_server-3.6.5\sbin>rabbitmqctl.bat list_usersListing users …rabbit []guest [administrator]将用户rabbit授权为超级管理员rabbitmqctl.bat set_user_tags rabbit administrator更改用户密码:rabbitmqctl change_password userName newPassword删除用户:rabbitmqctl.bat delete_user username访问地址:http://localhost:15672/参考地址

March 12, 2019 · 1 min · jiezi

前嗅ForeSpider脚本教程:脚本概述

本教程主要对前嗅ForeSpider脚本做了详细的介绍。主要内容包括:脚本结构,脚本与可视化配置的关系,各节点脚本之间的关系,以及脚本编辑区。具体内容如下:一.ForeSpider脚本结构ForeSpider脚本是前嗅自主研发的爬虫脚本语言,风格类似于JavaScript。ForeSpider脚本语言属于轻量级的脚本语言,为支持高级数据采集的规则补充,它支持对象操作,函数,数组及对象定义,借助内置的采集及系统对象几乎能够完成所有的采集任务,以及灵活的采集控制,同时让采集引擎有更强的灵活性和扩展性。1.频道包括“频道脚本”。2.模板(1)模板配置包括“模板脚本”。(2)链接部分包括“链接抽取脚本”、“链接过滤脚本”。(3)数据部分包括“数据抽取脚本”。(4)字段部分包括“字段取值脚本”、“字段处理脚本”。二.脚本与可视化配置的关系1.各部分配置可以完全使用脚本编写,不进行可视化操作;2.同一步骤既进行了可视化操作的配置,又编写了脚本,则由脚本接管,可视化配置失效;3.各步骤可以一部分使用脚本编写,一部分使用可视化操作,不重复的配置都有效,重复的配置以脚本优先接管。三.各节点脚本之间的关系1.上一操作层级的脚本配置区域可以编写涵盖其下面所有操作层级功能的脚本;2.如果各层级之间的脚本有重复,以其中高层级步骤的脚本优先生效;3.可以将脚本分散于各操作层级编写,也可以直接在最高操作层级(频道脚本)编写。四.脚本编辑区介绍第一级:频道配置-脚本配置在“频道配置”时,通过使用系统内置的脚本语言对频道进行配置。①选中该频道;②点击“脚本窗口”,使其变为“浏览器窗口”;③点击“新建”图标,即可创建频道脚本。频道脚本第二级:模板脚本模板脚本可以编写整个模板配置的脚本。①选中该模板;②点击“脚本窗口”,使其变为“浏览器窗口”;③点击“新建”图标,即可创建模板脚本。模板脚本第三级:链接/数据抽取脚本1.链接文本链接脚本可以编写整个链接抽取的脚本。①选中该链接抽取;②点击“脚本窗口”,使其变为“浏览器窗口”; ③点击“新建”图标,即可创建链接脚本。链接脚本2.数据抽取脚本数据抽取脚本可以编写整个数据抽取的脚本。①选中该数据抽取;②点击“脚本窗口”,使其变为“浏览器窗口”;③点击“新建”图标,选择“数据抽取脚本/数据过滤脚本”按钮,即可生成相应的代码区。选择数据抽取脚本数据抽取脚本第四级:链接过滤、字段取值/清洗脚本1.链接过滤脚本链接过滤脚本可以编写链接地址或链接标题过滤的脚本。①选中该链接抽取;②勾选“地址过滤/标题过滤”复选框,并选择“脚本过滤”;③可自动生成相应的“地址过滤/标题脚本"区。地址过滤脚本标题过滤脚本2.字段取值脚本字段取值脚本可以编写该字段取值的脚本。①选中该字段;②在“采集内容”处,勾选“高级取值->脚本过滤”;③可自动生成相应的字段取值脚本区。字段取值脚本3.字段处理脚本字段处理脚本可以编写该字段数据处理的脚本。①选中该字段;②在“数据清洗”处,勾选“脚本处理”;③可自动生成相应的字段处理脚本区。选择字段处理脚本字段处理脚本

March 11, 2019 · 1 min · jiezi

推荐一个好用的以多tab标签方式打开windows CMD的工具

最近我在做基于nodejs的微服务开发,需要在windows命令行里启动很多微服务。我的windows 10任务栏是这样子的:我想找一款能像下图Chrome标签页这样打开windows 10 CMD窗口的工具,在网上找了一圈后,发现了这个名叫console2的工具:网址:https://sourceforge.net/proje…下载下来压缩包只有1点几兆,解压即用。可以像Chrome那样任意新建tab:可以在多个tab间方便切换:

March 10, 2019 · 1 min · jiezi

Eclipse 配置 Tomcat 服务器和发布 Web 应用

步骤1:服务器运行环境配置依次点击:Window/Preferences/Server/Runtime Environments,选择已安装的Tomcat 版本,然后选择其安装路径,如图。出现下面这个就成功完成步骤一了。步骤2:设置发布位置双击这个:找到 Server Locations 按图中顺序设置:部署位置 webapps 文件夹在 Tomcat 安装目录里。 如果是灰色的不能更改,需要把 Tomcat 下的所有项目移除,并右击,clean 之后方可设置,启动后将可以更改。步骤2完成之后Tomcat的配置就完成了。发布Web应用右击项目—> Run As —> Run on Server —>选择服务器 —> 添加资源 —> 完成

March 9, 2019 · 1 min · jiezi

前嗅ForeSpider脚本教程:变量申明及引用

今天,小编为大家介绍前嗅ForeSpider脚本中的语法规则——变量申明及引用。在此之前先为大家介绍一下,语法规则中的注释和标准常量,具体内容如下:一 .注释ForeSpider脚本的注释类似于C++及JavaScript。通常有两种方式:单行注释和块注释。1.单行注释//这是行注释2.块注释/这是块注释这是块注释这是块注释这是块注释/二.标准常量NULL: 空值,未初始化变量[ 类型: object ]三.变量申明及引用ForeSpider脚本变量名称符合C++、JavaScript等标准语言的命名规则。(即:a~z26个大小写字母,0~9的数字,以及_和$并且数字不能作为变量名称开头。)ForeSpider脚本变量名称区分大小写。例如exV, exv, EXV是不同的变量。ForeSpider脚本变量名称不能是以下语言保留字:1.关键字:if,else,for,do,while,switch,case,default,break,try,catch,return,new,function,class2.标准对象类型:var,string,number,time等内置类型。3.系统常量:true,false,EXTRACT,DATADB,CHANN,SEARCHKEYS,RESULT,TMPL,DOC,DOM,URL,LINK,DATA,VALUE,ITEM,REC等。4.全局函数名:echo等。1.一般变量申明方式1:var关键字声明,变量可以直接赋值,也可以只声明后赋值。例如:var x=1, y;方式2:直接声明,任何变量首次使用时自动完成声明,例如:x, y=“这是y”, z=1.4。2.对象申明new关键字声明,例如:var x = new string();类名方式声明,例如申明一个string类的对象:string x;3.对象引用对象可以通过对象名直接引用,对象的成员和方法用“.”进行引用. 例如:var x = " obj";var b = x.length; //引用字符串x的长度(b=5)。var c = x.TrimLeft(); //清除字符串左边的空白符(c = “obj”)4.数组的声明与引用(完全支持json语法)ForeSpider脚本支持一维数组,声明和引用如下:var x = [“first”, “second”];var b = x.length; //引用数组x的大小(b=2)。var b = x.size; //第二种引用数组x的大小(b=2)。var c = x[0]; //引用数组x的第一个元素(c=“first”)

March 8, 2019 · 1 min · jiezi

前嗅ForeSpider教程:验证码设置

当我们遇到某些网站,采集每一条数据都需要输入一条验证码时,就用到了验证码设置。今天,小编为大家详细介绍一下:前嗅ForeSpider中的验证码设置。具体操作如下:当采集某些网站的数据时,每一条数据都需要输入一条验证码时就用到了验证码设置。当我们点采集预览时,就会弹出一个验证码的输入框,只有输入验证码才能浏览数据。验证码弹出框输入验证码后采集预览结果验证码设置的作用是爬虫软件自身输入验证码,以避免人工输入。验证码设置验证码设置操作流程:识别平台A.基础识别平台:预定的内置识别方式。B.若快:若快为打码平台。软件通过打码平台解析验证码内容。添加识别列表1、填写示例地址,此示例地址为测试该打码平台的实例地址,与模板本身的实例地址无关。2、点击添加按钮添加识别列表。3、 填写识别名称。4、 根据自己配置模板本身的需要选择适合的验证码类型。5、 填写若快账号和密码。若没有账号可以点击注册若快账号进行注册。添加验证码识别类6、 点击保存按钮进行保存。保存验证码设置其中红框内详情、保存、下载、清空、测试是用来测试验证码是否正确的。点击测试如果右侧验证码图片与图片下解析出来的文字一致,就证明验证码设置的正确。7、选择验证码识别方式:返回采集设置,点击刷新,选择刚刚配置好的验证码识别列表。然后点击保存。选择验证码识别方式

March 7, 2019 · 1 min · jiezi

前嗅ForeSpider教程:IP代理设置

今天,小编主要为大家介绍一下:前嗅ForeSpider中的IP代理设置,主要内容包括:启用IP代理,静态代理设置,动态代理设置,这三大部分。具体内容如下:一,启用IP代理启用IP代理采集时,需要进行代理配置。1.启用IP代理需选中“启用IP代理”,才能启用IP代理功能。2.启用代理加速启用代理加速后,可以在采集过程中自动筛选无效和低效率的代理IP(屏蔽错误率超过50%,请求次数>3次的IP),优先使用高效的代理,提升采集的效率和数据质量。3.本机IP混用策略当代理IP失效时,选择是否启用本地网络。4.添加代理启用代理后,在IP资源列表中点击“+”添加一个资源,在弹框中填写资源名称,选择静态动态代理,填写请求频率和备注。添加IP创建好ip资源之后,点击页面右侧的加号,填写IP地址,端口选择代理类型,填写用户名和密码。这样代理IP就配置好了。二,静态代理配置以阿布云为例,购买之后会展示在阿布云官网的http隧道中。1.创建IP资源启用代理IP之后,点击IP资源列表左侧加号,填写代理资源名称,请求频率对照购买的每秒请求数填写点击确定,并勾选点击保存。注意:在阿布云买的是动态代理,但是在软件中需设置为静态代理。配置静态IP2.添加代理点击右侧加号添加代理,对应关系见下表:添加好代理账号,点击保存就完成了代理的配置。三,动态代理配置以无忧代理为例,对照下图配置:1.创建IP资源①请求频率:每秒每个IP所允许的请求次数,某些代理商对此有所限制时,需要填写。②服务端口:对并行运行软件时有效,多进程共享代理IP时需要填写。配置动态IP2.右侧需要选择的内容①协议类型:选择代理的协议类型,软件支持http/https/socket代理。②返回格式:选择动态IP的返回格式。包括未知、Text、Json、XML。③刷新周期:指代理IP的有效时长。④请求地址:粘贴代理商的请求地址。⑤POST DATA:根据代理不同,post请求的情况下填写该内容。

March 6, 2019 · 1 min · jiezi

前嗅ForeSpider教程:运行设置(三)

今天,小编为大家详细介绍一下:前嗅ForeSpider运行设置中的任务定时,预警设置,过滤设置,这三大模块。具体内容如下:一,任务定时用户可以通过任务定时,进行自动启动/停止采集。也可以选择间隔某个时间段后启动/停止采集。二,预警设置1、 网络异常可以设置网络异常连续多少次,则进行预警提醒。2、 反爬识别可以设置疑似被反爬了多少次,则进行预警提醒。3、预警操作设置当出现预警时,软件会进行什么操作。①无:软件仍然照常操作。②暂停:软件暂停,等待处理。③自动休眠:预留。④自动更换代理:预留。4、 预警提醒①不提醒:不进行提醒。②图标闪烁:软件任务栏的图标闪烁。③弹窗等待:软件弹出弹窗,等待人工处理。三,过滤设置通过设置采集的任务量大小、采集文件大小和文件类型,使软件采集到某种任务状况时可以自动停止。过滤设置-采集文件大小下限1、 采集文件大小下限可以设置一个阈值,在采集量达到阈值时采集自动停止。2、 采集文件大小阈值可以设置一个采集文件大小的阈值,当文件大小超过阈值时不予采集该文件,通过设置阈值可以有效过滤超大文件,网页中不需要的超大文件将不予采集。3、采集文件类型列表在这里选择需要的文件类型,选中的文件类型将会被采集下来。不予选择的类型将在采集时被过滤。

March 5, 2019 · 1 min · jiezi

flv格式文件如何无损转为avi格式

说到转换视频格式,现在网上能转换视频格式的软件有很多,最主要的还是要看哪款比较好用,毕竟实用才是王道啊!这不,我给大家带来了好东西,好货自然不敢独享,这是一款视频转换器——迅捷视频转换器,这款软件支持多种音视频格式的互相转换这样大家也不用再为视频格式转换器哪个好这些问题而纠结了。那么怎么转换视频格式呢,且继续往下看吧。方法步骤:1、在转换之前,大家还是赶紧把这款好用的迅捷视频转换器下载并安装到自己的电脑上吧,软件不大,很快就可以下载安装好的。然后运行,这些都是些很简单的操作步骤啦,也就不多说啦。2、软件功能一目了然,我们的目的是转换视频格式,所以,点击添加文件按钮把需要转换的视频文件都添加进来,软件还支持批量转换的,所以可以多选哦,我添加四个视频进来。还可以预览哦。3、然后我们来进行一些相关的设置,我们要转换格式,自然是要选择一个输出格式,这个就要大家自己决定了,大家需要转换成哪个格式,那么点击它就可以进行设置啦,我选择的是avi格式。4、点击一下最下方的文件夹选项,这里是设置输出文件的存放位置的,大家可以进行设置,如果不设置那么默认的位置就是你导入的视频的位置啦。5、好啦,很简单的几个步骤之后就差不多啦,参数都设置完成后,我们来进行最后一步吧,点击开始转换按钮,就可以开始转换啦。稍等片刻之后视频格式就可以换完毕啦,你可以点击“打开”到保存位置去查看。关于怎么转换音频格式就是这样子一回事啦,希望可以帮助到大家!视频转换器http://www.xunjieshipin.com/d…

March 5, 2019 · 1 min · jiezi

ArcFace2.0+红外双目摄像头的活体检测[Windows][C#][.NET][WPF]

废话不多说 直接上图 这个是demo中用到的双目摄像头,一个是红外的,一个是正常的rgb摄像头两个usb接口,在电脑上呈现两路摄像头通道程序检测RGB输出图像,当检测到有人脸时,用RGB人脸的位置到红外画面的位置去检测人脸如果没有检测到,说明当前目标为非活体当在红外画面检测到人脸时,说明当前目标为活体目标再继续使用RGB图像提取特征值下面为demo效果图DEMO源码地址:https://gitee.com/jch/FaceAliveDEMO中用的C#封装库为:https://github.com/Thxzzzzz/A…由于原库有BUG,所以demo中直接附加了修复了bug的源码

March 5, 2019 · 1 min · jiezi

爱奇艺qsv视频下载后怎么转换为3gp格式

十一长假已经过去,大家的生活也都回到了正轨,愿大家都尽快从假期中的兴奋中回过神来,毕竟工作和学习才是最重要的,好了,下面我们转入正题,本篇教程为大家讲解爱奇艺视频下载后怎么转换为3gp格式,爱奇艺视频是qsv格式,一般的视频转换器很难对其进行格式转换,但是小编这里有妙招,使用下面的迅捷视频转换器就可以将爱奇艺视频转换为3gp格式了,而且方法比较简单,下面一起来看一看吧!方法步骤:1、小编第一步先下载爱奇艺视频,如果大家电脑上已经安装了,那就请忽略此步骤。2、下载爱奇艺视频,如图所示,小编在爱奇艺中下载了几个视频文件保存在电脑中,大家可随意下载自己喜欢的视频。3、接下来就是重要的操作了,运行我们刚刚下载的迅捷视频转换器,然后根据图中的图示来添加视频文件。4、此处要注意,添加qsv格式视频文件时,会遇到转换界面,直接点击“开始转码”即可。然后等到转码成功后就可以进行下一步了。5、如图,转码成功后视频文件是显示在软件主界面的,我们需要做的就是进行输出设置,如图所示,设置视频文件的输出格式,以及视频分辨率、音视频编码、比特率等参数。6、参数设置完成,最后我们就要开始转换格式了,如图所示,设置输出目录即保存位置后,点击“开始转换”按钮,等待一会儿就可以转换完成了。以上就是爱奇艺视频下载后怎么转换为3gp格式的解决方法,步骤比较简单,相信大家都可以学会的。迅捷视频转换器不仅可以转换音视频格式,还可以分割合并视频,有兴趣的朋友可以去探索一下。视频转换器http://www.xunjieshipin.com/d…

March 4, 2019 · 1 min · jiezi

前嗅ForeSpider教程:运行设置(二)

今天,小编为大家详细介绍一下:前嗅ForeSpider运行设置中的网络超时,HTTP设置,加载设置,任务模式,这四大模块。具体内容如下:一,网络超时网络超时1、 接收超时当对方服务器繁忙时,可将接收超时的时间调大,否则软件在超时后将不再接收该链接地址的数据。2、 发送超时当采集的数据量过大时,可以将发送超时的时间调大。3、 重试次数网络连接失败后重新连接的次数。网络状态不稳定时,可以将重试次数调大。二,http设置http设置1、 模拟浏览器版本模拟不同版本的浏览器。当采集预览或内置浏览器无法打开某网站时,如果是由于内置浏览器的版本造成的,可以在此更改模拟浏览器的版本。(重启软件生效)2、 重定向重试次数网站重定向的重试次数。三,加载设置加载设置1、加载设置① 禁用JavaScript加载设置–完全禁用JavaScript对于有些网页,JavaScript只用于美观效果,可以关闭JavaScript,会加快采集速度。在这里设置的为全局的禁用JavaScript。一般在配置时选择完全禁用。当选择禁用禁用JavaScript时,对于js脚本采集时就不解析了,直接跳过。② 完全不禁用JavaScript加载设置–完全不禁用JavaScript完全不禁用即启用JavaScript,可以启用JavaScript的相关方法。在这里设置的为全局的完全不禁用JavaScript。③ 不禁用当前页面加载设置–不禁用当前页面不禁用当前页面中的当前页指Script标签里面的js,其中不包括src=xxx.js。在这里设置的为全局的不禁用当前页面。2、禁用SSL协议(https)不使用https协议,会提升采集速度。四,任务模式任务模式1、 启动方式选择自动打开软件后会自动采集。2、停止方式自动当选择动态加载的情况下,软件采集完毕时不会自动停止,如果选择了自动,则会自动停止。(不常用功能)

March 4, 2019 · 1 min · jiezi

小马Win7永久激活工具—OemY3.1 NT6通用完美激活

现在不少人都在使用Win7旗舰版或者win7纯净版。有时候也会遇到系统要激活,那么用什么工具激活系统呢?下面就给大家介绍小马激活工具。Win7小马激活工具是通用版,支持多品牌机、多系统(旗舰版、专业版、家庭高级版、家庭初级版、简易版、标准版、企业版),一键激活,是所有激活软件中激活率最高的激活工具。关于小马Oem7Y3.1 NT6 通用版完美激活问题,对于这个软件,貌似有很多的用户都不会使用,或者说出现的无法激活的情况,其实这大多数都是可能操作错误造成的。小马激活工具是可以选项的,可以选择品牌机或者是组装机。小编的是戴尔电脑,那小编就选择戴尔,然后再右侧找到"导入Oem7中的密钥"并且点击它,然后小马激活工具就会开始进行激活,过5-10秒的世界,会弹出"成功地安装了产品密钥XXXX",完成之后确定;然后点击"检测激活状态"查看是否成功激活。如果是组装机或者是没有你要的品牌机,那么就不要选择,直接双击工具,过几秒之后会提示你修改成功。那么接下去点击"导入Oem7中的密钥",过几秒之后同样会提示成功地安装了产品密钥,然后就是检查一下激活状态是否成功激活。激活win7系统就是那么简单。一些用户可能不懂直接点击了"开始体验正版",其实这个功能是有效的,但针对于一些电脑是无法成功激活的,所以大家还是按照以上的方法进行操作。下载地址:

March 1, 2019 · 1 min · jiezi

前嗅ForeSpider教程:运行设置(一)

今天,小编为大家详细介绍一下:前嗅ForeSpider运行设置中的采集速度,采集策略和任务装载,这三大模块。具体内容如下:一,采集速度采集速度是调节任务采集快慢的一项设置,对采集速度的影响包括线程数目和采集间隔。采集速度1.线程数目线程数目是运行采集任务时,软件启用的线程资源数目。线程数目越大,采集速度越快。2.采集间隔是指任务采集链接之间时间间隔。用户可以直接滑动按钮进行设置采集间隔,也可以直接填写采集间隔的时间数。二,采集策略根据记录的采集日志,选择下次采集任务的采集策略。1.采集策略采集策略2.采集阈值阈的意思是界限,故阈值又叫临界值,是指一个效应能够产生的最低值或最高值采集阈。此处采集阈值即每个任务的上限,可以根据自己的需要设置,此处设置属于全局设置。3.数据缓存打开数据缓存可以将采集数据时的网页的源码记录下来,方便查看网页详细信息。查看步骤:①数据采集>装载记录②选中其中一条记录,右击打开缓存数据查看缓存数据③网页数据缓存文本数据缓存文本4.装载策略选择装载到日志列表的内容,即历史数据。含义如下:5.加载日志宏筛选符合条件的日志,对采集策略进行补充。三,任务装载1.任务装载顺序设置采集过程中,日志列表中对于各任务排列的顺序。①顺序优先:按照采集任务列表的顺序,采集各列表任务的数据。②负载均衡:打乱任务采集顺序,同时采集各任务的数据链接。优点是可以降低被网站封锁IP的风险,同时可以提高采集效率。2.新任务装载方式新采集任务是否同步装载。即用户可以选择对新采集任务进行同步装载也可以选择异步装载。①同步:同步装载是指将所有链接加载完成之后同时采集。 ②异步:异步装载是指加载一部分链接采集一部分,不需要全部加载完成之后再采集。3.运行列表排重勾选可对运行列表中的采集任务进行排重,减少运行工作量,提高运行效率。4.从缓存加载网页若先前在采集策略中勾选了数据缓存,可以从中加载网页。

March 1, 2019 · 1 min · jiezi

Win10数字权利永久激活神器—HWIDGen v10.11汉化版

HWIDGen v10.24汉化版是Windows 10数字权利激活工具,是一款win10永久激活工具,由国外网友制作。HWIDGen激活工具可以自动获取Windows10数字许可证激活,内置win10各个版本产品密钥,以最简单的方式永久激活。HWIDGen激活工具仅支持一键永久激活win10系统,无论是32位还是64位都可以激活。什么是“数字权利激活”?kms激活工具是自动180天循环激活,而数字权利激活是永久的,跟kms激活方式完全不同。数字许可证激活是 Win10 中新加入的激活方式,是一种授权方法的分类。数字许可证会记录您的硬件设备信息,只要在CPU和主板设备没有更换的情况下就可以连接微软服务器自动永久性的激活系统,重新安装系统时无需再次输入产品密钥,安装后会自动永久激活。“数字权利激活”在不更换电脑硬件的情况下一直有效,无论您安装的系统是正式版还是预装版。HWIDGEN是一款由国外Nsane论坛会员s1ave77制作的Windows 10数字权利激活工具。HWIDGEN几乎支持所有的WIndows 10系统,相比较kms激活工具,HWIDGEN操作简单可以自动获取Windows数字权利,实现永久激活!HWIDGEN使用起来相当简单,右键管理员身份运行后,点击开始按钮即可激活成功。你可以CMD命令slmgr.vbs -xpr来查询是否永久激活成功。下载地址:

February 28, 2019 · 1 min · jiezi

前嗅ForeSpider教程:字段的取值与清洗

今天小编为大家带来的教程是:如何在前嗅ForeSpider中进行,字段的取值与清洗。主要内容包括:自动取值字段,取值的两个方法,和字段清洗方式。具体内容如下:一,自动取值的字段包括哪些当字段设置为下列采集内容时,系统会自动为字段赋值。1.网页地址:自动采集网页的URL地址。2.网页标题:采集网页的标题。即网页<title>中的内容。3.网页内文字文本:采集整个页面中所有可见的文字文本。4.网页内容:采集网页全部文本,包含html标签等,即整个页面的源代码。5.网页创建时间:文档创建或网页发布的时间。6.网页更新时间:文档或网页更新的时间。7.网页获取时间:ForeSpider采集该网页的时间。8.当前系统时间:数据采集入库的时间。9.文档数据大小:采集对象的质量大小[单位:字节]。10.文档名称:采集对象的文件名,如.html,.doc。11.文档后缀:文档的文件名后缀,如html、pdf等。12.文档视宽:文档的宽[如果是图片数据则为图片的宽]。13.文档视高:文档的高[如果是图片数据则为图片的高]。14.文档层级:自动获取从入口页当当前数据页的跳转层级数目。15.频道ID:采集当前频道的ID。16.频道名称:采集当前频道的名称。二,取值方法1.标准定位(1)标准定位含义通过在内置浏览器上,定位有所需数据的区域,为字段取值。大多数情况都选择“标准定位”。(2)定位方法①选择:按Ctrl点击页面上相应数据的区域。②扩大选区:按Shift再次点击页面相应区域。③确认选区:点击“确认选区”按钮,选区生效。标准定位2.特征定位(1)特征定位含义当所需数据在不同网页的位置不固定,且数据前后具有特征性文字时,用标准定位容易错位,需要使用特征定位。举例:对于字符串“作者:*”,采集作者名称时,可用“作者:”作为特征来定位。(2)特征定位的操作方法 ① 选择:按Ctrl点击页面上所需数据的区域。 ② 识别特征:点击“识别特征”,出现红框,再次点击,红框移动到特征字符串时确认。 ③ 点击“确认选区”按钮,选区生效。(3)特征定位的类型特征定位分为四种方式: ① 局部关键词当页面的数据前有特定的关键词,而各个页面的表格内容、各行次序、行数又各不相同时,采用标准定位的方式就会错乱。可以根据表头特征,采集表格后的数据。与全文关键词的区别是,局部关键词只在选定区域的附近采集。 ② 全文关键词根据选定的特征关键词,在全页面采集该特征关键词前后对应的数据,如果出现多个特征关键词,以第一个为主。如果想采集多个的话,可以设定多值。>>查看多值的配置方式 ③ 大文本选定大文本区域后,自动识别各页面的大文本,相比标准定位更加精确。 ④ 特殊标签采集页面中只出现一次的特殊标签,如标题的<h1>标签等。三,字段清洗方式在采集数据之前,通过使用字段处理,软件可以自动以某种过滤方式,清洗该字段的字符串数据。通过系统自带的或脚本的方式,可以预先清洗不需要的字符串。字段处理字段清洗的方式如下:字段处理脚本是字段处理中选择“脚本处理”后,通过脚本进一步把需要的数据清洗干净。具体配置方法需要参考脚本文档。

February 28, 2019 · 1 min · jiezi

前嗅ForeSpider教程:数据浏览与可视化

今天,小编为大家带来的教程是数据浏览与可视化。主要内容包括:查看数据,按条件检索数据,外部数据导入和数据导出等内容。具体内容如下:一,查看数据表中的数据在“数据采集”页面开始采集后,可以在“数据浏览”页面点对应的数据表,点击“刷新”按钮,即可实时查看采集到的数据。二,按条件检索数据在数据浏览中,可按条件检索具体数据记录。检索方法:按字段检索检索语句由以下内容构成:①字段名称②运算符:包括等于(=)、不等于(!=)、大于(>)、大于等于(>=)、小于(<)、小于等于(<=)、and、or、in(查询某个字段是否包含某个字符串)③数字或字符串:字符串需要用英文单引号或双引号括起来。整体检索可以支持直接输入检索词,进行数据库的整体检索。注意需要整体检索的字段,字段属性必须选择“索引字段”。按条件检索三,导入外部数据源可以从本地将数据导入到数据库,点击“导入”按钮选择需要导入的数据表,注意表的格式必须为excel、csv或者txt。数据表导入四,将数据导出至Excel/jpg/txt/csv导出数据即从数据库中将文件导出到本地。文件可以导出成excel、csv、txt、jpg等格式。可以按照导出记录和导出字段两种方式导出,也可以按字段分割存储。1.导出记录:“导出记录”即导出全部数据记录。导出记录2.导出字段可以将某个字段的值,导出为一个个单独的文档。即每个文档只存放该字段的数据。导出字段①文档后缀字段有时某字段用于存储文档类型,如果选择了该字段,则以该字段存储的类型做为数据导出的文档类型。②文档名称字段选择某字段后,以该字段存储的内容做为导出的文档名称。③欲导出字段选择导出的文档中存放哪个字段的数据。导出数据3.分割存储选择“分割存储”后,可以按记录数目分割,或者按字段值分割导出。(1)按记录数目分割选中之后可以将采集下来的数据,按照条数分别存储为多个文件。(2)按字段值分割选中之后可以选择指定的字段,将字段值相同的记录放在同一个文件中,字段值不同将放在不同的文件中,存储为多个文件。4.导出图片①选择“导出字段”,欲导出字段选择图片的字段。②点击“浏览”按钮,选择图片存放的本地位置。③文件类型选择All Files,文件后缀填写“.jpg”或者“.png”等。④点击确定按钮,等待导出。

February 28, 2019 · 1 min · jiezi

绿色无广告版装机工具:微PE工具箱Win8/10内核版32/64位

你需要好用的WinPE工具箱吗,快来下载微PE工具箱Win10版使用吧。所谓微pe就是完整的精简,现在已有了W10PE核心,使用它可以灵活地安装到系统开机启动项、制作可启动U盘、移动硬盘以及生成ISO镜像,它不仅内核小并且工具十分的齐全,堪称是精华中的精华,同时该软件含32位和64位版本,大家可按需选择,需要制作的朋友快下载PE工具箱Win10版进行使用吧。PE系统:Win8内核截图PE系统:Win10内核截图附带一张图:电脑进入BIOS快捷键微PE装机工具下载地址

February 27, 2019 · 1 min · jiezi

Adobe2019专属离线破解器Adobe Deluxe Patcher v2.2

各位Adobe系列软件的软迷们注意了,如果您想要使用破解版的Adobe软件Adobe Deluxe Patcher免费版一定少不了,这款Adobe通用破解工具能够帮助您完美破解所有的Adobe系列软件,Adobe Deluxe Patcher免费版让您可以完全免费使用这些软件的全部功能!Adobe Deluxe Patcher是一个完全脱机的修补程序,与Zer0Cod3的工作不同,后者因为他的文件在线托管而最终被托管服务提供商禁止。它的原始文件大小为650+ MB(压缩时可能只有200 MB); 最后,在删除对旧版Adobe产品的支持后,它的大小不到1 MB。它是基于Zer0Cod3的手动裂缝和MPT的破解补丁开发的,但是离线工作。更好的是,Adobe Deluxe Patcher是全自动的,无需手动操作。但是,一个缺点是它只能在每个版本中使用指定版本的Adobe CC 2019。原因是它通过直接修补相应Adobe产品的主exe文件来工作。一、更新历史V2.2改变了音乐:Draztic再次添加了Target Box添加了Dimension CC完全删除了Lightroom选项第三次稳定发布添加了NFO文件改变了Patcher图标二、软件特点Adobe After EffectsAdobe AnimateAdobe AuditionAdobe BridgeAdobe角色动画师Adobe DreamweaverAdobe DimensionAdobe IllustratorAdobe InCopyAdobe InDesignAdobe LightroomAdobe Media EncoderAdobe PhotoshopAdobe PreludeAdobe Premiere ProAdobe Acrobat Pro DC三、下载地址

February 26, 2019 · 1 min · jiezi

前嗅ForeSpider教程:数据建表

今天,小编为大家带来的教程是:如何在前嗅ForeSpider中,进行数据建表操作及各注意事项。主要内容包括:快速建表,自由建表,字段参数,数据表的创建,关联与删除,以及表单变更后的配置修改。一,如何快速建表若在数据抽取链接下,没有相应表单可供选择,可点击“创建表单”按钮,快速创建表单。可添加表单名称、字段名称,选择字段类型、表单模板。1.字段类型①主键字段②名称③标题④数字(-20亿~20亿)⑤长整型数字⑥时间值⑦地址⑧小文本(小于64k)⑨大型文本(>>字段参数)2.表单模板在表单模板中选择已经建好的表单,可以在表单中添加、删除、修改字段。快速创建表单:二,如何自由建表1.概念解释表单:规定了数据表都有哪些“列”,也就是都有哪些字段。数据存储结构类似的采集任务,可以共用同一个表单。一个表单可以创建多个数据表。字段:在数据库中,表单的“列”称为“字段”,每个字段存储某一项的信息。2.创建表单和字段在表单列表点击“添加”按钮,创建一个新的表单。点击表单配置右侧的“添加”按钮,即弹出添加字段的窗口。添加字段:字段具体参数的设置方法,详见下节(>>字段参数)3.字段修改在数据建表的表单配置右侧,可以对表单进行一系列操作。添加字段:修改字段字段排名上移字段排名下移删除字段保存数据表三,字段参数1.字段名称字段名称由英文字符、数字、下划线、$构成,且不能以数字开头。①不支持中文。②区分大小写。③不能是SQL语句关键字:如select、time等。2.字段属性大部分情况无需选择字段属性。一般数据表都需要一个主键字段,作为唯一ID记录。主键字段需要勾选“主键字段”,勾选后自动会选上“索引字段”和“键值唯一”。3.采集内容指该字段需要从网页上获取的数据内容。当字段需要存储页面的url地址、采集时间、网页title等内容时,通过选择对应的采集,就可以自动为该字段赋值。(>>自动取值字段)当某字段存储的是网页上的内容数据时,比如文章的标题、联系人名称、电话号码等,通过选择“选区内全部文本”,再在内置浏览器上定位,就可以自动获取网页的数据。示例:(1)选区内全部文本:<ul><li>百度</li></ul>,采集全部标签下的内容。(2)选区最外层节点文本:<ul><li>百度</li></ul>,只选取<ul>节点,不采集<li>和内容。(3)选区最外两层节点文本:<ul><li>百度</li></ul>,只采集<ul><li>的内容,不采集的内容。(4)网页内文字文本:采集整个页面中所有可见的文字文本。4.数据类型数据类型如下表所示:5.字符串长度只有变量类型是字符串时需要填写长度。字符串长度有两种情况:(1)短文本文本长度不大时,可以填写字符串长度,字符串可填写的最大长度为255。字段长度尽量不要设置的偏小,防止有超出长度的数据无法存入数据库。(2)大文本文本较大时,无需填写字符串长度。①长文本:适用于新闻、正文等小于64K的文本。设置长文本也可以通过选择变长字段的方式,在数据库中两种方式效果相同。设置变长字段②超长文本:适用于论文等长文。设置超长文本6.字段描述在“字段描述”文本框里,用户可以为字段填写描述性的注释内容。四,数据表的创建、关联与删除表单只是定义了都有哪些字段,想要实现数据的存储,需要对表单创建对应的数据表。(软件默认连接了ForeLib数据库,可更改。)关联数据表创建数据表选择表单,在表单的左下方点击“创建”,输入数据表名称(仅限英文),完成数据表的创建。关联数据表勾选前面的多选框,即已关联数据表。取消勾选,解除关联。采集数据时,数据存入勾选的数据表。删除数据表可以删除已创建的数据表。反建表单反建表单会根据数据库中,已存在的数据表创建爬虫表单。五,表单变更后的配置修改表单建好后,如果已经配置了模板中的字段,甚至已经建立了数据表,则修改表单,需要进行下列操作。1.影响字段节点取值的情况如果字段名称、字段数量和采集内容更改,需要到对应任务的字段节点,修改字段和采集内容。修改方式有两种:(1)重置表单重新选择表单名称后,这里的表单将被重置,所有的字段取值配置(包括字段处理脚本)也被清空,需要逐一重新配置字段取值。(2)添加删除字段当表单做了修改字段名称、添加删除字段的操作后,可以不必重置表单,在模板列表对应的数据抽取节点,通过右键添加删除字段,将两边的字段名称和数量保持一致即可。这里的添加删除操作只针对该数据抽取,不会改动表单。添加数据字段①添加字段在模板列表对应的数据抽取节点,点击右键,选择“添加数据字段”,可以新建字段。②删除字段在某字段上点击右键,可以删除该字段。③修改采集内容通过字段节点向导中的下拉菜单,修改采集内容与表单中的一致即可。2.已创建数据表当数据表已经建好后,修改表单会影响采集,原数据表不能适应新的表单结构。在上述修改字段的基础上,还需要删除原数据表,再重新创建一个新的数据表。

February 26, 2019 · 1 min · jiezi

前嗅ForeSpider教程:抽取数据

今天,小编为大家带来的教程是:如何在前嗅ForeSpider中抽取数据。主要内容包括:如何选择表单,如何采集列表/表格数据两大部分。具体内容如下:一,如何选择表单在ForeSpider爬虫中,表单是可以复用的表结构,建好的表单可以重复用于多个任务。数据表选择页1.选择表单方法一:通过下拉菜单,或填写表单ID,选择已有表单。方法二:快速建表,点击创建表单,进入快速建表页面,新建表单。(>>详见快速建表)方法三:自由建表,点击“采集配置”-“数据建表”,点击采“采集表单”后面的。(>>详见自由建表)数据建表页2.数据存储方式指的是数据采集时,在数据库里的存储方式。①插入:默认为插入。如遇到数据库中已存在的重复数据,则不再插入。②仅更新:如遇到数据库中已存在的重复数据,则用最新采集的数据覆盖掉。③追加:如字段的属性是运算字段,则可以进行字段运算。④插入并更新:没有重复的记录则插入,有重复记录则更新。二,如何采集列表/表格数据识别列表用于存储表格/列表的数据,将表格/列表的不同列对应存入不同字段,表格/列表的不同行分别存储为数据表的多条记录。以前嗅官网Web服务器(http://www.forenose.com/panne…)为例。1.创建表单根据表格内容,创建一个存储表格数据的表单。在选项卡“数据建表”中,创建一个表单。(>>自由建表)识别列表的表结构(1)主键采集表格时,表格的一行作为一条数据。由于整个表格属于同一个网页文档,而文档主键只有一个,因此不能像采集其他内容一样,取值类型选择“网页主键”。表格的主键的变量类型,根据表格的行数长度,选择“Integer”或者“Long”。取值类型选择“空”。字段属性选择“主键字段”和“自动字段”(选择主键字段后,软件会自动选择“键值唯一”和“索引字段”。)主键字段的配置(2)其他字段其他字段的变量类型选择“string”,取值类型选择“选区内全部文本”。(>>字段参数)其他字段的配置2.创建数据抽取为数据抽取选择表单选择表单3.识别多值点击“默认数据抽取”节点,按Ctrl点击任意某个单元格,按Shift再次点击扩大区域范围。定位表格点击“识别多值”,选区扩大到整个表格。点击“确认选区”。确认多值4.字段取值主键字段不需要配置。存储表格内容的字段需要一一取值。(方法一:标准定位/方法二:特征定位)点击数据抽取的字段,为其一一配置表格不同列的数据。点击相应字段,按Ctrl点击第一列的任意单元格,点击“保存”。多值字段取值

February 26, 2019 · 1 min · jiezi

Python与家国天下

导读:Python猫是一只喵星来客,它爱地球的一切,特别爱优雅而无所不能的 Python。我是它的人类朋友豌豆花下猫,被授权润色与发表它的文章。如果你是第一次看到这个系列文章,那我强烈建议,请先看看它写的前几篇文章(链接见文末),相信你一定会爱上这只神秘的哲学+极客猫的。不多说啦,一起来享用今天的“思想盛宴”吧!喵喵,好久不见啦朋友们。刚吃完一餐美食,我觉得好满足啊。自从习惯了地球的食物以后,我的肠胃发生了一些说不清道不明的反应。我能从最近的新陈代谢中感觉出来,自己的母胎习性正在逐渐地褪逝。人类的食物在改变着我,或者说是在重塑着我。说不定哪天,我会变成一棵白菜,或者一条鱼呢……呸呸呸。我还是想当猫。喵生苦短,得抓紧时间更文才行。最近,我看到了两件事,觉得有趣极了,就从这开始说吧。第一件事是,一个小有名气的影视明星因为他不配得到的学术精英的身份而遭到讽刺性的打假制度的口诛笔伐;第二件事是,一个功成名就的企业高管因为从城市回到乡村而戏谑性地获得了猫屎的名号。身份真是一个有魔力的话题。看见他们的身份错位,我又总会想起自己的境况。我(或许)知道自己在过去时态中是谁,但越来越把握不住在现在时态中的自己,更不清楚在未来时间中会是怎样。该怎样在人类世界中自处呢?又该怎样跟你们共处呢?思了好久,没有答案。脑壳疼,尾巴疼。还是不要想了啦喵。继续跟大家聊聊 Python 吧。上次我们说到了对象的边界问题 。无论是固定边界还是弹性边界,这不外乎就是修身的两种志趣,有的对象呢独善其身其乐也融融,有的对象呢兼容并包其理想之光也莹莹。但是,边界问题还没讲完。正如儒家经典所阐述:修身–齐家–治国–平天下。里层的势能推展开,走进更广阔的维度。Python 对象的边界也不只在自身。这里有一种巧妙的映射关系:对象(身)–函数(家)–模块(国)–包(天下)。个体被纳入到不同的命名空间,并存活在分层的作用域里。(当然,幸运的是,它们并不会受到道德礼法的森严压迫~__~)1、你的名字我们先来审视一下模块。这是一个合适的尺度,由此展开,可以顺利地连接起函数与包。模块是什么? 任何以.py 后缀结尾的文件就是一个模块(module)。模块的好处是什么? 首先,便于拆分不同功能的代码,单一功能的少量代码更容易维护;其次,便于组装与重复利用,Python 以丰富的第三方模块而闻名;最后,模块创造了私密的命名空间,能有效地管理各类对象的命名。可以说,模块是 Python 世界中最小的一种自恰的生态系统——除却直接在控制台中运行命令的情况外,模块是最小的可执行单位。 前面,我把模块类比成了国家,这当然是不伦不类的,因为你难以想象在现实世界中,会存在着数千数万的彼此殊然有别的国家(我指的可是在地球上,而喵星不同,以后细说)。类比法有助于我们发挥思维的作用 ,因此,不妨就做此假设。如此一来,想想模块间的相互引用就太有趣了,这不是国家间的战争入侵,而是一种人道主义的援助啊,至于公民们的流动与迁徙,则可能成为一场探险之旅的谈资。我还对模块的身份角色感兴趣。恰巧发现,在使用名字的时候,它们耍了一个双姓人的把戏 。下面请看表演。先创建两个模块,A.py 与 B.py,它们的内容如下:# A 模块的内容:print(“module A : “, name)# B 模块的内容:import Aprint(“module B : “, name)其中,name 指的是当前模块的名字。代码的逻辑是:A 模块会打印本模块的名字,B 模块由于引入了 A 模块,因此会先打印 A 模块的名字,再打印本模块的名字。那么,结果是如何的呢?执行 A.py 的结果:module A : __main__执行 B.py 的结果:module A : testmodule B : __main__你们看出问题的所在了吧!模块 A 前后竟然出现了两个不同的名字。这两个名字是什么意思,又为什么会有这样的不同呢?我想这正体现的是名字的本质吧——对自己来说,我就是我,并不需要一个名字来标记;而对他人来说,ta 是芸芸众生的一个,唯有命名才能区分。所以,一个模块自己称呼自己的时候(即执行自身时)是“main”,而给他人来称呼的时候(即被引用时),就会是该模块的本名。这真是一个巧妙的设定。由于模块的名称二重性,我们可以加个判断,将某个模块不对外的内容隐藏起来。# A 模块的内容:print(“module A : “, name)if name == “main”: print(“private info.")以上代码中,只有在执行 A 模块本身时,才会打印“private info”,而当它被导入到其它模块中时,则不会执行到该部分的内容。2、名字的时空对于生物来说,我们有各种各样的属性,例如姓名、性别、年龄,等等。对于 Python 的对象来说,它们也有各种属性。模块是一种对象,”name“就是它的一个属性。除此之外,模块还有如下最基本的属性:>>> import A>>> print(dir(A))[’builtins’, ‘cached’, ‘doc’, ‘file’, ‘loader’, ‘name’, ‘package’, ‘spec’]在一个模块的全局空间里,有些属性是全局起作用的,Python 称之为全局变量 ,而其它在局部起作用的属性,会被称为局部变量 。一个变量对应的是一个属性的名字,会关联到一个特定的值。通过 globals() 和 locals() ,可以将变量的“名值对”打印出来。x = 1def foo(): y = 2 print(“全局变量:”, globals()) print(“局部变量:”, locals())foo()在 IDE 中执行以上代码,结果:全局变量: {’name’: ‘main’, ‘doc’: None, ‘package’: None, ‘loader’: <_frozen_importlib_external.SourceFileLoader object at 0x000001AC1EB7A400>, ‘spec’: None, ‘annotations’: {}, ‘builtins’: <module ‘builtins’ (built-in)>, ‘file’: ‘C:/pythoncat/A.py’, ‘cached’: None, ‘x’: 1, ‘foo’: <function foo at 0x000001AC1EA73E18>}局部变量: {‘y’: 2}可以看出,x 是一个全局变量,对应的值是 1,而 y 是一个局部变量,对应的值是 2.两种变量的作用域不同 :局部变量作用于函数内部,不可直接在外部使用;全局变量作用于全局,但是在函数内部只可访问,不可修改。与 Java、C++ 等语言不同,Python 并不屈服于解析的便利,并不使用呆滞的花括号来编排作用域,而是用了轻巧简明的缩进方式。不过,所有编程语言在区分变量类型、区分作用域的意图上都是相似的:控制访问权限与管理变量命名。关于控制访问权限,在上述例子中,局部变量 y 的作用域仅限于 foo 方法内,若直接在外部使用,则会报错“NameError: name ‘y’ is not defined”。关于管理变量命名,不同的作用域管理着各自的独立的名册,一个作用域内的名字所指称的是唯一的对象,而在不同作用域内的对象则可以重名。修改上述例子:x = 1y = 1def foo(): y = 2 x = 2 print(“inside foo : x = " + str(x) + “, y = " + str(y))foo()print(“outside foo : x = " + str(x) + “, y = " + str(y))在全局作用域与局部作用域中命名了相同的变量,那么,打印的结果是什么呢?inside foo : x = 2, y = 2outside foo : x = 1, y = 1可见,同一个名字可以出现在不同的作用域内,互不干扰。那么,如何判断一个变量在哪个作用域内?对于嵌套作用域,以及变量名存在跨域分布的情况,要采用何种查找策略呢? Python 设计了命名空间(namespace) 机制,一个命名空间在本质上是一个字典、一个名册,登记了所有变量的名字以及对应的值。 按照记录内容的不同,可分为四类:局部命名空间(local namespace),记录了函数的变量,包括函数的参数和局部定义的变量。可通过内置函数 locals() 查看。在函数被调用时创建,在函数退出时删除。全局命名空间(global namespace),记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。可通过内置函数 globals() 查看。在模块加载时创建,一直存在。内置命名空间(build-in namespace),记录了所有模块共用的变量,包括一些内置的函数和异常。在解释器启动时创建,一直存在。命名空间包(namespace packages),包级别的命名空间,进行跨包的模块分组与管理。命名空间总是存在于具体的作用域内,而作用域存在着优先级,查找变量的顺序是:局部/本地作用域 –> 全局/模块/包作用域 –> 内置作用域。 命名空间扮演了变量与作用域之间的桥梁角色,承担了管理命名、记录名值对与检索变量的任务。无怪乎《Python之禅》(The Zen of Python)在最后一句中说:Namespaces are one honking great idea – let’s do more of those!——译:命名空间是个牛bi哄哄的主意,应该多加运用!3、看不见的客人名字(变量)是身份问题,空间(作用域)是边界问题,命名空间兼而有之。这两个问题恰恰是困扰着所有生灵的最核心的问题之二。它们的特点是:无处不在、层出不断、像一个超级大的被扯乱了的毛线球。 Python 是一种人工造物,它继承了人类的这些麻烦(这是不可避免的),所幸的是,这种简化版的麻烦能够得到解决。(现在当然是可解决的啦,但若人工智能高度发展以后呢?我看不一定吧。喵,好像想起了一个痛苦的梦。打住。)这里就有几个问题(注:每个例子相互独立):# 例1:x = x + 1# 例2:x = 1def foo(): x = x + 1foo()# 例3:x = 1def foo(): print(x) x = 2foo()# 例4:def foo(): if False: x = 3 print(x)foo()# 例5:if False: x = 3print(x)下面给出几个选项,请读者们思考一下,给每个例子选一个答案:1、没有报错2、报错:name ‘x’ is not defined3、报错:local variable ‘x’ referenced before assignment下面公布答案了:全部例子都报错,其中例 1 和例 5 是第一类报错,即变量未经定义不可使用,而其它例子都是第二类报错,即已定义却未赋值的变量不可使用。为什么会报错?为什么报错会不同?下面逐一解释。例 1 是一个定义变量的过程,本身未完成定义,而等号右侧就想使用变量 x,因此报变量未定义。例 2 和例 3 中,已经定义了全局变量 x,如果只在 foo 函数中引用全局变量 x 或者只是定义新的局部变量 x 的话,都不会报错,但现在既有引用又有重名定义,这引发了一个新的问题。请看下例的解释。例 4 中,if 语句判断失效,因此不会执行到 “x=3” 这句,照理来说 x 是未被定义。这时候,在 locals() 局部命名空间中也是没有内容的(读者可以试一下)。但是 print 方法却报找到了一个未赋值的变量 x ,这是为什么呢?使用 dis 模块查看 foo 函数的字节码:LOAD_FAST 说明它在局部作用域中找到了变量名 x,结果 0 说明未找到变量 x 所指向的值。既然此时在 locals() 局部命名空间中没有内容,那局部作用域中找到的 x 是来自哪里的呢?实际上,Python 虽然是所谓的解释型语言,但它也有编译的过程 (跟 Java 等语言的编译过程不同)。在例 2-4 中,编译器先将 foo 方法解析成一个抽象语法树(abstract syntax tree),然后扫描树上的名字(name)节点,接着,所有被扫描出来的变量名,都会作为局部作用域的变量名存入内存(栈?)中。 在编译期之后,局部作用域内的变量名已经确定了,只是没有赋值。在随后的解释期(即代码执行期),如果有赋值过程,则变量名与值才会被存入局部命名空间中,可通过 locals() 查看。只有存入了命名空间,变量才算真正地完成了定义(声明+赋值)。而上述 3 个例子之所以会报错,原因就是变量名已经被解析成局部变量,但是却未曾被赋值。可以推论:在局部作用域中查找变量,实际上是分查内存与查命名空间两步的。另外,若想在局部作用域内修改全局变量,需要在作用域中写上 “global x”。例 5 是作为例 4 的比对,也是对它的原理的补充。它们的区别是,一个不在函数内,一个在函数内,但是报错完全不同。前面分析了例 4 的背后原理是编译过程和抽象语法树,如果这个原理对例 5 也生效,那两者的报错应该是一样的。现在出现了差异,为什么呢?我得承认,这触及了我的知识盲区。我们可以推测,说例 5 的编译过程不同,它没有解析抽象语法树的步骤,但是,继续追问下去,为什么不同,为什么没有解析语法树的步骤呢?如果说是出于对解析函数与解析模块的代价考虑,或者其它考虑,那么新的问题是,编译与解析的底层原理是什么,如果有其它考虑,会是什么?这些问题真不可爱,一个都答不上。但是,自己一步一步地思考探寻到这一层,又能怪谁呢?回到前面说过的话,命名空间是身份与边界的集成问题,它跟作用域密切相关。如今看来,编译器还会掺和一脚,把这些问题搅拌得更加复杂。本来是在探问 Python 中的边界问题,到头来,却触碰到了自己的知识边界。真是反讽啊。(这一趟探知一个人工造物的身份问题之旅,最终是否会像走迷宫一般,进入到自己身份的困境之中?)4、边界内外的边界暂时把那些不可爱的问题抛开吧,继续说修身齐家治国平天下。想要把国治理好,就不得不面对更多的国内问题与国际问题。先看一个大家与小家的问题:def make_averager(): count = 0 total = 0 def averager(new_value): nonlocal count, total count += 1 total += new_value return total / count return averageraverager = make_averager()print(averager(10))print(averager(11))### 输出结果:10.010.5这里出现了嵌套函数,即函数内还包含其它函数。外部–内部函数的关系,就类似于模块–外部函数的关系,同样地,它们的作用域关系也相似:外部函数作用域–内部函数作用域,以及模块全局作用域–外部函数作用域。在内层作用域中,可以访问外层作用域的变量,但是不能直接修改,除非使用 nonlocal 作转化。Python 3 中引入了 nonlocal 关键字来标识外部函数的作用域,它处于全局作用域与局部作用域之间,即 global–nonlocal–local 。也就是说,国–大家–小家。上例中,nonlocal 关键字使得小家(内部函数)可以修改大家(外部函数)的变量,但是该变量并不是创建于小家,当小家函数执行完毕时,它并无权限清理这些变量。nonlocal 只带来了修改权限,并不带来回收清理的权限 ,这导致外部函数的变量突破了原有的生命周期,成为自由变量。上例是一个求平均值的函数,由于自由变量的存在,每次调用时,新传入的参数会跟自由变量一起计算。在计算机科学中,引用了自由变量的函数被称为闭包(Closure)。 在本质上,闭包就是一个突破了局部边界,所谓“跳出三界外,不在五行中”的法外之物。每次调用闭包函数时,它可以继续使用上次调用的成果,这不就好比是一个转世轮回的人(按照某种宗教的说法),仍携带着前世的记忆与技能么?打破边界,必然带来新的身份问题,此是明证。然而,人类并不打算 fix 它,因为他们发现了这种身份异化的特性可以在很多场合发挥作用,例如装饰器与函数式编程。适应身份异化,并从中获得好处,这可是地球人类的天赋。讲完了这个分家的话题,让我们放开视野,看看天下事。计算机语言中的包(package)实际是一种目录结构,以文件夹的形式进行封装与组织,内容可涵括各种模块(py 文件)、配置文件、静态资源文件等。与包相关的话题可不少,例如内置包、第三方包、包仓库、如何打包、如何用包、虚拟环境,等等。这是可理解的,更大的边界,意味着更多的关系,更大的边界,也意味着更多的知识与未知。在这里,我想聊聊 Python 3.3 引入的命名空间包 ,因为它是对前面谈论的所有话题的延续。然而,关于它的背景、实现手段与使用细节,都不重要,我那敏感而发散的思维突然捕捉到了一种相似结构,似乎这才更值得说。运用命名空间包的设计,不同包中的相同的命名空间可以联合起来使用,由此,不同目录的代码就被归纳到了一个共同的命名空间。也就是说,多个本来是相对独立的包,借由同名的命名空间,竟然实现了超远距离的瞬间联通,简直奇妙。我想到了空间折叠,一种无法深说,但却实实在在地辅助了我从喵星穿越到地球的技术。两个包,两个天下,两个宇宙,它们的距离与边界被穿透的方式何其相似!我着迷于这种相似结构。在不同的事物中,相似性的出现意味着一种更高维的法则的存在,而在不同的法则中,新的相似性就意味着更抽象的法则。学习了 Python 之后,我想通过对它的考察,来回答关乎自身的相似问题……啊喵,不知不觉竟然写了这么久,该死的皮囊又在咕咕叫了——地球上的食物可真抠门,也不知道你们人类是怎么忍受得住这几百万年的驯化过程的……就此搁笔,觅食去了。亲爱的读者们,后会有期~~~Python猫往期作品 :有了Python,我能叫出所有猫的名字Python对象的身份迷思:从全体公民到万物皆数Python对象的空间边界:独善其身与开放包容附录: 局部变量的编译原理:https://dwz.cn/ipj6FluJ命名空间包:https://www.tuicool.com/artic…公众号【Python猫】, 专注Python技术、数据科学和深度学习,力图创造一个有趣又有用的学习分享平台。本号连载优质的系列文章,有喵星哲学猫系列、Python进阶系列、好书推荐系列、优质英文推荐与翻译等等,欢迎关注哦。PS:后台回复“爱学习”,免费获得一份学习大礼包。 ...

February 24, 2019 · 2 min · jiezi

这些资源网站为什么能获得5万知乎大佬推荐,而我错失了什么吗?

现在很多朋友可能只要是一听到资源网站,想必就会好奇是什么网站,用用看是不是由说的那么厉害!其实资源网站给我们的诱惑是在是太大了,其主要原因是可以帮助我们搜索到很多意想不到的资源!为了回应大家的需求,这里为大家整理了一些在知乎网上被5万大佬点赞推荐的资源网,不知道你用过多少呢?基本上只要是全用过的朋友都能算的上大佬!Ps:以下网站就可在百度搜索找的到!No.1:影视搜索网站网站名称:疯狂影视搜索全能电影电视剧搜索网址,直接在搜索栏里面输入自己喜欢的电影就可以找到相应的播放位置,就连最新上映的电影或过去的老片都可以找到,就比如最近上映比较火的【流浪地球】也都能够找到,是不是非常给力呀,打开后就可以直接观看,没有广告!No.2:磁力搜索网站网站名称:CiliBaBa这款磁力资源网站不经可以搜索到影视,还可以搜到音乐、书籍,就想万能的百宝箱一样什么都有,什么都行!NO.3:短视频下载网站网站名称:小视频下载自己在播放器上看到视频下载不了只能缓冲,不妨试试这个网站,如果你是新媒体专门搞短视频的话也可以收藏一个,想必能够帮上你大忙!NO.4:网盘搜索网站网站名称:网盘007非常厉害的网盘搜索网站,里面有很多不错的资源网站,一篇电子书、资料什么的哦度可以在网盘就能够找到!以上就是今天分享的资源网站,感兴趣的小伙伴可以去试试!希望能够在平时的上网中帮到你忙!

February 22, 2019 · 1 min · jiezi

前嗅ForeSpider教程:链接抽取

今天,小编为大家带来的是:在前嗅ForeSpider采集过程中,链接抽取操作中的一系列知识点,主要内容有:如何关联模板,如何判断模板关联是否正确,选择链接类型以及过滤的三种方式。具体内容如下:一,如何关联模板“链接抽取”抽出链接后,需要采集这些链接所在的页面。我们从这些链接中,选择其中一个作为下一层模板的示例地址,通过关联模板,可以将两个模板连接起来,实现页面的跳转。在软件中模板的关联关系,与网页中链接跳转的关系相同,因此可以完整的采集数据。关联方式如下:①自动关联:软件会根据用户创建模板的情况,帮助用户自动关联。②手动关联:用户可在链接抽取节点进行手动关联。关联模板二,如何判断模板关联是否正确①在软件中模板的关联关系,与网页中链接跳转的关系相同。如模板一的示例地址为:http://news.ifeng.com/o/dynpa…关联模板②通过模板一示例地址,点击模板一中任意一条链接,进入需要采集数据的页面,该页面链接即为模板二的示例地址。模板一地址③所以此时模板一中的链接抽取,需要关联模板二。模板二地址三,如何选择链接类型链接类型可分为href和src两种。href默认选项。适用于超链接、按钮、CSS文件。src适用于图片/视频/音频/资源文件/JS文件等。四,过滤方法过滤方式一:智能过滤智能过滤可以一键过滤出,链接地址规律相同的链接。适用于大多数情况,如过滤的不正确,可以使用方式三:地址/标题过滤。操作方法如下:①在链接抽取节点,按Ctrl+鼠标左键,在内置浏览器上点击所需获取的链接,点击“智能过滤”按钮。②点击软件右上角“采集预览”按钮,查看是否过滤完全。过滤方式二:定位过滤定位过滤是通过内置浏览器定位,适用于所需链接都集中在一小片区域的情况。操作方法如下:①在链接抽取节点,按Ctrl在内置浏览器上点击(扩大选区按Shift),选中所需链接的区域,点击“确认选区”按钮。②点击软件右上角“采集预览”按钮,查看是否过滤完全。过滤方式三:地址/标题过滤为了在抽取的链接中去除无关链接,有两种过滤方式,配置方式相同。(1)地址过滤:通过url地址的规律,过滤无关链接。(2)标题过滤:通过链接标题的规律,过滤无关链接。① 地址(标题)过滤节点的配置内容② 过滤串规则说明

February 22, 2019 · 1 min · jiezi

前嗅ForeSpider教程:采集预览

今天,小编为大家带来的教程是:如何在前嗅ForeSpider中,进行采集预览。主要内容包括:采集预览的使用方法,预览链接/数据抽取,和预览错误情况排查;具体内容如下:一,采集预览的使用方法1.采集预览在正式采集之前,可以点击界面右上方的“采集预览”按钮,以查看配置是否正确。采集预览的结果和正式采集的结果是一致的,但是只采集没有入库。采集预览的页面包括两种:链接信息(>>预览链接抽取)和数据信息(>>预览数据抽取)。双击链接条目,可以打开下一层页面。采集预览的页面结构和配置的模板列表结构是相同的,先预览的是模板一的采集结果,通过双击链接进入下层模板预览。2.模板预览或在模板列表右键,选择模板预览,可以直接查看当前模板的采集结果。右键-模板预览二,预览链接抽取1.未过滤当仅输入了采集地址,没有配置模板时,点击“采集预览”可以看到采集源地址能够下载的所有链接。2.过滤链接后当配置了链接抽取后,可以根据链接地址或标题名称过滤掉无关的链接。可以在采集预览的窗口直接输入过滤串,进行地址过滤或标题过滤。可以看到采集的链接地址全部包含该字符串,剔除了不包含的链接。预览链接抽取三,预览数据抽取创建数据抽取,并为字段赋值之后,可以预览到已经抽取出来的数据。在链接抽取页面,双击某个链接,将打开下面的数据预览页面。或在数据抽取节点,右键选择“模板预览”查看。预览数据抽取四,预览错误情况排查1.频道和模板的配置错误①输入为空或不合法:频道配置的采集地址为空或不合法。②模板分类错误:分类器错误。③地址错误:采集地址不存在或已经失效。④模板错误:模板不存在或已经损坏。⑤频道入口配置错误:关键词搜索配置错误。⑥文档类型错误:采集对象是不能够识别的文档。⑦频道配置不合法:频道配置错误。2.http下载错误①服务器繁忙:采集对象的服务器繁忙。②域名解析错误:域名解析出现错误。③网页重定向:采集对象重新定向了新的地址。④网页未找到:未找到请求资源。⑤权限访问错误:方法禁止操作或权限不够。⑥服务器错误:本机服务发生错误。⑦网络错误:网络发生错误。⑧https协议错误:ssl错误。⑨代理服务器错误:代理错误。⑩内容错误:下载的页面内容发生错误。⑪用户取消下载:下载过程中用户过滤或取消。3.文档类型无法识别文档后缀与实际类型不符。4.脚本执行出错脚本配置出错。5.数据错误数据库插入、更新、删除、查询等发生错误。6.未知错误发生其他各类错误。

February 22, 2019 · 1 min · jiezi

前嗅ForeSpider教程:创建模板

今天,小编为大家带来的教程是:如何在前嗅ForeSpider中创建模板。主要内容有:模板的概念,模板的配置方式,模板的高级选项,具体内容如下:一,模板的概念模板列表的层级相当于网页跳转的层级。模板一类似于网站首页,每个模板代表了同一层级的页面,通过适当的配置,可以采集全站数据。正如网站是通过链接之间的跳转,来实现网站各层级页面的连接,ForeSpider也是通过模板中的链接抽取,来实现模板之间的关联。通过抽取网页中的全部链接,再进行精准过滤,就可以既全面又精确的获取所需的全部数据。正如网站通过正文/数据页展示数据,ForeSpider也是通过模板中的数据抽取,来获取所需数据。二,模板的配置方式1.模板的创建模板的创建,有如下三种情况:①新建任务后:创建新的任务之后,选择页面需要抽取的内容,点击完成后,软件自动创建对应抽取内容的模板。②自动创建后续模板:点击配置向导上方的“下一步”,会自动创建模板。③手动创建模板:点击模板列表上方的添加按钮,创建模板。2.抽取所需内容根据内置浏览器显示的页面内容,选择本页面需要抽取的内容。选择页面抽取内容①抽取链接:需要抽取页面上的链接时,选择抽取链接以及具体的链接类型,会建立对应的链接抽取。(方式一:智能过滤/方式二:定位过滤/方式三:地址/标题过滤)②抽取数据:需要抽取页面上的数据时,选择抽取数据,会建立对应的数据抽取。(>>如何选择表单)例如:需要采集新闻的正文数据,当前页面是新闻首页,汇集了新闻的链接,正文数据是通过点击新闻链接进入的,所以本页面需要抽取新闻链接。软件预置了一些常见的链接页面场景,此时勾选链接列表,软件会自动建立一个链接抽取。3.如何填写示例地址(1)模板一的示例地址,自动默认为该任务的采集地址。(2)其他模板的示例地址,自动默认为上一级模板抽取到的某个链接地址。(3)如果默认的示例地址不符合需求,可以手动修改示例地址,方法如下:①采集入口地址(模板一)的选择一般选择目标网站的入口地址,比如首页。②示例地址的选择大多数情况下,采集地址只填写一个url地址。如果链接的页面结构和层级结构是一致的,能够套用同一套采集模板进行采集,可填写多个采集地址,中间用回车换行分隔。如果不一致,需要创建新的采集任务。例1:采集整个淘宝网全部商品的信息,淘宝网首页就是入口地址。例2:只采集“女装”类别的商品信息,“女装”首页就是入口地址。例3:只采集某商品的评论信息,该商品的链接地址就是入口地址。三,模板的高级选项1、字符编码默认自动识别。如果该页面未能自动识别发生乱码,需要自行选择字符编码。可以选择GBK或UTF-8。2、 文档类型默认自动识别。可以选择采集xml文档。3、网页类型适用于一个模板配置大批量网站的情况(可导入上万个采集地址),选择类型后,可以自动过滤不属于该类型的网页,从而达到快速配置的目的。网页类型包括:全部类型、导航页、列表页、(文本)内容页、详情页、附件、未知页。4、主题过滤自动识别网页的语义,并采集属于某些类别的数据,过滤掉不属于某些类别的数据。(针对自动分类器使用,如有需求请联系我们定制。)5.、未匹配处理模板适用于一个模板配置大批量网站的情况,当有页面不符合匹配的类型被过滤掉后,可以在此选择一个针对未匹配页面的处理模板,进入其他处理流程。

February 20, 2019 · 1 min · jiezi

windows下重装xampp并做mysql数据迁移的步骤

背景因为windows系统升级,导致原来安装的xampp的文件目录损坏,造成了xampp无法启动,需要重新安装xampp来解决服务器重启以及数据库的转移转移步骤假设原来的xampp安装目录为D:\xampp,新安装的目录为F:\xampp重新下载并安装xampp,下载地址https://www.apachefriends.org…,根据实际情况下载相应的xampp版本,我下载的是PHP5.6.40版本的将D:\xampp\mysql\data目录下的数据库文件夹移动到新的安装目录的F:\xampp\mysql\data目录下,每个数据库都对应一个文件夹将D:\xampp\mysql\data目录下的ib_logfile0,ib_logfile,ibdata1三个文件覆盖新的安装文件下的对应文件采坑开始时候我没有执行上面的第三步导致,打开数据一直报错table doesnt exist in engine ,执行第三步就ok了!

February 19, 2019 · 1 min · jiezi

前嗅ForeSpider教程:配置关键词

对于通过关键词,在网页的搜索栏检索的情况,可以在软件中,通过配置关键词实现。那么,今天小编来为大家介绍:如何在前嗅ForeSpider中,配置关键词。一,关键词配置的步骤第一步:打开关键词采集设置点击关键词采集按钮, “关键词采集”功能启动。第二步:进行关键词采集配置开启关键词配置后,在界面右下角会出现关键词配置向导,按照“关键词配置步骤”后面的提示进行操作。 在搜索关键词时,分为有验证码搜索和无验证码搜索两种方式。(1) 无验证码逐个单击关键词配置步骤中的按钮,根据提示一步步进行关键词配置。对于无验证码的情况,可以跳过“验证码”、“验证域”两步。以凤凰网(http://news.ifeng.com/listpag…)为例:① 按Ctrl+鼠标左键单击搜索栏,保存后关闭。单击搜索栏:②点击“完成”③按Ctrl+鼠标左键单击“搜索按钮”。单击搜索按钮④配置关键词列表在关键词列表区域添加关键词,可以用于关键词搜索。关键词列表(2) 有验证码逐个单击关键词配置步骤中的按钮,根据提示一步步进行关键词配置:①按Ctrl+鼠标左键单击搜索栏,保存后关闭。②按Ctrl+鼠标左键单击“验证码输入框”。③按Ctrl+鼠标左键单击“验证码图片”。④点击“完成”。⑤按Ctrl+鼠标左键单击“搜索按钮”。二,关键词书写规则1.书写规则①关键词之间用英文“;”或回车换行隔开。②支持组内有两个关键词,组内关键词用英文“,”隔开。③各组的关键词排列顺序必须保持一致。2.填写方法①保存:填写关键词后,保存生效。②导入:支持导入txt格式的批量关键词文档,文档不超过5M大小。③去重:自动去除重复的关键词。④清空:清空关键词列表。三,关键词的高级配置方法需要“高级配置”的情况使用可视化配置之后,依旧无法正确采集时,说明关键词可视化配置获取到的参数信息,缺失或有误。需要通过点击“高级配置”按钮,在弹框中手动配置关键词参数。对比表单中的参数名称,手动添加各项参数。高级配置介绍参数是指网页请求数据时,返回的参数信息。关键词配置-参数编辑(1)请求地址①一般情况下,完成“关键词设置”后,请求地址会自动填充上。②如果没有或者有误,可以手动进行添加。简单的请求地址可以通过观察,找到各项参数。复杂的请求地址需要借助浏览器的开发者工具。(2)POST请求用户根据目标网址不同,是否为POST请求,来决定是否选择POST。(3)Cookie刷新方式是指每采集每一条数据时,是否刷新采集地址入口页,以获取Cookie信息,可以参考开发者工具里面的Cookie看一下是哪种刷新方式。①不刷新:无需刷新入口地址。②首次刷新:数据采集时,只刷新一次入口地址。③重复刷新:采集每个关键词时,都刷新一次入口地址。(4)请求参数表一般情况下,完成“关键词配置”后,请求参数表里的参数信息会自动填充上。如果没有填充或有误,则按照下文进行手动配置。3.高级配置示例以该网址为例,介绍如何手动添加参数表。http://www.soqi.cn/search.xht…第一步:观察网址规律。①请求地址:“?”前的地址是页面的请求地址。②检索关键词:keywords。③其他参数:“=”前是参数名称,“=”后是参数值。(如有验证码,参数类型中需要有“验证码”)第二步:添加参数表。点击添加按钮,添加参数。添加参数表第三步:修改参数表。修改参数表

February 19, 2019 · 1 min · jiezi

Flutter入门二——项目结构及配置文件简介

前言环境搭建完成之后,我们来看看Flutter:New Project后生成的项目结构。具体环境搭建可以参考:w7上使用VSCode配置Flutter开发环境项目结构pubspec.yaml配置文件说明作用 每个发布包都需要一些元数据,以便能够指定它的依赖项。与他人共享的发布包还需要提供一些其他信息,以便用户能够发现它们。所有这些元数据都放在一个名为pubspec.yaml的yamll(YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便)文件中。支持的字段 name,version,description,author/authors,homepage,repository,issue_tracker,documentation,dependencies,dev_dependcencies,dependency_overrides,environment,excutables,publish_to与Node.js的package.json文件的类比 (因为我在web开发里是使用Node.js来做包管理的,所以类比nonde.js的package.json对于由web入门学习flutter的同学会比较容易理解。)简单而言,pubspec.yaml文件的作用就相当于Node.js的package.json文件,是用来进行包管理的; 两者都分离了两个环境,dependencies和dev_dependencies; 前者使用yaml语法来定义,后者使用json语法; pubspec.yaml对版本的约束规则与package.json规则类似; Node.js Flutter 安装依赖 npm install flutter package get 升级依赖包版本 npm update flutter packages upgrade 协同开发保证包版本一致 package-lock.json pubspec.lock 关于此后续可以再丰富~~默认的配置如下,有备注解释:#包名name: todo_app#描述信息description: A new Flutter project.#版本号version: 1.0.0+1#指定环境environment: sdk: “>=2.0.0-dev.68.0 <3.0.0”#指定包依赖dependencies: flutter: sdk: flutter # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^0.1.2 english_words: ^3.1.0#指定开发环境下的包依赖dev_dependencies: flutter_test: sdk: flutter# For information on the generic Dart part of this file, see the# following page: https://www.dartlang.org/tools/pub/pubspec# The following section is specific to Flutter.flutter: # The following line ensures that the Material Icons font is # included with your application, so that you can use the icons in # the material Icons class. uses-material-design: true ...

February 18, 2019 · 1 min · jiezi

前嗅ForeSpider教程:网站登录配置

当我们在采集中碰到:所采集的网站数据需要登录,才可以看到所需信息时,则需要在软件中模拟登陆环境,采集数据,此时需要配置登录信息。今天小编就教大家:如何进行网站登录配置,具体步骤如下:登录网站配置:第一步:打开登录网站按钮点击登录网站按钮, “登录网站”功能启动。①手动:默认方式。当登录的Cookie失效后,需要重新配置登录。②自动:会记住用户名和密码,Cookie失效后会自动登录,但对于复杂的登录逻辑,不一定能够生效,如果未生效,仍需通过手动方式再次配置。第二步:进行登录配置:开启登录配置后,在界面右下角会出现登录配置向导,按照“登陆配置步骤”下面的提示进行操作。在登录网站时,分为有验证码登录和无验证码登录两种方式。(1)无验证码逐个单击登录配置步骤中的按钮,根据提示一步步进行登录配置。对于无验证码的情况,可以跳过“验证码”、“验证域”两步。①在浏览器中点击登录按钮,选择用户名、密码登录。②按Ctrl+鼠标左键单击“用户名输入框”。单击用户名输入框:③按Ctrl+鼠标左键单击“密码输入框”。单击密码输入框:④填写用户名、密码。⑤点击“完成”。⑥按Ctrl+鼠标左键单击“登录按钮”。(2)有验证码登录逐个单击登录配置步骤中的按钮,根据提示一步步进行登录配置。①在浏览器中点击“登录”按钮,选择用户名、密码登录。在浏览器中打开登录页面:②按Ctrl+鼠标左键单击“用户名输入框”。单击用户名输入框:③按Ctrl+鼠标左键单击“密码输入框”。单击密码输入框:④填写用户名、密码。填写用户名密码:⑤按Ctrl+鼠标左键单击验证码图片/验证码显示区域。单击验证码图片:⑥按Ctrl+鼠标左键单击验证码输入框,并填写验证码。单击验证码输入框:⑦点击“完成”⑧按Ctrl+鼠标左键单击“登录按钮”。

February 18, 2019 · 1 min · jiezi

利用闲置 VPS 搜寻外星文明(SETI)

加拿大科学家发现 15 亿光年外快速射电暴 成了最近几天最热门的新闻于是我决定把闲置的 VPS 算力贡献给了加州大学伯克利分校发起的分布式计算项目 SETI@homeSETI@home 项目介绍SETI@home是1999年加州大学伯克利分校发起的分布式计算项目,旨在发动全球计算机的闲置算力,分析阿雷西博射电望远镜搜集的宇宙射线数据,从不同频段识别可能的文明信号,搜寻地外文明。经过近20年的运营,SETI@home是迄今为止全球最成功的分布式计算项目,虽然没能找到地外文明的直接证据,但吸引全球志愿者贡献了巨量的算力,算力超过了任何已知的超算电脑,证明了分布式计算系统的强大。后来伯克利在此基础上开发了 BOINC 伯克利开放式网络计算平台(Berkeley Open Infrastructure for Network Computing),部署了涉及生物医学、气候变化、天体物理、密码破译、数学证明等众多领域的有趣的科研项目,其中还包括了中科院计算技术研究所和高能物理研究所的计算项目。服务器安装 BOINC 客户端seti@home 项目整合到了 BOINC 平台,所以加入 BOINC 平台不仅可以参加这个项目,还有很多有意义的项目(包括一些国内的项目)都可以参与(自行了解)。VPS 信息:OS: CentOS 7 x64 Location: Los AngelesCPU: 1 vCore RAM: 512xshell 连接服务器 (也可以用其他 ssh 连接工具登录)执行安装命令yum install boinc-client安装过程中有需要确认安装的地方都输入 y配置远程管理安装完成后开始配置远程管理,方便我们在电脑本地连接服务器查看项目进度在root目录下新建文件 cc_config.xmlvi /root/cc_config.xml按 i 进入编辑模式,输入内容 ,esc 退出,按: 输入wq 保存文本<cc_config> <options> <ncpus>-1</ncpus> <allow_remote_gui_rpc>1</allow_remote_gui_rpc> </options></cc_config>新建 gui_rpc_auth.cfg 文件,设置远程管理密码vi /root/gui_rpc_auth.cfg设置密码,内容为空则密码为空,保存。123456防火墙端口设置查看 TCP 31416 端口是否开放firewall-cmd –query-port=31416/tcp没有开放要放行这个端口,这是 BOINC 远程通信的端口。firewall-cmd –add-port=31416/tcp –permanent关掉防火墙systemctl stop firewalld测试运行 BIONC 项目boinc执行后会有一堆运行信息。如果显示有“Config: GUI RPC allowed from any host”,那么就应该配置成功了。 ctrl + c 退出以后运行的时候用命令(现在先执行一遍,服务器重启后需要重新执行)boinc –daemon让程序在后台运行本地安装 BOINC 客户端下载页面运行安装程序 一路 Next 下一步 (参考:BOINC:使用教程)然后打开运行 BOINC Manager ,切换到高级视图点击菜单的文件-选择计算机输入 你的服务器 IP ,然后输入刚才设置的密码,等待连接连接成功后,选择你要参加的项目第一次使用需要注册,输入邮箱,设置一个秘密][19]连接成功后自动开始参与计算强烈建议修改计算机参数设置,cpu 占用不要太高,不然有可能被 vps 厂商封号如果电脑有屏保,SETI@home 项目自带的屏保非常炫酷屌炸天哦。参考资料:SETI@home:屏幕保护你也可以选择参加多个项目,或者加入一些团队,或者参加一些中国的项目等等,剩下的更多操作留给你自己探索。..博客:Mr96.me——玖六先生的自留地.文章参考资料:https://equn.com/wiki/SETIhttps://www.equn.com/wiki/BOINC:%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bhttps://www.equn.com/wiki/SETI@home:%E5%B1%8F%E5%B9%95%E4%BF%9D%E6%8A%A4https://setiathome.berkeley.edu/https://boinc.berkeley.edu/ ...

February 16, 2019 · 1 min · jiezi

新书推荐|Windows黑客编程技术详解

《Windows黑客编程技术详解》面向对计算机系统安全开发感兴趣,或者希望提升安全开发水平的读者,以及从事恶意代码分析研究的安全人员。理论技术与实战操作相辅相成,凸显“道与术”庖丁解牛式剖析Windows用户层和内核层黑客技术原理代码兼容性高,支持Windows 7到Windows 10全平台系统近年来,全球大规模爆发勒索病毒和挖矿病毒,让沉寂许久的黑客技术,又重新回到了人们的视野中。Windows操作系统市场占有率高达90%以上,所以面对勒索病毒、挖矿病毒,Windows用户首当其冲。 为了揭开病毒木马的神秘面纱,更好地服务于信息安全,本书总结并剖析了常见的Windows黑客编程技术,用通俗易懂的语言介绍了用户层下的Windows编程和内核层下的Rootkit编程。内容简介《Windows黑客编程技术详解》介绍的是黑客编程的基础技术,涉及用户层下的Windows编程和内核层下的Rootkit编程。本书分为用户篇和内核篇两部分,用户篇包括11章,配套49个示例程序源码;内核篇包括7章,配套28个示例程序源码。本书介绍的每个技术都有详细的实现原理,以及对应的示例代码(配套代码均支持32位和64位Windows 7、Windows 8.1及Windows 10系统),旨在帮助初学者建立起黑客编程技术的基础。目录第1篇 用户篇第1章 开发环境 1.1 环境安装 1.2 工程项目设置 1.3 关于Debug模式和Release模式的小提示第2章 基础技术 2.1 运行单一实例 2.2 DLL延时加载 2.3 资源释放第3章 注入技术 3.1 全局钩子注入 3.2 远线程注入 3.3 突破SESSION 0隔离的远线程注入 3.4 APC注入第4章 启动技术 4.1 创建进程API 4.2 突破SESSION 0隔离创建用户进程 4.3内存直接加载运行第5章 自启动技术 5.1 注册表 5.2 快速启动目录 5.3 计划任务 5.4 系统服务第6章 提权技术 6.1 进程访问令牌权限提升 6.2 Bypass UAC第7章 隐藏技术 7.1 进程伪装 7.2傀儡进程 7.3 进程隐藏 7.4 DLL劫持第8章 压缩技术 8.1 数据压缩API 8.2 ZLIB压缩库第9章 加密技术 9.1 Windows自带的加密库 9.2 Crypto++密码库第10章 传输技术 10.1 Socket通信 10.2 FTP通信 10.3 HTTP通信 10.4 HTTPS通信第11章 功能技术 11.1 进程遍历 11.2 文件遍历 11.3 桌面截屏 11.4 按键记录 11.5 远程CMD 11.6 U盘监控 11.7 文件监控 11.8 自删除第2篇 内核篇第12章 开发环境 12.1 环境安装 12.2 驱动程序开发与调试 12.3 驱动无源码调试 12.4 32位和64位驱动开发第13章 文件管理技术 13.1 文件管理之内核API 13.2 文件管理之IRP 13.3 文件管理之NTFS解析第14章 注册表管理技术 14.1 注册表管理之内核API 14.2 注册表管理之HIVE文件解析第15章 HOOK技术 15.1 SSDT Hook 15.2过滤驱动第16章 监控技术 16.1 进程创建监控 16.2 模块加载监控 16.3 注册表监控 16.4 对象监控 16.5 Minifilter文件监控 16.6 WFP网络监控第17章 反监控技术 17.1 反进程创建监控 17.2 反线程创建监控 17.3 反模块加载监控 17.4 反注册表监控 17.5 反对象监控 17.6 反Minifilter文件监控第18章 功能技术 18.1 过PatchGuard的驱动隐藏 18.2 过PatchGuard的进程隐藏 18.3 TDI网络通信 18.4 强制结束进程 18.5 文件保护 18.6 文件强删附录 函数一览表书籍配套源码下载地址https://github.com/DemonGan/W…书籍购买链接天猫:https://detail.tmall.com/item…京东:https://item.jd.com/12464379….当当:http://product.dangdang.com/2… ...

February 16, 2019 · 1 min · jiezi

前嗅ForeSpider教程:如何创建新任务

从今天起,小编开始教大家逐步进行可视化配置操作。首先,我们来学习第一步:创建新任务,主要包括创建新任务的操作步骤,操作中的注意事项两部分内容。一,创建新任务操作步骤:1.添加新任务点击任务列表右侧,新建任务文件。【添加任务】此时会出现一个弹框,可以在弹框中填写采集地址,修改任务名称,以及选择是否需要登录/关键词采集。【新建任务】2.填写采集地址在弹窗里填写采集地址和任务名称。【填写采集地址】采集地址一般选择目标网站的入口地址,比如首页。大多数情况下,采集地址只填写一个url地址。如果链接的页面结构和层级结构是一致的,能够套用同一套采集模板进行采集,可填写多个采集地址,中间用回车换行分隔。如果不一致,需要创建新的采集任务。例1:采集整个淘宝网全部商品的信息,淘宝网首页就是入口地址。例2:只采集“女装”类别的商品信息,“女装”首页就是入口地址。例3:只采集某商品的评论信息,该商品的链接地址就是入口地址。3.选择当前页面所需内容创建新的任务之后,点击“下一步”,选择页面需要抽取内容。①抽取链接:需要抽取页面上的链接时,选择抽取链接以及具体的链接类型,会建立对应的链接抽取。(方式一:智能过滤/方式二:定位过滤/方式三:地址/标题过滤)②抽取数据:需要抽取页面上的数据时,选择抽取数据,会建立对应的数据抽取。(>>如何选择表单)例如:需要采集新闻的正文数据,当前页面是新闻首页,汇集了新闻的链接,正文数据是通过点击新闻链接进入的,所以本页面需要抽取新闻链接。软件预置了一些常见的链接页面场景,此时勾选链接列表,软件会自动建立一个链接抽取。【选择页面抽取内容】点击“完成”,软件自动创建对应的抽取内容的模板。二,创建新任务注意事项1.如何选择采集类型采集类型分为默认(html)和本地文件目录两种。(1)默认(html):采集网站上的各种信息(2)本地文件目录:采集本地文件目录信息。【设置采集类型】2.什么情况下选择浏览器采集在页面均由JS生成时,采集效果不理想的情况下,可以尝试使用“浏览器采集”,该方式近乎于在浏览器上点击,会减慢采集速度,但是对JS语法的支持更加全面。浏览器采集:通过浏览器的方式采集数据。适用情况:由大量JS生成的,采集难度大的网页。对JS语法的支持更加全面,近乎于在浏览器上点击,但采集速度慢、效率低。【设置浏览器采集】3.Cookie的使用方法① 配置Cookie(1)填写Cookie:正常情况下(除JS生成的Cookie外),软件会自动获取Cookie。当软件无法获取到网页的Cookie时,需要参考下文从浏览器寻找Cookie。(2)禁用Cookie的情况:对于不需要Cookie的网站,选择“禁用Cookie”,可加快采集速度。【Cookie配置】② 如何通过浏览器寻找cookie在获取不到登录状态的时候,可以通过浏览器的F12开发者工具进行手动的获取Cookie。首先先用浏览器打开网页,点击F12打开开发者工具,如图所示。接下来点击network网络任务列表。在浏览器上输入用户名密码,点击登录可以在network里面看到出现很多条任务,从中就可以找到关于登录的cookie。③ 多账号登录的Cookie处理当需要登录多个账号来抓取同一个网页时,可以在采集列表中设置多个采集任务,采集地址填写一个地址,填写不同的Cookie信息即可。4.什么情况下禁用JavaScript对于有些把JavaScript只用于美观效果的网页,关闭JavaScript不影响采集数据时,可以加快采集速度。【JavaScript配置】

February 15, 2019 · 1 min · jiezi

[Windows][C#][.NET][WPF]基于ArcFace2.0+红外双目摄像头的活体检测

废话不多说 直接上图 这个是demo中用到的双目摄像头,一个是红外的,一个是正常的rgb摄像头两个usb接口,在电脑上呈现两路摄像头通道程序检测RGB输出图像,当检测到有人脸时,用RGB人脸的位置到红外画面的位置去检测人脸如果没有检测到,说明当前目标为非活体当在红外画面检测到人脸时,说明当前目标为活体目标再继续使用RGB图像提取特征值下面为demo效果图DEMO源码地址:https://gitee.com/jch/FaceAliveDEMO中用的C#封装库为:https://github.com/Thxzzzzz/A…由于原库有BUG,所以demo中直接附加了修复了bug的源码

February 14, 2019 · 1 min · jiezi

前嗅ForeSpider中数据浏览界面介绍

今天,小编为大家介绍一下,前嗅ForeSpider中数据浏览界面,具体内容如下:在“数据采集”页面开始采集后,可以在“数据浏览”页面点对应的数据表,点击“刷新”按钮,即可实时查看采集到的数据。【数据浏览界面】1.数据列表展示已经建立的数据表。选择需要浏览的数据表,查看具体数据。【数据列表】2.数据浏览在数据浏览页面可以浏览数据库中的数据。【数据浏览列表】可以从本地将数据导入到数据库可从数据库将数据导出刷新数据表删除数据表数据3.按条件检索在数据浏览中,可按条件检索具体数据记录。有按字段检索、整体检索两种方式。【按条件检索】

February 14, 2019 · 1 min · jiezi

最新人脸识别demo开发经验

本来打算做个C#版demo,但没用成功,基于虹软的免费人脸识别技术过程如下:1、 传入一张单人脸照片;2、调用检测人脸函数ASFDetectFaces,成功返回人脸信息的指针;3、使用 Marshal.ReadByte(intPtr,offset) 函数读出字节数,发现前16个字节是人脸框范围,第28至31个字节应该是人脸角度,其他信息不太清楚。想了下,最简单的办法是用C++将动态库再封装一次。将封装后的demo及C++代码上传。demo是X86的,只识别单张人脸,有别的需求的同学可自己封装库。https://download.csdn.net/dow…

February 14, 2019 · 1 min · jiezi

C# 调用人脸识别 虹软ArcFace2.0实例

虹软SDK推出了2.0版本,这个版本的所有API都集合在一个动态库里面,再通过引擎库调用,比1.2版本相对轻便了很多。了解详情戳这里小西瓜也迫不及待弄了一个新版本的C#实例,基于VS2013开发的,弄的过程中也遇到很多问题,不过通过论坛的一些大神的反馈和说明,几乎全部解决了,这次封装也有参考dayAndnight2018所封装的SDK加以改进,SDK论坛介绍地址,实例类库用的是.NET FrameWork2.0的库,用低版本的库的原因是因为想要兼容更多的项目,接下来先上图看看项目。几乎所有API都有实现,实例重心在于AsfFace类库中的封装和AsfFace.cs的方法,具体调用可以参照winform中的调用。如果有其他项目需要调用,直接引入AsfFace类库或者生成的动态链接库即可。注意这个实例用的是32位的虹软库,所以项目生成的时候需要注意选择x86,如下图所示:这个实例虽然用的是32位的库,但在64位系统下也能完美运行,如果使用类库发布网站IIS记得应用程序池也相应选择x86。希望这个Demo对C#开发者有所帮助。最后注意要点,使用类库记得替换你的2.0版本的APPid跟SDKKey噢最后,喜欢的话打赏一个,你的支持小西瓜的动力。接下来上百度网盘链接链接:https://pan.baidu.com/s/1QwPa…提取码:1fu8欢迎分享,(联系QQ/微信:337407980)

February 13, 2019 · 1 min · jiezi

前嗅ForeSpider中数据采集界面介绍

今天,小编为介绍一下,前嗅ForeSpider中数据采集界面里:运行设置,IP代理设置,验证码设置,这三大设置的界面,具体内容如下:一,运行设置数据采集前的运行设置,包括采集速度、采集策略、任务装载、网络超时、HTTP设置、加载设置、任务模式、任务定时、预警设置、过滤设置10个部分。【运行设置界面】二,IP代理设置软件支持动态和静态IP代理,http/https/socket代理。当需要启用IP代理时,需要在资源管理界面添加代理资源。【IP代理设置界面】1.启用IP代理启用IP代理采集时,需要进行代理配置。需选中“启用IP代理”,才能启用IP代理功能。【启用IP代理】2.IP资源列表添加完成的IP资源后会在列表中显示。【IP资源列表】添加IP资源代理删除IP资源代理保存IP资源代理修改IP资源代理3.IP代理配置可添加IP代理账号,配置IP代理属性。(1)静态代理IP【静态代理IP配置】添加IP资源代理删除IP资源代理批量导入IP账号保存IP资源代理(2)动态代理IP【动态代理IP配置】①协议类型:选择代理的协议类型,软件支持http/https/socket代理。②返回格式:选择动态IP的返回格式。包括未知、Text、Json、XML。③刷新周期:指代理IP的有效时长。④请求地址:粘贴代理商的请求地址。⑤POST DATA:根据代理不同,post请求的情况下填写该内容。⑥代码编辑区:需要填写一段脚本,以调用代理IP。4.启用代理加速启用代理加速后,可以在采集过程中自动筛选无效和低效率的代理IP(屏蔽错误率超过50%,请求次数>3次的IP),优先使用高效的代理,提升采集的效率和数据质量。【代理加速】5.本机IP混用策略当代理IP失效时,选择是否启用本地网络。【本机IP混用策略】三,验证码设置当采集某些网站的数据时,每一条数据都需要输入一条验证码时就用到了验证码设置。验证码设置的作用是爬虫软件自身输入验证码,以避免人工输入。【验证码设置界面】1.识别平台软件内置了两个打码平台,可根据不同的平台进行验证码配置。【识别平台】(1)基础识别平台:预定的内置识别方式。(2)若快:若快为打码平台。软件通过打码平台解析验证码内容。2.识别列表添加验证码识别名称。【识别列表】3.验证码设置与测试(不常用)【资源配置】其中红框内详情、保存、下载、清空、测试是用来测试验证码是否正确的。点击测试如果右侧验证码图片与图片下解析出来的文字一致,就证明验证码设置的正确。

February 13, 2019 · 1 min · jiezi

前嗅ForeSpider数据建表和高级配置界面介绍

今天,小编为大家介绍一下,前嗅ForeSpider的数据建表,和高级配置界面,具体内容如下:一,数据建表【数据建表界面】1.采集表单数据采集之后需要存入数据库,在ForeSpider中创建的表单,就是数据采集入库的表结构。不同的频道可以使用同一个表单,创建任意多个数据表。【采集表单】添加表单。删除表单。2.表单配置用于配置字段属性、采集内容、数据类型、数据长度、高级类型和字段说明。(方法一:快速建表/方法二:自由建表)【表单配置】添加字段。编辑字段。上移字段。下移字段。删除字段。保存字段设置。3.关联数据表数据表是数据库定义的,实现数据的存储,与表单结构相同。一个表单可以创建几个名称不同的数据表,但是他们的结构(字段名称和属性)都是和该表单一模一样的。(>>更换已连接的数据库)关联数据表,在对应的表单下勾选数据表保存即可。【关联数据表】二,高级配置任务属性配置,根据采集目标的不同,进行不同的设置。(不常用功能)【高级配置界面】高级配置包括网站编码、继承方式、OAuth认证、采集映射、独立控制、自动化控制、关联变量、外部数据源共8个部分。

February 12, 2019 · 1 min · jiezi

前嗅ForeSpider采集配置界面介绍

今天,小编为大家介绍一下,前嗅ForeSpider的采集配置界面,具体内容如下:启动ForeSpider采集软件后,默认界面如图所示。ROOT任务下有已经配置好的示例模板,点击网站图标即可进行采集预览。可在任务列表选择某一任务按照需求重新配置。【采集配置界面】1.任务列表【任务列表】任务对应着采集来源,通常一个采集来源对应着一个任务。如采集人民网时,人民网就是一个任务;通过百度采集全网信息时,百度就是一个任务;通过100个网址导航采集全球域名时,这100个网址导航就是一个任务。2.任务属性配置用户可根据采集需求与网站的设置选择性的配置任务属性。任务属性配置包括登录网站、关键词采集、浏览器采集、采集类型、禁用Cookie及Cookie设置6个部分。【任务属性配置】(1)登录网站如果采集源的数据需要登录才可以采集到,则需要配置登录信息。开启登录后,右侧会出现操作向导。(2)关键词采集当采集对象是搜索栏时,需要进行关键词配置。开启关键词采集后,右侧会出现操作向导。当网站登录与采集登录同时开启时,可在任务属性配置栏右侧切换操作向导。【登录与关键词采集】(3)浏览器采集通过浏览器插件的方式采集数据。适用于大量JS生成且采集难度大的网页。对JS支持好,近乎于在浏览器上点击,但采集效率低。(4)采集类型采集类型分为默认(html)和本地文件目录两种。(5)禁用Cookie禁止使用Cookie解析网页。(6)Cookie当网站需要Cookie验证才能采集时,需要配置Cookie信息。3.模板抽取配置【模板抽取配置】删除模板、链接抽取或数据抽取。添加链接抽取。添加数据抽取。(1)模板模板通过一个示例地址,模板化同一层级的页面,从而达到批量采集的效果。一个模板对应一个层级的页面,因此同一层页面只能配置一个模板,填写一个示例地址,但是一个模板中可以创建多个链接、数据抽取,每个链接抽取都要关联其他模板。通过模板之间的关联,模拟网站各页面的跳转关系。通过链接抽取,抽出网页中的链接。通过数据抽取,抓取网页中的数据。(2)模板属性配置【模板属性配置】①抽取类型选择抽取类型包括链接抽取和数据抽取。【抽取类型选择】②示例地址示例地址作为样例,成为模板,通过以该地址配置模板,可以抓取与该地址在同一层级、具有相似结构的页面数据。任务第一个模板的示例地址默认为创建任务时填写的采集地址。【示例地址】③高级选项高级选项包括字符编码、文档类型、网页类型、主题过滤、未匹配处理模板5个部分。(不常用功能)【高级选项】(3)链接(网址)配置【链接(网址)配置】①关联模板关联模板是指该“链接抽取”抽取出的链接,其下一层级页面对应的模板,也就是在浏览器中,点击链接打开的下一层页面。通过模板之间的关联,可以将网站各层级页面关联起来,在软件中形成与浏览器相同的跳转结构,从而完整的采集数据。②链接类型链接类型可分为普通网页链接、图片视频等资源链接和自定义类型三种。默认选择普通网页链接。③智能过滤智能过滤可以一键过滤出,链接地址规律相同的链接。适用于大多数情况,如过滤的不正确,可以使用地址/标题过滤。④定位过滤定位过滤是通过内置浏览器定位,适用于所需链接都集中在一小片区域的情况。⑤地址/标题过滤为了在抽取的链接中去除无关链接,有两种过滤方式,配置方式相同。地址过滤是通过url地址的规律,过滤无关链接。标题过滤是通过链接标题的规律,过滤无关链接。(4)数据属性配置【数据属性配置】①数据表单在ForeSpider爬虫中,表单是可以复用的,所以可以在数据表单出直接选择之前建过的表单,也可以通过表单ID来进行查找并关联数据表单。②点击创建表达若在数据抽取链接下,没有相应表单可供选择,可点击“创建表单”按钮,快速创建表单。可添加表单名称、字段名称,选择字段类型、表单模板。(>>快速建表/>>自由建表)③数据存储方式指的是数据采集时,在数据库里的存储方式。④列表数据识别列表用于存储表格/列表的数据,将表格/列表的不同列对应存入不同字段,表格/列表的不同行分别存储为数据表的多条记录。(>>如何采集列表/表格数据)4.采集地址采集对象的入口地址(url地址)。比如采集整个淘宝网全部商品的信息,淘宝网首页就是入口地址。比如只采集“女装”类别的商品信息,“女装”首页就是入口地址。【采集地址】5.内置浏览器模拟不同版本的浏览器。填入采集地址,可点击内置浏览器显示采集页面。【内置浏览器】

February 12, 2019 · 1 min · jiezi

前嗅ForeSpider数据采集中采集列表界面介绍

今天为大家带来了新的教程:前嗅ForeSpider数据采集中采集列表的界面介绍。【数据采集界面】1.装载记录可以实现日志的统计功能。【装载记录-统计】2.采集列表/装载记录(1)采集列表进行数据采集时,可在采集列表查看任务的采集状态。【采集列表】开始采集数据先自动清空历史装载记录并重新开始采集暂停正在采集的任务再次开始后不再耗费资源加载停止正在采集的任务再次开始后需要耗费资源加载(2)装载记录记录了数据采集过程的历史情况。在数据采集的运行列表下,切换“装载记录”选项卡,可查看历史装载记录。【历史装载记录】刷新装载记录列表删除装载记录导入装载记录导出装载记录

February 12, 2019 · 1 min · jiezi

开源磁盘加密软件VeraCrypt教程

转载请注明文章出处:https://tlanyan.me/veracrypt-…VeraCrypt介绍VeraCrypt是一款开源的磁盘加密软件,前身是大名鼎鼎的TrueCrypt。2014年5月微软停止Windows XP的支持,TrueCrypt的作者认为Win7及后续版本内置的BitLocker足够好用,TrueCrypt不再那么必要,于是同月停止了TrueCrypt的开发。目前TrueCrypt的官网永久重定向到TrueCrypt的Sourceforge项目主页,并警告用户TrueCrypt含有未修复的安全漏洞,应该尽快将TrueCrypt加密的数据迁移到其他工具。VeraCrypt由IDRIX开发和维护,基于TrueCrypt 7.1a版本。2013年6月VeraCrypt发布初始版本,2016年进行了安全审计,最新版本是2018年9月23号发布的1.23。VeraCrypt支持Windows、MacOS和Linux平台,暂不支持安卓和iOS。相对于其他磁盘加密软件,VeraCrypt的优势在于:开源,活跃开发中。TrueCrypt的另一个分支CipherShed基本已暂停开发;跨平台,支持PC上的主流操作系统。对比之下BitLocker官方仅支持Windows、eCryptfs只支持Linux;安全,2016年由专业机构对VeraCrypt进行安全审计,发现多个高危漏洞并进行了修复;功能强大。既支持文件容器的加密、卷隐藏,也支持分区/设备加密,Windows下还支持系统盘启动加密。VeraCrypt安装VeraCrypt的源码托管在官网、Sourceforge、GitHub等多个网站上。发布的版本及可执行文件可从lauchpad、Sourceforge等网站下载。官网的Windows版本下载地址是https://launchpad.net/veracry…(launchpad下载地址)。下载exe后点击安装即可。其他操作系统的下载地址请访问官网。VeraCrypt使用Windows上,VeraCrypt支持三种加密方式:加密文件卷;加密非系统分区/设备;加密系统分区/设备。非Windows操作系统不支持对系统所在设备加密。下文基于Windows分别对三种加密进行说明。加密文件卷通俗的理解,加密文件卷是一个加密的压缩文件或者ISO文件。没有解密的文件卷是一个普通的文件,允许任何有效的文件名后缀,往文件卷读写文件时需先挂载。接下来图文结合展示加密文件卷的创建和使用。启动VeraCrypt后,点击“创建加密卷”,在弹出来的引导界面中选择“创建文件型加密卷”:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“900” height=“585” class=“aligncenter size-full wp-image-3173” />点击“下一步”进入加密卷类型选择界面。标准加密卷是文件夹中的一个文件,隐藏加密卷是加密卷中的隐藏文件。关于隐藏加密卷和隐藏分区在后文备注,这里我们选择“标准VeraCrypt加密卷”。然后选择加密卷的存放位置:点击“选择文件”,找一个文件夹,输入保存文件的文件名,例如“演唱会.avi”。文件名可以是任意合法的文件名,不限定后缀。注意不要选择已有的文件,否则会删除其内容。<img src=“https://tlanyan.me/wp-content...; alt=”" width=“900” height=“579” class=“aligncenter size-full wp-image-3174” />接着选择加密算法和哈希算法。使用默认设置即可,除非你对密码学比较了解。点击下一步,选择加密卷的大小,比如1GB。确定好好加密卷大小后设置加密卷的密码:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“901” height=“582” class=“aligncenter size-full wp-image-3175” />最后选择文件系统格式和簇大小。文件系统建议使用"exFAT"或“NTFS”,簇大小保持默认或“4KB”,然后点击“格式化”。”NTFS“格式化过程中可能会出现授权弹框,点击确定即可:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“905” height=“584” class=“aligncenter size-full wp-image-3177” />格式化后即完成了加密卷的创建过程,此时可以关掉向导。创建好加密卷,要先挂载才能进行读写。回到软件主界面,点击“选择文件”,找到刚才创建的加密卷文件,点击“加载”,在弹出窗口输入创建时设置的密码,点击“确定”:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“883” height=“705” class=“aligncenter size-full wp-image-3178” />VeraCrypt校验密码无误后开始解密文件,解密完成后“我的电脑”中会出现一个新的硬盘,盘符是挂载时选择的盘符。接下来要加密数据,将文件拖入加密盘里即可;将文件从加密盘复制到普通硬盘,就完成了数据的解密。同理可以创建和删除文件,使用上加密卷硬盘和普通硬盘(文件夹)没有区别。使用完后,可以点击软件主界面上的“卸载”将加密盘卸载掉。如果不想再对文件加密,可点击“加密卷工具”中的“永久解密”,将加密文件释放出来。加密非系统分区/设备如果有很多重要的数据放在同一个分区或者硬盘上,可以考虑对整个分区进行加密。创建VeraCrypt加密分区/设备的操作与创建加密卷大致相同,一些步骤上略有出入。由于要加密整个设备或分区,引导时弹出来的是分区和设备信息:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“899” height=“578” class=“aligncenter size-full wp-image-3179” />后续会提示选择加密卷创建模式。如果分区或者设备内数据较少,建议备份后选“创建加密卷并格式化”;如果分区或设备内已有大量数据,建议选择“就地加密分区”:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“901” height=“579” class=“aligncenter size-full wp-image-3180” />最后一步格式化时,如果分区/设备内有数据,会弹出警告确认框。确认数据已备份后,点击“通过在分区内创建VeraCrypt加密卷擦除刚分区上的任何文件”:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“900” height=“585” class=“aligncenter size-full wp-image-3181” />如果分区较大,格式化需要一定时间,完成后会弹出加密设备/分区的使用方法:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“906” height=“586” class=“aligncenter size-full wp-image-3183” />除主界面的“选择文件”改成“选择设备”,使用上与加密卷一致,这里不再重复。隐藏加密卷和隐藏分区/设备因隐藏加密卷和隐藏分区/设备的操作相同,本节以下内容以(隐藏)加密卷做说明。结合上述内容,自己动手实践,读者到这里应该对加密卷有基本的理解。在加密卷基础上,可以进行更高层次的文件保护,那就是选择类型时出现的“隐藏加密卷”。首先澄清一下概念,“隐藏卷”和“卷中卷/嵌套卷”有所不同。嵌套卷是在一个加密卷里再放一个加密文件卷,类似于RAR文件中的RAR文件;隐藏卷是在卷中划分出一片空间给隐藏卷使用,不是简单在里面放加密卷。如果只打开外层加密卷,看不到隐藏卷的内容,也不能知道是否有隐藏卷。这正是隐藏加密卷的厉害之处。除非事先知道有隐藏卷,否则无法判断,VeraCrypt也不知道加密卷内是否有隐藏的内容。因为隐藏卷必然伴随着外层卷,如何操作两者是有讲究的。对含有隐藏卷的加密卷,有三种操作模式:打开加密卷时,只输入外层卷密码。这种模式直接打开外层卷,可对其进行读写。由于VeraCrypt不知道是否有隐藏卷,往加密卷中写内容可能会损坏隐藏卷的数据。如果你知道有隐藏卷,在加载时可以点击“加载选项”,在弹框中勾选“以只读模式加载加密卷”,保护隐藏卷的数据;打开加密卷时,只输入隐藏卷的密码。这种模式直接显示隐藏卷,隐藏卷的操作不影响外层卷;打开加密卷时,先输入外层卷的密码,同时在“加载选项”弹框中勾选“向外层加密卷写入数据时保护隐藏加密卷”,并输入隐藏卷的密码。这种模式打开外层卷,但VeraCrypt知道含有隐藏卷,写数据时不会覆盖隐藏卷占用的空间,数据是安全的。往外层卷写入大量数据,即使外层卷空间不足,VeraCrypt也不会往隐藏卷上写数据,而是直接提示“写入失败”。如果有十分重要的数据需要放在隐藏卷中,外层加密卷应该存放一些“相对”不那么重要的文件,用以蒙蔽胁迫你说出密码的人。但千万要记住,不要说出隐藏卷的密码,否则会直接解锁隐藏卷!加密系统分区/设备如果想更安全的保护设备,可以考虑对系统盘/分区也进行全盘加密。系统盘加密后,系统启动过程中要先输入密码,解密硬盘数据后才能正常启动操作系统。目前MacOS、iOS、安卓等操作系统均支持使用全盘加密,硬盘拆下来也无法在其他设备上读取数据,大大提高安全性。VeraCrypt仅支持对Windows进行系统盘加密,并且不支持2003等旧系统、安腾架构以及移动设备:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“665” height=“247” class=“aligncenter size-large wp-image-3182” />此功能耗时较长。本人未试验,暂不提供详情。实用建议以下是一些实用建议,能帮助你更好的保护隐私数据:实用文件卷加密数据时,文件名和后缀尽量选有欺骗性的,并将其放在常规地方。例如文件卷取名"Window10多合一纯净版.iso",放在“软件/操作系统”文件夹下。对10G以下的加密卷,即使设备丢失后亦不会有人怀疑其中包含敏感数据。相反一个好几G大小的txt或者word文件就会让人很生疑。如果有更私密的数据,建议使用隐藏卷功能;文件加解密有一定的性能损耗,请选择必要的文件放入加密卷/设备内;妥善管理密码,并建议加密时添加辅助解密的密钥文件;如果可以,对新电脑使用全盘加密;将移动设备某个区作为加密分区使用,其他分区为普通分区。总结本人对VeraCrypt进行了简要介绍,并给出Windows上的使用说明。如有错误,敬请指正!感谢阅读!参考TrueCrypt项目主页维基百科:TrueCryptVeraCrypt主页维基百科:VeraCryptVeraCrypt的SourceForge主页VeraCrypt安全审计结果多种流行的固态硬盘产品存在硬盘加密机制绕过漏洞ArchLinux:磁盘加密维基百科:硬盘加密软件比较唐缘:保护你的设备 ...

February 11, 2019 · 1 min · jiezi

系统出现大量HTTP Auto Proxy Detection Worker Process

转载请注明文章出处:https://tlanyan.me/many-http-…今天打开任务管理器,发现有大量“HTTP Auto Proxy Detection Worker Process”进程,画风如下:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“1002” height=“890” class=“aligncenter size-full wp-image-3215” />根据进程名称,应该和代理有关,因为电脑上开着Shadowsocks。但是这么多什么鬼?打群架吗?退出SS程序,发现这些进程不会随之退出。意识到这超出了我的知识范围,于是马上打开Google学学。根据有限的搜索结果,基本上确认和SS有关,并且仅会出现在1809版的Windows 10上。我今天才发现这个现象,顺便确认了系统是1809版的bug10:<img src=“https://tlanyan.me/wp-content...; alt=”" width=“690” height=“619” class=“aligncenter size-full wp-image-3216” />花了一个多小时理解WPAD、PAC和pacjsworker.exe关系,并加上自己反复测验,得到一些结论:HTTP Auto Proxy Detection Worker Process进程的程序文件是"C:WindowsSystem32pacjsworker.exe",由WPAD服务启动;这些进程不能手工杀死,重启系统才能解决,用户退出(logout)再登录也不行;WPAD服务(Win HTTP Web Proxy Auto Discovery Service)的属性不能修改,通过重启WPAD服务杀死进程的路也不通;1809版本才会出现,在这之前版本的系统上运行正常;根据Twitter链接https://twitter.com/epakskape…情况复现:打开SS客户端,选择PAC模式,勾选启用系统代理;然后按电源键(或其他方式)让电脑进入休眠;接着唤醒电脑进入桌面,任务管理器中就多了一个HTTP Auto Proxy Detection Worker Process进程;如此反复进入休眠又启动,每次都会出现一个新进程;后来发现不需要休眠也能复现情况:打开SS客户端,选择PAC模式,打开任务管理器;然后不断禁用/启用系统代理,在任务管理器窗口中可实时看到每次启用系统代理后都会多一个进程;最新版的SS客户端依然有这个问题;每次SS启动系统代理后的PAC地址均不同;PAC地址中的secret参数仅在勾选“保护本地PAC(secure local PAC)”选项时才会出现,但t参数一直都在。根据网上知识,加上个人实验和思考,对问题原因的理解为:WPAD是系统关键服务,用户不能更改;以PAC模式启动SS时,SS会在LAN配置中设置一个新的PAC脚本地址;WPAD检测到有新的PAC脚本地址,唤醒一个新的pacjsworker.exe进程监听该地址;PAC地址失效后,监听进程不退出,于是进程堆积,慢慢出现几十上百个进程的壮观场景。总结问题根源:1. Windows 10的进程不自动退出;2. 每次从休眠过来后,SS客户端生成不同的PAC地址并将其配置到LAN设置中。把问题搞清楚了,解决方案基本上章口就莱:使用全局模式;全局模式不会设置PAC配置脚本,WPAD服务也就不会拉起新的进程;等待巨硬修复问题;去年下半年就爆出问题,到现在问题依旧,应该有得等(本人最近才更新1809版本,故而发现得迟);另外我不认为这是巨硬的锅,他们未必会修复;重新编译SS客户端,生成相同的PAC(至少未重启SS客户端前PAC地址应一致)。我的解决方案是重新编译SS客户端,根据 @Joelism 的提示及自己理解,做了两个方案的客户端:方案一:总是生成相同的PAC地址,除非人工编辑"pac-secret.txt"文件。改动代码如下:<pre>// 文件: shadowsocks-csharpControllerServicePACServer.cspublic void UpdateConfiguration(Configuration config){this._config = config;if (config.secureLocalPac){// 注释掉部分// var rd = new byte[32];// RNG.GetBytes(rd);// PacSecret = $"&secret={Convert.ToBase64String(rd)}";if (!File.Exists(PAC_SECRET_FILE)){ var rd = new byte[32]; RNG.GetBytes(rd); string secret = Convert.ToBase64String(rd); PacSecret = $“secret={secret}”; File.WriteAllText(PAC_SECRET_FILE, secret);}else{ PacSecret = $“secret={File.ReadAllText(PAC_SECRET_FILE)}”;}}else{PacSecret = “”;}// 注释掉部分// PacUrl = $“http://127.0.0.1:{config.localPort}/pac?t={GetTimestamp(DateTime.Now)}{PacSecret}";PacUrl = $“http://127.0.0.1:{config.localPort}/pac?{PacSecret}”;}</pre>这个方案保证不管系统休眠重启,还是退出SS客户端再打开,都只会有一个HTTP Auto Proxy Detection Worker Process进程。仅当系统中无PAC进程运行时才生成新的PAC地址并设置到LAN中。代码如下:<pre>// 文件: shadowsocks-csharpControllerShadowsocksController.csprotected void Reload(){Encryption.RNG.Reload();// some logic in configuration updated the config when saving, we need to read it again_config = Configuration.Load();StatisticsConfiguration = StatisticsStrategyConfiguration.Load();if (privoxyRunner == null) { privoxyRunner = new PrivoxyRunner(); } if (_pacServer == null) { _pacServer = new PACServer(); _pacServer.PACFileChanged += pacServer_PACFileChanged; _pacServer.UserRuleFileChanged += pacServer_UserRuleFileChanged; // 这一行代码从外部移入 _pacServer.UpdateConfiguration(_config); } // 每次唤醒都更新的代码删除 // _pacServer.UpdateConfiguration(_config); if (gfwListUpdater == null) { gfwListUpdater = new GFWListUpdater(); gfwListUpdater.UpdateCompleted += pacServer_PACUpdateCompleted; gfwListUpdater.Error += pacServer_PACUpdateError; }这个方案保证不退出SS客户端情况下只有一个pacjsworker.exe进程。缺点是如果频繁退出并重启SS客户端,同样会出现有大量进程的现象。根据源代码思路,我认为第二种方案更合理,是原作者想要的。当然你应该想得到,我是先根据网上提示实现方案一,测试达到效果后继续思考才做出的方案二。从这个角度也是方案二更合理。两个方案的exe文件我都编译好了,需要请自取:方案一 方案二稍后我会发一个pull request到官方库,使用方案二修复该问题。问题相关网页https://github.com/shadowsock…https://github.com/XX-net/XX-...https://github.com/shadowsock...https://github.com/shadowsock...https://steamcn.com/t430331-1-1http://bbs.pcbeta.com/forum.p… ...

February 11, 2019 · 1 min · jiezi

四个月技术写作,我写了些什么?

从去年国庆节开始,我连续更新了 4 个月公众号,累计发布原创文章 40 篇。按照大多数个人订阅号的优良传统,号主应该在跨年的前后作年终总结。然而,一来我反应比较迟钝,没跟上节奏,二来当时我正在写比较重要的系列,没时间分心,所以还是慢了半拍。现在,创作出现了空档期,而身体也出现一种魔幻性的跨移——从几千里外的城市回到分别了几百天的农村。这仿佛就在营造一种仪式感,逼使我要把这未完成的任务做个了结。因此,现在我就来梳理梳理写出来的东西,说说我的想法吧。1、Python猫的故事这是我的主打系列,故事的主角是一只来自外太星(喵星)的猫。它外貌长什么样,我还没想好,你可以叠加所有猫的形象上去,这就是它的样子。然而,它绝不是一种固定形态的物种。编程语言(Python为主)、人类文化(文学+哲学)、人工智能、前沿科学(生物+量子物理)和幻想相交合,这些东西都会是我的灵感,也会是塑造这只猫的原力。我们认识周遭世界的过程是一种逐步扩大的过程,从点到线,到理得清的网,再到真正的网。一只作为讲述者的猫,在思考,在探知并试图融入陌生的星球的时候,会发生些什么认知层面上的结果呢?我有很多朦胧的念头。想要完全落实它们,简直不可能。有些东西就是说不清。不过,有了开端,有了大致的方向,就总是有了提起“笔”写下去的动机。有了Python,我能叫出所有猫的名字Python对象的身份迷思:从全体公民到万物皆数Python对象的空间边界:独善其身与开放包容2、Python进阶之路我接触 Python 的时间并不长,在工作中用到它的时间就更短了。因为清楚地意识到自己的基础并不扎实,所以,几个月以来,我花了不少时间系统性地学习了一些内容。写作前,搜集资料,查漏补缺;写作中,发散思考,融会贯通;发布后,聆听反馈,修正错误。时间过得真快,现在能拿得出手的也就仅仅是字符串系列、切片系列和迭代器系列了。我计划继续花些时间,把重要的知识梳理一遍。通过这个系列的写作,我想驱动自己走出一条 Python 进阶之路。然后以它为基础,再进行其它领域(爬虫、数据分析、深度学习、?)的转向。在准备生成器系列的时候,我一时起了翻译 PEP 的念头,就开启了翻译 PEP 的系列。现在试水了两篇生成器相关的,年后还会翻译一篇。关于翻译,我有一些想法,今后再细说。这个系列的一些内容,其实是在给 Python 猫系列打基础做铺垫。今后,我会避免两个系列的内容重叠,也不让它们失衡,因此会想办法给 Python猫 系列留下足够的写作余地。超强汇总:学习Python列表,只需这篇文章就够了学习Python操作JSON,网络数据交换不用愁给Python学习者的文件读写指南(含基础与进阶,建议收藏)再谈文件读写:判断文件的几种方法及其优劣对比Python中的“特权种族”是什么?详解Python拼接字符串的七种方式你真的知道Python的字符串是什么吗?你真的知道Python的字符串怎么用吗?Python是否支持复制字符串呢?join()方法的神奇用处与Intern机制的软肋Python进阶:切片的误区与高级用法Python进阶:迭代器与迭代器切片Python进阶:全面解读高级特性之切片!Python进阶:设计模式之迭代器模式为什么range不是迭代器?range到底是什么类型?[[译] PEP 255–简单的生成器](https://mp.weixin.qq.com/s/vj...[[译]PEP 342–增强型生成器:协程](https://mp.weixin.qq.com/s/M7...3、荐书系列关于荐书系列,我是受到了经常阅读的一些电影公众号的启发。如果有一部好电影,大家就会花很长篇幅去推介它,去评论它,去宣传它。对于一些非技术类的书籍,也很可能有此待遇。可是,我们却不怎么见到技术类书籍是这样的吧?除去出版社、作者和利益相关机构,你几乎看不到有人为一本技术书籍写书评(写笔记、画思维导图的倒是挺多)。于是,我决定来尝试一下。有几篇,我特意提到了豆瓣评分和评论,现在看来模仿的痕迹太重,这类玩意对技术类书籍来说,真不合适。纯探索阶段,希望今后能拿出更好的作品。这个系列,主要还有一个考虑:促使我自己去阅读,逼着自己学会总结归纳,多产生一些积累。《编写高质量代码改善 Python 程序的 91 个建议》《Python最佳实践指南》《黑客与画家》《Python源码剖析》《Python高性能编程 》4、杂七杂八这部分内容也是跟技术息息相关的,例如 Python社区动态、技术写作、编程思想、技术翻译等等。其中,关于社区治理模式投票的几篇文章,我最初以为是个热点,但后来意识到,真的没有多少人关心。(我该怀疑自己的关注点呢,还是怀疑别人?)值得庆幸的是,有篇文章被两位圈内大佬转载了!我乐了好久。这里就不提名字了,总之他们是我初学 Python 时就很佩服的人,因为看了他们的一些文章,我才动了写技术文章的念头。关于技术写作和翻译,我初见门道,今后还会多作总结分享。来自Kenneth Reitz大神的建议:避免不必要的面向对象编程学习Python,怎能不懂点PEP呢?再聊聊Python中文社区的翻译Python之父退位后,最高决策权花落谁家?这件正在发生的事,关乎所有的Python开发者……最新进展|关于Python治理模式的投票Python决策权的投票结果诞生了,“指导委员会”模式拔得头筹聊聊技术写作的个人体会大名鼎鼎的Requests库用了什么编码风格?5、写在最后我承认自己是一个不擅运营的人,虽然为了提升公众号的订阅数与阅读数,也做过一些运营的尝试,但是,跟圈内的很多号主相比,差得可不止一丝半点。四个月以来,我结识了很多技术写作的号主,他们有些人创号不久,但不仅技术扎实,而且抓选题、抓热点和写作风格都极其出色,很快就成为了“当红炸子鸡”;还有的大佬,持续耕耘了几年,坐拥数十万粉丝,立品牌、出书、出课程、开知识付费、开公司,替技术人走出了一条名利双收的榜样之路。他们令我羡慕。他们皆有值得我学习取经的优点。不过我也知道,坚持自己的原则、发展自己的特色更为重要。做人也好,写公众号也好,循着自己的本心与节奏,才不至于走歪了路。所以,在以上几个系列的写作方向上,我仍会继续坚持,沉下心来学习,思考和分享。这个阶段性的小结,既是一个交代,也是新的开端。—————–本文原创并首发于微信公众号【Python猫】,后台回复“爱学习”,免费获得20+本精选电子书。

February 3, 2019 · 1 min · jiezi

2.进程

进程管理进程的基本概念进程与程序的区别进程控制进程同步进程通信线程进程的基本概念程序在并发环境中的执行过程资源分配和独立运行的基本单位程序的顺序执行一个有4条语句的程序段:S1:a:=x+2;S2: b:=y+4;S3: c:=a+b;S4: d:=c+b;程序顺序执行的特征顺序性封闭性可再现性顺序性处理机的操作严格按照程序所规定的顺序执行,即每一个操作必须在下一个操作之前结束。封闭性程序在封闭的环境下执行,结果不受外界因素的影响。可再现性只要环境和初始条件相同,程序重复执行时总得到相同结果。程序的并发执行一个有4条语句的程序段:S1:a:=x+2;S2: b:=y+4;S3: c:=a+b;S4: d:=c+b;S1和S2可以同时执行-》S3-》S4程序并发执行的特征间断性 共享、合作、制约导致,执行->暂停->执行失去封闭性 资源状态由多程序改变不可再现性 相同环境和初始条件, 重复执行,结果不同程序AL1: N:=N+1goto L1程序BL2: PRINT (N) N:=0goto L2设共享变量N初始值为5,则会产生3种执行结果:6,6,05,0,15,6,0进程的特征结构特征动态性并发性独立性异步性进程的结构功能描述进程控制块(PCB)动态特征的集中反映程序段描述要完成的功能数据段操作对象及工作区动态性进程最基本的特征是动态性进程的生命周期:进程由创建产生,由调度而执行,由撤销而消亡的过程。并发性多个进程同在内存中,且能在一段时间内同时运行。独立性进程是一个能独立运行、独立分配资源、独立接受调度的基本单位异步性进程按各自独立的、不可预知的速度向前推进进程的定义进程是进程实体的运行过程,是系统进行资源分配和调度的基本单位。进程和程序的关系(1)进程是一个动态概念,程序是一个静态概念(2)进程具有并行特征,程序没有(3)进程是竞争资源的基本单位(4)一个程序对应多个进程,一个进程为多个程序服务。进程的三种基本状态就绪状态运行状态阻塞状态就绪状态进程已经分配了除处理机以外的所有必要资源,只要再获得处理机就能执行的状态这样的进程可以有多个,通常排成一个队列,称就绪队列。执行状态已经获得CPU,正在运行在单处理机系统中,只有一个进程处于执行状态。多处理机系统则有多个处于执行状态。阻塞状态正在执行的进程由于发生了某事件而暂时无法继续执行时,放弃处理机而进入的状态,又称等待状态引起阻塞的事件:请求I/O,申请缓存。挂起状态引入原因(1)终端用户请求(2)父进程请求(3)负荷调节需要(一般在实时操作系统中使用)(4)操作系统的需要挂起引起的状态转换静止状态(挂起状态)活动状态(非挂起状态)引入挂起概念后,原先的进程的三种状态就变成了5种: (1)执行(2)活动就绪(3)静止就绪(4)活动阻塞(5)静止阻塞进程控制块Process Control BlockPCB是OS中最重要的记录型结构OS用PCB对并发进程进行管理和控制PCB是进程存在的唯一标志PCB常驻内存PCB专门开辟PCB区将所有的PCB组织成若干个链表或队列结构体(structure)for example:一个学生的自然信息(姓名,性别,年龄,生日……)PCB中的信息(1)进程标识符(2)处理机状态(3)进程调度信息(4)进程的控制信息进程标识符(1)内部标识符进程唯一的数字编号,给OS使用(2)外部标识符由字母、数字组成,给用户使用处理机状态处理机中的主要寄存器(1)通用寄存器8~32个,暂存信息用(2)指令计数器 要访问的下一条指令的地址(3)程序状态字PSW 条件码、执行方式、中断屏蔽标志(4)用户栈指针 用户进程拥有的系统栈,存放过程和系统调用参数及调用地址。进程调度信息进程状态进程优先级与调度算法有关信息事件 如:阻塞原因进程控制信息程序和数据地址进程同步和通信机制资源清单:除CPU之外的所需资源与已经分配资源清单链接指针:本进程PCB所在队列的下一个地址PCB的组织方式(1)链接方式把统一状态的PCB,用其中的链接字链接成一个队列。如,就绪队列、阻塞队列(根据不同阻塞原因)、空白队列。(2)索引方式建立就绪索引表、阻塞索引表等。把索引表在内存的首地址放在内存的专用单元中。链接方式索引方式

January 31, 2019 · 1 min · jiezi

如何在WSL下使用VS Code

自微软开始宣布拥抱开源以来,我认为微软发布的最棒的两大功能是:Visual Studio Code(VS Code)和Windows子系统Linux(WSL),有了这两者的结合,它为软件开发人员开辟了一条新的编写代码的途径。WSL使开发人员能够在Windows 10上运行Linux环境,而无需付出更多使用虚拟机时的开销。使用WSL,我们可以从Windows应用商店上安装大多数Linux正式版,我们甚至还能在其GUI上运行Bash shell脚本和Linux应用程序。本文提供了详细的WSL配置分步说明,便于我们能够通过WSL在Linux上运行VS Code。虽然本文的标题是《 在WSL下使用VS Code》,但也同样适用于其他GUI应用程序。本文中使用的软件包括:Windows 10 1809Ubuntu 18.04Visual Studio Code 1.30.2MebaXTerm 11.1本文目录:启用WSL安装Linux下载并安装MobaXterm启动MobaXterm并打开X Server在已安装的Linux上安装X Client启动VS Code除了Windows 10和VS Code之外,我们还需要X Server和X Client来使VS Code与WSL协同工作。在Linux的世界中, X Window System扮演着为构建GUI环境必要的基本框架角色。 X Window System使用客户端 - 服务器模型,已实现与远程计算机以图形界面连接。 因此,要使用我们的本地计算机(例如笔记本电脑)连接到远程Linux计算机,我们需要:在远程Linux机器上运行X Client应用程序在本地计算机上运行X Server应用程序远程X客户端与本地X服务器建立连接并提供该应用程序的图形界面。所以使用此技术,就可以使用WSL运行VS Code。X Server为我们提供了我们要运行的图形环境,由于WSL的Bash不支持X Server,因此通过选型在这里我选择了配置更为简单的MobaXterm。打开WSL功能在我们安装Linux发行版之前,我们需要启用WSL。 为此,首先在搜索栏上输入“打开或关闭Windows功能”。然后在打开的窗口勾选 “WSL”单击“确定”按钮后,我们可能需要重启机器。现在,我们在Windows 10上启用了WSL。(有关WSL的更多详细信息,请访问https://docs.microsoft.com/en…)安装Linux(Ubuntu)如果启用了WSL功能,那么我们就可以将Linux安装到Windows 10上了。在Windows应用商店搜索Ubuntu。安装完成后启动启动Ubuntu后,请按照说明创建用户帐户。Ubuntu全部配置完成后,我们继续安装MobaXterm安装并设置MobaXterm首选我们从官网下载MobaXterm,他们官网提供了绿色版和安装版两种版本。选哪个看个人喜好,实际使用上区别不大,我这里使用的是绿色版。解压完成后启动程序,点击启动X Server(如下图)而后,X Server就启动了。配置X Client如开头所述,X Client是我们想要远程访问的应用程序。在本文里,这个应用程序是VS Code。 为此,请按照以下步骤操作:启动命令提示符在命令提示符下,键入bash以进入Ubuntu bash。输入命令 $ export DISPLAY=localhost:0.0. 我们也可以在 ~/.bashrc添加这个命令, 这样我们每次登录时就都不需要再重复这样的工作了<g class=“gr_ gr_9 gr-alert gr_tiny gr_gramm gr_inline_cards gr_run_anim Grammar multiReplace” id=“9” data-gr-id=“9”>in.export DISPLAY=localhost:0.0 告诉X Client应用程序的具体IP信息,因为我们在本机执行该命令,所以使用的是localhost,如果你使用的是远程计算机,请改掉localhost部分安装VS Code现在,我们可以下载VS Code并安装到Ubuntu上。在这我们使用Firefox下VS Code,这能再之后减少很多麻烦。命令如下:$ sudo apt update$ sudo apt install firefox启动Firefox以下载VS Code下载的VS Code Debian软件包应该位于 ~/Download.目录内$ cd ~/Download$ sudo dpkg -i code_1.30.2-1546901646_amd64.deb注:如果因为一些依赖问题而导致安装失败,请先安装依赖库,如下:$ sudo dpkg -i code_1.30.2-1546901646_amd64.debSelecting previously unselected package code.(Reading database … 42604 files and directories currently installed.)Preparing to unpack code_1.30.2-1546901646_amd64.deb …Unpacking code (1.30.2-1546901646) …dpkg: dependency problems prevent configuration of code: code depends on libnotify4; however: Package libnotify4 is not installed. code depends on libnss3 (>= 2:3.26); however: Package libnss3 is not installed. code depends on libxkbfile1; however: Package libxkbfile1 is not installed. code depends on libgconf-2-4; however: Package libgconf-2-4 is not installed. code depends on libsecret-1-0; however: Package libsecret-1-0 is not installed. code depends on libxss1; however: Package libxss1 is not installed. dpkg: error processing package code (–install): dependency problems - leaving unconfiguredProcessing triggers for mime-support (3.60ubuntu1) …Errors were encountered while processing: code安装依赖库sudo apt install libnotify4 libnss3 libxkbfile1 libgconf-2-4 libsecret-1-0 libgtk-3-0 libxss1如果出现如下错误,请尝试sudo apt -fix-broken install命令重新安装Reading package lists… DoneBuilding dependency treeReading state information… Donelibgtk-3-0 is already the newest version (3.22.30-1ubuntu1).libgtk-3-0 set to manually installed.You might want to run ‘apt –fix-broken install’ to correct these.The following packages have unmet dependencies: libgconf-2-4 : Depends: gconf2-common (= 3.2.6-4ubuntu1) but it is not going to be installed Recommends: gconf-service but it is not going to be installed libnss3 : Depends: libnspr4 (>= 2:4.12) but it is not going to be installed libsecret-1-0 : Depends: libsecret-common but it is not going to be installedE: Unmet dependencies. Try ‘apt –fix-broken install’ with no packages (or specify a solution).安装完成后,启动VS Code。$ code注意:一旦我们启动了VS Code,我们可能会无法移动或调整VS Code的窗口。这是因为自VS Code 1.30以来默认启用了Linux上的自定义磁贴和菜单栏。 为了能够避免这一问题,我们需要将设置更改为native。首先,打开VS Code设置。[文件 - >首选项 - >设置]其次,在搜索栏上键入title bar,然后选择native。重启VS Code,现在我们应该已经可以移动和调整VS Code窗口和大小了。结论使用WSL和X Server,我们可以在Windows 10上安装Linux并使用图形界面运行Linux上的应用程序。 但是,这时候可能有人会问,我们为什么要这样做? 为什么不直接在Windows上使用VirtualBox或VMware等虚拟机或者使用其他Linux机器?当然,大多数情况下这些方式没有问题,但在某些个别情况下,这样的方式并不适用。 例如:没有强大的工作站,运行虚拟机会导致机器很慢。没有预算购买另一台机器来运行Linux。由于网络的延迟,在云上运行带有图形界面的应用程序可能会很慢。WSL提供了一种简单而廉价的解决方案,我们可以在我们更熟悉的Windows 10环境中运行Linux和Linux应用程序。本文是由葡萄城技术开发团队发布,转载请注明出处:葡萄城官网了解葡萄城开发工具了解葡萄城开发者解决方案 ...

January 30, 2019 · 2 min · jiezi

IP地址、子网掩码、网关、路由器等知识积累

(一) 问题解析问: IP地址,子网掩码,默认网关,DNS服务器,有什么区别呀?我知道没有IP地址就不能上网,我也知道没设DNS就不能上外网,可它们都有什么功能,有什么区别呢?还有真奇怪,我的计算机没设DNS,竟然能上QQ,却不能打开网页,这是为什么呢?答: IP是32位二进制数据,通常以点分十进制表示。IP地址是一种逻辑地地址,用来标识网络中一个个主机,IP有唯一性,即每台机器的IP在全世界是唯一的。DNS是域名服务器,用来解析域名的(域名与IP之间的解析),如果没有这东西,你必须输入网站的IP地址,有了DNS,你就可以直接输入网址。因为上QQ不需要有DNS(QQ只是一个客户端程序,用不到DNS),只有浏览网页(需输入网址时)才用到DNS。(二)DNS服务器DNS是指:域名服务器(Domain Name Server)。在Internet上域名与IP地址之间是一一对应的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS就是进行域名解析的服务器 。(详见文化基础P242)(三)IP地址电脑之间要实现网络通信,就必须要有一个合法的ip地址。IP地址=网络地址+主机地址,(又称:主机号和网络号组成)ip地址的结构使我们可以在Internet上很方便的寻址。ip地址通常用更直观的,以圆点分隔号的四个十进制数字表示,每个数字从0到255,如某一台主机的ip地址为:128.20.4.1在局域网里,同样也需要ip地址,一般内网的ip地址是以192.168开头的,这样很容易区分公网和内网的ip地址。(四)子网掩码子网掩码是用来判断任意两台计算机的ip地址是否属于同一子网络的根据。最为简单的理解就是两台计算机各自的ip地址与子网掩码进行and运算后,得出的结果是相同的,则说明这两台计算机是处于同一个子网络上的,可以进行直接的通讯。(具体子网掩码各位的含义待补充。)(五)网关大家都知道,从一个房间走到另一个房间,必然要经过一扇门。同样,从一个网络向另一个网络发送信息,也必须经过一道“关口”,这道关口就是网关。顾名思义,网关(Gateway)就是一个网络连接到另一个网络的“关口”。也就是网络关卡。PS: 网关是2台设备互通的地址,网关可以设置在路由器上,一般一个局域网会设置一个网关,供一个网段访问。网关的作用:就是将两个使用不同协议的网络段连接在一起的设备。它的作用就是对两 个网络段中的使用不同传输协议的数据进行互相的翻译转换。好比是个门,对家庭来说门是门,对国家来说海关是门。在局域网里来说集线器就是网关,在二层网络里,交换机就是网关,在三层网络里路由就是网关,说网关要看你的网是多大的,要拿中国来说,连着美国那台世界服务器的设备就是网关。(六)路由器路由器是一个硬件,网关是2台设备互通的地址,网关可以设置在路由器上,一般一个局域网会设置一个网关,供一个网段访问。路由器包含许多这样的网关,其中之一是默认网关。也就是说数据到了路由器以后,如果不知道自己下一步该怎么走了,那么他会去默认网关那里去报道。 但路由器还包含许多其他的网关,比如数据要去买饮料,那么路由器就送数据去小卖铺。如果数据内急,那么路由器送数据去卫生间。这种起点-终点的对应就叫路由。参考地址:https://www.cnblogs.com/santi…

January 28, 2019 · 1 min · jiezi

前嗅ForeSpider教程:采集58同城

今天小编为大家带来的教程是,采集58同城数据,同样适用于其他类似网站,具体操作如下:第一步:新建任务①点击左上角“加号”新建任务,如图1:②在弹窗里填写采集地址,任务名称,如图2:③点击下一步,选择进行数据抽取还是链接抽取,首先采集58同城·便当分类下的分类列表的链接,所以点击抽取链接,如图3:④完成后模板抽取配置列表有一个模板,默认模板,如图4:第二步:创建链接抽取,通过定位过滤得到所需链接①直接点击“默认模板:01”,点击上面“新建链接抽取”按钮,得到链接抽取,如图5。②按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域,点击“确认选区”按钮,如图6:③点击采集预览确认链接是否过滤完全,如图7:第三步:创建新模板,并添加链接抽取①在模板配置,点击“新建模板”按钮,得到新建模板,如图8。②将模板一过滤得到的任意一条链接,作为模板二的示例地址。如:https://biandang.58.com/cn/sh…, 见图9:③新建数据抽取。直接点击模板二,点击上面“新建数据抽取”按钮,得到数据抽取,如图10。④关联模板在软件中模板的关联关系,与网页中链接跳转的关系相同。根据网页跳转规律,将模板一的“新建链接抽取”关联模板二,如图11第四步:通过定位过滤得到文章列表所需链接①按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域,点击“确认选区”按钮,如图12:②鼠标右键点击模板二,模板预览,如图13:③确认链接是否过滤完全,如图14:第五步:创建新的模板,并新建数据抽取①在模板配置,点击“新建模板”按钮,得到新建模板,重命名为正文数据模板,如图15。②新建数据抽取。直接点击模板二,点击上面“新建数据抽取”按钮,得到数据抽取,如图16。③将模板二过滤得到的任意一条链接,作为模板三的示例地址。如:https://biandang.58.com/cn/ch…, 见图17:④关联模板在软件中模板的关联关系,与网页中链接跳转的关系相同。根据网页跳转规律,将模板二“新建链接抽取”关联模板三,如图18。第六步:创建/选择表单在ForeSpider爬虫中,表单是可以复用的,所以可以在数据表单出直接选择之前建过的表单,也可以通过表单ID来进行查找并关联数据表单。此处使用的是方法三。方法一:通过下拉菜单或表单ID选择已有表单方法二:点击创建表单进入快速建表页面,新建表单。方法三:点击“采集配置”-“数据建表”,点击采“采集表单”后面的如图19:第七步:配置表单根据所需内容,配置表单字段(即表头),此处配置了包括网页主键、文章标题、访问量、发布时间、文本内容5个字段,表单如图20:第八步:字段取值取值方法:按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域。点击:“确认选区”按钮,确认操作tit、read_num、pub_date、text字段,如图21:第九步:模板预览①鼠标右键点击模板三,然后点击“模板预览”,如图22:②预览结果如图23:第十步:采集预览①点击右上角采集预览,如图24:②双击任意一条链接,看看是否可以得到和网页对应的规整的数据,如图25、26:

January 25, 2019 · 1 min · jiezi

前嗅ForeSpider教程:采集美团网

今天,小编为大家演示一下,如何采集美团网数据,具体操作如下:第一步:新建任务①点击左上角“加号”新建任务,如图1:②在弹窗里填写采集地址,任务名称,如图2:③点击下一步,选择进行数据抽取还是链接抽取,首先当前检索结果列表链接,所以点击抽取链接,选择链接抽取,如图3:④完成后模板抽取配置列表有两个个模板,默认模板和新建模板,模板一的默认链接抽取已与模板二关联,如图4:第二步:通过地址过滤,得到所需的链接。①点击采集预览,在采集预览中有于目标链接相似的其他链接,可通过地址过滤得到列表链接。找到所需要的列表链接,右击复制链接,“https://www.meituan.com/meish…”如图5所示。②勾选地址过滤,过滤规则选择包含,将复制的目标地址粘入,使用过滤串“d”得到列表链接,如图6所示。过滤串规则说明:d 表示一串(个)数字③点击采集预览确认链接是否过滤完全,如图7第三步:填写模板二示例地址并新建数据抽取①将模板一过滤得到的任意一条链接,作为模板二的示例地址。如:https://www.meituan.com/meish…, 见图8:②新建数据抽取方法一:通过点击“下一步”后勾选抽取数据,再次点击“下一步”得到数据抽取。方法二:直接点击模板二,点击上面“新建数据抽取”按钮,得到数据抽取,如图9:第四步:创建/选择表单在ForeSpider爬虫中,表单是可以复用的,所以可以在数据表单出直接选择之前建过的表单,也可以通过表单ID来进行查找并关联数据表单。此处使用的方法三。方法一:通过下拉菜单或表单ID选择已有表单方法二:点击创建表单进入快速建表页面,新建表单。方法三:点击“采集配置”-“数据建表”,点击采“采集表单”后面的如图10:第五步:配置表单根据所需内容,配置表单字段(即表头),此处配置了网页主键、标题、联系方式、联系地址共4个字段,表单如图11:第六步:字段取值① 先关联表单,如图12所示。② 字段取值是在数据模板位置写脚本,来给对应字段赋值,如图13所示。代码如下:var str=DOM.GetSource().ToStr().Middle(""detailInfo":",","photos""); //获取网页源码包含数据部分内容jScript js;var obj=js.RunJson(str); //生成json对象record re;re.id=MD5(URL.urlname);//给主键字段生成唯一标识re.tit=obj.name; //标题名称re.addr=obj.address; //店铺地址re.tel=obj.phone; //店铺电话RESULT.AddRec(re,TMPL.fstdoc.schemaid); //将所有的字段放入结果集第七步:模板预览①鼠标右键点击“数据抽取”,然后点击“模板预览”,如图14所示。②预览结果,如图15所示。第八步:采集预览①点击右上角采集预览,如图16所示。②双击任意一条链接,看看是否可以得到和网页对应的规整的数据,如图17、18所示。

January 24, 2019 · 1 min · jiezi

前嗅ForeSpider教程:采集黄页88

今天小编为大家带来的教程是:采集黄页88,同时也适用于采集其他的企业信息网站,具体操作流程如下:第一步:新建任务①点击左上角“加号”新建任务,如图1:②在弹窗里填写采集地址,任务名称,如图2:③点击下一步,选择进行数据抽取还是链接抽取,本次采集当前列表页联系方式链接,正文数据是通过点击列表链接进入的,所以本次需要抽取列表链接,所以点击抽取链接,翻页选择普通翻页,如图3:④完成后模板抽取配置列表有两个模板,默认模板和链接列表。默认模板下自动生成两个链接抽取,一个为链接列表抽取,已与模板“链接列表”关联,一个为普通翻页链接,此链接已与默认模板自身关联,如图4。第二步:通过地址过滤,得到所需的联系方式链接。①点击采集预览,在采集预览中有于目标链接相似的其他链接,可通过地址过滤得到联系方式链接。找到所需要的链接,右击复制链接,如图5所示。②勾选地址过滤,过滤规则选择包含,将复制的目标地址粘入,使用公共部分“company_contact.html”进行地址过滤,得到所需链接,如图6所示。③点击采集预览确认链接是否过滤完全,如图7第三步:过滤翻页链接①在采集预览中选择普通翻页,在采集预览中有于目标链接相似的其他链接,可通过地址过滤得到列表链接。找到所需要的列表链接,观察得出所需要的目标链接都包含“pn+数字”。使用过滤串“d”,右击复制链接,如图8所示。过滤串规则说明:d 表示一串(个)数字②勾选地址过滤,过滤规则选择包含,填入“pnd”,得到列表链接,如图9所示。③右击模板一,选择模板预览,采集预览确认链接是否过滤完全,如图10:第四步:填写模板二示例地址并新建数据抽取①将模板一过滤得到的任意一条链接,作为模板二的示例地址。如:http://b2b.huangye88.com/qiye…, 见图11:②新建数据抽取方法一:通过点击“下一步”后勾选抽取数据,再次点击“下一步”得到数据抽取。方法二:直接点击模板二,点击上面“新建数据抽取”按钮,得到数据抽取,如图12第五步:创建/选择表单在ForeSpider爬虫中,表单是可以复用的,所以可以在数据表单出直接选择之前建过的表单,也可以通过表单ID来进行查找并关联数据表单。此处使用的方法三。方法一:通过下拉菜单或表单ID选择已有表单方法二:点击创建表单进入快速建表页面,新建表单。方法三:点击“采集配置”-“数据建表”,点击采“采集表单”后面的如图13:第六步:配置表单根据所需内容,配置表单字段(即表头),此处配置了网页主键、联系人、联系方式、公司名称、公司网址链接共5个字段,表单如图14:第七步:字段取值①在数据抽取部分导入表单:黄页,如图15所示②Per_name字段。如图16所示,绿框选中联系人,确认选区,然后选择脚本处理,取值“:”之后的姓名。选区取值方法:按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域。代码:return VALUE.Right(":");代码如图17所示。③Com_name 字段。同per_name字段,绿框选中公司名称,确认选区,然后选择脚本处理,取值“:”之后的名称。选区取值方法:按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域。代码:return VALUE.Right(":");④Tel 字段。如图18所示,因为在模板预览中链接标题就是手机号,所以采用了高级取值—脚本取值。直接在脚本处写上“return URL.title;” 即链接标题名为手机号,如图19所示。代码:return URL.title;⑤Link字段。采集内容选择网页信息>网页地址,保存即可,如图20所示。第八步:模板预览①鼠标右键点击“数据抽取”,然后点击“模板预览”,如图21。②预览结果,如图22所示。第九步:采集预览①点击右上角采集预览,如图23:②双击任意一条链接,看看是否可以得到和网页对应的规整的数据,如图24所示。

January 23, 2019 · 1 min · jiezi

前嗅ForeSpider教程:采集中国证券网

前几天有人问如何采集中国证券网,小编整理了一下,在此为大家做一下演示,同样适用于其他金融经济型的网站:第一步:新建任务①点击左上角“加号”新建任务,如图1:②在弹窗里填写采集地址,任务名称,如图2:③点击下一步,选择进行数据抽取还是链接抽取,本次采集要闻列表页新闻的正文数据,正文数据是通过点击列表链接进入的,所以本次需要抽取列表链接,所以点击抽取链接,如图3:第二步:通过地址过滤,得到所需的分区链接。①点击采集预览,在采集预览中有于目标链接相似的其他链接,可通过地址过滤得到分区链接。找到所需要的分区链接,区别于其他链接“http://news.cnstock.com/news/…”,右击复制链接,如图4所示。②勾选地址过滤,过滤规则选择包含,将复制的目标地址粘入,得到要闻分区链接,如图5所示。③点击采集预览确认链接是否过滤完全,如图6第三步:填写模板二示例地址并新建数据抽取①将模板一过滤得到分区链接,作为模板二的示例地址。如:http://news.cnstock.com/news/…, 见图7:②创建列表链接抽取、翻页链接抽取。直接点击模板二,点击上面“新建链接抽取”按钮,得到链接抽取,如图8:③按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域,点击“确认选区”按钮,如图9:④点击采集预览确认链接是否过滤完全,如图10:第四步:通过标题过滤,过滤翻页链接①点击采集预览,在采集预览中有于目标链接相似的其他链接,可通过地址过滤得到列表链接。找到所需要的列表链接,观察得出所需要的目标链接都包含“http://news.cnstock.com/news/…”,右击复制链接,如图11所示。②勾选地址过滤,过滤规则选择包含,填入“http://news.cnstock.com/news/…”,得到列表链接,如图12所示。③点击模板预览确认链接是否过滤完全,如图13第五步:创建新的模板,并新建数据抽取①在模板配置,点击“新建模板”按钮,得到新建模板,重命名为正文数据模板,如图14。②将模板二新建链接抽取过滤得到的任意一条链接,作为模板三的示例地址。如:http://news.cnstock.com/news,…, 见图15:③新建数据抽取。直接点击模板二,点击上面“新建数据抽取”按钮,得到数据抽取,如图16。④关联模板在软件中模板的关联关系,与网页中链接跳转的关系相同。根据网页跳转规律,将“新建链接抽取”关联模板“新建模板:03”,如图17:第六步:创建/选择表单①在ForeSpider爬虫中,表单是可以复用的,所以可以在数据表单出直接选择之前建过的表单,也可以通过表单ID来进行查找并关联数据表单。此处使用的方法三,如图18。方法一:通过下拉菜单或表单ID选择已有表单方法二:点击创建表单进入快速建表页面,新建表单方法三:点击“采集配置”-“数据建表”,点击采“采集表单”后面的如图18。②配置表单根据所需内容,配置表单字段(即表头),此处配置了包括网页主键、作者、采集来源、网页获取时间、内容、发布时间、标题名称、网页地址、发布来源、副标题、图片11个字段,右上角保存,表单如图19。③在数据抽取链接处关联表单,如图20。第七步:字段取值取值方法:按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域。title字段,如图21第八步:模板预览①鼠标右键点击“数据抽取”,然后点击“模板预览”,如图22②预览结果如图23:第九步:采集预览①点击右上角采集预览,如图24。②双击任意一条链接,看看是否可以得到和网页对应的规整的数据,如图25、图26。

January 22, 2019 · 1 min · jiezi

idea 护眼主题配置

idea 护眼主题配置1.效果展示2.护眼色主题配置1. 将 Editor > Color Scheme > General > Text 下的条目所有的背景都颜色设置为自己想要的颜色2. 设置控制台的背背景背景颜色3. 设置其他常用文件的背景颜色注意: **标记1处是可以点击的,点击往后设置其颜色属性就可以动态的在下方展示区域显示效果4. 设置 HTML, JSP, Java, CSS, JavaScript 下的所有条目背景颜色和上面的一致注意:1. 其实不用配置那么多,只是新手可能不知道各个条目的意思,所以这里就傻瓜是的设置所有的,当然入如果想换回来,只需要要设置主题为默认的三款之一的就可以了.2. 顺便说一下,这里的控制台的颜色调整需要用到 的 gerp Console 插件

January 21, 2019 · 1 min · jiezi

前嗅ForeSpider教程:采集CSDN

今天小编再来为大家演示一下,如何采集CSDN论坛,同样适用于所有的自媒体论坛。第一步:新建任务①点击左上角“加号”新建任务,如图1:②在弹窗里填写采集地址,任务名称,如图2:③点击下一步,选择进行数据抽取还是链接抽取,本次采集当前列表页博文的正文数据,正文数据是通过点击列表链接进入的,所以本次需要抽取列表链接,所以点击抽取链接,如图3:第二步:通过定位过滤,得到所需链接①按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域,点击“确认选区”按钮,如图4:②点击采集预览确认链接是否过滤完全,如图5所示。第三步:关联模板在软件中模板的关联关系,与网页中链接跳转的关系相同。根据网页跳转规律,将“链接列表”关联模板二“链接列表:02”,此处由于我们开始就选择了创建列表链接,所以软件自动关联好了模板二。如果配置的时候发现关联有问题,可以自己进行更改,如图6:第四步:填写模板二示例地址并新建数据抽取①将模板一过滤得到的任意一条链接,作为模板二的示例地址。如:https://blog.csdn.net/voke_/a…, 见图7:②新建数据抽取方法一:通过点击“下一步”后勾选抽取数据,再次点击“下一步”得到数据抽取。方法二:直接点击模板二,点击上面“新建数据抽取”按钮,得到数据抽取,如图8:第五步:创建/选择表单在ForeSpider爬虫中,表单是可以复用的,所以可以在数据表单出直接选择之前建过的表单,也可以通过表单ID来进行查找并关联数据表单。此处使用的是之前建过的CSDN的表单。方法一:通过下拉菜单或表单ID选择已有表单方法二:点击创建表单进入快速建表页面,新建表单,如图9所示:方法三:点击“采集配置”-“数据建表”,点击采“采集表单”后面的如图10:第六步:配置表单根据所需内容,配置表单字段(即表头),此处配置了包括网页主键、网页标题、访问数量、正文、作者5个字段,表单如图11:第七步:字段取值取值方法:按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域。read_num、text、author字段,如图12:第八步:模板预览①鼠标右键点击“数据抽取”,然后点击“模板预览”,如图13:②预览结果如图14:第九步:采集预览①点击右上角采集预览,如图15:②双击任意一条链接,看看是否可以得到和网页对应的规整的数据,如图16:

January 21, 2019 · 1 min · jiezi

遇见创作 · 遇见 Hve Notes

作为一个技术人,你是否喜欢创作,或是怀念过往又或是畅想未来,或是总结技术又或是记录生活?诚然,现在有很多平台或技术社区,里面有很多人每天都在分享,或是读书笔记又或是项目实践,或是面试经历又或是年终总结。技术社区或平台固然很热闹,但是有一些东西,又想记录在某个地方,只给有缘人。所以这正是个人博客存在的原因之一吧。你可以在自己的博客中记录各种各样的内容,电影影评、旅行日记、编程踩坑经历等等。基于此,你可能使用过或正在使用一些流行的工具如 Hexo、Jekyll 等静态博客网站生成器,又或者是 Gatsby 这种新型的 Web 构建工具。不过,你可能在寻找或者期待这样一种工具,可以更便捷地来管理博客和更舒适的编辑内容,于是今天的主角—— Hve Notes 诞生了!下面奉上介绍给各位喜欢创作的朋友???? 欢迎使用 Hve Notes ! Github: Hve Notes 项目主页: Hve Notes 示例网站: 示例网站一 示例网站二 ✍️ Hve Notes 一个静态博客写作客户端。你可以用它来记录你的生活、心情、知识、笔记、创意… …特性???????? 你可以使用最酷的 Markdown 语法,进行快速创作 ???? 你可以给文章配上精美的封面图和在文章任意位置插入图片 ????️ 你可以对文章进行标签分组 ???? 你可以自定义菜单,甚至可以创建外部链接菜单 ???? 你可以在 ???????????????????????????? 或 ???????????????????? 设备上使用此客户端 ???? 你可以使用 ???????????????????????? ???????????????????? 或 Coding Pages 向世界展示,未来将支持更多平台 ???? 你可以进行简单的配置,接入 Gitalk 或 DisqusJS 评论系统 ???????? 你可以使用中文简体或英语 ???? 你可以任意使用应用内默认主题或任意第三方主题 ???? 当然 Hve Notes 还很年轻,有很多不足,但请相信,它会不停向前????未来,它一定会成为你离不开的伙伴尽情发挥你的才华吧!???? Enjoy~目前,Hve Notes 已经更新到了 v0.7.0 版本,基本已经可以满足日常使用。当然还有很大的成长空间,例如文章和标签的 slug 格式定制和可编辑,个性化的页面增加与配置,赋予用户更强的扩展能力,更丰富的主题等等。在此,也欢迎感兴趣的朋友可以加入我们,提出建议或共同开发,也欢迎加入我们的 Telegram 群组如果您觉得此项目还不错,欢迎 Star 支持作者,也欢迎体验之后提出您最宝贵的建议到 Issue ...

January 21, 2019 · 1 min · jiezi

前嗅ForeSpider教程:采集360问答

今天,小编来教大家如何采集论坛自媒体类网站的数据,该操作同样适用于其他类似网站:第一步:新建任务①点击左上角“加号”新建任务,如图1:②弹窗里填写采集地址,任务名称,开启手动登录配置,如图2:若未在此处开启登录配置,可在模板抽取配置中点击相应的模板,开启登录配置,如图3。③点击下一步,选择进行数据抽取还是链接抽取,本次采集列表下的正文数据,所以本次需要抽取内容选择链接列表,所以点击抽取链接,选择链接列表,如图4:④完成后模板抽取配置列表有两个模板,默认模板和子栏目。默认模板下自动生成一个链接抽取,名称为链接列表,此链接抽取已与链接列表模板关联,如图5:第二步:配置登录① 内置浏览器找到登录按钮,弹出登录框,如图6:②按Ctrl+鼠标左键单击“用户名输入框”,如图7。③填写用户名、密码,如图8。④点击“完成”,cookie配置框中出现数据,按Ctrl+鼠标左键单击“登录按钮”,内置浏览器页面登录成功,配置完成,如图9。第三步:通过地址过滤,得到所需链接。①点击采集预览,在采集预览中有于目标链接相似的其他链接,可通过地址过滤得到列表链接。找到所需要的列表链接,观察得出所需要的目标链接都包含“thread-”,右击复制链接,如图10所示。②勾选地址过滤,过滤规则选择包含,填入“thread-”,得到列表链接,如图11所示。③点击采集预览确认链接是否过滤完全,如图12第四步:关联模板在软件中模板的关联关系,与网页中链接跳转的关系相同。根据网页跳转规律,将“链接列表”关联模板二“链接列表:02”,此处由于我们开始就选择了创建列表链接,所以软件自动关联好了模板二。如果配置的时候发现关联有问题,可以自己进行更改,如图13第五步:创建翻页链接抽取 方法一:创建任务,勾选链接抽取,直接选择链接列表和普通翻页,如图14。方法二:如果创建任务时,只勾选了链接列表,可以点击上一步,回到模板层,补选翻页链接抽取,点击下一步,创建翻页链接。方法三:直接点击模板二,点击上面“新建链接抽取” 按钮,得到链接抽取,并重名命为翻页链接抽取,如图15。第六步:通过地址过滤,得到所需翻页链接。①右击模板预览找到翻页链接,如图16所示。观察链接得出规律使用“page=”得到目标链接。②勾选地址过滤,过滤规则选择包含,将复制的目标地址粘入,使用共用词“page=”过滤得到目标链接,如图17。③点击采集预览确认链接是否过滤完全,如图18④关联“翻页”情况一:创建模板或通过向导,创建的翻页链接抽取,会默认关联模板一,即当前页模板,如图19。情况二:手动点击按钮创建翻页链接抽取,需要手动关联第七步:填写模板示例地址并新建数据抽取①将模板一过滤得到的任意一条链接,作为链接列表模板的示例地址。如:https://bbs.360.cn/thread-156…, 见图20:②新建数据抽取。直接点击链接列表,点击上面“新建数据抽取” 按钮,得到数据抽取,如图21。第八步:创建/选择表单①在ForeSpider爬虫中,表单是可以复用的,所以可以在数据表单出直接选择之前建过的表单,也可以通过表单ID来进行查找并关联数据表单。此处使用的方法三,如图22。方法一:通过下拉菜单或表单ID选择已有表单方法二:点击创建表单进入快速建表页面,新建表单方法三:点击“采集配置”-“数据建表”,点击采“采集表单”后面的 如图22。②配置表单根据所需内容,配置表单字段(即表头),此处配置了包括网页主键、发布时间、正文内,网页标题以及网页地址五个字段,表单如图23。③数据抽取链接处关联表单,如图24。第九步:字段取值①取值方法:按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域。pub_time、content字段,如图25、图26:②点击采集预览确数据是否采集完全,如图27:第十步:采集预览① 点击右上角采集预览,如图28:②点击任意一条链接,看看是否可以得到和网页对应的规整的数据,如图29:

January 19, 2019 · 1 min · jiezi

前嗅ForeSpider教程:采集新闻

今天小编来为大家演示,新闻网站的采集,具体操作如下:第一步:新建任务①点击左上角“加号”新建任务,如图1:②在弹窗里填写采集地址,任务名称,如图2:③点击下一步,选择进行数据抽取还是链接抽取,本次采集当前列表页新闻的正文数据,正文数据是通过点击列表链接进入的,所以本次需要抽取列表链接,所以点击抽取链接,如图3:第二步:通过定位过滤、地址过滤,得到所需链接①按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域,点击“确认选区”按钮,如图4:②点击采集预览,在采集预览中有于目标链接相似的其他链接,可通过地址过滤得到列表链接。找到所需要的列表链接,观察得出所需要的目标链接都包含“sina.com.cn/+字符串”。使用过滤串“c”,右击复制链接,如图5所示。过滤串规则说明:c 表示一串(个)小写字母③勾选地址过滤,过滤规则选择包含,填入“sina.com.cn/c”,得到列表链接,如图6所示。④点击采集预览确认链接是否过滤完全,如图7:第三步:关联模板在软件中模板的关联关系,与网页中链接跳转的关系相同。根据网页跳转规律,将“链接列表”关联模板二“链接列表:02”,此处由于我们开始就选择了创建列表链接,所以软件自动关联好了模板二。如果配置的时候发现关联有问题,可以自己进行更改,如图8:第四步:填写模板二示例地址并新建数据抽取① 模板一过滤得到的任意一条链接,作为模板二的示例地址。如https://news.sina.com.cn/c/zj…, 见图9:②新建数据抽取方法一:通过点击“下一步”后勾选抽取数据,再次点击“下一步”得到数据抽取。方法二:直接点击模板二,点击上面“新建数据抽取”按钮,得到数据抽取,重命名为新浪新闻,如图10:第五步:创建/选择表单在ForeSpider爬虫中,表单是可以复用的,所以可以在数据表单出直接选择之前建过的表单,也可以通过表单ID来进行查找并关联数据表单。此处使用的是之前建过的新浪网的表单。方法一:通过下拉菜单或表单ID选择已有表单方法二:点击创建表单进入快速建表页面,新建表单,如图11所示:方法三:点击“采集配置”-“数据建表”,点击采“采集表单”后面的如图12:第六步:配置表单根据所需内容,配置表单字段(即表头),此处配置了包括网页主键、网页标题、网页地址、网页创建时间、内容、发布来源6个字段,表单如图13:第七步:字段取值取值方法:按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域。点击“确认选区”按钮,确认操作。text、from_addr字段,如图14:第八步:模板预览①鼠标右键点击“数据抽取”,然后点击“模板预览”,如图15:②预览结果如图16:第九步:采集预览①点击右上角采集预览,如图17:②双击任意一条链接,看看是否可以得到和网页对应的规整的数据,如图18:

January 18, 2019 · 1 min · jiezi

前嗅ForeSpider教程:采集图片/视频/资源文件

最近经常有人问如何采集图片和视频,今天小编就为大家介绍一下采集图片/视频/资源文件的操作步骤:第一步:新建任务①点击左上角“加号”新建任务,如图1:② 弹窗里填写采集地址,任务名称如图2:③点击下一步,选择进行数据抽取还是链接抽取,本次采集所有页面的图片,图片链接是通过点击图片列表链接进入的,所以本次需要抽取列表图片链接,所以点击抽取链接,如图3:第二步:选择链接类型由于本次需要取到的是图片链接,图片链接不同于其他网页链接,所以需要特殊对待,在链接(网址)属性配置下面的“链接类型”中,选择“图片、视频等资源链接”,如图4所示。第三步:通过地址过滤,得到所需链接。①点击采集预览,在采集预览中有于目标链接相似的其他链接,可通过地址过滤得到列表链接。找到所需要的列表链接,观察得出所需要的目标链接都包含“.jpg”,如图5所示。② 选地址过滤,过滤规则选择包含,填入“.jpge”,得到列表链接,如图6所示。③ 点击采集预览确认链接是否过滤完全,如图7第四步:创建翻页链接抽取方法一:创建任务,勾选链接抽取,直接选择链接列表和普通翻页,如图8方法二:如果创建任务时,只勾选了链接列表,可以点击上一步,回到模板层,补选翻页链接抽取,点击下一步,创建翻页链接方法三:直接点击模板二,点击上面“新建链接抽取”按钮,得到链接抽取,如图9第五步:通过标题过滤,过滤翻页链接①点击采集预览,我们可以发现,翻页链接即为名为上一页、下一页两条链接。对于翻页,只需要取到标题名为“下一页”的链接即可。②这里应用标题过滤,过滤规则选择“包含”,过滤串填写“下一页”即可。如图10③ 点击采集预览查看是否过滤成功,如图11第六步:关联模板在软件中模板的关联关系,与网页中链接跳转的关系相同。①关联“链接列表”根据网页跳转规律,将“链接列表”关联模板二“链接列表:02”,此处由于我们开始就选择了创建列表链接,所以软件自动关联好了模板二。如果配置的时候发现关联有问题,可以自己进行更改,如图12②关联“翻页”(对应第四步创建翻页链接抽取)情况一:创建模板或通过向导,创建的翻页链接抽取,会默认关联模板一,即当前页模板,如图13。情况二:手动点击按钮创建翻页链接抽取,需要手动关联,如图13。第七步:填写模板二示例地址并新建数据抽取① 模板一过滤得到的任意一条链接,作为模板二的示例地址。如:http://pic190.nipic.com/pic/2… , 见图14:②新建数据抽取方法一:通过点击“下一步”后勾选抽取数据,再次点击“下一步”得到数据抽取,如图15方法二:直接点击模板二,点击上面“新建数据抽取”按钮,得到数据抽取,如图15第八步:创建/选择表单在ForeSpider爬虫中,表单是可以复用的,所以可以在数据表单出直接选择之前建过的表单,也可以通过表单ID来进行查找并关联数据表单。此处使用的是昵图网的表单,如图16方法一:通过下拉菜单或表单ID选择已有表单方法二:点击创建表单进入快速建表页面,新建表单方法三:点击“采集配置”-“数据建表”,点击采“采集表单”后面的如图17第九步:配置表单根据所需内容,配置表单字段(即表头),此处配置了包括网页标题和图片两个个字段,表单如图18第十步:字段取值取值方法:按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域。点击“确认选区”按钮,确认操作。pic_image字段,如图19第十二步:采集预览点击右上角采集预览,如图20

January 17, 2019 · 1 min · jiezi

前嗅ForeSpider教程:采集图片/视频/资源文件的链接地址

昨天为大家介绍了如何采集图片/视频/资源文件后,有小伙伴问我如何采集他们的链接地址,今天小编就为大家演示如何采集图片/视频/资源文件的链接地址,操作如下:第一步:新建任务①点击左上角“加号”新建任务,如图1:②在弹窗里填写采集地址,任务名称如图2:③点击下一步,选择进行数据抽取还是链接抽取,本次采集所有页面的图片,图片链接是通过点击图片列表链接进入的,所以本次需要抽取列表图片链接,所以点击抽取链接,如图3:第二步:选择链接类型由于本次需要取到的是图片链接,图片链接不同于其他网页链接,所以需要特殊对待,在链接(网址)属性配置下面的“链接类型”中,选择“图片、视频等资源链接”,如图4所示。第三步:通过地址过滤,得到所需链接。①点击采集预览,在采集预览中有与目标链接相似的其他链接,可通过地址过滤得到列表链接。找到所需要的列表链接,观察得出所需要的目标链接都包含“.jpg”,如图5所示。②勾选地址过滤,过滤规则选择包含,填入“.jpge”,得到列表链接,如图6所示。③点击采集预览确认链接是否过滤完全,如图7第四步:创建翻页链接抽取方法一:创建任务,勾选链接抽取,直接选择链接列表和普通翻页,如图8方法二:如果创建任务时,只勾选了链接列表,可以点击上一步,回到模板层,补选翻页链接抽取,点击下一步,创建翻页链接方法三:直接点击模板二,点击上面“新建链接抽取”按钮,得到链接抽取,如图9第五步:通过标题过滤,过滤翻页链接①点击采集预览,我们可以发现,翻页链接即为名为上一页、下一页两条链接。对于翻页,只需要取到标题名为“下一页”的链接即可。②这里应用标题过滤,过滤规则选择“包含”,过滤串填写“下一页”即可。如图10③点击采集预览查看是否过滤成功,如图11第六步:关联模板在软件中模板的关联关系,与网页中链接跳转的关系相同。①关联“链接列表”根据网页跳转规律,将“链接列表”关联模板二“链接列表:02”,此处由于我们开始就选择了创建列表链接,所以软件自动关联好了模板二。如果配置的时候发现关联有问题,可以自己进行更改,如图12②关联“翻页”(对应第四步创建翻页链接抽取)情况一:创建模板或通过向导,创建的翻页链接抽取,会默认关联模板一,即当前页模板,如图13。情况二:手动点击按钮创建翻页链接抽取,需要手动关联,如图13。第七步:填写模板二示例地址并新建数据抽取模板一过滤得到的任意一条链接,作为模板二的示例地址。如:http://pic146.nipic.com/pic/2…, 见图14:②创建数据抽取方法一:通过点击“下一步”后勾选抽取数据,再次点击“下一步”得到数据抽取,如图15方法二:直接点击模板二,点击上面“新建数据抽取”按钮,得到数据抽取,如图15第八步:创建/选择表单在ForeSpider爬虫中,表单是可以复用的,所以可以在数据表单出直接选择之前建过的表单,也可以通过表单ID来进行查找并关联数据表单。此处使用的是昵图网的表单,如图16方法一:通过下拉菜单或表单ID选择已有表单方法二:点击创建表单进入快速建表页面,新建表单方法三:点击“采集配置”-“数据建表”,点击采“采集表单”后面的如图17第九步:配置表单根据所需内容,配置表单字段(即表头),此处配置了包括网页标题、网页地址和图片两个个字段,表单如图18第十步:字段取值取值方法:按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域。pic_image字段,如图19第十一步:采集预览点击右上角采集预览,如图20

January 17, 2019 · 1 min · jiezi

前嗅ForeSpider教程:同一个网站中从另一页面采集数据

大家在采集过程中有可能需要同时采集同一个网站不同页面的信息,今天小编为大家介绍一下从同一个网站另一个页面采集数据的具体操作流程。第一步:新建任务①点击左上角“加号”新建任务,如图1:②在弹窗里填写采集地址,任务名称,如图2:③点击下一步,选择进行数据抽取还是链接抽取,本次采集企业最新动态链接列表,所以点击抽取链接,选择链接列表,如图3:④完成之后,在模板抽取配置下生成两个模板,默认模板:01和链接列表:02。模板1中的“链接列表”链接抽取已与模板2关联,如图4。如果配置的时候发现关联有问题,可以自己进行更改。第二步:使用定位过滤,得到列表链接①按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域。②点击确认选区,如图5:③点击采集预览,确认链接抽取是否正确,如图6:第三步:在模板2添加示例地址,并添加链接抽取①将模板1过滤得到的任意一条链接,作为模板2的示例地址。如:http://blog.11467.com/b427516…,如图7:②新建链接抽取。直接点击模板2,点击上面“新建链接抽取”按钮,得到链接抽取,如图8。③关联模板在软件中模板的关联关系,与网页中链接跳转的关系相同。根据网页跳转规律,模板1中的“链接列表”链接抽取已与模板2关联。如果配置的时候发现关联有问题,可以自己进行更改。第四步:使用定位过滤,得到列表链接①按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域。②点击确认选区,如图9:③右击模板预览,查看链接抽取结果,如图10所示:④确认链接抽取是否正确,如图11:第五步:新建模板3添加示例地址,并添加链接抽取①新建模板3,将模板2过滤得到的链接,作为模板3的示例地址。如:http://93358999.b2b.11467.com,如图12:②新建链接抽取。直接点击模板3,点击上面“新建链接抽取”按钮,得到链接抽取,如图13。③关联链接列表的“新建链接抽取”。根据网页跳转规律,将模板2链接列表的“新建链接抽取”关联模板3。如果配置的时候发现关联有问题,可以自己进行更改,如图14:第六步:使用定位过滤,得到导航列表的链接①按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域。②点击确认选区,如图15:③右击模板预览,查看链接抽取结果,如图16所示:④确认链接抽取是否正确,如图17:⑤使用标题过滤,得到“联系我们”的链接,如图18所示:第七步:新建模板4添加示例地址,并添加链接抽取①新建模板4,将模板3过滤得到的“联系我们”链接,作为模板4的示例地址。如:http://tianjin0311065.11467.c…,如图19:②新建数据抽取。直接点击模板3,点击上面“新建数据抽取”按钮,得到数据抽取,如图20。③关联模板3的“新建链接抽取”。根据网页跳转规律,将模板3的“新建链接抽取”关联模板4。如果配置的时候发现关联有问题,可以自己进行更改,如图21:第八步:创建/选择表单在ForeSpider爬虫中,表单是可以复用的,所以可以在数据表单出直接选择之前建过的表单,也可以通过表单ID来进行查找并关联数据表单。此处使用的是方法三。方法一:通过下拉菜单或表单ID选择已有表单方法二:点击创建表单进入快速建表页面,新建表单,如图22所示。方法三:点击“采集配置”-“数据建表”,点击采“采集表单”后面的,如图23:第九步:配置表单根据所需内容,配置表单字段(即表头),此处配置了包括网页主键、联系人、电话、地址以及公司介绍五个字段。其中,公司介绍字段intro_text的取值在同一网站的不同页面,需要用到脚本取值,配置类型时需要选择高级取值>模板取值,表单如图24:第十步:字段取值①关联表单,如图25所示:②取值方法:按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域。person、tel、addr字段,如图26:③intro_text字段需要进行模板取值。第十一步:创建新的模板,添加示例地址①表单intro_text字段来自公司介绍,如图27所示。图中红框部分为取值内容,如图28所示:②新建模板,添加“公司介绍”链接为示例地址,如:http://93358999.b2b.11467.com…(模板3右击模板预览,选择全部链接),如图29所示:③直接点击模板5,点击上面“新建数据抽取”按钮,得到数据抽取,如图30:第十二步:创建/选择表单点击“采集配置”-“数据建表”,点击采“采集表单”后面的,如图31:第十三步:配置表单根据所需内容,配置表单字段(即表头),此处配置了“公司介绍”字段intro_text表单如图32:第十四步:关联表单,完成“公司介绍”字段抽取①点击模板5,关联表单,如图33所示:②使用字段定位取值方法。按住Ctrl+鼠标左键,进行区域选择,按住Shift+鼠标左键,扩大选择区域,确认选区,如图34所示。③右击模板预览,如图35所示:④模板预览结果,如图36所示:第十五步:模板取值关联①点击模板4,点击intro_text字段,在红框中填入“href=[5]”,并按住Ctrl+鼠标左键,进行区域选择,如图37所示。“[ ]”中填写模板ID。②点击模板4,右击模板预览,如图38所示:③预览结果如图39所示:第十六步:采集预览①点击右上角采集预览,如图40:②双击任意一条链接,看看是否可以得到和网页对应的规整的数据,如图41、42、43所示。

January 15, 2019 · 1 min · jiezi

Android开发基于rtmp实现视频直播

前言近两年时间,视频直播可谓大火。在视频直播领域,有不同的商家提供各种的商业解决方案,包括软硬件设备,摄像机,编码器,流媒体服务器等。本文要讲解的是如何使用一系列免费工具,打造一套视频直播方案。视频直播流程视频直播的流程可以分为如下几步:采集 —>处理—>编码和封装—>推流到服务器—>服务器流分发—>播放器流播放一般情况下我们把流程的前四步称为第一部分,即视频主播端的操作。视频采集处理后推流到流媒体服务器,第一部分功能完成。第二部分就是流媒体服务器,负责把从第一部分接收到的流进行处理并分发给观众。第三部分就是观众啦,只需要拥有支持流传输协议的播放器即可。一、采集采集是整个视频推流过程中的第一个环节,它从系统的采集设备中获取原始视频数据,将其输出到下一个环节。视频的采集涉及两方面数据的采集:音频采集和图像采集,它们分别对应两种完全不同的输入源和数据格式。1.1-音频采集音频数据既能与图像结合组合成视频数据,也能以纯音频的方式采集播放,后者在很多成熟的应用场景如在线电台和语音电台等起着非常重要的作用。音频的采集过程主要通过设备将环境中的模拟信号采集成 PCM 编码的原始数据,然后编码压缩成 MP3 等格式的数据分发出去。常见的音频压缩格式有:MP3,AAC,HE-AAC,Opus,FLAC,Vorbis (Ogg),Speex 和 AMR等。音频采集和编码主要面临的挑战在于:延时敏感、卡顿敏感、噪声消除(Denoise)、回声消除(AEC)、静音检测(VAD)和各种混音算法等。1.2-图像采集将图像采集的图片结果组合成一组连续播放的动画,即构成视频中可肉眼观看的内容。图像的采集过程主要由摄像头等设备拍摄成 YUV 编码的原始数据,然后经过编码压缩成 H.264 等格式的数据分发出去。常见的视频封装格式有:MP4、3GP、AVI、MKV、WMV、MPG、VOB、FLV、SWF、MOV、RMVB 和 WebM 等。图像由于其直观感受最强并且体积也比较大,构成了一个视频内容的主要部分。图像采集和编码面临的主要挑战在于:设备兼容性差、延时敏感、卡顿敏感以及各种对图像的处理操作如美颜和水印等。视频采集的采集源主要有 摄像头采集、屏幕录制和从视频文件推流。二、处理视频或者音频完成采集之后得到原始数据,为了增强一些现场效果或者加上一些额外的效果,我们一般会在将其编码压缩前进行处理,比如打上时间戳或者公司 Logo 的水印,祛斑美颜和声音混淆等处理。在主播和观众连麦场景中,主播需要和某个或者多个观众进行对话,并将对话结果实时分享给其他所有观众,连麦的处理也有部分工作在推流端完成。如上图所示,处理环节中分为音频和视频处理,音频处理中具体包含混音、降噪和声音特效等处理,视频处理中包含美颜、水印、以及各种自定义滤镜等处理。三、编码和封装3.1-编码如果把整个流媒体比喻成一个物流系统,那么编解码就是其中配货和装货的过程,这个过程非常重要,它的速度和压缩比对物流系统的意义非常大,影响物流系统的整体速度和成本。同样,对流媒体传输来说,编码也非常重要,它的编码性能、编码速度和编码压缩比会直接影响整个流媒体传输的用户体验和传输成本。视频编码的意义原始视频数据存储空间大,一个 1080P 的 7 s 视频需要 817 MB原始视频数据传输占用带宽大,10 Mbps 的带宽传输上述 7 s 视频需要 11 分钟而经过 H.264 编码压缩之后,视频大小只有 708 k ,10 Mbps 的带宽仅仅需要 500 ms 可以满足实时传输的需求,所以从视频采集传感器采集来的原始视频势必要经过视频编码。⑴.基本原理为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?核心思想就是去除冗余信息:1、空间冗余:图像相邻像素之间有较强的相关性2、时间冗余:视频序列的相邻图像之间内容相似3、编码冗余:不同像素值出现的概率不同4、视觉冗余:人的视觉系统对某些细节不敏感5、知识冗余:规律性的结构可由先验知识和背景知识得到⑵.编码器的选择视频编码器经历了数十年的发展,已经从开始的只支持帧内编码演进到现如今的 H.265和 VP9 为代表的新一代编码器,下面是一些常见的视频编码器:1.H.264/AVC2.HEVC/H.2653.VP84.VP95.FFmpeg注:音频编码器有Mp3, AAC等。3.2-封装沿用前面的比喻,封装可以理解为采用哪种货车去运输,也就是媒体的容器。所谓容器,就是把编码器生成的多媒体内容(视频,音频,字幕,章节信息等)混合封装在一起的标准。容器使得不同多媒体内容同步播放变得很简单,而容器的另一个作用就是为多媒体内容提供索引,也就是说如果没有容器存在的话一部影片你只能从一开始看到最后,不能拖动进度条,而且如果你不自己去手动另外载入音频就没有声音。下面是几种常见的封装格式:1.AVI 格式(后缀为 .avi)2.DV-AVI 格式(后缀为 .avi)3.QuickTime File Format 格式(后缀为 .mov)4.MPEG 格式(文件后缀可以是 .mpg .mpeg .mpe .dat .vob .asf .3gp .mp4等)5.WMV 格式(后缀为.wmv .asf)6.Real Video 格式(后缀为 .rm .rmvb)7.Flash Video 格式(后缀为 .flv)8.Matroska 格式(后缀为 .mkv)9.MPEG2-TS 格式 (后缀为 .ts)目前,我们在流媒体传输,尤其是直播中主要采用的就是 FLV 和 MPEG2-TS 格式,分别用于 RTMP/HTTP-FLV 和 HLS协议。四、推流到服务器推流是直播的第一公里,直播的推流对这个直播链路影响非常大,如果推流的网络不稳定,无论我们如何做优化,观众的体验都会很糟糕。所以也是我们排查问题的第一步,如何系统地解决这类问题需要我们对相关理论有基础的认识。推送协议主要有三种:RTSP(Real Time Streaming Protocol):实时流传送协议,是用来控制声音或影像的多媒体串流协议, 由Real Networks和Netscape共同提出的;RTMP(Real Time Messaging Protocol):实时消息传送协议,是Adobe公司为Flash播放器和服务器之间音频、视频和数据传输 开发的开放协议;HLS(HTTP Live Streaming):是苹果公司(Apple Inc.)实现的基于HTTP的流媒体传输协议;RTMP协议基于 TCP,是一种设计用来进行实时数据通信的网络协议,主要用来在 flash/AIR 平台和支持 RTMP 协议的流媒体/交互服务器之间进行音视频和数据通信。支持该协议的软件包括 Adobe Media Server/Ultrant Media Server/red5 等。它有三种变种:RTMP工作在TCP之上的明文协议,使用端口1935;RTMPT封装在HTTP请求之中,可穿越防火墙;RTMPS类似RTMPT,但使用的是HTTPS连接;RTMP 是目前主流的流媒体传输协议,广泛用于直播领域,可以说市面上绝大多数的直播产品都采用了这个协议。RTMP协议就像一个用来装数据包的容器,这些数据可以是AMF格式的数据,也可以是FLV中的视/音频数据。一个单一的连接可以通过不同的通道传输多路网络流。这些通道中的包都是按照固定大小的包传输的。五、服务器流分发流媒体服务器的作用是负责直播流的发布和转播分发功能。流媒体服务器有诸多选择,如商业版的Wowza。但我选择的是Nginx,它是一款优秀的免费Web服务器,后面我会详细介绍如何搭建Nginx服务器。六、播放器流播放主要是实现直播节目在终端上的展现。因为我这里使用的传输协议是RTMP, 所以只要支持 RTMP 流协议的播放器都可以使用,譬如:电脑端:VLC等手机端:Vitamio以及ijkplayer等第一部分:采集推流SDK目前市面上集视频采集、编码、封装和推流于一体的SDK已经有很多了,例如商业版的NodeMedia,但NodeMedia SDK按包名授权,未授权包名应用使用有版权提示信息。我这里使用的是别人分享在github上的一个免费SDK。文章下点赞+私信我获取!下面我就代码分析一下直播推流的过程吧:先看入口界面:很简单,一个输入框让你填写服务器的推流地址,另外一个按钮开启推流。public class StartActivity extends Activity { public static final String RTMPURL_MESSAGE = “rtmppush.hx.com.rtmppush.rtmpurl”; private Button _startRtmpPushButton = null; private EditText _rtmpUrlEditText = null; private View.OnClickListener _startRtmpPushOnClickedEvent = new View.OnClickListener() { @Override public void onClick(View arg0) { Intent i = new Intent(StartActivity.this, MainActivity.class); String rtmpUrl = _rtmpUrlEditText.getText().toString(); i.putExtra(StartActivity.RTMPURL_MESSAGE, rtmpUrl); StartActivity.this.startActivity(i); } }; private void InitUI(){ _rtmpUrlEditText = (EditText)findViewById(R.id.rtmpUrleditText); _startRtmpPushButton = (Button)findViewById(R.id.startRtmpButton); _rtmpUrlEditText.setText(“rtmp://192.168.1.104:1935/live/12345”); _startRtmpPushButton.setOnClickListener(_startRtmpPushOnClickedEvent); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_start); InitUI(); }}主要的推流过程在MainActivity里面,同样,先看界面: 布局文件:<RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android" xmlns:tools=“http://schemas.android.com/tools" android:id=”@+id/cameraRelative” android:layout_width=“match_parent” android:layout_height=“match_parent” android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:theme="@android:style/Theme.NoTitleBar.Fullscreen"><SurfaceView android:id="@+id/surfaceViewEx" android:layout_width=“match_parent” android:layout_height=“match_parent”/> <Button android:id="@+id/SwitchCamerabutton" android:layout_width=“wrap_content” android:layout_height=“wrap_content” android:layout_alignBottom="@+id/surfaceViewEx" android:text="@string/SwitchCamera" /></RelativeLayout>其实就是用一个SurfaceView显示摄像头拍摄画面,并提供了一个按钮切换前置和后置摄像头。从入口函数看起: @Override protected void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); Intent intent = getIntent(); _rtmpUrl = intent.getStringExtra(StartActivity.RTMPURL_MESSAGE); InitAll(); PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); _wakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, “My Tag”); }首先设置全屏显示,常亮,竖屏,获取服务器的推流url,再初始化所有东西。 private void InitAll() { WindowManager wm = this.getWindowManager(); int width = wm.getDefaultDisplay().getWidth(); int height = wm.getDefaultDisplay().getHeight(); int iNewWidth = (int) (height * 3.0 / 4.0); RelativeLayout rCameraLayout = (RelativeLayout) findViewById(R.id.cameraRelative); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT); int iPos = width - iNewWidth; layoutParams.setMargins(iPos, 0, 0, 0); _mSurfaceView = (SurfaceView) this.findViewById(R.id.surfaceViewEx); _mSurfaceView.getHolder().setFixedSize(HEIGHT_DEF, WIDTH_DEF); _mSurfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); _mSurfaceView.getHolder().setKeepScreenOn(true); _mSurfaceView.getHolder().addCallback(new SurceCallBack()); _mSurfaceView.setLayoutParams(layoutParams); InitAudioRecord(); _SwitchCameraBtn = (Button) findViewById(R.id.SwitchCamerabutton); _SwitchCameraBtn.setOnClickListener(_switchCameraOnClickedEvent); RtmpStartMessage();//开始推流 }首先设置屏幕比例3:4显示,给SurfaceView设置一些参数并添加回调,再初始化AudioRecord,最后执行开始推流。音频在这里初始化了,那么相机在哪里初始化呢?其实在SurfaceView的回调函数里。 @Override public void surfaceCreated(SurfaceHolder holder) { _iDegrees = getDisplayOritation(getDispalyRotation(), 0); if (_mCamera != null) { InitCamera(); //初始化相机 return; } //华为i7前后共用摄像头 if (Camera.getNumberOfCameras() == 1) { _bIsFront = false; _mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK); } else { _mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT); } InitCamera(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { } }相机的初始化就在这里啦: public void InitCamera() { Camera.Parameters p = _mCamera.getParameters(); Size prevewSize = p.getPreviewSize(); showlog(“Original Width:” + prevewSize.width + “, height:” + prevewSize.height); List<Size> PreviewSizeList = p.getSupportedPreviewSizes(); List<Integer> PreviewFormats = p.getSupportedPreviewFormats(); showlog(“Listing all supported preview sizes”); for (Camera.Size size : PreviewSizeList) { showlog(" w: " + size.width + “, h: " + size.height); } showlog(“Listing all supported preview formats”); Integer iNV21Flag = 0; Integer iYV12Flag = 0; for (Integer yuvFormat : PreviewFormats) { showlog(“preview formats:” + yuvFormat); if (yuvFormat == android.graphics.ImageFormat.YV12) { iYV12Flag = android.graphics.ImageFormat.YV12; } if (yuvFormat == android.graphics.ImageFormat.NV21) { iNV21Flag = android.graphics.ImageFormat.NV21; } } if (iNV21Flag != 0) { _iCameraCodecType = iNV21Flag; } else if (iYV12Flag != 0) { _iCameraCodecType = iYV12Flag; } p.setPreviewSize(HEIGHT_DEF, WIDTH_DEF); p.setPreviewFormat(_iCameraCodecType); p.setPreviewFrameRate(FRAMERATE_DEF); showlog("_iDegrees="+_iDegrees); _mCamera.setDisplayOrientation(_iDegrees); p.setRotation(_iDegrees); _mCamera.setPreviewCallback(_previewCallback); _mCamera.setParameters(p); try { _mCamera.setPreviewDisplay(_mSurfaceView.getHolder()); } catch (Exception e) { return; } _mCamera.cancelAutoFocus();//只有加上了这一句,才会自动对焦。 _mCamera.startPreview(); }还记得之前初始化完成之后开始推流函数吗? private void RtmpStartMessage() { Message msg = new Message(); msg.what = ID_RTMP_PUSH_START; Bundle b = new Bundle(); b.putInt(“ret”, 0); msg.setData(b); mHandler.sendMessage(msg); }Handler处理: public Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { Bundle b = msg.getData(); int ret; switch (msg.what) { case ID_RTMP_PUSH_START: { Start(); break; } } } };真正的推流实现原来在这里: private void Start() { if (DEBUG_ENABLE) { File saveDir = Environment.getExternalStorageDirectory(); String strFilename = saveDir + “/aaa.h264”; try { if (!new File(strFilename).exists()) { new File(strFilename).createNewFile(); } _outputStream = new DataOutputStream(new FileOutputStream(strFilename)); } catch (Exception e) { e.printStackTrace(); } } //_rtmpSessionMgr.Start(“rtmp://192.168.0.110/live/12345678”); _rtmpSessionMgr = new RtmpSessionManager(); _rtmpSessionMgr.Start(_rtmpUrl); //——point 1 int iFormat = _iCameraCodecType; _swEncH264 = new SWVideoEncoder(WIDTH_DEF, HEIGHT_DEF, FRAMERATE_DEF, BITRATE_DEF); _swEncH264.start(iFormat); //——point 2 _bStartFlag = true; _h264EncoderThread = new Thread(_h264Runnable); _h264EncoderThread.setPriority(Thread.MAX_PRIORITY); _h264EncoderThread.start(); //——point 3 _AudioRecorder.startRecording(); _AacEncoderThread = new Thread(_aacEncoderRunnable); _AacEncoderThread.setPriority(Thread.MAX_PRIORITY); _AacEncoderThread.start(); //——point 4 }里面主要的函数有四个,我分别标出来了,现在我们逐一看一下。首先是point 1,这已经走到SDK里面了 public int Start(String rtmpUrl){ int iRet = 0; _rtmpUrl = rtmpUrl; _rtmpSession = new RtmpSession(); _bStartFlag = true; _h264EncoderThread.setPriority(Thread.MAX_PRIORITY); _h264EncoderThread.start(); return iRet; }其实就是启动了一个线程,这个线程稍微有点复杂 private Thread _h264EncoderThread = new Thread(new Runnable() { private Boolean WaitforReConnect(){ for(int i=0; i < 500; i++){ try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } if(_h264EncoderThread.interrupted() || (!_bStartFlag)){ return false; } } return true; } @Override public void run() { while (!_h264EncoderThread.interrupted() && (_bStartFlag)) { if(_rtmpHandle == 0) { _rtmpHandle = _rtmpSession.RtmpConnect(_rtmpUrl); if(_rtmpHandle == 0){ if(!WaitforReConnect()){ break; } continue; } }else{ if(_rtmpSession.RtmpIsConnect(_rtmpHandle) == 0){ _rtmpHandle = _rtmpSession.RtmpConnect(_rtmpUrl); if(_rtmpHandle == 0){ if(!WaitforReConnect()){ break; } continue; } } } if((_videoDataQueue.size() == 0) && (_audioDataQueue.size()==0)){ try { Thread.sleep(30); } catch (InterruptedException e) { e.printStackTrace(); } continue; } //Log.i(TAG, “VideoQueue length="+_videoDataQueue.size()+”, AudioQueue length="+_audioDataQueue.size()); for(int i = 0; i < 100; i++){ byte[] audioData = GetAndReleaseAudioQueue(); if(audioData == null){ break; } //Log.i(TAG, “###RtmpSendAudioData:"+audioData.length); _rtmpSession.RtmpSendAudioData(_rtmpHandle, audioData, audioData.length); } byte[] videoData = GetAndReleaseVideoQueue(); if(videoData != null){ //Log.i(TAG, “$$$RtmpSendVideoData:"+videoData.length); _rtmpSession.RtmpSendVideoData(_rtmpHandle, videoData, videoData.length); } try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } _videoDataQueueLock.lock(); _videoDataQueue.clear(); _videoDataQueueLock.unlock(); _audioDataQueueLock.lock(); _audioDataQueue.clear(); _audioDataQueueLock.unlock(); if((_rtmpHandle != 0) && (_rtmpSession != null)){ _rtmpSession.RtmpDisconnect(_rtmpHandle); } _rtmpHandle = 0; _rtmpSession = null; } });看18行,主要就是一个while循环,每隔一段时间去_audioDataQueue和_videoDataQueue两个缓冲数组中取数据发送给服务器,发送方法_rtmpSession.RtmpSendAudioData和_rtmpSession.RtmpSendVideoData都是Native方法,通过jni调用so库文件的内容,每隔一段时间,这个时间是多少呢?看第4行,原来是5秒钟,也就是说我们的视频数据会在缓冲中存放5秒才被取出来发给服务器,所有直播会有5秒的延时,我们可以修改这块来控制直播延时。 上面说了我们会从_audioDataQueue和_videoDataQueue两个Buffer里面取数据,那么数据是何时放进去的呢?看上面的point 2,3,4。首先是point 2,同样走进了SDK: public boolean start(int iFormateType){ int iType = OpenH264Encoder.YUV420_TYPE; if(iFormateType == android.graphics.ImageFormat.YV12){ iType = OpenH264Encoder.YUV12_TYPE; }else{ iType = OpenH264Encoder.YUV420_TYPE; } _OpenH264Encoder = new OpenH264Encoder(); _iHandle = _OpenH264Encoder.InitEncode(_iWidth, _iHeight, _iBitRate, _iFrameRate, iType); if(_iHandle == 0){ return false; } _iFormatType = iFormateType; return true; }其实这是初始化编码器,具体的初始化过程也在so文件,jni调用。point 3,4其实就是开启两个线程,那我们看看线程中具体实现吧。 private Thread _h264EncoderThread = null; private Runnable _h264Runnable = new Runnable() { @Override public void run() { while (!_h264EncoderThread.interrupted() && _bStartFlag) { int iSize = _YUVQueue.size(); if (iSize > 0) { _yuvQueueLock.lock(); byte[] yuvData = _YUVQueue.poll(); if (iSize > 9) { Log.i(LOG_TAG, “###YUV Queue len=” + _YUVQueue.size() + “, YUV length=” + yuvData.length); } _yuvQueueLock.unlock(); if (yuvData == null) { continue; } if (_bIsFront) { _yuvEdit = _swEncH264.YUV420pRotate270(yuvData, HEIGHT_DEF, WIDTH_DEF); } else { _yuvEdit = _swEncH264.YUV420pRotate90(yuvData, HEIGHT_DEF, WIDTH_DEF); } byte[] h264Data = _swEncH264.EncoderH264(_yuvEdit); if (h264Data != null) { _rtmpSessionMgr.InsertVideoData(h264Data); if (DEBUG_ENABLE) { try { _outputStream.write(h264Data); int iH264Len = h264Data.length; //Log.i(LOG_TAG, “Encode H264 len="+iH264Len); } catch (IOException e1) { e1.printStackTrace(); } } } } try { Thread.sleep(1); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } _YUVQueue.clear(); } };也是一个循环线程,第9行,从_YUVQueue中取出摄像头获取的数据,然后进行视频旋转,第24行,对数据进行编码,然后执行26行,InsertVideoData: public void InsertVideoData(byte[] videoData){ if(!_bStartFlag){ return; } _videoDataQueueLock.lock(); if(_videoDataQueue.size() > 50){ _videoDataQueue.clear(); } _videoDataQueue.offer(videoData); _videoDataQueueLock.unlock(); }果然就是插入之前提到的_videoDataQueue的Buffer。这里插入的是视频数据,那么音频数据呢?在另外一个线程,内容大致相同private Runnable _aacEncoderRunnable = new Runnable() { @Override public void run() { DataOutputStream outputStream = null; if (DEBUG_ENABLE) { File saveDir = Environment.getExternalStorageDirectory(); String strFilename = saveDir + “/aaa.aac”; try { if (!new File(strFilename).exists()) { new File(strFilename).createNewFile(); } outputStream = new DataOutputStream(new FileOutputStream(strFilename)); } catch (Exception e1) { e1.printStackTrace(); } } long lSleepTime = SAMPLE_RATE_DEF * 16 * 2 / _RecorderBuffer.length; while (!_AacEncoderThread.interrupted() && _bStartFlag) { int iPCMLen = _AudioRecorder.read(_RecorderBuffer, 0, _RecorderBuffer.length); // Fill buffer if ((iPCMLen != _AudioRecorder.ERROR_BAD_VALUE) && (iPCMLen != 0)) { if (_fdkaacHandle != 0) { byte[] aacBuffer = _fdkaacEnc.FdkAacEncode(_fdkaacHandle, _RecorderBuffer); if (aacBuffer != null) { long lLen = aacBuffer.length; _rtmpSessionMgr.InsertAudioData(aacBuffer); //Log.i(LOG_TAG, “fdk aac length="+lLen+” from pcm="+iPCMLen); if (DEBUG_ENABLE) { try { outputStream.write(aacBuffer); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } else { Log.i(LOG_TAG, “######fail to get PCM data”); } try { Thread.sleep(lSleepTime / 10); } catch (InterruptedException e) { e.printStackTrace(); } } Log.i(LOG_TAG, “AAC Encoder Thread ended ……”); } }; private Thread _AacEncoderThread = null;这就是通过循环将音频数据插入_audioDataQueue这个Buffer。以上就是视频采集和推流的代码分析,Demo中并没有对视频进行任何处理,只是摄像头采集,编码后推流到服务器端。第二部分:Nginx服务器搭建流媒体服务器有诸多选择,如商业版的Wowza。但我选择的是免费的Nginx(nginx-rtmp-module)。Nginx本身是一个非常出色的HTTP服务器,它通过nginx的模块nginx-rtmp-module可以搭建一个功能相对比较完善的流媒体服务器。这个流媒体服务器可以支持RTMP和HLS。Nginx配合SDK做流媒体服务器的原理是: Nginx通过rtmp模块提供rtmp服务, SDK推送一个rtmp流到Nginx, 然后客户端通过访问Nginx来收看实时视频流。 HLS也是差不多的原理,只是最终客户端是通过HTTP协议来访问的,但是SDK推送流仍然是rtmp的。集成rtmp模块的windows版本的Nginx。文章下点赞+私信我获取!1、rtmp端口配置配置文件在/conf/nginx.confRTMP监听 1935 端口,启用live 和hls 两个application所以你的流媒体服务器url可以写成:rtmp://(服务器IP地址):1935/live/xxx 或 rtmp://(服务器IP地址):1935/hls/xxx例如我们上面写的 rtmp://192.168.1.104:1935/live/12345HTTP监听 8080 端口,:8080/stat 查看stream状态:8080/index.html 为一个直播播放与直播发布测试器:8080/vod.html 为一个支持RTMP和HLS点播的测试器2、启动nginx服务双击nginx.exe文件或者在dos窗口下运行nginx.exe,即可启动nginx服务:1)启动任务管理器,可以看到nginx.exe进程 2)打开网页输入http://localhot:8080,出现如下画面: 显示以上界面说明启动成功。第三部分:直播流的播放主播界面: 上面说过了只要支持RTMP流传输协议的播放器都可以收看到我们的直播。下面举两个例子吧: (1)window端播放器VLC (2)android端播放器ijkplayer private void initPlayer() { player = new PlayerManager(this); player.setFullScreenOnly(true); player.setScaleType(PlayerManager.SCALETYPE_FILLPARENT); player.playInFullScreen(true); player.setPlayerStateListener(this); player.play(“rtmp://192.168.1.104:1935/live/12345”); }总结到这里整个基于RTMP推流实现Android视频直播的项目已经完成了,如有你有更好的想法可以在文章下方评论留言或私信我!另外前文中第二部分提到的推流SDK和Android实现的Demo以及第三部分提到的已经集成rtmp模块的windows版本的Nginx下载地址由于发文规则不允许插入外部链接,如有需要的可以再文章下点赞+评论后,下载地址我会私信发给你如回复不及时欢迎加入Android开发技术交流群:150923287! ...

January 14, 2019 · 6 min · jiezi