puppeteer( Nodejs 版 selenium )快速入门

 

From:https://www.cnblogs.com/CyLee/p/9310839.html

puppeteer 官网:https://pptr.dev/
Puppeteer 中文文档 (与官方同步更新):https://segmentfault.com/a/1190000015913821

Puppeteer 中文文档 :https://learnku.com/docs/puppeteer/3.1.0

Puppeteer v1.5.0 中文翻译:https://blog.csdn.net/DeepLies/article/details/80861761
puppeteer api 与 教程:https://pptr.dev/#?product=Puppeteer&version=v1.6.0&show=api-class-puppeteer

github 地址 以及 doc :https://github.com/GoogleChrome/puppeteer

Puppeteer的入门教程和实践:https://juejin.im/post/59f1ef1a6fb9a045211df069
大前端神器安利之 Puppeteer:https://jeffjade.com/2017/12/17/134-kinds-of-toss-using-puppeteer/
Puppeteer初探--爬取并生成《ES6标准入门》PDF:https://segmentfault.com/a/1190000010736797

详解 Puppeteer 入门教程https://www.jb51.net/article/139808.htm

puppeteer初探:https://juejin.im/post/5b58a1a051882519790c9295

爬虫利器 Puppeteer 实战:https://www.jianshu.com/p/a9a55c03f768
puppeteer 爬虫入门教程:https://blog.csdn.net/u011350541/article/details/85469918
Puppeteer之爬虫入门:https://www.e-learn.cn/content/qita/845998
Puppeteer 实战-爬取动态生成的网页:https://blog.csdn.net/weixin_33724059/article/details/88031866
puppeteer实战之网页爬虫,模拟操作《二》:https://blog.csdn.net/mr_xiatian/article/details/79240978
puppeteer破解滑动验证码方法:http://www.php.cn/js-tutorial-387019.html
Node:使用Puppeteer完成一次复杂的爬虫:https://www.jianshu.com/p/97eeffa3bf3a

puppeteer的简单使用_爬取页面信息:https://segmentfault.com/a/1190000013037078
puppeteer进阶版_爬取小说站:https://segmentfault.com/a/1190000013055389

 

 

API 文档

完整 API 文档 和 例子.

 

 

Puppeteer 出现的背景

 

Chrome59 (linux、macos)、 Chrome60(windows)之后,Chrome自带headless(无界面)模式很方便做自动化测试或者爬虫。但是如何和 headless 模式的 Chrome 交互则是一个问题。通过启动 Chrome 时的命令行参数仅能实现简易的启动时初始化操作。Selenium、Webdriver 等是一种解决方案,但是往往依赖众多,不够扁平。

Puppeteer 是谷歌官方出品的一个通过 DevTools 协议 控制 headless Chrome 的 Node 库。可以通过 Puppeteer 的提供的 api 直接控制 Chrome 模拟大部分用户操作来进行 UI Test 或者 作为 爬虫 访问页面 来 收集数据

Puppeteer(中文翻译”木偶”) 是 Google Chrome 团队官方的无界面(Headless)Chrome 工具,它是一个 Node 库,提供了一个高级的 API 来控制 DevTools协议上的无头版 Chrome 。也可以配置为使用完整(非无头)的 Chrome。Chrome 素来在浏览器界稳执牛耳,因此,Chrome Headless 必将成为 web 应用自动化测试的行业标杆。使用 Puppeteer,相当于同时具有 Linux 和 Chrome 双端的操作能力,应用场景可谓非常之多。此仓库的建立,即是尝试各种折腾使用 GoogleChrome Puppeteer;以期在好玩的同时,学到更多有意思的操作。

 

 

Puppeteer 是什么,以及能做些什么

 

Puppeteer is a Node library which provides a high-level API to control headless Chrome or Chromium over the DevTools Protocol. It can also be configured to use full (non-headless) Chrome or Chromium.

简而言之,这货是一个提供高级API的node库,能够通过devtool控制headless模式的chrome或者chromium,它可以在headless模式下模拟任何的人为操作。

 

你可以在浏览器中手动完成的大部分事情都可以使用 Puppeteer 完成!你可以从以下几个示例开始:

  • 生成页面的截图和PDF。
  • 抓取SPA并生成预先呈现的内容(即“SSR”)。
  • 从网站抓取你需要的内容。
  • 自动表单提交,UI测试,键盘输入等
  • 创建一个最新的自动化测试环境。使用最新的JavaScript和浏览器功能,直接在最新版本的Chrome中运行测试。
  • 捕获您的网站的时间线跟踪,以帮助诊断性能问题。

总之:chrome 浏览器能干的事情 puppeteer 都能干。puppeteer 通俗来说就是一个 headless chrome浏览器 (当然你也可以配置成有UI的,默认是没有的)。既然是浏览器,那么我们手工可以在浏览器上做的事情 Puppeteer 都能胜任, 另外,Puppeteer 翻译成中文是”木偶”意思,所以听名字就知道,操纵起来很方便,你可以很方便的操纵她去实现:
1) 生成网页截图或者 PDF 
2) 高级爬虫,可以爬取大量异步渲染内容的网页 
3) 模拟键盘输入、表单自动提交、登录网页等,实现 UI 自动化测试 
4) 捕获站点的时间线,以便追踪你的网站,帮助分析网站性能问题如果你用过 PhantomJS 的话,你会发现她们有点类似,但Puppeteer是Chrome官方团队进行维护的,用俗话说就是”有娘家的人“,前景更好。

备注: 鉴于 Puppeteer 需要 Chromium,但,即便处于 Science 上网的姿态, 也会遇到 Chromium 无法成功下载的问题;所以在最新的修改中,已经其替换为 puppeteer-core (默认情况下不下载 Chromium,使用时需要确保您安装的 puppeteer-core 版本与您要连接的浏览器兼容)。在实际使用时候,即便已然按照说明操作,但依旧会报如下错误:

Error: Chromium revision is not downloaded. Run “npm install” or “yarn install”

因此只好采取手动下载 Chromium 的方式解决;因此在运行此仓库时候,您需要在 Puppeteer API Tip-Of-Tree 根据指定 Puppeteer 下载对应 Chromium,然后放置到项根目录即可(项目中已对各不同系统做了适配,国内用户可以在 Taobao Mirrors 根据系统按需下载)

 

 

Puppeteer 架构图

 

架构图:

 

  • Puppeteer 通过 devTools 与 browser 通信
  • Browser 一个可以拥有多个页面的浏览器(chroium)实例
  • Page 至少含有一个 Frame 的页面
  • Frame 至少还有一个用于执行 javascript 的执行环境,也可以拓展多个执行环境

 

 

 

环境和安装

 

Puppetee r本身依赖 6.4 以上的Node,但是为了异步超级好用的 async/await,推荐使用7.6版本以上的Node。另外headless Chrome本身对服务器依赖的库的版本要求比较高,centos服务器依赖偏稳定,v6很难使用headless Chrome,提升依赖版本可能出现各种服务器问题(包括且不限于无法使用ssh),最好使用高版本服务器。

要在项目中使用 Puppeteer,只需要运行如下命令安装即可;不过要注意的是:Puppeteer 至少需要 Node v6.4.0,如要使用 async / await,只有 Node v7.6.0 或更高版本才支持;另外,安装 Puppeteer 时,它会下载最新版本的 Chromium(〜71Mb Mac,〜90Mb Linux,〜110Mb Win),保证与 API 协同工作。

Puppeteer 因为是一个 npm 的包,所以安装很简单:npm i puppeteer    或者    yarn add puppeteer

Puppeteer 安装时自带一个最新版本的Chromium,可以通过设置环境变量或者 npm config 中的PUPPETEER_SKIP_CHROMIUM_DOWNLOAD 跳过下载。如果不下载的话,启动时可以通过 puppeteer.launch([options]) 配置项中的 executablePath 指定 Chromium 的位置。

 

 

Puppeteer 轻松入门

 

运行环境查看 Puppeteer 的官方 API 你会发现满屏的 async, await 之类,这些都是 ES7 的规范,所以你需要: Nodejs 的版本不能低于 v7.6.0, 需要支持 async, await.
需要最新的 chrome driver,

基本用法先开看看官方的入门的 DEMO

const puppeteer = require('puppeteer'); (async () => {const browser = await puppeteer.launch();const page = await browser.newPage();await page.goto('http://example.com');await page.screenshot({ path: 'example.png' }); await browser.close();
})();

上面这段代码就实现了网页截图,先大概解读一下上面几行代码: 

  • 1. 先通过 puppeteer.launch() 创建一个浏览器实例 Browser 对象
  • 2. 然后通过 Browser 对象创建页面 Page 对象
  • 3. 然后 page.goto() 跳转到指定的页面
  • 4. 调用 page.screenshot() 对页面进行截图

下面就介绍一下 puppeteer 的常用的几个 API。

 

 

 

示例 1

Puppeteer 类似其他框架,通过操作 Browser 实例 来操作浏览器作出相应的反应。

const puppeteer = require('puppeteer');(async () => {const browser = await puppeteer.launch();const page = await browser.newPage();await page.goto('http://rennaiqian.com');await page.screenshot({path: 'example.png'});await page.pdf({path: 'example.pdf', format: 'A4'});await browser.close();
})();

上述代码通过puppeteer的launch方法生成了一个browser的实例,对应于浏览器,launch方法可以传入配置项,比较有用的是在本地调试时传入{headless:false}可以关闭headless模式。

const browser = await puppeteer.launch({headless:false})

browser.newPage方法可以打开一个新选项卡并返回选项卡的实例page,通过page上的各种方法可以对页面进行常用操作。上述代码就进行了截屏和打印pdf的操作。

一个很强大的方法是 page.evaluate(pageFunction, ...args),可以向页面注入我们的函数,这样就有了无限可能。

const puppeteer = require('puppeteer');(async () => {const browser = await puppeteer.launch();const page = await browser.newPage();await page.goto('http://rennaiqian.com');// Get the "viewport" of the page, as reported by the page.const dimensions = await page.evaluate(() => {return {width: document.documentElement.clientWidth,height: document.documentElement.clientHeight,deviceScaleFactor: window.devicePixelRatio};});console.log('Dimensions:', dimensions);await browser.close();
})();

需要注意的是evaluate方法中是无法直接使用外部的变量的,需要作为参数传入,想要获得执行的结果也需要return出来。因为是一个开源一个多月的项目,现在项目很活跃,所以使用时自行查找api才能保证参数、使用方法不会错。

 

示例 2

对于如何使用 Puppeteer,这非常之容易;如下简易的示例,即实现了:导航到 https://example.com 并将截屏保存为 example.png;

const puppeteer = require('puppeteer');(async () => {const browser = await puppeteer.launch();  // 创建浏览器实例const page = await browser.newPage();      // 创建新的浏览器页面await page.goto('https://example.com');    //  页面访问地址 http://example.comawait page.screenshot({ path: 'example.png' }); // 页面截图 example.pngawait browser.close(); // 关闭浏览器
})();

Puppeteer 设置浏览器页面为 800像素 x 600像素, 屏幕截图也依据这个大小. 如你需要调整页面大小,可以通过 Page.setViewport().

更多示例可参考 GoogleChrome Puppeteer Usage;在略为熟悉 Puppeteer的 Api 之后,即可用来她操纵浏览器,来为你做些你想搞的事儿;不过值得一提的是,她现在还处于开发阶段,随着版本的更替,Api 接口也有可能会跟着略有变动。Toss Puppeteer,这是在 Github 创建的一个仓库,以承载尝试使用 GoogleChrome Puppeteer 做的各种的折腾,具体如下:

 

示例 3

举例 - 创建PDF.

const puppeteer = require('puppeteer');(async () => {const browser = await puppeteer.launch();const page = await browser.newPage();await page.goto('https://news.ycombinator.com', { waitUntil: 'networkidle2' });await page.pdf({ path: 'hn.pdf', format: 'A4' });await browser.close();
})();

上例中waitUntil表示等待的时长,参数定义在这里waitUntil - 搜索waitUntil
Page.pdf() 访问这里有更多关于创建PDF的信息.

 

示例 4

举例 - 通过页面上下文 (context) 获取页面信息

const puppeteer = require('puppeteer');(async () => {const browser = await puppeteer.launch();const page = await browser.newPage();await page.goto('https://example.com');// Get the "viewport" of the page, as reported by the page.const dimensions = await page.evaluate(() => { // 通过evaluate执行页面jsreturn {width: document.documentElement.clientWidth, // 页面宽度height: document.documentElement.clientHeight, // 页面高度deviceScaleFactor: window.devicePixelRatio // 设备像素比};});console.log('Dimensions:', dimensions);await browser.close();
})();

访问 Page.evaluate() 获得更多关于 evaluate 和相关功能例如 evaluateOnNewDocumentand exposeFunction的介绍。

 

 

调试技巧

 

  1. 显示界面 - 最直观的调试方法就是看到界面上发生了什么. 通过创建完整浏览器来实现,选项 headless: false:

    const browser = await puppeteer.launch({headless: false});
    
  2. 让执行慢下来 - slowMo 选项 可以指定毫秒值,让 Puppeteer 的执行慢下来 ,也对调试有帮助

    const browser = await puppeteer.launch({headless: false,slowMo: 250 // slow down by 250ms
    });
    
  3. 获取Console的输出 - 你既可以监听 console 事件, 也可以通过 page.evaluate()来打印。

    page.on('console', msg => console.log('PAGE LOG:', ...msg.args));await page.evaluate(() => console.log(`url is ${location.href}`));
    
  4. 启用详细日志 - 所有API调用和内部协议交互都会被记录在 puppeteer 名字空间的 debug 模式下.

    # 所有详细的日志
    env DEBUG="puppeteer:*" node script.js# 通过名字空间来控制调试日志的输出
    env DEBUG="puppeteer:*,-puppeteer:protocol" node script.js # 除了protocol外的所有消息
    env DEBUG="puppeteer:session" node script.js # 只需要protocol session 消息 
    env DEBUG="puppeteer:mouse,puppeteer:keyboard" node script.js # 只输出鼠标和键盘日志# Protocol 的交互消息会很多. 这里的例子说明了如何过滤掉所有Netwok的消息。
    env DEBUG="puppeteer:*" env DEBUG_COLORS=true node script.js 2>&1 | grep -v '"Network'
    

自定义运行的 Chromium

默认情况下, Puppeteer 会选择自行选择下载 Chromium 来确保其API 在当前环境下正常运行. 如果确认需要运行不同版本的 Chromium, 在创建浏览器的时候传入executablePath参数,值为目标浏览器的可执行路径:

const browser = await puppeteer.launch({executablePath: '/path/to/Chrome'});

 

 

额外的例子

 

这些例子从 Issue 页面归纳而来,如果有额外的需要请留言。

  1. 如何模拟页面点击?

    通过以下page的接口, 相关 issue

    page.mouseMoved(x, y, options = {})
    page.mousePressed(x, y, options = {})
    page.mouseReleased(x, y, options = {})
    page.tap(x, y, options = {})
    page.touchmove()
    page.touchend()
    
  2. 如何上下翻动页面?

    通过调用page.evaluate中的 window.scrollBy来实现, 相关 issue

    page.evaluate(_ => { window.scrollBy(0, window.innerHeight);
    
  3. 避免页面ssl认证错误信息
    通过puppeteer option ignoredHTTPErrors 实现

  4. page.evalute 能否返回page DOM?
    你可以传入 ObjectHandle到page.evaluate中成为DOM元素,但当DOM被返回的时候则成 为对应的 ObjectHandle. issue
    如果需要返回,也可以返回实际需要的值,例如:

    const list = await page.evaluateHandle(() => {
    return Array.from(document.getElementsByTagName('a')).map(a => a.href);
    });
    console.log(await list.jsonValue());
    

    相关 iusse

  5. 如何读取和设置cookies?
    通过page.setCookie 和 page.cookies 接口。 目前有一些关于该功能的使用问题, 相关 issue

  6. 如何上传文件?
    通过elementHandle.uploadFile(...filePaths) 接口。 目前只支持 input type="file" 类
    型的文件提交。 相关issue

  7. 如何获得页面html代码?
    通过 page.content()

  8. 如何关闭javascript弹框
    通过 dialog.accept, 相关 issue

        page.on('dialog', dialog => {dialog.accept('test');});
    
  9. 如何监控页面的网络请求?

    const page = await browser.newPage();
    await page.setRequestInterceptionEnabled(true);page.on('request', request => {request.continue(); // pass it through.
    });page.on('response', response => {const req = response.request();console.log(req.method, response.status, req.url);
    });
    
  10. 如何输入内容?
    方法1 page.type

    // ...
    await page.focus('#lst-ib')
    page.type('China')
    // ...
    

    方法2 page.evaluate 后 element.value =

    await page.evaluate((a, b) => {document.querySelector('#a').value = a;document.querySelector('#b').value = b;document.querySelector('#c').click();}, a, b);
    
  11. 如何在页面中不同的Frame中切换
    通过page.frames()获得frame的数组,使用 iframe.$ 来获得对应frame中的handle
    例如:

    const browser = await puppeteer.launch({headless: false});
    const page = await browser.newPage();
    await page.setContent('<iframe></iframe>');// the page.frames()[0] is always a main frame.
    const iframe = page.frames()[1];
    // fetch the body element of the iframe
    const body = await iframe.$('body');
    // ...
    // do something with `body`..
    // ...
    browser.close();
    
  12. 获取element中的自定义属性值
    通过page.evaluate 然后使用object.getAttribute

await page.evaluate( (obj) => {return obj.getAttribute('data-src');
}, imgurlEle);

 

 

 

爬虫实践

 

很多网页通过user-agent来判断设备,可以通过page.emulate(options)来进行模拟。options有两个配置项,一个为userAgent,另一个为viewport可以设置宽度(width)、高度(height)、屏幕缩放(deviceScaleFactor)、是否是移动端(isMobile)、有无touch事件(hasTouch)。

const puppeteer = require('puppeteer');
const devices = require('puppeteer/DeviceDescriptors');
const iPhone = devices['iPhone 6'];puppeteer.launch().then(async browser => {const page = await browser.newPage();await page.emulate(iPhone);await page.goto('https://www.example.com');// other actions...await browser.close();
});

上述代码则模拟了iPhone6访问某网站,其中devices是puppeteer内置的一些常见设备的模拟参数。

很多网页需要登录,有两种解决方案:

  1. 让puppeteer去输入账号密码
    常用方法:点击可以使用page.click(selector[, options])方法,也可以选择聚焦page.focus(selector)。
    输入可以使用page.type(selector, text[, options])输入指定的字符串,还可以在options中设置delay缓慢输入更像真人一些。也可以使用keyboard.down(key[, options])来一个字符一个字符的输入。

  2. 如果是通过cookie判断登录状态的可以通过page.setCookie(...cookies),想要维持cookie可以定时访问。

 

Tip:有些网站需要扫码,但是相同域名的其他网页却有登录,就可以尝试去可以登录的网页登录完利用cookie访问跳过扫码。

 

 

简单例子

 

示例代码:

const puppeteer = require('puppeteer');(async () => {const browser = await puppeteer.launch({headless: false});const page = await browser.newPage();await page.goto('https://baidu.com');await page.type('#kw', 'puppeteer', {delay: 100});page.click('#su')await page.waitFor(1000);const targetLink = await page.evaluate(() => {return [...document.querySelectorAll('.result a')].filter(item => {return item.innerText && item.innerText.includes('Puppeteer的入门和实践')}).toString()});await page.goto(targetLink);await page.waitFor(1000);browser.close();
})()

运行截图:

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

硅谷人眼中的2018年十大前沿科技预测

来源&#xff1a; 和米资本近日&#xff0c;由斯坦福大学的顶级学术研究团队、美国国防部高级研究计划局、硅谷最具创新力和影响力的创业公司以及和米资本一起精心策划&#xff0c;共同探讨技术将如何重新塑造行业和社会等问题&#xff0c;分析预测了2018年全球十大前沿科技的未…

麦肯锡AI应用报告:深度学习是蓝海还是深坑?

来源&#xff1a;网络大数据AI的价值并不在模型自身&#xff0c;而在于公司怎样用好它们。麦肯锡出品&#xff0c;一份深度学习领域的分析报告&#xff0c;包含400个应用案例&#xff0c;横跨19个行业的9种业务功能。报告重点强调了前沿AI技术的应用范围之广&#xff0c;以及经…

pyppeteer:比 selenium 更高效的爬虫利器

API 接口文档&#xff1a;API Reference&#xff1a;https://miyakogi.github.io/pyppeteer/reference.html pyppeteer github 地址&#xff1a;https://github.com/miyakogi/pyppeteer pyppeteer 英文文档地址&#xff1a;https://miyakogi.github.io/pyppeteer/ pyppeteer…

全球机器学习领域顶尖的16家公司

来源&#xff1a;网络大数据 作者&#xff1a;Andy Patrizio摘要&#xff1a;机器学习是众多公司颇感兴趣的一个新兴领域。本文介绍了几大领先的机器学习公司&#xff0c;包括老牌技术厂商和后起之秀。机器学习是与人工智能一同急剧发展的领域。IDC预测&#xff0c;人工智能和…

突破淘宝对于 selenium 检测

From&#xff1a;https://blog.csdn.net/qq_42196922/article/details/89400988 多加一行代码&#xff0c;突破淘宝模拟登录滑块&#xff1a;http://www.imooc.com/article/285729 爬虫自动化&#xff1a;https://www.jianshu.com/p/b3b92f327374 selenium 跳过 webdriver 检…

18年你需要了解的15个人工智能统计数据

来源&#xff1a;网络大数据人工智能(AI)每天都在以惊人的速度增长&#xff0c;并且与此同时&#xff0c;围绕着各行业的统计数据也在发生变化。该技术在简化医疗保健行业工作流程方面取得了巨大成功&#xff0c;减少了教育部门行政任务的工时&#xff0c;同时也降低了制造业的…

Python GUI 开发工具

Python Tkinter教程&#xff08;GUI图形界面开发教程&#xff09;&#xff1a;http://c.biancheng.net/python/tkinter/ PyQt5教程&#xff1a;http://code.py40.com/face 作为 Pyhon 开发者&#xff0c;我们迟早都会碰到 图形用户界面&#xff08;GUI&#xff09;应用 开发任…

pandas 读写 excel

Python开发 之 Python3读写Excel文件&#xff08;较全&#xff09;&#xff1a;https://blog.csdn.net/u014597198/article/details/83104653 python读取excel&#xff08;Python处理xls&#xff09;&#xff1a;https://blog.csdn.net/chenggong2dm/article/details/44956805…

7张图了解2018物联网产业发展新趋势

来源&#xff1a;硅谷动力 作者&#xff1a;文乾摘要&#xff1a;物联网其本质上是互联网的延伸&#xff0c;利用以传感器为主的嵌入式计算机系统进行各终端之间的彼此数据交互。本篇文章用7张图片讲述了物联网应用的各个领域。随着互联网红利逐渐消失&#xff0c;“Interne…

安装 Python 包时解决 Microsoft visual c++ 14.0 is required 问题

参考&#xff1a;http://www.hongweipeng.com/index.php/archives/1532/ 在 windows 上安装 scrapy 时经常会遇到这个问题&#xff0c;安装其他组件也可能会遇到。但问题解决办法都是大致相同的。 如&#xff1a;pip install scrapy 时出现&#xff1a;error: Microsoft Visua…

硅基光电子芯片:换道超车的核心技术

来源&#xff1a;光电子先导院 作者&#xff1a;周治平2018年4月16日&#xff0c;美国商务部激活了对中兴通讯的拒绝令&#xff0c;禁止美国公司向中兴通讯销售任何零部件、商品、软件和技术&#xff0c;直到2025年3月13日。这一禁令立刻使中兴通讯业务陷入休克状态&#xff…

AI虚拟偶像:知识图谱赋予AI“生命感”

来源&#xff1a;脑极体AI是个非常有趣的词&#xff0c;不管是中文翻译的&#xff0c;还是英文的Artificial Intelligence&#xff0c;都有“生物性”的含义。一个是集结了地球顶尖智慧的“人工”&#xff0c;另一个Intelligence则专指生物拥有的智慧。不过在当今的AI风潮中&am…

PySide6、PyQt6、ui文件转py文件、Qt Designer 使用

QT 官网&#xff1a;https://www.qt.io/zh-cn/develop 用 Python 编写安卓 APK&#xff1a;https://zhuanlan.zhihu.com/p/398126847 1、PySide6、PyQt6、PyQt5 PySide6、PySide2、PyQt5 都是基于 Qt 库&#xff0c;Qt 是一组 C 库和开发工具&#xff0c;包括图形用户界面、网…

用visio反向工程画oracle数据库表的结构图

步骤: 1、数据库----反向工程 2、在反向工程向导中选择--设置--然后选择---Microsoft--ODBC-for--oracle 3、新建数据源---选择用户数据源----Microsoft--ODBC-for--oracle4、输入用户名和数据库名5、输入数据库密码---选择需要绘制的表转载于:https://www.cnblogs.com/kokyu/a…

该如何对「半监督学习算法」实际性应用进行评估?Google给出了新答案

原文来源&#xff1a;arXiv 作者&#xff1a;Avital Oliver、Augustus Odena、Colin Raffel、Ekin D. Cubuk、Ian J. Goodfellow「雷克世界」编译&#xff1a;KABUDA、EVA半监督学习&#xff08;Semi-supervised learning&#xff0c;SSL&#xff09;提供了一个强大的框架&…

Python PyQt5 教程

PyQt5教程 &#xff1a;http://code.py40.com/face 教程翻译自&#xff1a;http://zetcode.com/gui/pyqt5/ PyQt5 的 核心API 以及 扩展应用&#xff08;CSDN 学院收费视频&#xff09;&#xff1a;https://edu.csdn.net/course/play/9870/222942 pyqt5 - 对文本样式进行操作&…

Silverlight中全屏处理

Silverlight插件支持全屏模式&#xff0c;这个没什么好说的&#xff0c;只需要用设置IsFullScreen属性即可&#xff0c;问题在于全屏模式中&#xff0c;尽管屏幕变大了&#xff0c;但是页面中的控件并未相应的变大&#xff0c;下面是我在网上找到的解决这个问题的两种方式。 第…

人工智能的过去、现在和未来

来源&#xff1a; 人工智能和大数据 作者&#xff1a; 腾讯 AI Lab 主任 张潼在回答人工智能达到了什么程度这个问题之前&#xff0c;需先了解人工智能的概念是什么&#xff1f;人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;是指计算机像人一样拥有智…

Dom4j完整教程~DOM4J简介

DOM4J是 dom4j.org 出品的一个开源 XML 解析包。DOM4J应用于 Java 平台&#xff0c;采用了 Java 集合框架并完全支持 DOM&#xff0c;SAX 和 JAXP。 DOM4J 使用起来非常简单。只要你了解基本的 XML-DOM 模型&#xff0c;就能使用。 Dom&#xff1a;把整个文档作为一个对象。 DO…

除了芯片 我们还应关注哪些核心技术

来源&#xff1a;传感器技术&#xff08;公众号&#xff09;最近的“中兴封杀”事件&#xff0c;让国人深深领略了缺少核心技术给企业乃至行业和国家带来的巨痛。除了我们知道的芯片技术之外&#xff0c;还有哪些核心技术需要我们重点关注呢&#xff1f;超级计算终端 超级计算终…