
js 抓取网页内容
js 抓取网页内容 同构 JavaScript 应用 —— Web 世界的未来?
网站优化 • 优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2022-05-31 08:11
Web 世界有一个至理名言,就是 Java 提出的“Write once, run everywhere”。但这句话只适用于 Java 么?我们能否也用它来形容 JavaScript 呢?答案是 Yes。
我将会在这篇文章中介绍同构 JavaScript 应用的概念,并推荐一些资源帮助你构建此类应用。
一路走来
多年以前,web 只是一些由 HTML 和 CSS 搭建的静态页面,没有太多的交互。用户的每一个动作都需要服务器来创建并返回一个完整的页面。幸而有了 JavaScript,开发者开始创建很棒的效果,不过 Ajax 的到来才是这场革新的真正开始。Web 开发者开始编写能够与服务端进行交互,且在不重载页面的情况下向服务端发送并接受数据的页面。
随着时间的推移,客户端代码可以做的事情越来越多,催生了被称作单页面应用(SPA)的一类应用。SPA 在首次加载页面时就获取了所有必需的资源,或者再按需动态加载并且渲染到页面上。 Gmail 和 StackEdit editor 是很棒的 SPA 示例。
SPA 准许重度的交互设计,因为几乎所有的操作都在客户端执行,保持最低限度地与服务端进行交流。不幸的是,它们也存在一些严重的问题,我们选择几个进行讨论。
性能
因为相对于静态页面,SPA 需要更多的客户端代码,需要下载数据的体积也更大。这使得手机加载速度很慢,可能会导致一些极端的状况 —— 比如糟糕的用户体验以及收入上的损失等。依据 Microsoft 的一篇文章 ——
Bing 的一项研究表明:页面的加载时间每增加 10ms,站点年度总收入就会减少 $250K。
SEO
因为单页面应用依赖于 JavaScript 的执行,服务器不会提供它们可能用到的任何 HTML 内容。因此,web 爬虫很难去索引到这些页面。爬虫就是可以向 web 服务器发送请求,并且将结果分析成原始文本的程序,而不需要像一个浏览器运行 JavaScript 那样解释和执行客户端的内容。不久前,Google 优化了搜索引擎的 web 爬虫,现在它也可以抓取基于客户端 JavaScript 所构建的页面了。但是 Bing、Yahoo 以及其他搜索引擎怎么办?一个好的索引对任何公司来说都至关重要,它通常会带来更多的流量以及更高的回报。
同构 JavaScript 应用
同构 JavaScript 应用基于 JavaScript 编写,可以在客户端和服务端运行。正因为此,你只需要写一次代码,就可以在服务端渲染静态页面,还可以在客户端完成复杂的交互。所以,这种方式互通了两个世界,并且避免了前面提到了两个问题。
现在,有很多框架可以帮助你开发这类应用。其中最著名的一个可能是 Meteor。Meter 是一个开源 JavaScript 框架,基于 Node.js 编写,专注于实时 web 应用。我想提到的另一个项目是 Rendr,它是 Airbnb 开发的一款轻量级类库,准许同时在客户端和服务端运行 Backbone.js。
越来越多的公司将 Node.js 应用到他们的产品中。客户端和服务端的代码共享成为一个更加普通而自然的选择。在我看来,这种做法将是 web 开发的未来。有些类库通过共享模板又增强了这一趋势,比如 React。
结论
这篇文章介绍了同构 JavaScript 应用的概念,它是应用开发的一种全新方式,可以最大限度地结合服务端和客户端应用程序。我们还讨论了运用这种方式尝试解决的问题,以及你现在就可以参与实践的一些项目。
你听说过同构 JavaScript 应用么?你开发过么?你有开发经验么?
原文:Isomorphic JavaScript Applications — the Future of the Web? 查看全部
js 抓取网页内容 同构 JavaScript 应用 —— Web 世界的未来?
Web 世界有一个至理名言,就是 Java 提出的“Write once, run everywhere”。但这句话只适用于 Java 么?我们能否也用它来形容 JavaScript 呢?答案是 Yes。
我将会在这篇文章中介绍同构 JavaScript 应用的概念,并推荐一些资源帮助你构建此类应用。
一路走来
多年以前,web 只是一些由 HTML 和 CSS 搭建的静态页面,没有太多的交互。用户的每一个动作都需要服务器来创建并返回一个完整的页面。幸而有了 JavaScript,开发者开始创建很棒的效果,不过 Ajax 的到来才是这场革新的真正开始。Web 开发者开始编写能够与服务端进行交互,且在不重载页面的情况下向服务端发送并接受数据的页面。
随着时间的推移,客户端代码可以做的事情越来越多,催生了被称作单页面应用(SPA)的一类应用。SPA 在首次加载页面时就获取了所有必需的资源,或者再按需动态加载并且渲染到页面上。 Gmail 和 StackEdit editor 是很棒的 SPA 示例。
SPA 准许重度的交互设计,因为几乎所有的操作都在客户端执行,保持最低限度地与服务端进行交流。不幸的是,它们也存在一些严重的问题,我们选择几个进行讨论。
性能
因为相对于静态页面,SPA 需要更多的客户端代码,需要下载数据的体积也更大。这使得手机加载速度很慢,可能会导致一些极端的状况 —— 比如糟糕的用户体验以及收入上的损失等。依据 Microsoft 的一篇文章 ——
Bing 的一项研究表明:页面的加载时间每增加 10ms,站点年度总收入就会减少 $250K。
SEO
因为单页面应用依赖于 JavaScript 的执行,服务器不会提供它们可能用到的任何 HTML 内容。因此,web 爬虫很难去索引到这些页面。爬虫就是可以向 web 服务器发送请求,并且将结果分析成原始文本的程序,而不需要像一个浏览器运行 JavaScript 那样解释和执行客户端的内容。不久前,Google 优化了搜索引擎的 web 爬虫,现在它也可以抓取基于客户端 JavaScript 所构建的页面了。但是 Bing、Yahoo 以及其他搜索引擎怎么办?一个好的索引对任何公司来说都至关重要,它通常会带来更多的流量以及更高的回报。
同构 JavaScript 应用
同构 JavaScript 应用基于 JavaScript 编写,可以在客户端和服务端运行。正因为此,你只需要写一次代码,就可以在服务端渲染静态页面,还可以在客户端完成复杂的交互。所以,这种方式互通了两个世界,并且避免了前面提到了两个问题。
现在,有很多框架可以帮助你开发这类应用。其中最著名的一个可能是 Meteor。Meter 是一个开源 JavaScript 框架,基于 Node.js 编写,专注于实时 web 应用。我想提到的另一个项目是 Rendr,它是 Airbnb 开发的一款轻量级类库,准许同时在客户端和服务端运行 Backbone.js。
越来越多的公司将 Node.js 应用到他们的产品中。客户端和服务端的代码共享成为一个更加普通而自然的选择。在我看来,这种做法将是 web 开发的未来。有些类库通过共享模板又增强了这一趋势,比如 React。
结论
这篇文章介绍了同构 JavaScript 应用的概念,它是应用开发的一种全新方式,可以最大限度地结合服务端和客户端应用程序。我们还讨论了运用这种方式尝试解决的问题,以及你现在就可以参与实践的一些项目。
你听说过同构 JavaScript 应用么?你开发过么?你有开发经验么?
原文:Isomorphic JavaScript Applications — the Future of the Web?
js 抓取网页内容 【第2030期】JavaScript 启动性能瓶颈分析与解决方案
网站优化 • 优采云 发表了文章 • 0 个评论 • 57 次浏览 • 2022-05-26 07:39
前言
找到它存在的意义。今日早读文章由@王下邀月熊翻译授权分享。
正文从这开始~~
在 Web 开发中,随着需求的增加与代码库的扩张,我们最终发布的 Web 页面也逐渐膨胀。不过这种膨胀远不止意味着占据更多的传输带宽,其还意味着用户浏览网页时可能更差劲的性能体验。浏览器在下载完某个页面依赖的脚本之后,其还需要经过语法分析、解释与运行这些步骤。而本文则会深入分析浏览器对于 JavaScript 的这些处理流程,挖掘出那些影响你应用启动时间的罪魁祸首,并且根据我个人的经验提出相对应的解决方案。回顾过去,我们还没有专门地考虑过如何去优化 JavaScript 解析/编译这些步骤;我们预想中的是解析器在发现 查看全部
js 抓取网页内容 【第2030期】JavaScript 启动性能瓶颈分析与解决方案
前言
找到它存在的意义。今日早读文章由@王下邀月熊翻译授权分享。
正文从这开始~~
在 Web 开发中,随着需求的增加与代码库的扩张,我们最终发布的 Web 页面也逐渐膨胀。不过这种膨胀远不止意味着占据更多的传输带宽,其还意味着用户浏览网页时可能更差劲的性能体验。浏览器在下载完某个页面依赖的脚本之后,其还需要经过语法分析、解释与运行这些步骤。而本文则会深入分析浏览器对于 JavaScript 的这些处理流程,挖掘出那些影响你应用启动时间的罪魁祸首,并且根据我个人的经验提出相对应的解决方案。回顾过去,我们还没有专门地考虑过如何去优化 JavaScript 解析/编译这些步骤;我们预想中的是解析器在发现
.NET微信网页开发之使用微信JS-SDK自定义微信分享内容
网站优化 • 优采云 发表了文章 • 0 个评论 • 38 次浏览 • 2022-05-26 07:35
第一步、微信JS-SDK的使用步骤,配置信息的生成获取讲解:
关于JS-SDK的使用步骤和timestamp(时间戳),nonceStr(随机串),signature(签名),access_token(接口调用凭据)生成获取的详细说明在这里:
第二步、调用微信JS-SDK自定义分享内容接口:
//注入权限验证配置wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: '', // 必填,公众号的唯一标识 timestamp: , // 必填,生成签名的时间戳 nonceStr: '', // 必填,生成签名的随机串 signature: '',// 必填,签名 jsApiList: ['updateAppMessageShareData','updateTimelineShareData'] // 必填,分享朋友和分享朋友圈接口列表});<br />//自定义分享的内容var title="店铺好礼豪情大派送";var link='xxx.xxx.com'//分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致var desc="好礼一起享,进店铺领取优惠券可享更多优惠哟!";var imgUrl ="图片地址";//注意一定要是可以访问的网络链接地址,否则没有用<br />//1.自定义“分享给朋友”及“分享到QQ”按钮的分享内容(1.4.0)wx.ready(function () { //需在用户可能点击分享按钮前就先调用 wx.updateAppMessageShareData({ title: title, // 分享标题 desc: desc, // 分享描述 link: link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: imgUrl , // 分享图标 success: function () { // 设置成功 alert("分享成功"); } })});<br /><br />//2.自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容(1.4.0)wx.ready(function () { //需在用户可能点击分享按钮前就先调用 wx.updateTimelineShareData({ title: title, // 分享标题 link: link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: imgUrl , // 分享图标 success: function () { // 设置成功 alert("分享成功"); } })});
第三步、通过点击微信右上角的按钮,找到微信分享:
注意:你在微信中无法定义事件去主动触发微信分享,需要点击微信右上角的按钮然后就能够找到微信分享。
效果图,如下:
学习是一个永无止境的过程,你知道的越多,你不知道的也会越多,在有限的时间内坚持每天多学一点,你一定能成为你想要成为的那个人。不积跬步无以至千里,不积小流无以成江河!!!
See you next good day~
查看全部
.NET微信网页开发之使用微信JS-SDK自定义微信分享内容
第一步、微信JS-SDK的使用步骤,配置信息的生成获取讲解:
关于JS-SDK的使用步骤和timestamp(时间戳),nonceStr(随机串),signature(签名),access_token(接口调用凭据)生成获取的详细说明在这里:
第二步、调用微信JS-SDK自定义分享内容接口:
//注入权限验证配置wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: '', // 必填,公众号的唯一标识 timestamp: , // 必填,生成签名的时间戳 nonceStr: '', // 必填,生成签名的随机串 signature: '',// 必填,签名 jsApiList: ['updateAppMessageShareData','updateTimelineShareData'] // 必填,分享朋友和分享朋友圈接口列表});<br />//自定义分享的内容var title="店铺好礼豪情大派送";var link='xxx.xxx.com'//分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致var desc="好礼一起享,进店铺领取优惠券可享更多优惠哟!";var imgUrl ="图片地址";//注意一定要是可以访问的网络链接地址,否则没有用<br />//1.自定义“分享给朋友”及“分享到QQ”按钮的分享内容(1.4.0)wx.ready(function () { //需在用户可能点击分享按钮前就先调用 wx.updateAppMessageShareData({ title: title, // 分享标题 desc: desc, // 分享描述 link: link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: imgUrl , // 分享图标 success: function () { // 设置成功 alert("分享成功"); } })});<br /><br />//2.自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容(1.4.0)wx.ready(function () { //需在用户可能点击分享按钮前就先调用 wx.updateTimelineShareData({ title: title, // 分享标题 link: link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: imgUrl , // 分享图标 success: function () { // 设置成功 alert("分享成功"); } })});
第三步、通过点击微信右上角的按钮,找到微信分享:
注意:你在微信中无法定义事件去主动触发微信分享,需要点击微信右上角的按钮然后就能够找到微信分享。
效果图,如下:
学习是一个永无止境的过程,你知道的越多,你不知道的也会越多,在有限的时间内坚持每天多学一点,你一定能成为你想要成为的那个人。不积跬步无以至千里,不积小流无以成江河!!!
See you next good day~
js 抓取网页内容 同构 JavaScript 应用 —— Web 世界的未来?
网站优化 • 优采云 发表了文章 • 0 个评论 • 61 次浏览 • 2022-05-25 13:11
Web 世界有一个至理名言,就是 Java 提出的“Write once, run everywhere”。但这句话只适用于 Java 么?我们能否也用它来形容 JavaScript 呢?答案是 Yes。
我将会在这篇文章中介绍同构 JavaScript 应用的概念,并推荐一些资源帮助你构建此类应用。
一路走来
多年以前,web 只是一些由 HTML 和 CSS 搭建的静态页面,没有太多的交互。用户的每一个动作都需要服务器来创建并返回一个完整的页面。幸而有了 JavaScript,开发者开始创建很棒的效果,不过 Ajax 的到来才是这场革新的真正开始。Web 开发者开始编写能够与服务端进行交互,且在不重载页面的情况下向服务端发送并接受数据的页面。
随着时间的推移,客户端代码可以做的事情越来越多,催生了被称作单页面应用(SPA)的一类应用。SPA 在首次加载页面时就获取了所有必需的资源,或者再按需动态加载并且渲染到页面上。 Gmail 和 StackEdit editor 是很棒的 SPA 示例。
SPA 准许重度的交互设计,因为几乎所有的操作都在客户端执行,保持最低限度地与服务端进行交流。不幸的是,它们也存在一些严重的问题,我们选择几个进行讨论。
性能
因为相对于静态页面,SPA 需要更多的客户端代码,需要下载数据的体积也更大。这使得手机加载速度很慢,可能会导致一些极端的状况 —— 比如糟糕的用户体验以及收入上的损失等。依据 Microsoft 的一篇文章 ——
Bing 的一项研究表明:页面的加载时间每增加 10ms,站点年度总收入就会减少 $250K。
SEO
因为单页面应用依赖于 JavaScript 的执行,服务器不会提供它们可能用到的任何 HTML 内容。因此,web 爬虫很难去索引到这些页面。爬虫就是可以向 web 服务器发送请求,并且将结果分析成原始文本的程序,而不需要像一个浏览器运行 JavaScript 那样解释和执行客户端的内容。不久前,Google 优化了搜索引擎的 web 爬虫,现在它也可以抓取基于客户端 JavaScript 所构建的页面了。但是 Bing、Yahoo 以及其他搜索引擎怎么办?一个好的索引对任何公司来说都至关重要,它通常会带来更多的流量以及更高的回报。
同构 JavaScript 应用
同构 JavaScript 应用基于 JavaScript 编写,可以在客户端和服务端运行。正因为此,你只需要写一次代码,就可以在服务端渲染静态页面,还可以在客户端完成复杂的交互。所以,这种方式互通了两个世界,并且避免了前面提到了两个问题。
现在,有很多框架可以帮助你开发这类应用。其中最著名的一个可能是 Meteor。Meter 是一个开源 JavaScript 框架,基于 Node.js 编写,专注于实时 web 应用。我想提到的另一个项目是 Rendr,它是 Airbnb 开发的一款轻量级类库,准许同时在客户端和服务端运行 Backbone.js。
越来越多的公司将 Node.js 应用到他们的产品中。客户端和服务端的代码共享成为一个更加普通而自然的选择。在我看来,这种做法将是 web 开发的未来。有些类库通过共享模板又增强了这一趋势,比如 React。
结论
这篇文章介绍了同构 JavaScript 应用的概念,它是应用开发的一种全新方式,可以最大限度地结合服务端和客户端应用程序。我们还讨论了运用这种方式尝试解决的问题,以及你现在就可以参与实践的一些项目。
你听说过同构 JavaScript 应用么?你开发过么?你有开发经验么?
原文:Isomorphic JavaScript Applications — the Future of the Web? 查看全部
js 抓取网页内容 同构 JavaScript 应用 —— Web 世界的未来?
Web 世界有一个至理名言,就是 Java 提出的“Write once, run everywhere”。但这句话只适用于 Java 么?我们能否也用它来形容 JavaScript 呢?答案是 Yes。
我将会在这篇文章中介绍同构 JavaScript 应用的概念,并推荐一些资源帮助你构建此类应用。
一路走来
多年以前,web 只是一些由 HTML 和 CSS 搭建的静态页面,没有太多的交互。用户的每一个动作都需要服务器来创建并返回一个完整的页面。幸而有了 JavaScript,开发者开始创建很棒的效果,不过 Ajax 的到来才是这场革新的真正开始。Web 开发者开始编写能够与服务端进行交互,且在不重载页面的情况下向服务端发送并接受数据的页面。
随着时间的推移,客户端代码可以做的事情越来越多,催生了被称作单页面应用(SPA)的一类应用。SPA 在首次加载页面时就获取了所有必需的资源,或者再按需动态加载并且渲染到页面上。 Gmail 和 StackEdit editor 是很棒的 SPA 示例。
SPA 准许重度的交互设计,因为几乎所有的操作都在客户端执行,保持最低限度地与服务端进行交流。不幸的是,它们也存在一些严重的问题,我们选择几个进行讨论。
性能
因为相对于静态页面,SPA 需要更多的客户端代码,需要下载数据的体积也更大。这使得手机加载速度很慢,可能会导致一些极端的状况 —— 比如糟糕的用户体验以及收入上的损失等。依据 Microsoft 的一篇文章 ——
Bing 的一项研究表明:页面的加载时间每增加 10ms,站点年度总收入就会减少 $250K。
SEO
因为单页面应用依赖于 JavaScript 的执行,服务器不会提供它们可能用到的任何 HTML 内容。因此,web 爬虫很难去索引到这些页面。爬虫就是可以向 web 服务器发送请求,并且将结果分析成原始文本的程序,而不需要像一个浏览器运行 JavaScript 那样解释和执行客户端的内容。不久前,Google 优化了搜索引擎的 web 爬虫,现在它也可以抓取基于客户端 JavaScript 所构建的页面了。但是 Bing、Yahoo 以及其他搜索引擎怎么办?一个好的索引对任何公司来说都至关重要,它通常会带来更多的流量以及更高的回报。
同构 JavaScript 应用
同构 JavaScript 应用基于 JavaScript 编写,可以在客户端和服务端运行。正因为此,你只需要写一次代码,就可以在服务端渲染静态页面,还可以在客户端完成复杂的交互。所以,这种方式互通了两个世界,并且避免了前面提到了两个问题。
现在,有很多框架可以帮助你开发这类应用。其中最著名的一个可能是 Meteor。Meter 是一个开源 JavaScript 框架,基于 Node.js 编写,专注于实时 web 应用。我想提到的另一个项目是 Rendr,它是 Airbnb 开发的一款轻量级类库,准许同时在客户端和服务端运行 Backbone.js。
越来越多的公司将 Node.js 应用到他们的产品中。客户端和服务端的代码共享成为一个更加普通而自然的选择。在我看来,这种做法将是 web 开发的未来。有些类库通过共享模板又增强了这一趋势,比如 React。
结论
这篇文章介绍了同构 JavaScript 应用的概念,它是应用开发的一种全新方式,可以最大限度地结合服务端和客户端应用程序。我们还讨论了运用这种方式尝试解决的问题,以及你现在就可以参与实践的一些项目。
你听说过同构 JavaScript 应用么?你开发过么?你有开发经验么?
原文:Isomorphic JavaScript Applications — the Future of the Web?
js 抓取网页内容 同构 JavaScript 应用 —— Web 世界的未来?
网站优化 • 优采云 发表了文章 • 0 个评论 • 61 次浏览 • 2022-05-21 12:13
Web 世界有一个至理名言,就是 Java 提出的“Write once, run everywhere”。但这句话只适用于 Java 么?我们能否也用它来形容 JavaScript 呢?答案是 Yes。
我将会在这篇文章中介绍同构 JavaScript 应用的概念,并推荐一些资源帮助你构建此类应用。
一路走来
多年以前,web 只是一些由 HTML 和 CSS 搭建的静态页面,没有太多的交互。用户的每一个动作都需要服务器来创建并返回一个完整的页面。幸而有了 JavaScript,开发者开始创建很棒的效果,不过 Ajax 的到来才是这场革新的真正开始。Web 开发者开始编写能够与服务端进行交互,且在不重载页面的情况下向服务端发送并接受数据的页面。
随着时间的推移,客户端代码可以做的事情越来越多,催生了被称作单页面应用(SPA)的一类应用。SPA 在首次加载页面时就获取了所有必需的资源,或者再按需动态加载并且渲染到页面上。 Gmail 和 StackEdit editor 是很棒的 SPA 示例。
SPA 准许重度的交互设计,因为几乎所有的操作都在客户端执行,保持最低限度地与服务端进行交流。不幸的是,它们也存在一些严重的问题,我们选择几个进行讨论。
性能
因为相对于静态页面,SPA 需要更多的客户端代码,需要下载数据的体积也更大。这使得手机加载速度很慢,可能会导致一些极端的状况 —— 比如糟糕的用户体验以及收入上的损失等。依据 Microsoft 的一篇文章 ——
Bing 的一项研究表明:页面的加载时间每增加 10ms,站点年度总收入就会减少 $250K。
SEO
因为单页面应用依赖于 JavaScript 的执行,服务器不会提供它们可能用到的任何 HTML 内容。因此,web 爬虫很难去索引到这些页面。爬虫就是可以向 web 服务器发送请求,并且将结果分析成原始文本的程序,而不需要像一个浏览器运行 JavaScript 那样解释和执行客户端的内容。不久前,Google 优化了搜索引擎的 web 爬虫,现在它也可以抓取基于客户端 JavaScript 所构建的页面了。但是 Bing、Yahoo 以及其他搜索引擎怎么办?一个好的索引对任何公司来说都至关重要,它通常会带来更多的流量以及更高的回报。
同构 JavaScript 应用
同构 JavaScript 应用基于 JavaScript 编写,可以在客户端和服务端运行。正因为此,你只需要写一次代码,就可以在服务端渲染静态页面,还可以在客户端完成复杂的交互。所以,这种方式互通了两个世界,并且避免了前面提到了两个问题。
现在,有很多框架可以帮助你开发这类应用。其中最著名的一个可能是 Meteor。Meter 是一个开源 JavaScript 框架,基于 Node.js 编写,专注于实时 web 应用。我想提到的另一个项目是 Rendr,它是 Airbnb 开发的一款轻量级类库,准许同时在客户端和服务端运行 Backbone.js。
越来越多的公司将 Node.js 应用到他们的产品中。客户端和服务端的代码共享成为一个更加普通而自然的选择。在我看来,这种做法将是 web 开发的未来。有些类库通过共享模板又增强了这一趋势,比如 React。
结论
这篇文章介绍了同构 JavaScript 应用的概念,它是应用开发的一种全新方式,可以最大限度地结合服务端和客户端应用程序。我们还讨论了运用这种方式尝试解决的问题,以及你现在就可以参与实践的一些项目。
你听说过同构 JavaScript 应用么?你开发过么?你有开发经验么?
原文:Isomorphic JavaScript Applications — the Future of the Web? 查看全部
js 抓取网页内容 同构 JavaScript 应用 —— Web 世界的未来?
Web 世界有一个至理名言,就是 Java 提出的“Write once, run everywhere”。但这句话只适用于 Java 么?我们能否也用它来形容 JavaScript 呢?答案是 Yes。
我将会在这篇文章中介绍同构 JavaScript 应用的概念,并推荐一些资源帮助你构建此类应用。
一路走来
多年以前,web 只是一些由 HTML 和 CSS 搭建的静态页面,没有太多的交互。用户的每一个动作都需要服务器来创建并返回一个完整的页面。幸而有了 JavaScript,开发者开始创建很棒的效果,不过 Ajax 的到来才是这场革新的真正开始。Web 开发者开始编写能够与服务端进行交互,且在不重载页面的情况下向服务端发送并接受数据的页面。
随着时间的推移,客户端代码可以做的事情越来越多,催生了被称作单页面应用(SPA)的一类应用。SPA 在首次加载页面时就获取了所有必需的资源,或者再按需动态加载并且渲染到页面上。 Gmail 和 StackEdit editor 是很棒的 SPA 示例。
SPA 准许重度的交互设计,因为几乎所有的操作都在客户端执行,保持最低限度地与服务端进行交流。不幸的是,它们也存在一些严重的问题,我们选择几个进行讨论。
性能
因为相对于静态页面,SPA 需要更多的客户端代码,需要下载数据的体积也更大。这使得手机加载速度很慢,可能会导致一些极端的状况 —— 比如糟糕的用户体验以及收入上的损失等。依据 Microsoft 的一篇文章 ——
Bing 的一项研究表明:页面的加载时间每增加 10ms,站点年度总收入就会减少 $250K。
SEO
因为单页面应用依赖于 JavaScript 的执行,服务器不会提供它们可能用到的任何 HTML 内容。因此,web 爬虫很难去索引到这些页面。爬虫就是可以向 web 服务器发送请求,并且将结果分析成原始文本的程序,而不需要像一个浏览器运行 JavaScript 那样解释和执行客户端的内容。不久前,Google 优化了搜索引擎的 web 爬虫,现在它也可以抓取基于客户端 JavaScript 所构建的页面了。但是 Bing、Yahoo 以及其他搜索引擎怎么办?一个好的索引对任何公司来说都至关重要,它通常会带来更多的流量以及更高的回报。
同构 JavaScript 应用
同构 JavaScript 应用基于 JavaScript 编写,可以在客户端和服务端运行。正因为此,你只需要写一次代码,就可以在服务端渲染静态页面,还可以在客户端完成复杂的交互。所以,这种方式互通了两个世界,并且避免了前面提到了两个问题。
现在,有很多框架可以帮助你开发这类应用。其中最著名的一个可能是 Meteor。Meter 是一个开源 JavaScript 框架,基于 Node.js 编写,专注于实时 web 应用。我想提到的另一个项目是 Rendr,它是 Airbnb 开发的一款轻量级类库,准许同时在客户端和服务端运行 Backbone.js。
越来越多的公司将 Node.js 应用到他们的产品中。客户端和服务端的代码共享成为一个更加普通而自然的选择。在我看来,这种做法将是 web 开发的未来。有些类库通过共享模板又增强了这一趋势,比如 React。
结论
这篇文章介绍了同构 JavaScript 应用的概念,它是应用开发的一种全新方式,可以最大限度地结合服务端和客户端应用程序。我们还讨论了运用这种方式尝试解决的问题,以及你现在就可以参与实践的一些项目。
你听说过同构 JavaScript 应用么?你开发过么?你有开发经验么?
原文:Isomorphic JavaScript Applications — the Future of the Web?
js抓取网页内容,获取qq聊天记录免费开源实现js
网站优化 • 优采云 发表了文章 • 0 个评论 • 127 次浏览 • 2022-05-18 14:02
js抓取网页内容,获取qq聊天记录免费https开源实现js抓取网页内容,
可以看看这个帖子。一定不要对js有什么侥幸心理,我之前还用js在uiwebview里操作title,timeline重构呢,把评论列表转换一下文本风格,组个三级评论,然后让我改title...哭着告诉你不可能的,这个就是精神洁癖惹的祸。我们在碰到没办法操作的情况的时候都会压力山大,拼命的开发uiwebview去匹配一些自己看不懂的字符,回头看效果也是不忍直视。
js抓取才是人人必备的技能,深入研究一下,不仅仅是爬虫之类,而是深度剖析js。首先要安装jsjs不然当你遇到object的属性重写的时候你会蛋疼死,好多jsclass对象都是可以从内部写写写抓进去的。第二要懂一点点python,一般js有直接调用模块里对象的机制,当有这个机制的时候你就会感到一种是shit,还是shit的质疑,因为这种机制用过c系的童鞋应该深有体会。
当然更多的要用python去抓写好js代码和格式,可以简单操作,抓取的内容格式和抓取的页面内容格式要尽量一致。格式不一致你抓取到的内容也不一致。第三点,要会用web库或者框架。这个就要多涉猎多抓取,碰到合适的用就好,至于第二点就是把书上的案例放到案例库里去模拟个你就会很熟练了。比如天猫,去哪儿,淘宝,花瓣,豆瓣...等等第四点..就是遇到数据量多的情况要练习手指点击操作,因为可能爬去的数据就几千万条数据,实在不容易。当然操作和理解都在于积累,都在于熟练,followup...。 查看全部
js抓取网页内容,获取qq聊天记录免费开源实现js
js抓取网页内容,获取qq聊天记录免费https开源实现js抓取网页内容,
可以看看这个帖子。一定不要对js有什么侥幸心理,我之前还用js在uiwebview里操作title,timeline重构呢,把评论列表转换一下文本风格,组个三级评论,然后让我改title...哭着告诉你不可能的,这个就是精神洁癖惹的祸。我们在碰到没办法操作的情况的时候都会压力山大,拼命的开发uiwebview去匹配一些自己看不懂的字符,回头看效果也是不忍直视。
js抓取才是人人必备的技能,深入研究一下,不仅仅是爬虫之类,而是深度剖析js。首先要安装jsjs不然当你遇到object的属性重写的时候你会蛋疼死,好多jsclass对象都是可以从内部写写写抓进去的。第二要懂一点点python,一般js有直接调用模块里对象的机制,当有这个机制的时候你就会感到一种是shit,还是shit的质疑,因为这种机制用过c系的童鞋应该深有体会。
当然更多的要用python去抓写好js代码和格式,可以简单操作,抓取的内容格式和抓取的页面内容格式要尽量一致。格式不一致你抓取到的内容也不一致。第三点,要会用web库或者框架。这个就要多涉猎多抓取,碰到合适的用就好,至于第二点就是把书上的案例放到案例库里去模拟个你就会很熟练了。比如天猫,去哪儿,淘宝,花瓣,豆瓣...等等第四点..就是遇到数据量多的情况要练习手指点击操作,因为可能爬去的数据就几千万条数据,实在不容易。当然操作和理解都在于积累,都在于熟练,followup...。
js 抓取网页内容 【第2030期】JavaScript 启动性能瓶颈分析与解决方案
网站优化 • 优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2022-05-16 06:31
前言
找到它存在的意义。今日早读文章由@王下邀月熊翻译授权分享。
正文从这开始~~
在 Web 开发中,随着需求的增加与代码库的扩张,我们最终发布的 Web 页面也逐渐膨胀。不过这种膨胀远不止意味着占据更多的传输带宽,其还意味着用户浏览网页时可能更差劲的性能体验。浏览器在下载完某个页面依赖的脚本之后,其还需要经过语法分析、解释与运行这些步骤。而本文则会深入分析浏览器对于 JavaScript 的这些处理流程,挖掘出那些影响你应用启动时间的罪魁祸首,并且根据我个人的经验提出相对应的解决方案。回顾过去,我们还没有专门地考虑过如何去优化 JavaScript 解析/编译这些步骤;我们预想中的是解析器在发现 查看全部
js 抓取网页内容 【第2030期】JavaScript 启动性能瓶颈分析与解决方案
前言
找到它存在的意义。今日早读文章由@王下邀月熊翻译授权分享。
正文从这开始~~
在 Web 开发中,随着需求的增加与代码库的扩张,我们最终发布的 Web 页面也逐渐膨胀。不过这种膨胀远不止意味着占据更多的传输带宽,其还意味着用户浏览网页时可能更差劲的性能体验。浏览器在下载完某个页面依赖的脚本之后,其还需要经过语法分析、解释与运行这些步骤。而本文则会深入分析浏览器对于 JavaScript 的这些处理流程,挖掘出那些影响你应用启动时间的罪魁祸首,并且根据我个人的经验提出相对应的解决方案。回顾过去,我们还没有专门地考虑过如何去优化 JavaScript 解析/编译这些步骤;我们预想中的是解析器在发现
3招教你做符合百度抓取的内容(网站秒收录)
网站优化 • 优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2022-05-14 02:40
你知道在搜索引擎眼里什么才叫高质量的文章吗?
在 SEO 圈,“内容”肯定是一个经久不衰的论题,尽管每个阶段的搜索引擎算法对待 SEO 都有不同的规范,益发智能化的算法也让深圳SEO 作业变得越来越不简略,但“好内容”永远是一个包围利器。那么问题来了,在搜索引擎看来,怎样的内容才是“高质量内容”呢?
简略来说,“高质量内容”是好内容、优质代码、以及杰出用户体会的集成体。
一、 根本规范
内容最根本的组成部分便是“文字”,写文章时千万首要不要呈现错别字、语病、无标点、长篇大论不分段的情况;在不必要的情况下,不要运用艰深、难明的文字、表述,尽量运用便于各个层次用户均可了解的、简略直观的语句。
二、排版布局
想要产出让用户满足的“高质量内容”,除了内容本身外,排版布局也是一项很重要的作业,毕竟人都是视觉动物。
将文本内容划分为标题、副标题、正文等不同的类型,然后让文本各司其职,具有杰出的层次,明晰的层次结构能够让内容具有更好的可读性,恰当的配图则会让文章显得更加生动。别的,不同文本类型运用不同格式、不同巨细、不同色彩的字体,也能够让用户取得更好的阅览体会。当需求引用其他平台内容时,尽量确保链接导向到高质、威望的站点(如政府平台、官方网站等)。
三、加载速度
“网站加载速度”的重要性终究有多大呢?据研讨查询标明,网站加载时刻过长是形成用户丢失的首要原因之一,关于电商网站来说更是如此。
“网站加载速度”与“用户购买行为”之间的联系,如下图:
快节奏的日子导致用户们耐心缺失,阅读网页的时分更是如此,能够说速度是决议网站胜败最重要的要素之一,网站加载时刻添加 1 秒,可能导致:转化率下降 7%,用户满足度下降 16%……
那么,该怎么进步“加载速度”呢?下面大概说几个点:
1)将JS代码和CSS款式别离合并到一个同享的文件;
2)恰当紧缩图片,优化格式;
3)优先显现可见区域中的内容,即优先加载第一屏的内容、款式等,当用户翻滚鼠标时再加载下方内容;
4)给代码做减法,去除不必要的冗余代码,如空格、注释等。
5)缓存静态资源,通过设置阅读器缓存,将CSS、JS等不太常常更新的文件进行缓存;
四、立异性
现在,网络上、交际媒体、自媒体等平台上总是充满着“怎么写好文章”套路、教程,比方《10W+的文章标题是怎么写出来的》、《自媒体人必须懂得的10W+文章技巧》……诸如此类,导致“内容生产者们”的文章总按一个套路开端写,丧失了立异性,不断趋于同质化,乃至用户看了最初变觉得索然无味。
所以,想要遭到用户的喜爱,要么写出有深度、有见地、有沉积,没有商业气味的内容,这个关于很多站长来说难度比较大;另一种就是写出“新颖”的内容,这类对文笔要求略微低一些,但需求必定的构思 iDea,比方我们都在写“鹿晗和晓彤揭露爱情”的时分,那个能在第一时刻联写出“为何鹿晗没有选择迪丽热巴”这样文章的作者取得的重视度肯定会更大(可能些这样的文章会被网友喷,但肯定能取得重视度)。
查看全部
3招教你做符合百度抓取的内容(网站秒收录)
你知道在搜索引擎眼里什么才叫高质量的文章吗?
在 SEO 圈,“内容”肯定是一个经久不衰的论题,尽管每个阶段的搜索引擎算法对待 SEO 都有不同的规范,益发智能化的算法也让深圳SEO 作业变得越来越不简略,但“好内容”永远是一个包围利器。那么问题来了,在搜索引擎看来,怎样的内容才是“高质量内容”呢?
简略来说,“高质量内容”是好内容、优质代码、以及杰出用户体会的集成体。
一、 根本规范
内容最根本的组成部分便是“文字”,写文章时千万首要不要呈现错别字、语病、无标点、长篇大论不分段的情况;在不必要的情况下,不要运用艰深、难明的文字、表述,尽量运用便于各个层次用户均可了解的、简略直观的语句。
二、排版布局
想要产出让用户满足的“高质量内容”,除了内容本身外,排版布局也是一项很重要的作业,毕竟人都是视觉动物。
将文本内容划分为标题、副标题、正文等不同的类型,然后让文本各司其职,具有杰出的层次,明晰的层次结构能够让内容具有更好的可读性,恰当的配图则会让文章显得更加生动。别的,不同文本类型运用不同格式、不同巨细、不同色彩的字体,也能够让用户取得更好的阅览体会。当需求引用其他平台内容时,尽量确保链接导向到高质、威望的站点(如政府平台、官方网站等)。
三、加载速度
“网站加载速度”的重要性终究有多大呢?据研讨查询标明,网站加载时刻过长是形成用户丢失的首要原因之一,关于电商网站来说更是如此。
“网站加载速度”与“用户购买行为”之间的联系,如下图:
快节奏的日子导致用户们耐心缺失,阅读网页的时分更是如此,能够说速度是决议网站胜败最重要的要素之一,网站加载时刻添加 1 秒,可能导致:转化率下降 7%,用户满足度下降 16%……
那么,该怎么进步“加载速度”呢?下面大概说几个点:
1)将JS代码和CSS款式别离合并到一个同享的文件;
2)恰当紧缩图片,优化格式;
3)优先显现可见区域中的内容,即优先加载第一屏的内容、款式等,当用户翻滚鼠标时再加载下方内容;
4)给代码做减法,去除不必要的冗余代码,如空格、注释等。
5)缓存静态资源,通过设置阅读器缓存,将CSS、JS等不太常常更新的文件进行缓存;
四、立异性
现在,网络上、交际媒体、自媒体等平台上总是充满着“怎么写好文章”套路、教程,比方《10W+的文章标题是怎么写出来的》、《自媒体人必须懂得的10W+文章技巧》……诸如此类,导致“内容生产者们”的文章总按一个套路开端写,丧失了立异性,不断趋于同质化,乃至用户看了最初变觉得索然无味。
所以,想要遭到用户的喜爱,要么写出有深度、有见地、有沉积,没有商业气味的内容,这个关于很多站长来说难度比较大;另一种就是写出“新颖”的内容,这类对文笔要求略微低一些,但需求必定的构思 iDea,比方我们都在写“鹿晗和晓彤揭露爱情”的时分,那个能在第一时刻联写出“为何鹿晗没有选择迪丽热巴”这样文章的作者取得的重视度肯定会更大(可能些这样的文章会被网友喷,但肯定能取得重视度)。
DomCurl:Curl + JavaScript前端抓取小工具
网站优化 • 优采云 发表了文章 • 0 个评论 • 83 次浏览 • 2022-05-09 07:43
21世纪技术官导读:开发过网页爬虫的同学,会发现一些网页越来越难抓,在后端我们可以使用curl来抓取,但是处理起来非常复杂。现在前端出来一些好工具,使用JavaScript就可以开发出类似curl的程序,帮助我们直接在浏览器端直接获取相关的内容,并充分利用好Chrome的开发工具。
很长一段时间以来,我一直在思考,我们常用的浏览器的未来。“如果所有东西都是由网络提供动力的,但为啥没有浏览器的事儿?”
如果你有完整权限访问浏览器,但是没有看见“金子”,那么和大家说一个新的服务和机会,浏览器里蕴藏着新的机会。
使用浏览器作可以让开发者利用已经输出的HTML,与自定义的JavaScript函数执行相结合,对其内容进行深入分析。
在服务器上运行浏览器,我们可以更轻松的构建和分析动态生成数据的服务,这将使我们能够更轻松地运行自己的逻辑,对页面上的数据能更有效操作的能力。
从想法到实现需要一段时间,但我现在认为已经到达了那里。
Puppeteer是一个基于Chrome Dev Tools协议之上的JavaScript库,它允许开发自动化和编写Chrome浏览器的脚本。
我的日常工作涉及很多调试Web服务器,以确保网站质量。与许多开发人员一样,我使用curl向Web服务器发出请求并获取返回的内容。
而如今,开发者正在构建使用大量JavaScript构建的网站,还有像react开发的这类网站,这使得抓取到的内容不是完整的内容。
于是我决定创建一个类似cUrl的工具来获取资源,并在称为domcurl的页面上运行JavaScript。
domcurl是一个使用Puppeteer的小型Node.js应用程序,可以通过以下命令进行安装:
npm install domcurl
像curl命令一样,您可以发出一个简单的domcurl [url]来获取资源并在页面上运行JS。
它不会复制所有的curl ,但它具有以下功能:
指定要抓取的网址,即domcurl [url]
用-v检查响应标题。 即, domcurl -v [url]
使用-b即, domcurl [url] -b "test=hello; Domain=; HttpOnly;" -b setcookie domcurl [url] -b "test=hello; Domain=; HttpOnly;" -b domcurl [url] -b "test=hello; Domain=; HttpOnly;" -b
"hello=world; Domain=; HttpOnly;"
使用-H参数添加自定义标题。
使用--stderr手动设置STDOUT和-o和STDERR
我发现它非常有用,但它不能像curl那样流式传输结果,必须等待CSS和JS被下载和执行。
后来我又添加了一些基于JavaScript和Chrome的特性。
输出一个Chrome开发工具跟踪文件(包括屏幕截图):
domcurl --url --trace test.json
如果你需要将其集成到任何现有应用程序中,可以将其作为JavaScript模块加入。
const {domcurl} = require('domcurl'); domcurl(``, {});
现在这个工具还不是特别全面,但我认为The Headless Web正在成熟,像Puppeteer和其它工具将帮助开发者在浏览器端抓取页面持续提供强大功能。 我们只需建立规则逻辑就可以了。
译者:春晖 查看全部
DomCurl:Curl + JavaScript前端抓取小工具
21世纪技术官导读:开发过网页爬虫的同学,会发现一些网页越来越难抓,在后端我们可以使用curl来抓取,但是处理起来非常复杂。现在前端出来一些好工具,使用JavaScript就可以开发出类似curl的程序,帮助我们直接在浏览器端直接获取相关的内容,并充分利用好Chrome的开发工具。
很长一段时间以来,我一直在思考,我们常用的浏览器的未来。“如果所有东西都是由网络提供动力的,但为啥没有浏览器的事儿?”
如果你有完整权限访问浏览器,但是没有看见“金子”,那么和大家说一个新的服务和机会,浏览器里蕴藏着新的机会。
使用浏览器作可以让开发者利用已经输出的HTML,与自定义的JavaScript函数执行相结合,对其内容进行深入分析。
在服务器上运行浏览器,我们可以更轻松的构建和分析动态生成数据的服务,这将使我们能够更轻松地运行自己的逻辑,对页面上的数据能更有效操作的能力。
从想法到实现需要一段时间,但我现在认为已经到达了那里。
Puppeteer是一个基于Chrome Dev Tools协议之上的JavaScript库,它允许开发自动化和编写Chrome浏览器的脚本。
我的日常工作涉及很多调试Web服务器,以确保网站质量。与许多开发人员一样,我使用curl向Web服务器发出请求并获取返回的内容。
而如今,开发者正在构建使用大量JavaScript构建的网站,还有像react开发的这类网站,这使得抓取到的内容不是完整的内容。
于是我决定创建一个类似cUrl的工具来获取资源,并在称为domcurl的页面上运行JavaScript。
domcurl是一个使用Puppeteer的小型Node.js应用程序,可以通过以下命令进行安装:
npm install domcurl
像curl命令一样,您可以发出一个简单的domcurl [url]来获取资源并在页面上运行JS。
它不会复制所有的curl ,但它具有以下功能:
指定要抓取的网址,即domcurl [url]
用-v检查响应标题。 即, domcurl -v [url]
使用-b即, domcurl [url] -b "test=hello; Domain=; HttpOnly;" -b setcookie domcurl [url] -b "test=hello; Domain=; HttpOnly;" -b domcurl [url] -b "test=hello; Domain=; HttpOnly;" -b
"hello=world; Domain=; HttpOnly;"
使用-H参数添加自定义标题。
使用--stderr手动设置STDOUT和-o和STDERR
我发现它非常有用,但它不能像curl那样流式传输结果,必须等待CSS和JS被下载和执行。
后来我又添加了一些基于JavaScript和Chrome的特性。
输出一个Chrome开发工具跟踪文件(包括屏幕截图):
domcurl --url --trace test.json
如果你需要将其集成到任何现有应用程序中,可以将其作为JavaScript模块加入。
const {domcurl} = require('domcurl'); domcurl(``, {});
现在这个工具还不是特别全面,但我认为The Headless Web正在成熟,像Puppeteer和其它工具将帮助开发者在浏览器端抓取页面持续提供强大功能。 我们只需建立规则逻辑就可以了。
译者:春晖
用 Javascript 和 Node.js 爬取网页
网站优化 • 优采云 发表了文章 • 0 个评论 • 298 次浏览 • 2022-05-06 17:06
HTTP 客户端是能够将请求发送到服务器,然后接收服务器响应的工具。下面提到的所有工具底的层都是用 HTTP 客户端来访问你要抓取的网站。
Request
Request 是 Javascript 生态中使用最广泛的 HTTP 客户端之一,但是 Request 库的作者已正式声明弃用了。不过这并不意味着它不可用了,相当多的库仍在使用它,并且非常好用。用 Request 发出 HTTP 请求是非常简单的:
1const request = require('request')<br />2request('https://www.reddit.com/r/programming.json', function (<br />3 error,<br />4 response,<br />5 body<br />6) {<br />7 console.error('error:', error)<br />8 console.log('body:', body)<br />9})<br />
你可以在 Github 上找到 Request 库,安装它非常简单。你还可以在 找到弃用通知及其含义。
Axios
Axios 是基于 promise 的 HTTP 客户端,可在浏览器和 Node.js 中运行。如果你用 Typescript,那么 axios 会为你覆盖内置类型。通过 Axios 发起 HTTP 请求非常简单,默认情况下它带有 Promise 支持,而不是在 Request 中去使用回调:
1const axios = require('axios')<br /> 2<br /> 3axios<br /> 4 .get('https://www.reddit.com/r/programming.json')<br /> 5 .then((response) => {<br /> 6 console.log(response)<br /> 7 })<br /> 8 .catch((error) => {<br /> 9 console.error(error)<br />10 });<br />
如果你喜欢 Promises API 的 async/await 语法糖,那么你也可以用,但是由于顶级 await 仍处于 stage 3 ,所以我们只好先用异步函数来代替:
1async function getForum() {<br /> 2 try {<br /> 3 const response = await axios.get(<br /> 4 'https://www.reddit.com/r/programming.json'<br /> 5 )<br /> 6 console.log(response)<br /> 7 } catch (error) {<br /> 8 console.error(error)<br /> 9 }<br />10}<br />
你所要做的就是调用 getForum!可以在 上找到Axios库。
Superagent
与 Axios 一样,Superagent 是另一个强大的 HTTP 客户端,它支持 Promise 和 async/await 语法糖。它具有像 Axios 这样相当简单的 API,但是 Superagent 由于存在更多的依赖关系并且不那么流行。
用 promise、async/await 或回调向 Superagent 发出HTTP请求看起来像这样:
1const superagent = require("superagent")<br /> 2const forumURL = "https://www.reddit.com/r/progr ... %3Bbr /> 3<br /> 4// callbacks<br /> 5superagent<br /> 6 .get(forumURL)<br /> 7 .end((error, response) => {<br /> 8 console.log(response)<br /> 9 })<br />10<br />11// promises<br />12superagent<br />13 .get(forumURL)<br />14 .then((response) => {<br />15 console.log(response)<br />16 })<br />17 .catch((error) => {<br />18 console.error(error)<br />19 })<br />20<br />21// promises with async/await<br />22async function getForum() {<br />23 try {<br />24 const response = await superagent.get(forumURL)<br />25 console.log(response)<br />26 } catch (error) {<br />27 console.error(error)<br />28 }<br />29}<br />
可以在 找到 Superagent。
正则表达式:艰难的路
在没有任何依赖性的情况下,最简单的进行网络抓取的方法是,使用 HTTP 客户端查询网页时,在收到的 HTML 字符串上使用一堆正则表达式。正则表达式不那么灵活,而且很多专业人士和业余爱好者都难以编写正确的正则表达式。
让我们试一试,假设其中有一个带有用户名的标签,我们需要该用户名,这类似于你依赖正则表达式时必须执行的操作
1const htmlString = 'Username: John Doe'<br />2const result = htmlString.match(/(.+)/)<br />3<br />4console.log(result[1], result[1].split(": ")[1])<br />5// Username: John Doe, John Doe<br />
在 Javascript 中,match() 通常返回一个数组,该数组包含与正则表达式匹配的所有内容。第二个元素(在索引1中)将找到我们想要的 标记的 textContent 或 innerHTML。但是结果中包含一些不需要的文本( “Username: “),必须将其删除。
如你所见,对于一个非常简单的用例,步骤和要做的工作都很多。这就是为什么应该依赖 HTML 解析器的原因,我们将在后面讨论。
Cheerio:用于遍历 DOM 的核心 JQuery
Cheerio 是一个高效轻便的库,它使你可以在服务器端使用 JQuery 的丰富而强大的 API。如果你以前用过 JQuery,那么将会对 Cheerio 感到很熟悉,它消除了 DOM 所有不一致和与浏览器相关的功能,并公开了一种有效的 API 来解析和操作 DOM。
1const cheerio = require('cheerio')<br />2const $ = cheerio.load('Hello world')<br />3<br />4$('h2.title').text('Hello there!')<br />5$('h2').addClass('welcome')<br />6<br />7$.html()<br />8// Hello there!<br />
如你所见,Cheerio 与 JQuery 用起来非常相似。
但是,尽管它的工作方式不同于网络浏览器,也就这意味着它不能:
因此,如果你尝试爬取的网站或 Web 应用是严重依赖 Javascript 的(例如“单页应用”),那么 Cheerio 并不是最佳选择,你可能不得不依赖稍后讨论的其他选项。
为了展示 Cheerio 的强大功能,我们将尝试在 Reddit 中抓取 r/programming 论坛,尝试获取帖子名称列表。
首先,通过运行以下命令来安装 Cheerio 和 axios:npm install cheerio axios。
然后创建一个名为 crawler.js 的新文件,并复制粘贴以下代码:
1const axios = require('axios');<br /> 2const cheerio = require('cheerio');<br /> 3<br /> 4const getPostTitles = async () => {<br /> 5 try {<br /> 6 const { data } = await axios.get(<br /> 7 'https://old.reddit.com/r/programming/'<br /> 8 );<br /> 9 const $ = cheerio.load(data);<br />10 const postTitles = [];<br />11<br />12 $('div > p.title > a').each((_idx, el) => {<br />13 const postTitle = $(el).text()<br />14 postTitles.push(postTitle)<br />15 });<br />16<br />17 return postTitles;<br />18 } catch (error) {<br />19 throw error;<br />20 }<br />21};<br />22<br />23getPostTitles()<br />24.then((postTitles) => console.log(postTitles));<br />
getPostTitles() 是一个异步函数,将对旧的 reddit 的 r/programming 论坛进行爬取。首先,用带有 axios HTTP 客户端库的简单 HTTP GET 请求获取网站的 HTML,然后用 cheerio.load() 函数将 html 数据输入到 Cheerio 中。
然后在浏览器的 Dev Tools 帮助下,可以获得可以定位所有列表项的选择器。如果你使用过 JQuery,则必须非常熟悉 $('div> p.title> a')。这将得到所有帖子,因为你只希望单独获取每个帖子的标题,所以必须遍历每个帖子,这些操作是在 each() 函数的帮助下完成的。
要从每个标题中提取文本,必须在 Cheerio 的帮助下获取 DOM元素( el 指代当前元素)。然后在每个元素上调用 text() 能够为你提供文本。
现在,打开终端并运行 node crawler.js,然后你将看到大约存有标题的数组,它会很长。尽管这是一个非常简单的用例,但它展示了 Cheerio 提供的 API 的简单性质。
如果你的用例需要执行 Javascript 并加载外部源,那么以下几个选项将很有帮助。
JSDOM:Node 的 DOM
JSDOM 是在 Node.js 中使用的文档对象模型的纯 Javascript 实现,如前所述,DOM 对 Node 不可用,但是 JSDOM 是最接近的。它或多或少地模仿了浏览器。
由于创建了 DOM,所以可以通过编程与要爬取的 Web 应用或网站进行交互,也可以模拟单击按钮。如果你熟悉 DOM 操作,那么使用 JSDOM 将会非常简单。
1const { JSDOM } = require('jsdom')<br /> 2const { document } = new JSDOM(<br /> 3 'Hello world'<br /> 4).window<br /> 5const heading = document.querySelector('.title')<br /> 6heading.textContent = 'Hello there!'<br /> 7heading.classList.add('welcome')<br /> 8<br /> 9heading.innerHTML<br />10// Hello there!<br />
代码中用 JSDOM 创建一个 DOM,然后你可以用和操纵浏览器 DOM 相同的方法和属性来操纵该 DOM。
为了演示如何用 JSDOM 与网站进行交互,我们将获得 Reddit r/programming 论坛的第一篇帖子并对其进行投票,然后验证该帖子是否已被投票。
首先运行以下命令来安装 jsdom 和 axios:npm install jsdom axios
然后创建名为 crawler.js的文件,并复制粘贴以下代码:
1const { JSDOM } = require("jsdom")<br /> 2const axios = require('axios')<br /> 3<br /> 4const upvoteFirstPost = async () => {<br /> 5 try {<br /> 6 const { data } = await axios.get("https://old.reddit.com/r/programming/");<br /> 7 const dom = new JSDOM(data, {<br /> 8 runScripts: "dangerously",<br /> 9 resources: "usable"<br />10 });<br />11 const { document } = dom.window;<br />12 const firstPost = document.querySelector("div > div.midcol > div.arrow");<br />13 firstPost.click();<br />14 const isUpvoted = firstPost.classList.contains("upmod");<br />15 const msg = isUpvoted<br />16 ? "Post has been upvoted successfully!"<br />17 : "The post has not been upvoted!";<br />18<br />19 return msg;<br />20 } catch (error) {<br />21 throw error;<br />22 }<br />23};<br />24<br />25upvoteFirstPost().then(msg => console.log(msg));<br />
upvoteFirstPost() 是一个异步函数,它将在 r/programming 中获取第一个帖子,然后对其进行投票。axios 发送 HTTP GET 请求获取指定 URL 的HTML。然后通过先前获取的 HTML 来创建新的 DOM。JSDOM 构造函数把HTML 作为第一个参数,把 option 作为第二个参数,已添加的 2 个 option 项执行以下功能:
创建 DOM 后,用相同的 DOM 方法得到第一篇文章的 upvote 按钮,然后单击。要验证是否确实单击了它,可以检查 classList 中是否有一个名为 upmod 的类。如果存在于 classList 中,则返回一条消息。
打开终端并运行 node crawler.js,然后会看到一个整洁的字符串,该字符串将表明帖子是否被赞过。尽管这个例子很简单,但你可以在这个基础上构建功能强大的东西,例如,一个围绕特定用户的帖子进行投票的机器人。
如果你不喜欢缺乏表达能力的 JSDOM ,并且实践中要依赖于许多此类操作,或者需要重新创建许多不同的 DOM,那么下面将是更好的选择。
Puppeteer:无头浏览器
顾名思义,Puppeteer 允许你以编程方式操纵浏览器,就像操纵木偶一样。它通过为开发人员提供高级 API 来默认控制无头版本的 Chrome。
摘自 Puppeter DocsPuppeteer 比上述工具更有用,因为它可以使你像真正的人在与浏览器进行交互一样对网络进行爬取。这就具备了一些以前没有的可能性:
它还可以在 Web 爬取之外的其他任务中发挥重要作用,例如 UI 测试、辅助性能优化等。
通常你会想要截取网站的屏幕截图,也许是为了了解竞争对手的产品目录,可以用 puppeteer 来做到。首先运行以下命令安装 puppeteer,:npm install puppeteer
这将下载 Chromium 的 bundle 版本,根据操作系统的不同,该版本大约 180 MB 至 300 MB。如果你要禁用此功能。
让我们尝试在 Reddit 中获取 r/programming 论坛的屏幕截图和 PDF,创建一个名为 crawler.js的新文件,然后复制粘贴以下代码:
1const puppeteer = require('puppeteer')<br /> 2<br /> 3async function getVisual() {<br /> 4 try {<br /> 5 const URL = 'https://www.reddit.com/r/programming/'<br /> 6 const browser = await puppeteer.launch()<br /> 7 const page = await browser.newPage()<br /> 8<br /> 9 await page.goto(URL)<br />10 await page.screenshot({ path: 'screenshot.png' })<br />11 await page.pdf({ path: 'page.pdf' })<br />12<br />13 await browser.close()<br />14 } catch (error) {<br />15 console.error(error)<br />16 }<br />17}<br />18<br />19getVisual()<br />
getVisual() 是一个异步函数,它将获 URL 变量中 url 对应的屏幕截图和 pdf。首先,通过 puppeteer.launch() 创建浏览器实例,然后创建一个新页面。可以将该页面视为常规浏览器中的选项卡。然后通过以 URL 为参数调用 page.goto() ,将先前创建的页面定向到指定的 URL。最终,浏览器实例与页面一起被销毁。
完成操作并完成页面加载后,将分别使用 page.screenshot() 和 page.pdf() 获取屏幕截图和 pdf。你也可以侦听 javascript load 事件,然后执行这些操作,在生产环境级别下强烈建议这样做。
在终端上运行 node crawler.js ,几秒钟后,你会注意到已经创建了两个文件,分别名为 screenshot.jpg 和 page.pdf。
Nightmare:Puppeteer 的替代者
Nightmare 是类似 Puppeteer 的高级浏览器自动化库,该库使用 Electron,但据说速度是其前身 PhantomJS 的两倍。
如果你在某种程度上不喜欢 Puppeteer 或对 Chromium 捆绑包的大小感到沮丧,那么 nightmare 是一个理想的选择。首先,运行以下命令安装 nightmare 库:npm install nightmare
然后,一旦下载了 nightmare,我们将用它通过 Google 搜索引擎找到 ScrapingBee 的网站。创建一个名为crawler.js的文件,然后将以下代码复制粘贴到其中:
1const Nightmare = require('nightmare')<br /> 2const nightmare = Nightmare()<br /> 3<br /> 4nightmare<br /> 5 .goto('https://www.google.com/')<br /> 6 .type("input[title='Search']", 'ScrapingBee')<br /> 7 .click("input[value='Google Search']")<br /> 8 .wait('#rso > div:nth-child(1) > div > div > div.r > a')<br /> 9 .evaluate(<br />10 () =><br />11 document.querySelector(<br />12 '#rso > div:nth-child(1) > div > div > div.r > a'<br />13 ).href<br />14 )<br />15 .end()<br />16 .then((link) => {<br />17 console.log('Scraping Bee Web Link': link)<br />18 })<br />19 .catch((error) => {<br />20 console.error('Search failed:', error)<br />21 })<br />
首先创建一个 Nighmare 实例,然后通过调用 goto() 将该实例定向到 Google 搜索引擎,加载后,使用其选择器获取搜索框,然后使用搜索框的值(输入标签)更改为“ScrapingBee”。完成后,通过单击 “Google搜索” 按钮提交搜索表单。然后告诉 Nightmare 等到第一个链接加载完毕,一旦完成,它将使用 DOM 方法来获取包含该链接的定位标记的 href 属性的值。
最后,完成所有操作后,链接将打印到控制台。
总结
往期精彩回顾
如果觉得有帮助,请点击“在看”让更多小伙伴知道 查看全部
用 Javascript 和 Node.js 爬取网页
HTTP 客户端是能够将请求发送到服务器,然后接收服务器响应的工具。下面提到的所有工具底的层都是用 HTTP 客户端来访问你要抓取的网站。
Request
Request 是 Javascript 生态中使用最广泛的 HTTP 客户端之一,但是 Request 库的作者已正式声明弃用了。不过这并不意味着它不可用了,相当多的库仍在使用它,并且非常好用。用 Request 发出 HTTP 请求是非常简单的:
1const request = require('request')<br />2request('https://www.reddit.com/r/programming.json', function (<br />3 error,<br />4 response,<br />5 body<br />6) {<br />7 console.error('error:', error)<br />8 console.log('body:', body)<br />9})<br />
你可以在 Github 上找到 Request 库,安装它非常简单。你还可以在 找到弃用通知及其含义。
Axios
Axios 是基于 promise 的 HTTP 客户端,可在浏览器和 Node.js 中运行。如果你用 Typescript,那么 axios 会为你覆盖内置类型。通过 Axios 发起 HTTP 请求非常简单,默认情况下它带有 Promise 支持,而不是在 Request 中去使用回调:
1const axios = require('axios')<br /> 2<br /> 3axios<br /> 4 .get('https://www.reddit.com/r/programming.json')<br /> 5 .then((response) => {<br /> 6 console.log(response)<br /> 7 })<br /> 8 .catch((error) => {<br /> 9 console.error(error)<br />10 });<br />
如果你喜欢 Promises API 的 async/await 语法糖,那么你也可以用,但是由于顶级 await 仍处于 stage 3 ,所以我们只好先用异步函数来代替:
1async function getForum() {<br /> 2 try {<br /> 3 const response = await axios.get(<br /> 4 'https://www.reddit.com/r/programming.json'<br /> 5 )<br /> 6 console.log(response)<br /> 7 } catch (error) {<br /> 8 console.error(error)<br /> 9 }<br />10}<br />
你所要做的就是调用 getForum!可以在 上找到Axios库。
Superagent
与 Axios 一样,Superagent 是另一个强大的 HTTP 客户端,它支持 Promise 和 async/await 语法糖。它具有像 Axios 这样相当简单的 API,但是 Superagent 由于存在更多的依赖关系并且不那么流行。
用 promise、async/await 或回调向 Superagent 发出HTTP请求看起来像这样:
1const superagent = require("superagent")<br /> 2const forumURL = "https://www.reddit.com/r/progr ... %3Bbr /> 3<br /> 4// callbacks<br /> 5superagent<br /> 6 .get(forumURL)<br /> 7 .end((error, response) => {<br /> 8 console.log(response)<br /> 9 })<br />10<br />11// promises<br />12superagent<br />13 .get(forumURL)<br />14 .then((response) => {<br />15 console.log(response)<br />16 })<br />17 .catch((error) => {<br />18 console.error(error)<br />19 })<br />20<br />21// promises with async/await<br />22async function getForum() {<br />23 try {<br />24 const response = await superagent.get(forumURL)<br />25 console.log(response)<br />26 } catch (error) {<br />27 console.error(error)<br />28 }<br />29}<br />
可以在 找到 Superagent。
正则表达式:艰难的路
在没有任何依赖性的情况下,最简单的进行网络抓取的方法是,使用 HTTP 客户端查询网页时,在收到的 HTML 字符串上使用一堆正则表达式。正则表达式不那么灵活,而且很多专业人士和业余爱好者都难以编写正确的正则表达式。
让我们试一试,假设其中有一个带有用户名的标签,我们需要该用户名,这类似于你依赖正则表达式时必须执行的操作
1const htmlString = 'Username: John Doe'<br />2const result = htmlString.match(/(.+)/)<br />3<br />4console.log(result[1], result[1].split(": ")[1])<br />5// Username: John Doe, John Doe<br />
在 Javascript 中,match() 通常返回一个数组,该数组包含与正则表达式匹配的所有内容。第二个元素(在索引1中)将找到我们想要的 标记的 textContent 或 innerHTML。但是结果中包含一些不需要的文本( “Username: “),必须将其删除。
如你所见,对于一个非常简单的用例,步骤和要做的工作都很多。这就是为什么应该依赖 HTML 解析器的原因,我们将在后面讨论。
Cheerio:用于遍历 DOM 的核心 JQuery
Cheerio 是一个高效轻便的库,它使你可以在服务器端使用 JQuery 的丰富而强大的 API。如果你以前用过 JQuery,那么将会对 Cheerio 感到很熟悉,它消除了 DOM 所有不一致和与浏览器相关的功能,并公开了一种有效的 API 来解析和操作 DOM。
1const cheerio = require('cheerio')<br />2const $ = cheerio.load('Hello world')<br />3<br />4$('h2.title').text('Hello there!')<br />5$('h2').addClass('welcome')<br />6<br />7$.html()<br />8// Hello there!<br />
如你所见,Cheerio 与 JQuery 用起来非常相似。
但是,尽管它的工作方式不同于网络浏览器,也就这意味着它不能:
因此,如果你尝试爬取的网站或 Web 应用是严重依赖 Javascript 的(例如“单页应用”),那么 Cheerio 并不是最佳选择,你可能不得不依赖稍后讨论的其他选项。
为了展示 Cheerio 的强大功能,我们将尝试在 Reddit 中抓取 r/programming 论坛,尝试获取帖子名称列表。
首先,通过运行以下命令来安装 Cheerio 和 axios:npm install cheerio axios。
然后创建一个名为 crawler.js 的新文件,并复制粘贴以下代码:
1const axios = require('axios');<br /> 2const cheerio = require('cheerio');<br /> 3<br /> 4const getPostTitles = async () => {<br /> 5 try {<br /> 6 const { data } = await axios.get(<br /> 7 'https://old.reddit.com/r/programming/'<br /> 8 );<br /> 9 const $ = cheerio.load(data);<br />10 const postTitles = [];<br />11<br />12 $('div > p.title > a').each((_idx, el) => {<br />13 const postTitle = $(el).text()<br />14 postTitles.push(postTitle)<br />15 });<br />16<br />17 return postTitles;<br />18 } catch (error) {<br />19 throw error;<br />20 }<br />21};<br />22<br />23getPostTitles()<br />24.then((postTitles) => console.log(postTitles));<br />
getPostTitles() 是一个异步函数,将对旧的 reddit 的 r/programming 论坛进行爬取。首先,用带有 axios HTTP 客户端库的简单 HTTP GET 请求获取网站的 HTML,然后用 cheerio.load() 函数将 html 数据输入到 Cheerio 中。
然后在浏览器的 Dev Tools 帮助下,可以获得可以定位所有列表项的选择器。如果你使用过 JQuery,则必须非常熟悉 $('div> p.title> a')。这将得到所有帖子,因为你只希望单独获取每个帖子的标题,所以必须遍历每个帖子,这些操作是在 each() 函数的帮助下完成的。
要从每个标题中提取文本,必须在 Cheerio 的帮助下获取 DOM元素( el 指代当前元素)。然后在每个元素上调用 text() 能够为你提供文本。
现在,打开终端并运行 node crawler.js,然后你将看到大约存有标题的数组,它会很长。尽管这是一个非常简单的用例,但它展示了 Cheerio 提供的 API 的简单性质。
如果你的用例需要执行 Javascript 并加载外部源,那么以下几个选项将很有帮助。
JSDOM:Node 的 DOM
JSDOM 是在 Node.js 中使用的文档对象模型的纯 Javascript 实现,如前所述,DOM 对 Node 不可用,但是 JSDOM 是最接近的。它或多或少地模仿了浏览器。
由于创建了 DOM,所以可以通过编程与要爬取的 Web 应用或网站进行交互,也可以模拟单击按钮。如果你熟悉 DOM 操作,那么使用 JSDOM 将会非常简单。
1const { JSDOM } = require('jsdom')<br /> 2const { document } = new JSDOM(<br /> 3 'Hello world'<br /> 4).window<br /> 5const heading = document.querySelector('.title')<br /> 6heading.textContent = 'Hello there!'<br /> 7heading.classList.add('welcome')<br /> 8<br /> 9heading.innerHTML<br />10// Hello there!<br />
代码中用 JSDOM 创建一个 DOM,然后你可以用和操纵浏览器 DOM 相同的方法和属性来操纵该 DOM。
为了演示如何用 JSDOM 与网站进行交互,我们将获得 Reddit r/programming 论坛的第一篇帖子并对其进行投票,然后验证该帖子是否已被投票。
首先运行以下命令来安装 jsdom 和 axios:npm install jsdom axios
然后创建名为 crawler.js的文件,并复制粘贴以下代码:
1const { JSDOM } = require("jsdom")<br /> 2const axios = require('axios')<br /> 3<br /> 4const upvoteFirstPost = async () => {<br /> 5 try {<br /> 6 const { data } = await axios.get("https://old.reddit.com/r/programming/");<br /> 7 const dom = new JSDOM(data, {<br /> 8 runScripts: "dangerously",<br /> 9 resources: "usable"<br />10 });<br />11 const { document } = dom.window;<br />12 const firstPost = document.querySelector("div > div.midcol > div.arrow");<br />13 firstPost.click();<br />14 const isUpvoted = firstPost.classList.contains("upmod");<br />15 const msg = isUpvoted<br />16 ? "Post has been upvoted successfully!"<br />17 : "The post has not been upvoted!";<br />18<br />19 return msg;<br />20 } catch (error) {<br />21 throw error;<br />22 }<br />23};<br />24<br />25upvoteFirstPost().then(msg => console.log(msg));<br />
upvoteFirstPost() 是一个异步函数,它将在 r/programming 中获取第一个帖子,然后对其进行投票。axios 发送 HTTP GET 请求获取指定 URL 的HTML。然后通过先前获取的 HTML 来创建新的 DOM。JSDOM 构造函数把HTML 作为第一个参数,把 option 作为第二个参数,已添加的 2 个 option 项执行以下功能:
创建 DOM 后,用相同的 DOM 方法得到第一篇文章的 upvote 按钮,然后单击。要验证是否确实单击了它,可以检查 classList 中是否有一个名为 upmod 的类。如果存在于 classList 中,则返回一条消息。
打开终端并运行 node crawler.js,然后会看到一个整洁的字符串,该字符串将表明帖子是否被赞过。尽管这个例子很简单,但你可以在这个基础上构建功能强大的东西,例如,一个围绕特定用户的帖子进行投票的机器人。
如果你不喜欢缺乏表达能力的 JSDOM ,并且实践中要依赖于许多此类操作,或者需要重新创建许多不同的 DOM,那么下面将是更好的选择。
Puppeteer:无头浏览器
顾名思义,Puppeteer 允许你以编程方式操纵浏览器,就像操纵木偶一样。它通过为开发人员提供高级 API 来默认控制无头版本的 Chrome。
摘自 Puppeter DocsPuppeteer 比上述工具更有用,因为它可以使你像真正的人在与浏览器进行交互一样对网络进行爬取。这就具备了一些以前没有的可能性:
它还可以在 Web 爬取之外的其他任务中发挥重要作用,例如 UI 测试、辅助性能优化等。
通常你会想要截取网站的屏幕截图,也许是为了了解竞争对手的产品目录,可以用 puppeteer 来做到。首先运行以下命令安装 puppeteer,:npm install puppeteer
这将下载 Chromium 的 bundle 版本,根据操作系统的不同,该版本大约 180 MB 至 300 MB。如果你要禁用此功能。
让我们尝试在 Reddit 中获取 r/programming 论坛的屏幕截图和 PDF,创建一个名为 crawler.js的新文件,然后复制粘贴以下代码:
1const puppeteer = require('puppeteer')<br /> 2<br /> 3async function getVisual() {<br /> 4 try {<br /> 5 const URL = 'https://www.reddit.com/r/programming/'<br /> 6 const browser = await puppeteer.launch()<br /> 7 const page = await browser.newPage()<br /> 8<br /> 9 await page.goto(URL)<br />10 await page.screenshot({ path: 'screenshot.png' })<br />11 await page.pdf({ path: 'page.pdf' })<br />12<br />13 await browser.close()<br />14 } catch (error) {<br />15 console.error(error)<br />16 }<br />17}<br />18<br />19getVisual()<br />
getVisual() 是一个异步函数,它将获 URL 变量中 url 对应的屏幕截图和 pdf。首先,通过 puppeteer.launch() 创建浏览器实例,然后创建一个新页面。可以将该页面视为常规浏览器中的选项卡。然后通过以 URL 为参数调用 page.goto() ,将先前创建的页面定向到指定的 URL。最终,浏览器实例与页面一起被销毁。
完成操作并完成页面加载后,将分别使用 page.screenshot() 和 page.pdf() 获取屏幕截图和 pdf。你也可以侦听 javascript load 事件,然后执行这些操作,在生产环境级别下强烈建议这样做。
在终端上运行 node crawler.js ,几秒钟后,你会注意到已经创建了两个文件,分别名为 screenshot.jpg 和 page.pdf。
Nightmare:Puppeteer 的替代者
Nightmare 是类似 Puppeteer 的高级浏览器自动化库,该库使用 Electron,但据说速度是其前身 PhantomJS 的两倍。
如果你在某种程度上不喜欢 Puppeteer 或对 Chromium 捆绑包的大小感到沮丧,那么 nightmare 是一个理想的选择。首先,运行以下命令安装 nightmare 库:npm install nightmare
然后,一旦下载了 nightmare,我们将用它通过 Google 搜索引擎找到 ScrapingBee 的网站。创建一个名为crawler.js的文件,然后将以下代码复制粘贴到其中:
1const Nightmare = require('nightmare')<br /> 2const nightmare = Nightmare()<br /> 3<br /> 4nightmare<br /> 5 .goto('https://www.google.com/')<br /> 6 .type("input[title='Search']", 'ScrapingBee')<br /> 7 .click("input[value='Google Search']")<br /> 8 .wait('#rso > div:nth-child(1) > div > div > div.r > a')<br /> 9 .evaluate(<br />10 () =><br />11 document.querySelector(<br />12 '#rso > div:nth-child(1) > div > div > div.r > a'<br />13 ).href<br />14 )<br />15 .end()<br />16 .then((link) => {<br />17 console.log('Scraping Bee Web Link': link)<br />18 })<br />19 .catch((error) => {<br />20 console.error('Search failed:', error)<br />21 })<br />
首先创建一个 Nighmare 实例,然后通过调用 goto() 将该实例定向到 Google 搜索引擎,加载后,使用其选择器获取搜索框,然后使用搜索框的值(输入标签)更改为“ScrapingBee”。完成后,通过单击 “Google搜索” 按钮提交搜索表单。然后告诉 Nightmare 等到第一个链接加载完毕,一旦完成,它将使用 DOM 方法来获取包含该链接的定位标记的 href 属性的值。
最后,完成所有操作后,链接将打印到控制台。
总结
往期精彩回顾
如果觉得有帮助,请点击“在看”让更多小伙伴知道
Node.js开发RPA-自动抓取网页的文字内容
网站优化 • 优采云 发表了文章 • 0 个评论 • 308 次浏览 • 2022-05-06 16:28
背景
RPA工作流中最常见的场景是操作浏览器,对页面内容进行相关操作。本例中以 页面为例。带领大家初步探索如何使用RPA 工具进行自动化抓取页面文本内容。
本文开发RPA脚本会用到JavaScript语言。这里所用到的RPA工具LeanRunner,可从Windows的应用商店上直接下载,它可以支持使用node.js的开源自动化库做RPA开发。用户可以按照下面操作步骤,逐步实现自己的RPA脚本。
操作步骤
新建项目
打开LeanRunner, 选择【项目】--【新建】--【选择基本项目模板】,输入项目名称:demo,选择项目路径:
安装依赖库
selenium-webdriver 是流行的操作Web自动化库,使用chromedriver库可以驱动Chrome实现各类网页自动化,当然文字的提取也不在话下,本次RPA就是利用这两个库来实现功能。所以创建好项目之后需要安装对应的库。
点击LeanRunner打开命令行工具按钮
,执行安装命令:
npm init -ynpm install chromedriver selenium-webdriver @types/selenium-webdriver --save
<br />
备注:npm作为node.js的包管理机制,需要安装node.js环境才能使用
(下载地址:)
定义流程步骤
定义流程步骤是为了让自动化流程有好的可读性。
a. 打开 main.js,在【工具箱】--【框架】中找到 stepGroup 方法,拖拽到js 文件中。
b. 在弹出的对话框中 输入描述文本:抓取网页文本内容并点击插入代码。
c. 此时,main.js 的文件内容:
const { stepGroup } = require('leanrunner');<br />async function main() { await stepGroup("抓取网页文本内容", async () => { })}
d. 继续拖拽【工具箱】--【框架】中的step 方法,描述文本输入:使用Chrome浏览器打开要抓取的网站:
e. 按照上面操作步骤,再次插入 抓取文本 和 关闭浏览器 的步骤定义。
main.js如下:
const { step } = require('leanrunner');const { stepGroup } = require('leanrunner');<br />async function main() { await stepGroup("抓取网页文本内容", async () => { await step("使用Chrome浏览器打开要抓取的网站", async (world) => { }) await step("抓取文本", async (world) => { }) await step("关闭浏览器", async (world) => { }) })}
<br />
f. 插入Workflow.run函数, RPA执行最终要执行,选择【工具箱】--【Framework】中的Workrun.run()函数:
g. 运行的函数中 输入“main”:
最终代码为:
const { Workflow } = require('leanrunner');const { step } = require('leanrunner');const { stepGroup } = require('leanrunner');<br />async function main() { await stepGroup("抓取网页文本内容", async () => { await step("使用Chrome浏览器打开要抓取的网站", async (world) => { }) await step("抓取文本", async (world) => { }) await step("关闭浏览器", async (world) => { }) })}<br />Workflow.run(main);
<br />
实现操作步骤
参考 selenium-webdriver API
(). 分别实现上述操作步骤:
a. 使用Chrome浏览器打开要抓取的网站:
const WebDriver = require('selenium-webdriver');let driver = new WebDriver.Builder().forBrowser('chrome').build();const url = 'http://wufazhuce.com/one/2558';await driver.get(url);
上述代码创建了一个WebDriver实例,打开浏览器窗口,并导航到目标url。
b. 抓取文本:
let text = await driver.findElement({ css:'div[class="one-cita"]'}).getText();console.log(text);
上面代码用css选择器定位到要访问的元素,并打印输出。
c. 关闭浏览器
await driver.close();
<br />
最终实现的代码如下:
const { Workflow } = require('leanrunner');const { step } = require('leanrunner');const { stepGroup } = require('leanrunner');require('chromedriver');const WebDriver = require('selenium-webdriver');let driver = new WebDriver.Builder().forBrowser('chrome').build();<br />async function main() { await stepGroup("抓取网页文本内容", async () => { await step("使用Chrome浏览器打开要抓取的网站", async (world) => { const url = 'http://wufazhuce.com/one/2558'; await driver.get(url); }) await step("抓取文本", async (world) => { let text = await driver.findElement({ css:'div[class="one-cita"]'}).getText(); console.log(text); world.attachText(text); }) await step("关闭浏览器", async (world) => { await driver.close() }) })}<br />Workflow.run(main);
<br />
执行
点击“运行”按钮
,或者点击“运行项目”按钮
可以看到浏览器打开网页并将文本内容打印在LeanRunner设计器的输出面板。
如果是运行项目,还会显示html的运行报告:
对用户来说,html报告有较强的可读性。
总结
至此,我们完成了一个基本操作网页的RPA。后续可以在此RPA基础上进一步加深操作,比如抓取的文本内容存放到Excel表格中,或者存放到数据库中。
本文用到的selenium-webdriver自动化库,是非常流行的开源库,能够支持各种类型的浏览器,并能及时更新,支持最新版本的浏览器。同时Node.js也是非常流行的开源平台。基于这样一些技术开发RPA自动化脚本,保持了RPA脚本的可用性和可维护性,结合LeanRunner RPA平台,能够帮助企业,快速打造您自己的流程自动化。 查看全部
Node.js开发RPA-自动抓取网页的文字内容
背景
RPA工作流中最常见的场景是操作浏览器,对页面内容进行相关操作。本例中以 页面为例。带领大家初步探索如何使用RPA 工具进行自动化抓取页面文本内容。
本文开发RPA脚本会用到JavaScript语言。这里所用到的RPA工具LeanRunner,可从Windows的应用商店上直接下载,它可以支持使用node.js的开源自动化库做RPA开发。用户可以按照下面操作步骤,逐步实现自己的RPA脚本。
操作步骤
新建项目
打开LeanRunner, 选择【项目】--【新建】--【选择基本项目模板】,输入项目名称:demo,选择项目路径:
安装依赖库
selenium-webdriver 是流行的操作Web自动化库,使用chromedriver库可以驱动Chrome实现各类网页自动化,当然文字的提取也不在话下,本次RPA就是利用这两个库来实现功能。所以创建好项目之后需要安装对应的库。
点击LeanRunner打开命令行工具按钮
,执行安装命令:
npm init -ynpm install chromedriver selenium-webdriver @types/selenium-webdriver --save
<br />
备注:npm作为node.js的包管理机制,需要安装node.js环境才能使用
(下载地址:)
定义流程步骤
定义流程步骤是为了让自动化流程有好的可读性。
a. 打开 main.js,在【工具箱】--【框架】中找到 stepGroup 方法,拖拽到js 文件中。
b. 在弹出的对话框中 输入描述文本:抓取网页文本内容并点击插入代码。
c. 此时,main.js 的文件内容:
const { stepGroup } = require('leanrunner');<br />async function main() { await stepGroup("抓取网页文本内容", async () => { })}
d. 继续拖拽【工具箱】--【框架】中的step 方法,描述文本输入:使用Chrome浏览器打开要抓取的网站:
e. 按照上面操作步骤,再次插入 抓取文本 和 关闭浏览器 的步骤定义。
main.js如下:
const { step } = require('leanrunner');const { stepGroup } = require('leanrunner');<br />async function main() { await stepGroup("抓取网页文本内容", async () => { await step("使用Chrome浏览器打开要抓取的网站", async (world) => { }) await step("抓取文本", async (world) => { }) await step("关闭浏览器", async (world) => { }) })}
<br />
f. 插入Workflow.run函数, RPA执行最终要执行,选择【工具箱】--【Framework】中的Workrun.run()函数:
g. 运行的函数中 输入“main”:
最终代码为:
const { Workflow } = require('leanrunner');const { step } = require('leanrunner');const { stepGroup } = require('leanrunner');<br />async function main() { await stepGroup("抓取网页文本内容", async () => { await step("使用Chrome浏览器打开要抓取的网站", async (world) => { }) await step("抓取文本", async (world) => { }) await step("关闭浏览器", async (world) => { }) })}<br />Workflow.run(main);
<br />
实现操作步骤
参考 selenium-webdriver API
(). 分别实现上述操作步骤:
a. 使用Chrome浏览器打开要抓取的网站:
const WebDriver = require('selenium-webdriver');let driver = new WebDriver.Builder().forBrowser('chrome').build();const url = 'http://wufazhuce.com/one/2558';await driver.get(url);
上述代码创建了一个WebDriver实例,打开浏览器窗口,并导航到目标url。
b. 抓取文本:
let text = await driver.findElement({ css:'div[class="one-cita"]'}).getText();console.log(text);
上面代码用css选择器定位到要访问的元素,并打印输出。
c. 关闭浏览器
await driver.close();
<br />
最终实现的代码如下:
const { Workflow } = require('leanrunner');const { step } = require('leanrunner');const { stepGroup } = require('leanrunner');require('chromedriver');const WebDriver = require('selenium-webdriver');let driver = new WebDriver.Builder().forBrowser('chrome').build();<br />async function main() { await stepGroup("抓取网页文本内容", async () => { await step("使用Chrome浏览器打开要抓取的网站", async (world) => { const url = 'http://wufazhuce.com/one/2558'; await driver.get(url); }) await step("抓取文本", async (world) => { let text = await driver.findElement({ css:'div[class="one-cita"]'}).getText(); console.log(text); world.attachText(text); }) await step("关闭浏览器", async (world) => { await driver.close() }) })}<br />Workflow.run(main);
<br />
执行
点击“运行”按钮
,或者点击“运行项目”按钮
可以看到浏览器打开网页并将文本内容打印在LeanRunner设计器的输出面板。
如果是运行项目,还会显示html的运行报告:
对用户来说,html报告有较强的可读性。
总结
至此,我们完成了一个基本操作网页的RPA。后续可以在此RPA基础上进一步加深操作,比如抓取的文本内容存放到Excel表格中,或者存放到数据库中。
本文用到的selenium-webdriver自动化库,是非常流行的开源库,能够支持各种类型的浏览器,并能及时更新,支持最新版本的浏览器。同时Node.js也是非常流行的开源平台。基于这样一些技术开发RPA自动化脚本,保持了RPA脚本的可用性和可维护性,结合LeanRunner RPA平台,能够帮助企业,快速打造您自己的流程自动化。
基于browser的爬虫(ghostinstaller.spider)基于python的数据库加速
网站优化 • 优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2022-05-02 03:00
js抓取网页内容文件结构文件结构从favicon.ico里面找,或者用浏览器浏览器标签里面找第一步我们获取的excel里面的数据第二步,webpy抓取网页内容python3爬虫+webpy实战(代码已放github)第三步,
webpy的webcontent模块
写爬虫嘛,o2magicjs的第一个版本,很基础的。别的啥都没有。
没有用过webpy,不知道难度,但是比python的方便多了。只要用。
webpy
当然是o2magic了啊
肯定是开源的webpy了呀,
excel会得到20000条基本数据可以不用编程了。
我找过的一些挺有意思的库:webpy基于get/post的网络请求库,不适合爬取数据。selenium基于模拟器的代理。基于browser的爬虫(ghostinstaller)基于python的爬虫(openitview.spider)基于selenium的爬虫加速库,爬下来就是图片。基于requests的爬虫基于flask的爬虫,参见flaskpy。
osgeocouter基于python的命令行工具pathfinder(java版本的)基于mysql的数据库加速。celery/python-sqlite(hbase这种,oracle也可以)(quickopenopen这类有线程池的,nio中的kqueue也可以用在爬虫里,关键是效率)如果需要写的excel能兼容就再考虑mongodb之类,或者借助其他第三方库。
最不推荐的就是c++的spider。因为爬取后,除了后续文件读写可能会遇到各种问题以外,最后还是需要进行转化才能跑起来。c++里,也没多少可以实现和效率相关的功能。 查看全部
基于browser的爬虫(ghostinstaller.spider)基于python的数据库加速
js抓取网页内容文件结构文件结构从favicon.ico里面找,或者用浏览器浏览器标签里面找第一步我们获取的excel里面的数据第二步,webpy抓取网页内容python3爬虫+webpy实战(代码已放github)第三步,
webpy的webcontent模块
写爬虫嘛,o2magicjs的第一个版本,很基础的。别的啥都没有。
没有用过webpy,不知道难度,但是比python的方便多了。只要用。
webpy
当然是o2magic了啊
肯定是开源的webpy了呀,
excel会得到20000条基本数据可以不用编程了。
我找过的一些挺有意思的库:webpy基于get/post的网络请求库,不适合爬取数据。selenium基于模拟器的代理。基于browser的爬虫(ghostinstaller)基于python的爬虫(openitview.spider)基于selenium的爬虫加速库,爬下来就是图片。基于requests的爬虫基于flask的爬虫,参见flaskpy。
osgeocouter基于python的命令行工具pathfinder(java版本的)基于mysql的数据库加速。celery/python-sqlite(hbase这种,oracle也可以)(quickopenopen这类有线程池的,nio中的kqueue也可以用在爬虫里,关键是效率)如果需要写的excel能兼容就再考虑mongodb之类,或者借助其他第三方库。
最不推荐的就是c++的spider。因为爬取后,除了后续文件读写可能会遇到各种问题以外,最后还是需要进行转化才能跑起来。c++里,也没多少可以实现和效率相关的功能。
分享优化前怎么做网站诊断(优化的前期准备有哪些)
网站优化 • 优采云 发表了文章 • 0 个评论 • 302 次浏览 • 2022-05-01 18:04
首先,在seo优化前我们要对网站进行诊断和分析。我们要分析网站的现状,网站做得不好的地方,如何改进,改进后会有什么效果。为了为每个网站制定相应的网站优化方案,预诊断是优化方案的关键。我会详细谈谈。
通常看它的标题,接管一个新的网站来诊断它。标题是否包含目标关键字,标题能传达给客户什么信息,客户能在最短的时间内知道你的网站在做什么吗
检查源文件时查看代码是否凌乱。有没有JS和CSS的封装。太乱了,搜索引擎对它很不友好,所以在没有封装的情况下,有必要对其进行封装,这样不仅可以使朋友搜索引擎更加友好,而且可以使主页更有利于搜索引擎的爬行。
合理分布,关键字布局。实现从左到右、从上到下的布局规则。有合理的标签使用(H标签,自旋标签等)合理自然的分布,不要让关键字重叠,把重要的有价值的关键字放在上面的导航栏上。关键词密度应控制在4%-5%之间。
现在的搜索引擎无法识别图片,一般每个网站都有自己的logo图片。所以我想修改图片的alt属性,并使用alt=here来描述“告诉搜索引擎这张图片是什么”。当然,它也可以像我的网站。logo采用背景的方式,在其上写入文本,然后用CSS控制显示效果。这也是一张非常好的照片。使用太多太大的图片往往会影响网速所有图片都应该添加alt属性。
制作一张地图非常重要,就像一个人来到一个全新的地方,搜索引擎蜘蛛来了。虽然不熟悉。但是有了地图。然后你可以找到网站的所有位置。制作一张这个地点的地图。蜘蛛爬行比较友好。
排除网站的死链接,使404页。死链接会影响搜索引擎对网站的友好程度。一旦出现死链,蜘蛛无法接入会造成不良印象,必须确保每个连接都能接入。不要在网站上造成死角。应检测并修复死链路。让搜索引擎在网上畅通无阻。
就像你可以去任何地方。就这样。导航结果是面包屑导航。这将清楚地表明进入的地点。导航也有利于搜索引擎的爬行。同时,文章可以在前面的主题中加入,站点导航也很重要。下一个话题。使整个网站看起来是四面八方。没有人有死胡同。
为了保证网站的活力,检查内容的更新频率。高质量的内容在网站的权重中起着非常重要的作用。坚持竞争力,则内容更原创。长期没有更新,使网站失去了活力。有太多的蜘蛛,没有新的内容要抓取,所以要确保总是有新的内容注入。这对以后的SEO优化工作非常有帮助。
这是自己做的免费链接,网站的内部链也很重要。做好内部链接。它可以使整个互联网都可以访问。不做外链,等于切断了与外界的联系,从外无法进入本站,多发外链,更利于用户进入你的网站。
查看全部
分享优化前怎么做网站诊断(优化的前期准备有哪些)
首先,在seo优化前我们要对网站进行诊断和分析。我们要分析网站的现状,网站做得不好的地方,如何改进,改进后会有什么效果。为了为每个网站制定相应的网站优化方案,预诊断是优化方案的关键。我会详细谈谈。
通常看它的标题,接管一个新的网站来诊断它。标题是否包含目标关键字,标题能传达给客户什么信息,客户能在最短的时间内知道你的网站在做什么吗
检查源文件时查看代码是否凌乱。有没有JS和CSS的封装。太乱了,搜索引擎对它很不友好,所以在没有封装的情况下,有必要对其进行封装,这样不仅可以使朋友搜索引擎更加友好,而且可以使主页更有利于搜索引擎的爬行。
合理分布,关键字布局。实现从左到右、从上到下的布局规则。有合理的标签使用(H标签,自旋标签等)合理自然的分布,不要让关键字重叠,把重要的有价值的关键字放在上面的导航栏上。关键词密度应控制在4%-5%之间。
现在的搜索引擎无法识别图片,一般每个网站都有自己的logo图片。所以我想修改图片的alt属性,并使用alt=here来描述“告诉搜索引擎这张图片是什么”。当然,它也可以像我的网站。logo采用背景的方式,在其上写入文本,然后用CSS控制显示效果。这也是一张非常好的照片。使用太多太大的图片往往会影响网速所有图片都应该添加alt属性。
制作一张地图非常重要,就像一个人来到一个全新的地方,搜索引擎蜘蛛来了。虽然不熟悉。但是有了地图。然后你可以找到网站的所有位置。制作一张这个地点的地图。蜘蛛爬行比较友好。
排除网站的死链接,使404页。死链接会影响搜索引擎对网站的友好程度。一旦出现死链,蜘蛛无法接入会造成不良印象,必须确保每个连接都能接入。不要在网站上造成死角。应检测并修复死链路。让搜索引擎在网上畅通无阻。
就像你可以去任何地方。就这样。导航结果是面包屑导航。这将清楚地表明进入的地点。导航也有利于搜索引擎的爬行。同时,文章可以在前面的主题中加入,站点导航也很重要。下一个话题。使整个网站看起来是四面八方。没有人有死胡同。
为了保证网站的活力,检查内容的更新频率。高质量的内容在网站的权重中起着非常重要的作用。坚持竞争力,则内容更原创。长期没有更新,使网站失去了活力。有太多的蜘蛛,没有新的内容要抓取,所以要确保总是有新的内容注入。这对以后的SEO优化工作非常有帮助。
这是自己做的免费链接,网站的内部链也很重要。做好内部链接。它可以使整个互联网都可以访问。不做外链,等于切断了与外界的联系,从外无法进入本站,多发外链,更利于用户进入你的网站。
网站终于被收录了!
网站优化 • 优采云 发表了文章 • 0 个评论 • 140 次浏览 • 2022-04-30 08:30
陌溪的学习笔记:
大家好,我是陌溪
之前一直有小伙伴跑来问我,为啥蘑菇博客上线了这么久,百度出来只有首页?
百度收录
在聊这个问题之前,我们先谈谈什么是 SEO。搜索引擎优化(Search engine optimization,简称 SEO ),指为了提升网页在搜索引擎自然搜索结果中(非商业性推广结果)的收录数量以及排序位置而做的优化行为,是为了从搜索引擎中获得更多的免费流量,以及更好的展现形象。
其实蘑菇网站上线快几年了,但是只收录了首页,归根到底还是因为之前项目选型的时候,采用了 Vue 作为前端开发框架,而我们知道 Vue 作为单页面应用框架,所有的数据都是通过 axios 进行返回的,也可以想成是 ajax 请求异步返回的,是非常不利于 SEO 的。
而百度收录的原理,其实就是百度的爬虫程序去爬取咱们的网站网站,但是因为我们内容都是通过 axios 异步返回,所以只能看到下面这样的骨架代码,因此百度也就只会收录咱们的首页了。
蘑菇页面源码
一般爬虫抓取页面内容是先从一个页面出发,从中提取出其他页面的链接,然后当作下一个请求的对象,一直重复这个过程。所以要有良好的 SEO,需要你在各大网站上拥有外链,这样会提高你的网站被搜索引擎爬虫的几率。
而 Vue 为了解决 SEO 问题,官方有 Vue SSR 方案,后面又推出了 Nuxt.js 框架。
蘑菇其实在旧版本中,也是使用 nuxt.js 实现了一波,经过测试后也确实能够被百度所收录,但是因为同时维护两份代码,有些耗时耗力,并且切换到 nuxt.js后,因为是服务器渲染,网站打开也变慢了很多,因此在种种因素下,也放弃了维护 nuxt_mogu_web 项目
nuxt.js版蘑菇博客
同时,后面也在积极的探索更优雅的 SEO 实现方案,预期是不会较大的改变现有逻辑的基础上,就能够实现。
回归到原始需求,为了提高用户体验我们用了 Vue、React 这些 SPA 技术、为了 SEO 我们用了 SSR、预渲染等技术。
不同技术方案有一定差距,不能兼顾优点。但仔细想,需要这些技术优点的 "用户",其实时不一样的,SPA 针对的是浏览器普通用户、SSR 针对的是网页爬虫,如 googlebot、baiduspider 等,那为什么我们不能给不同“用户”不同的页面呢,服务端动态渲染就是这种方案。
后来,陌溪在网上冲浪的时候,在 Github 上发现了 prender-alpine 这个开源项目
prerender项目
prender-alpine 的原理,在 Alpine Linux 上构建的轻量级 Prerender 容器,带有 Node 和 Headless Chrome
Prerender :可以当做是一个预渲染的容器,项目的原理其实就是相当于跑了一层 node.js 的 Render 层,帮助我们做服务器渲染。
针对爬虫的预渲染
服务端对请求的 user-agent 进行判断,浏览器端直接给 SPA 页面,如果是爬虫,需要通过 Prerender 容器动态渲染的 html 页面进行返回
完整的流程图如下,我们需要通过 nginx 识别出访问我们网站的用户是否是爬虫,还是普通用户,从而请求不同的页面。
完整流程蘑菇 SEO 改造
为了方便小伙伴们的使用,陌溪也把 prender-alpine 项目放到了蘑菇镜像仓库,同时提供了一份 prerender.yml 文件
version: '3.1'<br />services:<br /> prerender:<br /> restart: always<br /> image: registry.cn-shenzhen.aliyuncs.com/mogublog/prerender<br /> container_name: prerender<br /> ports:<br /> - 3000:3000<br /> environment:<br /> MEMORY_CACHE: 1<br /> CACHE_MAXSIZE: 300<br /> CACHE_TTL: 6000<br /> networks:<br /> - mogu<br /><br />networks:<br /> mogu:<br /> external: true<br />
只需要将其拷贝到蘑菇一键部署的 yaml 目录下即可,同时使用命令进行启动
docker-compose -f prerender.yml<br />
启动完成后,可以看到项目运行在 3000 端口
容器运行
搭建完成后,我们可以打开浏览器进行测试,打开 172.184.166.150:3000/ 页面,后面挂着的就是你要预渲染的页面,如果能够打开下面的页面,说明已经预渲染成功了
预渲染成功
同时,通过查看网页源码,也能够看到页面的文字和链接了,这样爬虫也就能爬取到我们网站的其它信息
查看源码
下面,我们就需要改造我们的 nginx 了,通过 $http_user_agent 来识别请求的 user_agent 是否属于 Google、百度、必应、360…. 的爬虫
如果识别成功,那么会跳转到刚刚搭建的 prerender 容器中进行预渲染,否则继续返回原来的 Vue 页面
下面是完整的 nginx 配置文件 vue_mogu_web.conf
server {<br /> listen 80;<br /> server_name localhost;<br /><br /> add_header Access-Control-Allow-Origin *;<br /> add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';<br /> add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,lang,access-token';<br /> if ($request_method = 'OPTIONS') {<br /> return 204;<br /> }<br /><br /> root /usr/share/nginx/html/;<br /> index index.html;<br /><br /> location / {<br /> try_files $uri @render;<br /> }<br /><br /> location @render {<br /> set $render 0;<br /> if ($http_user_agent ~* "googlebot|bingbot|Baiduspider|360Spider|Sogou web spider|Bytespider") {<br /> set $render 1;<br /> }<br /><br /> if ($uri ~* "\.(js|css|xml|less|png|jpg|jpeg|gif|pdf|doc|txt|ico|rss|zip|mp3|rar|exe|wmv|doc|avi|ppt|mpg|mpeg|tif|wav|mov|psd|ai|xls|mp4|m4a|swf|dat|dmg|iso|flv|m4v|torrent|ttf|woff|svg|eot)") {<br /> set $render 0;<br /> }<br />
if ($render = 1) {<br /> set $render "172.184.166.150:3000";<br /> rewrite .* /$scheme://$host:$server_port$request_uri? break;<br /> proxy_pass http://$render;<br /> }<br /><br /> if ($render = 0) {<br /> rewrite .* /index.html break;<br /> }<br /><br /> }<br />}<br />
注意,这个配置需要修改 vue_mogu_web.yml,把刚刚创建的配置文件挂载出来
version: '3'<br />services:<br /> #授权服务<br /> vue_mogu_web:<br /> image: registry.cn-shenzhen.aliyuncs.com/mogublog_business/vue_mogu_web:latest<br /> container_name: vue_mogu_web<br /> restart: always<br /> ports:<br /> - 9527:80<br /> networks:<br /> - mogu<br /> env_file:<br /> - ../config/vue_mogu_web.env<br /> environment:<br /> - COMPOSE_PROJECT_NAME=vue_mogu_web<br /> volumes:<br /> - ../config/vue_mogu_web.conf:/etc/nginx/conf.d/default.conf<br /><br />networks:<br /> mogu:<br /> external: true<br />
修改完成后,就可以开始使用接口工具进行测试了,通过设置 Headers 设置请求头信息,加入 User-agent = googlebot 用来标识这个请求是爬虫
调用接口可以看到,我们的页面能够把完整的数据给返回
模拟爬虫请求
同时,如果我们把 User-agent 删掉,这个时候返回的就是我们正常的 SPA 单应用页面了
模拟正常用户
到这里,网站针对爬虫专属的 SEO 就改造完毕了
经过几天测试后,通过 site: 进行查询,也可以看到被百度收录了好几个页面了~
百度收录多个页面
好了,本期蘑菇 SEO 优化讲解就到这里
我是陌溪,我们下期再见~
往期推荐
博主就职于字节跳动商业化部门,一直维护校招笔记仓库LearningNote「在Gitee上已有5kstar,地址」,公众号上的文章也会在此同步更新,欢迎各位小伙伴一起交流学习,回复「PDF」获取PDF笔记。
同时,想要丰富项目经验的小伙伴,可以参考我维护的开源微服务博客项目:蘑菇博客「Gitee官方推荐项目,博客类搜索排名第一,在Gitee已有4.7Kstar,仓库地址:」。
本公众号申请较晚,暂时没有开通留言功能,欢迎小伙伴们添加我的私人微信coder_moxi【备注:加群】,我将邀请你加入到蘑菇博客交流群中,欢迎小伙伴们找陌溪一块聊天唠嗑,共同学习进步。最后,如果你觉得本文对你有所帮助,麻烦小伙伴们动动手指给文章点个「赞」和「在看」,非常感谢大家的支持。
快来找陌溪唠嗑吧
点个在看你最好看 查看全部
网站终于被收录了!
陌溪的学习笔记:
大家好,我是陌溪
之前一直有小伙伴跑来问我,为啥蘑菇博客上线了这么久,百度出来只有首页?
百度收录
在聊这个问题之前,我们先谈谈什么是 SEO。搜索引擎优化(Search engine optimization,简称 SEO ),指为了提升网页在搜索引擎自然搜索结果中(非商业性推广结果)的收录数量以及排序位置而做的优化行为,是为了从搜索引擎中获得更多的免费流量,以及更好的展现形象。
其实蘑菇网站上线快几年了,但是只收录了首页,归根到底还是因为之前项目选型的时候,采用了 Vue 作为前端开发框架,而我们知道 Vue 作为单页面应用框架,所有的数据都是通过 axios 进行返回的,也可以想成是 ajax 请求异步返回的,是非常不利于 SEO 的。
而百度收录的原理,其实就是百度的爬虫程序去爬取咱们的网站网站,但是因为我们内容都是通过 axios 异步返回,所以只能看到下面这样的骨架代码,因此百度也就只会收录咱们的首页了。
蘑菇页面源码
一般爬虫抓取页面内容是先从一个页面出发,从中提取出其他页面的链接,然后当作下一个请求的对象,一直重复这个过程。所以要有良好的 SEO,需要你在各大网站上拥有外链,这样会提高你的网站被搜索引擎爬虫的几率。
而 Vue 为了解决 SEO 问题,官方有 Vue SSR 方案,后面又推出了 Nuxt.js 框架。
蘑菇其实在旧版本中,也是使用 nuxt.js 实现了一波,经过测试后也确实能够被百度所收录,但是因为同时维护两份代码,有些耗时耗力,并且切换到 nuxt.js后,因为是服务器渲染,网站打开也变慢了很多,因此在种种因素下,也放弃了维护 nuxt_mogu_web 项目
nuxt.js版蘑菇博客
同时,后面也在积极的探索更优雅的 SEO 实现方案,预期是不会较大的改变现有逻辑的基础上,就能够实现。
回归到原始需求,为了提高用户体验我们用了 Vue、React 这些 SPA 技术、为了 SEO 我们用了 SSR、预渲染等技术。
不同技术方案有一定差距,不能兼顾优点。但仔细想,需要这些技术优点的 "用户",其实时不一样的,SPA 针对的是浏览器普通用户、SSR 针对的是网页爬虫,如 googlebot、baiduspider 等,那为什么我们不能给不同“用户”不同的页面呢,服务端动态渲染就是这种方案。
后来,陌溪在网上冲浪的时候,在 Github 上发现了 prender-alpine 这个开源项目
prerender项目
prender-alpine 的原理,在 Alpine Linux 上构建的轻量级 Prerender 容器,带有 Node 和 Headless Chrome
Prerender :可以当做是一个预渲染的容器,项目的原理其实就是相当于跑了一层 node.js 的 Render 层,帮助我们做服务器渲染。
针对爬虫的预渲染
服务端对请求的 user-agent 进行判断,浏览器端直接给 SPA 页面,如果是爬虫,需要通过 Prerender 容器动态渲染的 html 页面进行返回
完整的流程图如下,我们需要通过 nginx 识别出访问我们网站的用户是否是爬虫,还是普通用户,从而请求不同的页面。
完整流程蘑菇 SEO 改造
为了方便小伙伴们的使用,陌溪也把 prender-alpine 项目放到了蘑菇镜像仓库,同时提供了一份 prerender.yml 文件
version: '3.1'<br />services:<br /> prerender:<br /> restart: always<br /> image: registry.cn-shenzhen.aliyuncs.com/mogublog/prerender<br /> container_name: prerender<br /> ports:<br /> - 3000:3000<br /> environment:<br /> MEMORY_CACHE: 1<br /> CACHE_MAXSIZE: 300<br /> CACHE_TTL: 6000<br /> networks:<br /> - mogu<br /><br />networks:<br /> mogu:<br /> external: true<br />
只需要将其拷贝到蘑菇一键部署的 yaml 目录下即可,同时使用命令进行启动
docker-compose -f prerender.yml<br />
启动完成后,可以看到项目运行在 3000 端口
容器运行
搭建完成后,我们可以打开浏览器进行测试,打开 172.184.166.150:3000/ 页面,后面挂着的就是你要预渲染的页面,如果能够打开下面的页面,说明已经预渲染成功了
预渲染成功
同时,通过查看网页源码,也能够看到页面的文字和链接了,这样爬虫也就能爬取到我们网站的其它信息
查看源码
下面,我们就需要改造我们的 nginx 了,通过 $http_user_agent 来识别请求的 user_agent 是否属于 Google、百度、必应、360…. 的爬虫
如果识别成功,那么会跳转到刚刚搭建的 prerender 容器中进行预渲染,否则继续返回原来的 Vue 页面
下面是完整的 nginx 配置文件 vue_mogu_web.conf
server {<br /> listen 80;<br /> server_name localhost;<br /><br /> add_header Access-Control-Allow-Origin *;<br /> add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';<br /> add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,lang,access-token';<br /> if ($request_method = 'OPTIONS') {<br /> return 204;<br /> }<br /><br /> root /usr/share/nginx/html/;<br /> index index.html;<br /><br /> location / {<br /> try_files $uri @render;<br /> }<br /><br /> location @render {<br /> set $render 0;<br /> if ($http_user_agent ~* "googlebot|bingbot|Baiduspider|360Spider|Sogou web spider|Bytespider") {<br /> set $render 1;<br /> }<br /><br /> if ($uri ~* "\.(js|css|xml|less|png|jpg|jpeg|gif|pdf|doc|txt|ico|rss|zip|mp3|rar|exe|wmv|doc|avi|ppt|mpg|mpeg|tif|wav|mov|psd|ai|xls|mp4|m4a|swf|dat|dmg|iso|flv|m4v|torrent|ttf|woff|svg|eot)") {<br /> set $render 0;<br /> }<br />
if ($render = 1) {<br /> set $render "172.184.166.150:3000";<br /> rewrite .* /$scheme://$host:$server_port$request_uri? break;<br /> proxy_pass http://$render;<br /> }<br /><br /> if ($render = 0) {<br /> rewrite .* /index.html break;<br /> }<br /><br /> }<br />}<br />
注意,这个配置需要修改 vue_mogu_web.yml,把刚刚创建的配置文件挂载出来
version: '3'<br />services:<br /> #授权服务<br /> vue_mogu_web:<br /> image: registry.cn-shenzhen.aliyuncs.com/mogublog_business/vue_mogu_web:latest<br /> container_name: vue_mogu_web<br /> restart: always<br /> ports:<br /> - 9527:80<br /> networks:<br /> - mogu<br /> env_file:<br /> - ../config/vue_mogu_web.env<br /> environment:<br /> - COMPOSE_PROJECT_NAME=vue_mogu_web<br /> volumes:<br /> - ../config/vue_mogu_web.conf:/etc/nginx/conf.d/default.conf<br /><br />networks:<br /> mogu:<br /> external: true<br />
修改完成后,就可以开始使用接口工具进行测试了,通过设置 Headers 设置请求头信息,加入 User-agent = googlebot 用来标识这个请求是爬虫
调用接口可以看到,我们的页面能够把完整的数据给返回
模拟爬虫请求
同时,如果我们把 User-agent 删掉,这个时候返回的就是我们正常的 SPA 单应用页面了
模拟正常用户
到这里,网站针对爬虫专属的 SEO 就改造完毕了
经过几天测试后,通过 site: 进行查询,也可以看到被百度收录了好几个页面了~
百度收录多个页面
好了,本期蘑菇 SEO 优化讲解就到这里
我是陌溪,我们下期再见~
往期推荐
博主就职于字节跳动商业化部门,一直维护校招笔记仓库LearningNote「在Gitee上已有5kstar,地址」,公众号上的文章也会在此同步更新,欢迎各位小伙伴一起交流学习,回复「PDF」获取PDF笔记。
同时,想要丰富项目经验的小伙伴,可以参考我维护的开源微服务博客项目:蘑菇博客「Gitee官方推荐项目,博客类搜索排名第一,在Gitee已有4.7Kstar,仓库地址:」。
本公众号申请较晚,暂时没有开通留言功能,欢迎小伙伴们添加我的私人微信coder_moxi【备注:加群】,我将邀请你加入到蘑菇博客交流群中,欢迎小伙伴们找陌溪一块聊天唠嗑,共同学习进步。最后,如果你觉得本文对你有所帮助,麻烦小伙伴们动动手指给文章点个「赞」和「在看」,非常感谢大家的支持。
快来找陌溪唠嗑吧
点个在看你最好看
js 抓取网页内容(js爬虫如何实现网页数据(js函数爬虫)怎样实现)
网站优化 • 优采云 发表了文章 • 0 个评论 • 43 次浏览 • 2022-04-17 21:05
js爬虫如何实现网页数据抓取-:使用http抓包工具获取下一页的url,然后分析url的规律再下载你给的url我打不开
javascript如何抓取网页上的内容——:基本上是通过页面上定义的id来抓取,例如: 前提:页面中的某个文本定义了一个id,即id="test",goal获取此文本方法中的内容:可以使用以下方法:document.getEle...
如何使用javascript提取网页内容??:document.getElementById('iframe1').value
如何爬取js函数生成的网页内容——:我查过你提供的页面代码:在首页,你用ajax动态获取服务器每一列的数据,然后动态生成页面。这样搜索引擎就无法爬取了,因为目前的搜索引擎还没有爬取ajax页面的技术。当然,目前有 163 个博客使用这种方法来构建博客。但是人...
如何抓取js函数生成的网页内容——:如果是网页中的html元素,可以直接使用获取值的方法,jq的val()或者js的value(),也可以描述详细说明你要抢什么东西。
如何抓取网站的js文件?- : ie----view----source文件,搜索.js,可以找到js脚本路径,可以下载
如何采集javascript-generated pages-:phantomjs和casperjs Casperjs是基于Phantomjs的,而Phantom JS是一个服务器端的JavaScript API WebKit可以做采集javascript-generated pages 当然你也可以分析然后js直接通过接口获取网页的数据。
Javascript可以提取网页数据进行运算和计算吗?- :是的,你可以把这两个数据保存在一个cookie中,然后进行计算,就是这样!
javascript网页提取 - :可以通过使用锚来解决
网页内容爬取(js):这种js做不到,推荐使用PHP的curl功能来实现!具体使用方法网上有很多资料! 查看全部
js 抓取网页内容(js爬虫如何实现网页数据(js函数爬虫)怎样实现)
js爬虫如何实现网页数据抓取-:使用http抓包工具获取下一页的url,然后分析url的规律再下载你给的url我打不开
javascript如何抓取网页上的内容——:基本上是通过页面上定义的id来抓取,例如: 前提:页面中的某个文本定义了一个id,即id="test",goal获取此文本方法中的内容:可以使用以下方法:document.getEle...
如何使用javascript提取网页内容??:document.getElementById('iframe1').value
如何爬取js函数生成的网页内容——:我查过你提供的页面代码:在首页,你用ajax动态获取服务器每一列的数据,然后动态生成页面。这样搜索引擎就无法爬取了,因为目前的搜索引擎还没有爬取ajax页面的技术。当然,目前有 163 个博客使用这种方法来构建博客。但是人...
如何抓取js函数生成的网页内容——:如果是网页中的html元素,可以直接使用获取值的方法,jq的val()或者js的value(),也可以描述详细说明你要抢什么东西。
如何抓取网站的js文件?- : ie----view----source文件,搜索.js,可以找到js脚本路径,可以下载
如何采集javascript-generated pages-:phantomjs和casperjs Casperjs是基于Phantomjs的,而Phantom JS是一个服务器端的JavaScript API WebKit可以做采集javascript-generated pages 当然你也可以分析然后js直接通过接口获取网页的数据。
Javascript可以提取网页数据进行运算和计算吗?- :是的,你可以把这两个数据保存在一个cookie中,然后进行计算,就是这样!
javascript网页提取 - :可以通过使用锚来解决
网页内容爬取(js):这种js做不到,推荐使用PHP的curl功能来实现!具体使用方法网上有很多资料!
js 抓取网页内容(python怎么用python爬取视频网站的数据如何用爬取js渲染加载的视频文件不是)
网站优化 • 优采云 发表了文章 • 0 个评论 • 68 次浏览 • 2022-04-17 20:47
如何用python爬取视频网站的数据
如何用python爬取js渲染加载的视频文件不是每个人都有资格说喜欢,也不是每个人都可以选择陪你一辈子!
在哪位大神的指导下,视频网站上的一些视频文件是通过js加载的,不知道能不能用selenium+phantomjs PhantomJS是一个基于webkit的JavaScript API。它使用 QtWebKit 作为其核心浏览器功能,并使用 webkit 来编译、解释和执行 JavaScript 代码。您可以在基于 webkit 的浏览器中做的任何事情,它都能做到。
python如何爬取头条付费栏视频 python如何爬取头条付费栏视频
前往今日头条官网自媒体申请账号,选择发布信息的类别,等待今日头条审核通过,即可发布视频。
想用Python做一个数据库,其结构大致是“歌手-歌曲名-专辑名-歌曲时长”,以及爬取网页、模拟登录等背后的大致逻辑和原理;
以songtaste网页标题提取为例,详细讲解如何爬取网站并提取网页内容;
以模拟登录百度为例,详细讲解如何模拟登录网站;
如何用Python爬取搜索引擎的结果 一个人的心,一个人的孤岛,可能只需要弹指一挥。
我选择爬取百度知道的html作为我的搜索源数据。目前,我打算搜索网页的标题。我选择Python的scrapy库来抓取网页,抓取网页的title、url、html。使用 sqlist3 管理爬取的数据源。爬行过程是深度优先的过程。
Python爬虫可以爬什么
用Python脚本在哔哩哔哩上爬视频是我离开彩妆后一个人的时候。面对电脑屏幕的二十四种本色,我无动于衷地哀悼。黑与白,失恋的缤纷色彩。没有您的网络,计算机简直就是地狱! 查看全部
js 抓取网页内容(python怎么用python爬取视频网站的数据如何用爬取js渲染加载的视频文件不是)
如何用python爬取视频网站的数据
如何用python爬取js渲染加载的视频文件不是每个人都有资格说喜欢,也不是每个人都可以选择陪你一辈子!
在哪位大神的指导下,视频网站上的一些视频文件是通过js加载的,不知道能不能用selenium+phantomjs PhantomJS是一个基于webkit的JavaScript API。它使用 QtWebKit 作为其核心浏览器功能,并使用 webkit 来编译、解释和执行 JavaScript 代码。您可以在基于 webkit 的浏览器中做的任何事情,它都能做到。
python如何爬取头条付费栏视频 python如何爬取头条付费栏视频
前往今日头条官网自媒体申请账号,选择发布信息的类别,等待今日头条审核通过,即可发布视频。
想用Python做一个数据库,其结构大致是“歌手-歌曲名-专辑名-歌曲时长”,以及爬取网页、模拟登录等背后的大致逻辑和原理;
以songtaste网页标题提取为例,详细讲解如何爬取网站并提取网页内容;
以模拟登录百度为例,详细讲解如何模拟登录网站;
如何用Python爬取搜索引擎的结果 一个人的心,一个人的孤岛,可能只需要弹指一挥。
我选择爬取百度知道的html作为我的搜索源数据。目前,我打算搜索网页的标题。我选择Python的scrapy库来抓取网页,抓取网页的title、url、html。使用 sqlist3 管理爬取的数据源。爬行过程是深度优先的过程。
Python爬虫可以爬什么
用Python脚本在哔哩哔哩上爬视频是我离开彩妆后一个人的时候。面对电脑屏幕的二十四种本色,我无动于衷地哀悼。黑与白,失恋的缤纷色彩。没有您的网络,计算机简直就是地狱!
js 抓取网页内容(怎么显示在网页上的呢?网页的代码里面直接包含内容)
网站优化 • 优采云 发表了文章 • 0 个评论 • 58 次浏览 • 2022-04-16 01:01
网页内容一般是指我们最终在网页上看到的内容,但是这个过程并不像直接在网页的代码中收录内容那么简单,所以对于很多新手来说,会遇到很多问题,比如:
显然,当用 Chrome 或 Firefox 检查页面时,可以看到 HTML 标签中收录的内容,但在抓取时为空。
很多内容必须通过点击按钮或执行交互操作来显示在页面上。
因此,对于很多新手来说,做法是使用别人模拟浏览器操作的某种语言的库。其实就是调用本地浏览器或者收录一些执行javascript的引擎进行模拟操作来抓取数据。在抓取大量数据的情况下,效率很低,相当于给技术人员自己用了一个盒子,那么这些内容到底是如何在网页上显示的呢?
主要分为以下几种情况:
网页收录内容的情况是最容易解决的。一般来说,基本上都是写死的静态网页,或者是使用模板渲染的动态网页。当浏览器获取 HTML 时,它已经收录了所有的关键信息,所以你在网页上直接看到的内容可以通过特定的 HTML 标签由 javascript 代码加载。这是因为虽然网页显示时内容在HTML标签中,但实际上是通过执行js代码添加到标签中的。所以此时内容在js代码中,js的执行是在浏览器端,所以当你使用程序请求网页地址时,得到的响应是网页代码和js代码,所以你可以在浏览器端看到它。说到内容,由于解析时没有执行js,所以一定要发现指定html标签下的内容一定是空的。此时的处理方式一般是找到收录该内容的js代码字符串,然后通过正则表达式获取对应的内容。, 而不是解析 HTML 标签。 查看全部
js 抓取网页内容(怎么显示在网页上的呢?网页的代码里面直接包含内容)
网页内容一般是指我们最终在网页上看到的内容,但是这个过程并不像直接在网页的代码中收录内容那么简单,所以对于很多新手来说,会遇到很多问题,比如:
显然,当用 Chrome 或 Firefox 检查页面时,可以看到 HTML 标签中收录的内容,但在抓取时为空。
很多内容必须通过点击按钮或执行交互操作来显示在页面上。
因此,对于很多新手来说,做法是使用别人模拟浏览器操作的某种语言的库。其实就是调用本地浏览器或者收录一些执行javascript的引擎进行模拟操作来抓取数据。在抓取大量数据的情况下,效率很低,相当于给技术人员自己用了一个盒子,那么这些内容到底是如何在网页上显示的呢?
主要分为以下几种情况:
网页收录内容的情况是最容易解决的。一般来说,基本上都是写死的静态网页,或者是使用模板渲染的动态网页。当浏览器获取 HTML 时,它已经收录了所有的关键信息,所以你在网页上直接看到的内容可以通过特定的 HTML 标签由 javascript 代码加载。这是因为虽然网页显示时内容在HTML标签中,但实际上是通过执行js代码添加到标签中的。所以此时内容在js代码中,js的执行是在浏览器端,所以当你使用程序请求网页地址时,得到的响应是网页代码和js代码,所以你可以在浏览器端看到它。说到内容,由于解析时没有执行js,所以一定要发现指定html标签下的内容一定是空的。此时的处理方式一般是找到收录该内容的js代码字符串,然后通过正则表达式获取对应的内容。, 而不是解析 HTML 标签。
js 抓取网页内容(谷歌TKD标签是什么?标签中的T即title)
网站优化 • 优采云 发表了文章 • 0 个评论 • 44 次浏览 • 2022-04-15 17:30
谷歌是全球最大的搜索引擎,也是独立网站卖家的重要流量来源之一。独立网站卖家通过不断优化和提升网站在谷歌页面的有机排名,可以获得更多的曝光率和免费流量。这不仅可以帮助卖家无形中降低销售成本,还可以在一定程度上提高网站的转化率和热度。
什么是 TKD 标签?
TKD标签中的T是标题(网页标题),是网站中最重要的标签。标题是对当前页面的简要描述,所以标题不仅要给访问者一个清晰的引导,还要让访问者有阅读的兴趣网站。
但是不要为了吸引人而写与页面内容不匹配的标题,因为相关性越高,搜索引擎排名就越好。同时,与内容不符的标题也会让访问者感到被欺骗,从而降低网站的信任度和好感度。
标题是您在搜索结果中看到的第一个信息,因此最好将标题字符保持在 30 个字以内。这样标题就可以完整显示,不会因为显示不完整而影响用户体验。此外,在标题中收录一个核心 关键词,以强调 关键词 的重要性。
K代表Keyword,是网站的标题和描述的标签。关键字描述应尽可能简洁明了。关键词标签在TKD标签优化中的重要性近年来逐渐下降,很多卖家甚至选择完全不设置关键词,因为这样很容易被搜索引擎判定违规。
D是Deion(网页描述),是对网站标题的补充和解释。适当增加其中关键词的密度,对于提升排名会有显着的效果。因为页面描述会像标题一样出现在访问者的搜索结果列表中,卖家不仅要注意关键词的密度,还要尽量让页面描述对访问者有吸引力。
好的描述信息不仅可以提高网站的点击率,还可以提高网站的竞争力。遵循完整显示的原则,描述信息的字符最好控制在80个字符以内。
Ueeshop TKD标签
<p>Ueeshop TKD标签可以快速编辑产品、产品类别、单文、文章、案例、博客等TKD信息,还提供自动添加TKD标签的功能,帮助卖家提升 查看全部
js 抓取网页内容(谷歌TKD标签是什么?标签中的T即title)
谷歌是全球最大的搜索引擎,也是独立网站卖家的重要流量来源之一。独立网站卖家通过不断优化和提升网站在谷歌页面的有机排名,可以获得更多的曝光率和免费流量。这不仅可以帮助卖家无形中降低销售成本,还可以在一定程度上提高网站的转化率和热度。
什么是 TKD 标签?
TKD标签中的T是标题(网页标题),是网站中最重要的标签。标题是对当前页面的简要描述,所以标题不仅要给访问者一个清晰的引导,还要让访问者有阅读的兴趣网站。
但是不要为了吸引人而写与页面内容不匹配的标题,因为相关性越高,搜索引擎排名就越好。同时,与内容不符的标题也会让访问者感到被欺骗,从而降低网站的信任度和好感度。
标题是您在搜索结果中看到的第一个信息,因此最好将标题字符保持在 30 个字以内。这样标题就可以完整显示,不会因为显示不完整而影响用户体验。此外,在标题中收录一个核心 关键词,以强调 关键词 的重要性。
K代表Keyword,是网站的标题和描述的标签。关键字描述应尽可能简洁明了。关键词标签在TKD标签优化中的重要性近年来逐渐下降,很多卖家甚至选择完全不设置关键词,因为这样很容易被搜索引擎判定违规。
D是Deion(网页描述),是对网站标题的补充和解释。适当增加其中关键词的密度,对于提升排名会有显着的效果。因为页面描述会像标题一样出现在访问者的搜索结果列表中,卖家不仅要注意关键词的密度,还要尽量让页面描述对访问者有吸引力。
好的描述信息不仅可以提高网站的点击率,还可以提高网站的竞争力。遵循完整显示的原则,描述信息的字符最好控制在80个字符以内。
Ueeshop TKD标签
<p>Ueeshop TKD标签可以快速编辑产品、产品类别、单文、文章、案例、博客等TKD信息,还提供自动添加TKD标签的功能,帮助卖家提升
js 抓取网页内容(js抓取网页内容会先被转换成map格式,怎么处理)
网站优化 • 优采云 发表了文章 • 0 个评论 • 61 次浏览 • 2022-04-14 12:02
js抓取网页内容会先被转换成map格式,内容会被简单的整理一下,例如:check</a>echo"check
check
"但是没有url的话会取不到内容,所以建议用urllib2。
百度。
可以用scrapy,可以在webscrapy-scrapy或者meganscrapy项目下载到前端返回的html文件,再继续发起后面的连接来接收数据。
我一直在用这个,然后前端操作挺方便的。
简单的做法是爬取首页大部分商品。因为大部分商品的商品价格固定,对应的url自然就能设计出来。这样方便用模板写页面css等,标准的url格式对静态页面也是够用的。然后正则,例如首页的url是/abab2be143ebe8235be7106c36841546ed828/beci/goods/这样的dom就可以爬下来。
一共大概几千行代码不到十分钟搞定。不推荐那种上千字符搜索,因为太多是指向商品页面内容页的,部分网站正则匹配排序算法不一定受得了。如果页面中有宝贝链接的话,可以抓取部分宝贝链接,但不推荐。因为这样做会对页面进行程序化解析,每个商品页面的宝贝链接都会有对应页数,每个页数多少url就是几千字符,需要关联上层链接。
不能简单拿链接直接输出了。这部分后期可以有后端处理。是有后端的,你不会用后端的话,可以用后端可用的html来接收,然后发起连接。然后拿抓到的数据给商品页面使用。这样就可以得到首页大部分商品的url对应的数据了。其他页面的数据没有抓到,应该有后端工具可以抓取其他页面或内容。在看下这些页面的数据怎么处理。
肯定不是从外部爬取下来一样就完了。数据处理也是很耗时的。这里推荐一个比较容易的方法。去爬取微博好像有很多爬虫在抓取粉丝数量前几名的,然后把这些url保存在数据库里,那么在某些场景可以不用保存粉丝信息就直接抓取。 查看全部
js 抓取网页内容(js抓取网页内容会先被转换成map格式,怎么处理)
js抓取网页内容会先被转换成map格式,内容会被简单的整理一下,例如:check</a>echo"check
check
"但是没有url的话会取不到内容,所以建议用urllib2。
百度。
可以用scrapy,可以在webscrapy-scrapy或者meganscrapy项目下载到前端返回的html文件,再继续发起后面的连接来接收数据。
我一直在用这个,然后前端操作挺方便的。
简单的做法是爬取首页大部分商品。因为大部分商品的商品价格固定,对应的url自然就能设计出来。这样方便用模板写页面css等,标准的url格式对静态页面也是够用的。然后正则,例如首页的url是/abab2be143ebe8235be7106c36841546ed828/beci/goods/这样的dom就可以爬下来。
一共大概几千行代码不到十分钟搞定。不推荐那种上千字符搜索,因为太多是指向商品页面内容页的,部分网站正则匹配排序算法不一定受得了。如果页面中有宝贝链接的话,可以抓取部分宝贝链接,但不推荐。因为这样做会对页面进行程序化解析,每个商品页面的宝贝链接都会有对应页数,每个页数多少url就是几千字符,需要关联上层链接。
不能简单拿链接直接输出了。这部分后期可以有后端处理。是有后端的,你不会用后端的话,可以用后端可用的html来接收,然后发起连接。然后拿抓到的数据给商品页面使用。这样就可以得到首页大部分商品的url对应的数据了。其他页面的数据没有抓到,应该有后端工具可以抓取其他页面或内容。在看下这些页面的数据怎么处理。
肯定不是从外部爬取下来一样就完了。数据处理也是很耗时的。这里推荐一个比较容易的方法。去爬取微博好像有很多爬虫在抓取粉丝数量前几名的,然后把这些url保存在数据库里,那么在某些场景可以不用保存粉丝信息就直接抓取。
js 抓取网页内容(1.javascript怎么获取元素的所有内容ContentEditable)
网站优化 • 优采云 发表了文章 • 0 个评论 • 40 次浏览 • 2022-04-13 02:09
1.javascript如何获取元素的所有内容
试试 ContentEditable 属性。
看看这个演示:
HTML5 演示:ContentEditable
/内容可编辑
相关代码:
1
2
3
4
5
6
vareditable = document.getElementById('editable');addEvent(editable, 'blur', function() {
// 很糟糕,我们正在挂钩模糊事件
localStorage.setItem('contenteditable', this.innerHTML);
document.designMode = 'off';});addEvent(editable, 'focus', function () {
document.designMode = 'on';});if (localStorage.getItem('contenteditable')) {
editable.innerHTML = localStorage.getItem('contenteditable');}
不过,最好用JQuery,而且简单。 jquery有个属性可以直接获取当前元素的所有子元素
2.Javascript获取Html界面元素的几种方法
getElementById()
//通过ID获取元素,所以只能访问设置了ID的元素,例如有一个ID为docid的DIV:
//
// 然后可以使用getElementById("docid") 来获取这个元素。
getElementsByName()
// 按名称获取元素。 DOCUMENT 中元素的名称可以重复。如果一个文档中有两个以上的同名标签,那么getElementsByName()可以获取这些元素组成一个数组。
// 比如有两个DIV:
//
//
// 然后就可以用getElementsByName("docname")获取这两个DIV,用getElementsByName("docname")[0]访问第一个DIV。 getElementsByTagName()
// 元素通过TAGNAME(标签名)获取。一个DOCUMENT中会有相同的标签,所以这个方法也得到一个数组。
// 可以使用 getElementsByTagName("div") 访问,第一个 DIV 使用 getElementsByTagName("div")[0],第二个 DIV 使用 getElementsByTagName("div")[1]。
3.Javascript获取Html界面元素的几种方法
getElementById() // 通过 ID 获取元素,因此只能访问设置了 ID 的元素。例如,如果有一个ID为docid的DIV: // // 那么你可以使用getElementById("docid") 来获取它这个元素。
getElementsByName()//通过NAME获取元素,DOCUMENT中元素的NAME可以重复,如果一个文档中有两个以上标签//同名,那么getElementsByName()可以获取这些元素形成数组 。 // 比如有两个DIV: // // // 那么可以使用getElementsByName("docname") 获取这两个DIV,使用getElementsByName("docname")[0] 访问第一个DIV。
getElementsByTagName()//通过TAGNAME(标签名)获取元素,一个DOCUMENT中会有相同的标签,所以这个方法也是获取一个数组。 // 可以使用 getElementsByTagName("div") 访问它们,第一个 DIV 使用 getElementsByTagName("div")[0],第二个 DIV 使用 getElementsByTagName("div")[1]。
4.javascript如何获取元素的所有内容
试试 ContentEditable 属性。
看这个Demo: HTML5 Demo: ContentEditable /contenteditable 相关代码: 1 2 3 4 5 6 var editable = document.getElementById('editable');addEvent(editable, 'blur', function () { // lame我们正在挂钩模糊事件 localStorage.setItem('contenteditable', this.innerHTML); document.designMode = 'off';});addEvent(editable, 'focus', function () { document.designMode = 'on ';});if (localStorage.getItem('contenteditable')) { editable.innerHTML = localStorage.getItem('contenteditable');} 不过还是推荐使用JQuery,而且很简单,Jquery有一个属性,可以直接获取当前元素的所有子元素。
转载请注明出处 JS码网 » js获取页面元素内容(javascript如何获取元素所有内容) 查看全部
js 抓取网页内容(1.javascript怎么获取元素的所有内容ContentEditable)
1.javascript如何获取元素的所有内容
试试 ContentEditable 属性。
看看这个演示:
HTML5 演示:ContentEditable
/内容可编辑
相关代码:
1
2
3
4
5
6
vareditable = document.getElementById('editable');addEvent(editable, 'blur', function() {
// 很糟糕,我们正在挂钩模糊事件
localStorage.setItem('contenteditable', this.innerHTML);
document.designMode = 'off';});addEvent(editable, 'focus', function () {
document.designMode = 'on';});if (localStorage.getItem('contenteditable')) {
editable.innerHTML = localStorage.getItem('contenteditable');}
不过,最好用JQuery,而且简单。 jquery有个属性可以直接获取当前元素的所有子元素
2.Javascript获取Html界面元素的几种方法
getElementById()
//通过ID获取元素,所以只能访问设置了ID的元素,例如有一个ID为docid的DIV:
//
// 然后可以使用getElementById("docid") 来获取这个元素。
getElementsByName()
// 按名称获取元素。 DOCUMENT 中元素的名称可以重复。如果一个文档中有两个以上的同名标签,那么getElementsByName()可以获取这些元素组成一个数组。
// 比如有两个DIV:
//
//
// 然后就可以用getElementsByName("docname")获取这两个DIV,用getElementsByName("docname")[0]访问第一个DIV。 getElementsByTagName()
// 元素通过TAGNAME(标签名)获取。一个DOCUMENT中会有相同的标签,所以这个方法也得到一个数组。
// 可以使用 getElementsByTagName("div") 访问,第一个 DIV 使用 getElementsByTagName("div")[0],第二个 DIV 使用 getElementsByTagName("div")[1]。
3.Javascript获取Html界面元素的几种方法
getElementById() // 通过 ID 获取元素,因此只能访问设置了 ID 的元素。例如,如果有一个ID为docid的DIV: // // 那么你可以使用getElementById("docid") 来获取它这个元素。
getElementsByName()//通过NAME获取元素,DOCUMENT中元素的NAME可以重复,如果一个文档中有两个以上标签//同名,那么getElementsByName()可以获取这些元素形成数组 。 // 比如有两个DIV: // // // 那么可以使用getElementsByName("docname") 获取这两个DIV,使用getElementsByName("docname")[0] 访问第一个DIV。
getElementsByTagName()//通过TAGNAME(标签名)获取元素,一个DOCUMENT中会有相同的标签,所以这个方法也是获取一个数组。 // 可以使用 getElementsByTagName("div") 访问它们,第一个 DIV 使用 getElementsByTagName("div")[0],第二个 DIV 使用 getElementsByTagName("div")[1]。
4.javascript如何获取元素的所有内容
试试 ContentEditable 属性。
看这个Demo: HTML5 Demo: ContentEditable /contenteditable 相关代码: 1 2 3 4 5 6 var editable = document.getElementById('editable');addEvent(editable, 'blur', function () { // lame我们正在挂钩模糊事件 localStorage.setItem('contenteditable', this.innerHTML); document.designMode = 'off';});addEvent(editable, 'focus', function () { document.designMode = 'on ';});if (localStorage.getItem('contenteditable')) { editable.innerHTML = localStorage.getItem('contenteditable');} 不过还是推荐使用JQuery,而且很简单,Jquery有一个属性,可以直接获取当前元素的所有子元素。
转载请注明出处 JS码网 » js获取页面元素内容(javascript如何获取元素所有内容)
js 抓取网页内容 同构 JavaScript 应用 —— Web 世界的未来?
网站优化 • 优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2022-05-31 08:11
Web 世界有一个至理名言,就是 Java 提出的“Write once, run everywhere”。但这句话只适用于 Java 么?我们能否也用它来形容 JavaScript 呢?答案是 Yes。
我将会在这篇文章中介绍同构 JavaScript 应用的概念,并推荐一些资源帮助你构建此类应用。
一路走来
多年以前,web 只是一些由 HTML 和 CSS 搭建的静态页面,没有太多的交互。用户的每一个动作都需要服务器来创建并返回一个完整的页面。幸而有了 JavaScript,开发者开始创建很棒的效果,不过 Ajax 的到来才是这场革新的真正开始。Web 开发者开始编写能够与服务端进行交互,且在不重载页面的情况下向服务端发送并接受数据的页面。
随着时间的推移,客户端代码可以做的事情越来越多,催生了被称作单页面应用(SPA)的一类应用。SPA 在首次加载页面时就获取了所有必需的资源,或者再按需动态加载并且渲染到页面上。 Gmail 和 StackEdit editor 是很棒的 SPA 示例。
SPA 准许重度的交互设计,因为几乎所有的操作都在客户端执行,保持最低限度地与服务端进行交流。不幸的是,它们也存在一些严重的问题,我们选择几个进行讨论。
性能
因为相对于静态页面,SPA 需要更多的客户端代码,需要下载数据的体积也更大。这使得手机加载速度很慢,可能会导致一些极端的状况 —— 比如糟糕的用户体验以及收入上的损失等。依据 Microsoft 的一篇文章 ——
Bing 的一项研究表明:页面的加载时间每增加 10ms,站点年度总收入就会减少 $250K。
SEO
因为单页面应用依赖于 JavaScript 的执行,服务器不会提供它们可能用到的任何 HTML 内容。因此,web 爬虫很难去索引到这些页面。爬虫就是可以向 web 服务器发送请求,并且将结果分析成原始文本的程序,而不需要像一个浏览器运行 JavaScript 那样解释和执行客户端的内容。不久前,Google 优化了搜索引擎的 web 爬虫,现在它也可以抓取基于客户端 JavaScript 所构建的页面了。但是 Bing、Yahoo 以及其他搜索引擎怎么办?一个好的索引对任何公司来说都至关重要,它通常会带来更多的流量以及更高的回报。
同构 JavaScript 应用
同构 JavaScript 应用基于 JavaScript 编写,可以在客户端和服务端运行。正因为此,你只需要写一次代码,就可以在服务端渲染静态页面,还可以在客户端完成复杂的交互。所以,这种方式互通了两个世界,并且避免了前面提到了两个问题。
现在,有很多框架可以帮助你开发这类应用。其中最著名的一个可能是 Meteor。Meter 是一个开源 JavaScript 框架,基于 Node.js 编写,专注于实时 web 应用。我想提到的另一个项目是 Rendr,它是 Airbnb 开发的一款轻量级类库,准许同时在客户端和服务端运行 Backbone.js。
越来越多的公司将 Node.js 应用到他们的产品中。客户端和服务端的代码共享成为一个更加普通而自然的选择。在我看来,这种做法将是 web 开发的未来。有些类库通过共享模板又增强了这一趋势,比如 React。
结论
这篇文章介绍了同构 JavaScript 应用的概念,它是应用开发的一种全新方式,可以最大限度地结合服务端和客户端应用程序。我们还讨论了运用这种方式尝试解决的问题,以及你现在就可以参与实践的一些项目。
你听说过同构 JavaScript 应用么?你开发过么?你有开发经验么?
原文:Isomorphic JavaScript Applications — the Future of the Web? 查看全部
js 抓取网页内容 同构 JavaScript 应用 —— Web 世界的未来?
Web 世界有一个至理名言,就是 Java 提出的“Write once, run everywhere”。但这句话只适用于 Java 么?我们能否也用它来形容 JavaScript 呢?答案是 Yes。
我将会在这篇文章中介绍同构 JavaScript 应用的概念,并推荐一些资源帮助你构建此类应用。
一路走来
多年以前,web 只是一些由 HTML 和 CSS 搭建的静态页面,没有太多的交互。用户的每一个动作都需要服务器来创建并返回一个完整的页面。幸而有了 JavaScript,开发者开始创建很棒的效果,不过 Ajax 的到来才是这场革新的真正开始。Web 开发者开始编写能够与服务端进行交互,且在不重载页面的情况下向服务端发送并接受数据的页面。
随着时间的推移,客户端代码可以做的事情越来越多,催生了被称作单页面应用(SPA)的一类应用。SPA 在首次加载页面时就获取了所有必需的资源,或者再按需动态加载并且渲染到页面上。 Gmail 和 StackEdit editor 是很棒的 SPA 示例。
SPA 准许重度的交互设计,因为几乎所有的操作都在客户端执行,保持最低限度地与服务端进行交流。不幸的是,它们也存在一些严重的问题,我们选择几个进行讨论。
性能
因为相对于静态页面,SPA 需要更多的客户端代码,需要下载数据的体积也更大。这使得手机加载速度很慢,可能会导致一些极端的状况 —— 比如糟糕的用户体验以及收入上的损失等。依据 Microsoft 的一篇文章 ——
Bing 的一项研究表明:页面的加载时间每增加 10ms,站点年度总收入就会减少 $250K。
SEO
因为单页面应用依赖于 JavaScript 的执行,服务器不会提供它们可能用到的任何 HTML 内容。因此,web 爬虫很难去索引到这些页面。爬虫就是可以向 web 服务器发送请求,并且将结果分析成原始文本的程序,而不需要像一个浏览器运行 JavaScript 那样解释和执行客户端的内容。不久前,Google 优化了搜索引擎的 web 爬虫,现在它也可以抓取基于客户端 JavaScript 所构建的页面了。但是 Bing、Yahoo 以及其他搜索引擎怎么办?一个好的索引对任何公司来说都至关重要,它通常会带来更多的流量以及更高的回报。
同构 JavaScript 应用
同构 JavaScript 应用基于 JavaScript 编写,可以在客户端和服务端运行。正因为此,你只需要写一次代码,就可以在服务端渲染静态页面,还可以在客户端完成复杂的交互。所以,这种方式互通了两个世界,并且避免了前面提到了两个问题。
现在,有很多框架可以帮助你开发这类应用。其中最著名的一个可能是 Meteor。Meter 是一个开源 JavaScript 框架,基于 Node.js 编写,专注于实时 web 应用。我想提到的另一个项目是 Rendr,它是 Airbnb 开发的一款轻量级类库,准许同时在客户端和服务端运行 Backbone.js。
越来越多的公司将 Node.js 应用到他们的产品中。客户端和服务端的代码共享成为一个更加普通而自然的选择。在我看来,这种做法将是 web 开发的未来。有些类库通过共享模板又增强了这一趋势,比如 React。
结论
这篇文章介绍了同构 JavaScript 应用的概念,它是应用开发的一种全新方式,可以最大限度地结合服务端和客户端应用程序。我们还讨论了运用这种方式尝试解决的问题,以及你现在就可以参与实践的一些项目。
你听说过同构 JavaScript 应用么?你开发过么?你有开发经验么?
原文:Isomorphic JavaScript Applications — the Future of the Web?
js 抓取网页内容 【第2030期】JavaScript 启动性能瓶颈分析与解决方案
网站优化 • 优采云 发表了文章 • 0 个评论 • 57 次浏览 • 2022-05-26 07:39
前言
找到它存在的意义。今日早读文章由@王下邀月熊翻译授权分享。
正文从这开始~~
在 Web 开发中,随着需求的增加与代码库的扩张,我们最终发布的 Web 页面也逐渐膨胀。不过这种膨胀远不止意味着占据更多的传输带宽,其还意味着用户浏览网页时可能更差劲的性能体验。浏览器在下载完某个页面依赖的脚本之后,其还需要经过语法分析、解释与运行这些步骤。而本文则会深入分析浏览器对于 JavaScript 的这些处理流程,挖掘出那些影响你应用启动时间的罪魁祸首,并且根据我个人的经验提出相对应的解决方案。回顾过去,我们还没有专门地考虑过如何去优化 JavaScript 解析/编译这些步骤;我们预想中的是解析器在发现 查看全部
js 抓取网页内容 【第2030期】JavaScript 启动性能瓶颈分析与解决方案
前言
找到它存在的意义。今日早读文章由@王下邀月熊翻译授权分享。
正文从这开始~~
在 Web 开发中,随着需求的增加与代码库的扩张,我们最终发布的 Web 页面也逐渐膨胀。不过这种膨胀远不止意味着占据更多的传输带宽,其还意味着用户浏览网页时可能更差劲的性能体验。浏览器在下载完某个页面依赖的脚本之后,其还需要经过语法分析、解释与运行这些步骤。而本文则会深入分析浏览器对于 JavaScript 的这些处理流程,挖掘出那些影响你应用启动时间的罪魁祸首,并且根据我个人的经验提出相对应的解决方案。回顾过去,我们还没有专门地考虑过如何去优化 JavaScript 解析/编译这些步骤;我们预想中的是解析器在发现
.NET微信网页开发之使用微信JS-SDK自定义微信分享内容
网站优化 • 优采云 发表了文章 • 0 个评论 • 38 次浏览 • 2022-05-26 07:35
第一步、微信JS-SDK的使用步骤,配置信息的生成获取讲解:
关于JS-SDK的使用步骤和timestamp(时间戳),nonceStr(随机串),signature(签名),access_token(接口调用凭据)生成获取的详细说明在这里:
第二步、调用微信JS-SDK自定义分享内容接口:
//注入权限验证配置wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: '', // 必填,公众号的唯一标识 timestamp: , // 必填,生成签名的时间戳 nonceStr: '', // 必填,生成签名的随机串 signature: '',// 必填,签名 jsApiList: ['updateAppMessageShareData','updateTimelineShareData'] // 必填,分享朋友和分享朋友圈接口列表});<br />//自定义分享的内容var title="店铺好礼豪情大派送";var link='xxx.xxx.com'//分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致var desc="好礼一起享,进店铺领取优惠券可享更多优惠哟!";var imgUrl ="图片地址";//注意一定要是可以访问的网络链接地址,否则没有用<br />//1.自定义“分享给朋友”及“分享到QQ”按钮的分享内容(1.4.0)wx.ready(function () { //需在用户可能点击分享按钮前就先调用 wx.updateAppMessageShareData({ title: title, // 分享标题 desc: desc, // 分享描述 link: link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: imgUrl , // 分享图标 success: function () { // 设置成功 alert("分享成功"); } })});<br /><br />//2.自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容(1.4.0)wx.ready(function () { //需在用户可能点击分享按钮前就先调用 wx.updateTimelineShareData({ title: title, // 分享标题 link: link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: imgUrl , // 分享图标 success: function () { // 设置成功 alert("分享成功"); } })});
第三步、通过点击微信右上角的按钮,找到微信分享:
注意:你在微信中无法定义事件去主动触发微信分享,需要点击微信右上角的按钮然后就能够找到微信分享。
效果图,如下:
学习是一个永无止境的过程,你知道的越多,你不知道的也会越多,在有限的时间内坚持每天多学一点,你一定能成为你想要成为的那个人。不积跬步无以至千里,不积小流无以成江河!!!
See you next good day~
查看全部
.NET微信网页开发之使用微信JS-SDK自定义微信分享内容
第一步、微信JS-SDK的使用步骤,配置信息的生成获取讲解:
关于JS-SDK的使用步骤和timestamp(时间戳),nonceStr(随机串),signature(签名),access_token(接口调用凭据)生成获取的详细说明在这里:
第二步、调用微信JS-SDK自定义分享内容接口:
//注入权限验证配置wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: '', // 必填,公众号的唯一标识 timestamp: , // 必填,生成签名的时间戳 nonceStr: '', // 必填,生成签名的随机串 signature: '',// 必填,签名 jsApiList: ['updateAppMessageShareData','updateTimelineShareData'] // 必填,分享朋友和分享朋友圈接口列表});<br />//自定义分享的内容var title="店铺好礼豪情大派送";var link='xxx.xxx.com'//分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致var desc="好礼一起享,进店铺领取优惠券可享更多优惠哟!";var imgUrl ="图片地址";//注意一定要是可以访问的网络链接地址,否则没有用<br />//1.自定义“分享给朋友”及“分享到QQ”按钮的分享内容(1.4.0)wx.ready(function () { //需在用户可能点击分享按钮前就先调用 wx.updateAppMessageShareData({ title: title, // 分享标题 desc: desc, // 分享描述 link: link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: imgUrl , // 分享图标 success: function () { // 设置成功 alert("分享成功"); } })});<br /><br />//2.自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容(1.4.0)wx.ready(function () { //需在用户可能点击分享按钮前就先调用 wx.updateTimelineShareData({ title: title, // 分享标题 link: link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: imgUrl , // 分享图标 success: function () { // 设置成功 alert("分享成功"); } })});
第三步、通过点击微信右上角的按钮,找到微信分享:
注意:你在微信中无法定义事件去主动触发微信分享,需要点击微信右上角的按钮然后就能够找到微信分享。
效果图,如下:
学习是一个永无止境的过程,你知道的越多,你不知道的也会越多,在有限的时间内坚持每天多学一点,你一定能成为你想要成为的那个人。不积跬步无以至千里,不积小流无以成江河!!!
See you next good day~
js 抓取网页内容 同构 JavaScript 应用 —— Web 世界的未来?
网站优化 • 优采云 发表了文章 • 0 个评论 • 61 次浏览 • 2022-05-25 13:11
Web 世界有一个至理名言,就是 Java 提出的“Write once, run everywhere”。但这句话只适用于 Java 么?我们能否也用它来形容 JavaScript 呢?答案是 Yes。
我将会在这篇文章中介绍同构 JavaScript 应用的概念,并推荐一些资源帮助你构建此类应用。
一路走来
多年以前,web 只是一些由 HTML 和 CSS 搭建的静态页面,没有太多的交互。用户的每一个动作都需要服务器来创建并返回一个完整的页面。幸而有了 JavaScript,开发者开始创建很棒的效果,不过 Ajax 的到来才是这场革新的真正开始。Web 开发者开始编写能够与服务端进行交互,且在不重载页面的情况下向服务端发送并接受数据的页面。
随着时间的推移,客户端代码可以做的事情越来越多,催生了被称作单页面应用(SPA)的一类应用。SPA 在首次加载页面时就获取了所有必需的资源,或者再按需动态加载并且渲染到页面上。 Gmail 和 StackEdit editor 是很棒的 SPA 示例。
SPA 准许重度的交互设计,因为几乎所有的操作都在客户端执行,保持最低限度地与服务端进行交流。不幸的是,它们也存在一些严重的问题,我们选择几个进行讨论。
性能
因为相对于静态页面,SPA 需要更多的客户端代码,需要下载数据的体积也更大。这使得手机加载速度很慢,可能会导致一些极端的状况 —— 比如糟糕的用户体验以及收入上的损失等。依据 Microsoft 的一篇文章 ——
Bing 的一项研究表明:页面的加载时间每增加 10ms,站点年度总收入就会减少 $250K。
SEO
因为单页面应用依赖于 JavaScript 的执行,服务器不会提供它们可能用到的任何 HTML 内容。因此,web 爬虫很难去索引到这些页面。爬虫就是可以向 web 服务器发送请求,并且将结果分析成原始文本的程序,而不需要像一个浏览器运行 JavaScript 那样解释和执行客户端的内容。不久前,Google 优化了搜索引擎的 web 爬虫,现在它也可以抓取基于客户端 JavaScript 所构建的页面了。但是 Bing、Yahoo 以及其他搜索引擎怎么办?一个好的索引对任何公司来说都至关重要,它通常会带来更多的流量以及更高的回报。
同构 JavaScript 应用
同构 JavaScript 应用基于 JavaScript 编写,可以在客户端和服务端运行。正因为此,你只需要写一次代码,就可以在服务端渲染静态页面,还可以在客户端完成复杂的交互。所以,这种方式互通了两个世界,并且避免了前面提到了两个问题。
现在,有很多框架可以帮助你开发这类应用。其中最著名的一个可能是 Meteor。Meter 是一个开源 JavaScript 框架,基于 Node.js 编写,专注于实时 web 应用。我想提到的另一个项目是 Rendr,它是 Airbnb 开发的一款轻量级类库,准许同时在客户端和服务端运行 Backbone.js。
越来越多的公司将 Node.js 应用到他们的产品中。客户端和服务端的代码共享成为一个更加普通而自然的选择。在我看来,这种做法将是 web 开发的未来。有些类库通过共享模板又增强了这一趋势,比如 React。
结论
这篇文章介绍了同构 JavaScript 应用的概念,它是应用开发的一种全新方式,可以最大限度地结合服务端和客户端应用程序。我们还讨论了运用这种方式尝试解决的问题,以及你现在就可以参与实践的一些项目。
你听说过同构 JavaScript 应用么?你开发过么?你有开发经验么?
原文:Isomorphic JavaScript Applications — the Future of the Web? 查看全部
js 抓取网页内容 同构 JavaScript 应用 —— Web 世界的未来?
Web 世界有一个至理名言,就是 Java 提出的“Write once, run everywhere”。但这句话只适用于 Java 么?我们能否也用它来形容 JavaScript 呢?答案是 Yes。
我将会在这篇文章中介绍同构 JavaScript 应用的概念,并推荐一些资源帮助你构建此类应用。
一路走来
多年以前,web 只是一些由 HTML 和 CSS 搭建的静态页面,没有太多的交互。用户的每一个动作都需要服务器来创建并返回一个完整的页面。幸而有了 JavaScript,开发者开始创建很棒的效果,不过 Ajax 的到来才是这场革新的真正开始。Web 开发者开始编写能够与服务端进行交互,且在不重载页面的情况下向服务端发送并接受数据的页面。
随着时间的推移,客户端代码可以做的事情越来越多,催生了被称作单页面应用(SPA)的一类应用。SPA 在首次加载页面时就获取了所有必需的资源,或者再按需动态加载并且渲染到页面上。 Gmail 和 StackEdit editor 是很棒的 SPA 示例。
SPA 准许重度的交互设计,因为几乎所有的操作都在客户端执行,保持最低限度地与服务端进行交流。不幸的是,它们也存在一些严重的问题,我们选择几个进行讨论。
性能
因为相对于静态页面,SPA 需要更多的客户端代码,需要下载数据的体积也更大。这使得手机加载速度很慢,可能会导致一些极端的状况 —— 比如糟糕的用户体验以及收入上的损失等。依据 Microsoft 的一篇文章 ——
Bing 的一项研究表明:页面的加载时间每增加 10ms,站点年度总收入就会减少 $250K。
SEO
因为单页面应用依赖于 JavaScript 的执行,服务器不会提供它们可能用到的任何 HTML 内容。因此,web 爬虫很难去索引到这些页面。爬虫就是可以向 web 服务器发送请求,并且将结果分析成原始文本的程序,而不需要像一个浏览器运行 JavaScript 那样解释和执行客户端的内容。不久前,Google 优化了搜索引擎的 web 爬虫,现在它也可以抓取基于客户端 JavaScript 所构建的页面了。但是 Bing、Yahoo 以及其他搜索引擎怎么办?一个好的索引对任何公司来说都至关重要,它通常会带来更多的流量以及更高的回报。
同构 JavaScript 应用
同构 JavaScript 应用基于 JavaScript 编写,可以在客户端和服务端运行。正因为此,你只需要写一次代码,就可以在服务端渲染静态页面,还可以在客户端完成复杂的交互。所以,这种方式互通了两个世界,并且避免了前面提到了两个问题。
现在,有很多框架可以帮助你开发这类应用。其中最著名的一个可能是 Meteor。Meter 是一个开源 JavaScript 框架,基于 Node.js 编写,专注于实时 web 应用。我想提到的另一个项目是 Rendr,它是 Airbnb 开发的一款轻量级类库,准许同时在客户端和服务端运行 Backbone.js。
越来越多的公司将 Node.js 应用到他们的产品中。客户端和服务端的代码共享成为一个更加普通而自然的选择。在我看来,这种做法将是 web 开发的未来。有些类库通过共享模板又增强了这一趋势,比如 React。
结论
这篇文章介绍了同构 JavaScript 应用的概念,它是应用开发的一种全新方式,可以最大限度地结合服务端和客户端应用程序。我们还讨论了运用这种方式尝试解决的问题,以及你现在就可以参与实践的一些项目。
你听说过同构 JavaScript 应用么?你开发过么?你有开发经验么?
原文:Isomorphic JavaScript Applications — the Future of the Web?
js 抓取网页内容 同构 JavaScript 应用 —— Web 世界的未来?
网站优化 • 优采云 发表了文章 • 0 个评论 • 61 次浏览 • 2022-05-21 12:13
Web 世界有一个至理名言,就是 Java 提出的“Write once, run everywhere”。但这句话只适用于 Java 么?我们能否也用它来形容 JavaScript 呢?答案是 Yes。
我将会在这篇文章中介绍同构 JavaScript 应用的概念,并推荐一些资源帮助你构建此类应用。
一路走来
多年以前,web 只是一些由 HTML 和 CSS 搭建的静态页面,没有太多的交互。用户的每一个动作都需要服务器来创建并返回一个完整的页面。幸而有了 JavaScript,开发者开始创建很棒的效果,不过 Ajax 的到来才是这场革新的真正开始。Web 开发者开始编写能够与服务端进行交互,且在不重载页面的情况下向服务端发送并接受数据的页面。
随着时间的推移,客户端代码可以做的事情越来越多,催生了被称作单页面应用(SPA)的一类应用。SPA 在首次加载页面时就获取了所有必需的资源,或者再按需动态加载并且渲染到页面上。 Gmail 和 StackEdit editor 是很棒的 SPA 示例。
SPA 准许重度的交互设计,因为几乎所有的操作都在客户端执行,保持最低限度地与服务端进行交流。不幸的是,它们也存在一些严重的问题,我们选择几个进行讨论。
性能
因为相对于静态页面,SPA 需要更多的客户端代码,需要下载数据的体积也更大。这使得手机加载速度很慢,可能会导致一些极端的状况 —— 比如糟糕的用户体验以及收入上的损失等。依据 Microsoft 的一篇文章 ——
Bing 的一项研究表明:页面的加载时间每增加 10ms,站点年度总收入就会减少 $250K。
SEO
因为单页面应用依赖于 JavaScript 的执行,服务器不会提供它们可能用到的任何 HTML 内容。因此,web 爬虫很难去索引到这些页面。爬虫就是可以向 web 服务器发送请求,并且将结果分析成原始文本的程序,而不需要像一个浏览器运行 JavaScript 那样解释和执行客户端的内容。不久前,Google 优化了搜索引擎的 web 爬虫,现在它也可以抓取基于客户端 JavaScript 所构建的页面了。但是 Bing、Yahoo 以及其他搜索引擎怎么办?一个好的索引对任何公司来说都至关重要,它通常会带来更多的流量以及更高的回报。
同构 JavaScript 应用
同构 JavaScript 应用基于 JavaScript 编写,可以在客户端和服务端运行。正因为此,你只需要写一次代码,就可以在服务端渲染静态页面,还可以在客户端完成复杂的交互。所以,这种方式互通了两个世界,并且避免了前面提到了两个问题。
现在,有很多框架可以帮助你开发这类应用。其中最著名的一个可能是 Meteor。Meter 是一个开源 JavaScript 框架,基于 Node.js 编写,专注于实时 web 应用。我想提到的另一个项目是 Rendr,它是 Airbnb 开发的一款轻量级类库,准许同时在客户端和服务端运行 Backbone.js。
越来越多的公司将 Node.js 应用到他们的产品中。客户端和服务端的代码共享成为一个更加普通而自然的选择。在我看来,这种做法将是 web 开发的未来。有些类库通过共享模板又增强了这一趋势,比如 React。
结论
这篇文章介绍了同构 JavaScript 应用的概念,它是应用开发的一种全新方式,可以最大限度地结合服务端和客户端应用程序。我们还讨论了运用这种方式尝试解决的问题,以及你现在就可以参与实践的一些项目。
你听说过同构 JavaScript 应用么?你开发过么?你有开发经验么?
原文:Isomorphic JavaScript Applications — the Future of the Web? 查看全部
js 抓取网页内容 同构 JavaScript 应用 —— Web 世界的未来?
Web 世界有一个至理名言,就是 Java 提出的“Write once, run everywhere”。但这句话只适用于 Java 么?我们能否也用它来形容 JavaScript 呢?答案是 Yes。
我将会在这篇文章中介绍同构 JavaScript 应用的概念,并推荐一些资源帮助你构建此类应用。
一路走来
多年以前,web 只是一些由 HTML 和 CSS 搭建的静态页面,没有太多的交互。用户的每一个动作都需要服务器来创建并返回一个完整的页面。幸而有了 JavaScript,开发者开始创建很棒的效果,不过 Ajax 的到来才是这场革新的真正开始。Web 开发者开始编写能够与服务端进行交互,且在不重载页面的情况下向服务端发送并接受数据的页面。
随着时间的推移,客户端代码可以做的事情越来越多,催生了被称作单页面应用(SPA)的一类应用。SPA 在首次加载页面时就获取了所有必需的资源,或者再按需动态加载并且渲染到页面上。 Gmail 和 StackEdit editor 是很棒的 SPA 示例。
SPA 准许重度的交互设计,因为几乎所有的操作都在客户端执行,保持最低限度地与服务端进行交流。不幸的是,它们也存在一些严重的问题,我们选择几个进行讨论。
性能
因为相对于静态页面,SPA 需要更多的客户端代码,需要下载数据的体积也更大。这使得手机加载速度很慢,可能会导致一些极端的状况 —— 比如糟糕的用户体验以及收入上的损失等。依据 Microsoft 的一篇文章 ——
Bing 的一项研究表明:页面的加载时间每增加 10ms,站点年度总收入就会减少 $250K。
SEO
因为单页面应用依赖于 JavaScript 的执行,服务器不会提供它们可能用到的任何 HTML 内容。因此,web 爬虫很难去索引到这些页面。爬虫就是可以向 web 服务器发送请求,并且将结果分析成原始文本的程序,而不需要像一个浏览器运行 JavaScript 那样解释和执行客户端的内容。不久前,Google 优化了搜索引擎的 web 爬虫,现在它也可以抓取基于客户端 JavaScript 所构建的页面了。但是 Bing、Yahoo 以及其他搜索引擎怎么办?一个好的索引对任何公司来说都至关重要,它通常会带来更多的流量以及更高的回报。
同构 JavaScript 应用
同构 JavaScript 应用基于 JavaScript 编写,可以在客户端和服务端运行。正因为此,你只需要写一次代码,就可以在服务端渲染静态页面,还可以在客户端完成复杂的交互。所以,这种方式互通了两个世界,并且避免了前面提到了两个问题。
现在,有很多框架可以帮助你开发这类应用。其中最著名的一个可能是 Meteor。Meter 是一个开源 JavaScript 框架,基于 Node.js 编写,专注于实时 web 应用。我想提到的另一个项目是 Rendr,它是 Airbnb 开发的一款轻量级类库,准许同时在客户端和服务端运行 Backbone.js。
越来越多的公司将 Node.js 应用到他们的产品中。客户端和服务端的代码共享成为一个更加普通而自然的选择。在我看来,这种做法将是 web 开发的未来。有些类库通过共享模板又增强了这一趋势,比如 React。
结论
这篇文章介绍了同构 JavaScript 应用的概念,它是应用开发的一种全新方式,可以最大限度地结合服务端和客户端应用程序。我们还讨论了运用这种方式尝试解决的问题,以及你现在就可以参与实践的一些项目。
你听说过同构 JavaScript 应用么?你开发过么?你有开发经验么?
原文:Isomorphic JavaScript Applications — the Future of the Web?
js抓取网页内容,获取qq聊天记录免费开源实现js
网站优化 • 优采云 发表了文章 • 0 个评论 • 127 次浏览 • 2022-05-18 14:02
js抓取网页内容,获取qq聊天记录免费https开源实现js抓取网页内容,
可以看看这个帖子。一定不要对js有什么侥幸心理,我之前还用js在uiwebview里操作title,timeline重构呢,把评论列表转换一下文本风格,组个三级评论,然后让我改title...哭着告诉你不可能的,这个就是精神洁癖惹的祸。我们在碰到没办法操作的情况的时候都会压力山大,拼命的开发uiwebview去匹配一些自己看不懂的字符,回头看效果也是不忍直视。
js抓取才是人人必备的技能,深入研究一下,不仅仅是爬虫之类,而是深度剖析js。首先要安装jsjs不然当你遇到object的属性重写的时候你会蛋疼死,好多jsclass对象都是可以从内部写写写抓进去的。第二要懂一点点python,一般js有直接调用模块里对象的机制,当有这个机制的时候你就会感到一种是shit,还是shit的质疑,因为这种机制用过c系的童鞋应该深有体会。
当然更多的要用python去抓写好js代码和格式,可以简单操作,抓取的内容格式和抓取的页面内容格式要尽量一致。格式不一致你抓取到的内容也不一致。第三点,要会用web库或者框架。这个就要多涉猎多抓取,碰到合适的用就好,至于第二点就是把书上的案例放到案例库里去模拟个你就会很熟练了。比如天猫,去哪儿,淘宝,花瓣,豆瓣...等等第四点..就是遇到数据量多的情况要练习手指点击操作,因为可能爬去的数据就几千万条数据,实在不容易。当然操作和理解都在于积累,都在于熟练,followup...。 查看全部
js抓取网页内容,获取qq聊天记录免费开源实现js
js抓取网页内容,获取qq聊天记录免费https开源实现js抓取网页内容,
可以看看这个帖子。一定不要对js有什么侥幸心理,我之前还用js在uiwebview里操作title,timeline重构呢,把评论列表转换一下文本风格,组个三级评论,然后让我改title...哭着告诉你不可能的,这个就是精神洁癖惹的祸。我们在碰到没办法操作的情况的时候都会压力山大,拼命的开发uiwebview去匹配一些自己看不懂的字符,回头看效果也是不忍直视。
js抓取才是人人必备的技能,深入研究一下,不仅仅是爬虫之类,而是深度剖析js。首先要安装jsjs不然当你遇到object的属性重写的时候你会蛋疼死,好多jsclass对象都是可以从内部写写写抓进去的。第二要懂一点点python,一般js有直接调用模块里对象的机制,当有这个机制的时候你就会感到一种是shit,还是shit的质疑,因为这种机制用过c系的童鞋应该深有体会。
当然更多的要用python去抓写好js代码和格式,可以简单操作,抓取的内容格式和抓取的页面内容格式要尽量一致。格式不一致你抓取到的内容也不一致。第三点,要会用web库或者框架。这个就要多涉猎多抓取,碰到合适的用就好,至于第二点就是把书上的案例放到案例库里去模拟个你就会很熟练了。比如天猫,去哪儿,淘宝,花瓣,豆瓣...等等第四点..就是遇到数据量多的情况要练习手指点击操作,因为可能爬去的数据就几千万条数据,实在不容易。当然操作和理解都在于积累,都在于熟练,followup...。
js 抓取网页内容 【第2030期】JavaScript 启动性能瓶颈分析与解决方案
网站优化 • 优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2022-05-16 06:31
前言
找到它存在的意义。今日早读文章由@王下邀月熊翻译授权分享。
正文从这开始~~
在 Web 开发中,随着需求的增加与代码库的扩张,我们最终发布的 Web 页面也逐渐膨胀。不过这种膨胀远不止意味着占据更多的传输带宽,其还意味着用户浏览网页时可能更差劲的性能体验。浏览器在下载完某个页面依赖的脚本之后,其还需要经过语法分析、解释与运行这些步骤。而本文则会深入分析浏览器对于 JavaScript 的这些处理流程,挖掘出那些影响你应用启动时间的罪魁祸首,并且根据我个人的经验提出相对应的解决方案。回顾过去,我们还没有专门地考虑过如何去优化 JavaScript 解析/编译这些步骤;我们预想中的是解析器在发现 查看全部
js 抓取网页内容 【第2030期】JavaScript 启动性能瓶颈分析与解决方案
前言
找到它存在的意义。今日早读文章由@王下邀月熊翻译授权分享。
正文从这开始~~
在 Web 开发中,随着需求的增加与代码库的扩张,我们最终发布的 Web 页面也逐渐膨胀。不过这种膨胀远不止意味着占据更多的传输带宽,其还意味着用户浏览网页时可能更差劲的性能体验。浏览器在下载完某个页面依赖的脚本之后,其还需要经过语法分析、解释与运行这些步骤。而本文则会深入分析浏览器对于 JavaScript 的这些处理流程,挖掘出那些影响你应用启动时间的罪魁祸首,并且根据我个人的经验提出相对应的解决方案。回顾过去,我们还没有专门地考虑过如何去优化 JavaScript 解析/编译这些步骤;我们预想中的是解析器在发现
3招教你做符合百度抓取的内容(网站秒收录)
网站优化 • 优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2022-05-14 02:40
你知道在搜索引擎眼里什么才叫高质量的文章吗?
在 SEO 圈,“内容”肯定是一个经久不衰的论题,尽管每个阶段的搜索引擎算法对待 SEO 都有不同的规范,益发智能化的算法也让深圳SEO 作业变得越来越不简略,但“好内容”永远是一个包围利器。那么问题来了,在搜索引擎看来,怎样的内容才是“高质量内容”呢?
简略来说,“高质量内容”是好内容、优质代码、以及杰出用户体会的集成体。
一、 根本规范
内容最根本的组成部分便是“文字”,写文章时千万首要不要呈现错别字、语病、无标点、长篇大论不分段的情况;在不必要的情况下,不要运用艰深、难明的文字、表述,尽量运用便于各个层次用户均可了解的、简略直观的语句。
二、排版布局
想要产出让用户满足的“高质量内容”,除了内容本身外,排版布局也是一项很重要的作业,毕竟人都是视觉动物。
将文本内容划分为标题、副标题、正文等不同的类型,然后让文本各司其职,具有杰出的层次,明晰的层次结构能够让内容具有更好的可读性,恰当的配图则会让文章显得更加生动。别的,不同文本类型运用不同格式、不同巨细、不同色彩的字体,也能够让用户取得更好的阅览体会。当需求引用其他平台内容时,尽量确保链接导向到高质、威望的站点(如政府平台、官方网站等)。
三、加载速度
“网站加载速度”的重要性终究有多大呢?据研讨查询标明,网站加载时刻过长是形成用户丢失的首要原因之一,关于电商网站来说更是如此。
“网站加载速度”与“用户购买行为”之间的联系,如下图:
快节奏的日子导致用户们耐心缺失,阅读网页的时分更是如此,能够说速度是决议网站胜败最重要的要素之一,网站加载时刻添加 1 秒,可能导致:转化率下降 7%,用户满足度下降 16%……
那么,该怎么进步“加载速度”呢?下面大概说几个点:
1)将JS代码和CSS款式别离合并到一个同享的文件;
2)恰当紧缩图片,优化格式;
3)优先显现可见区域中的内容,即优先加载第一屏的内容、款式等,当用户翻滚鼠标时再加载下方内容;
4)给代码做减法,去除不必要的冗余代码,如空格、注释等。
5)缓存静态资源,通过设置阅读器缓存,将CSS、JS等不太常常更新的文件进行缓存;
四、立异性
现在,网络上、交际媒体、自媒体等平台上总是充满着“怎么写好文章”套路、教程,比方《10W+的文章标题是怎么写出来的》、《自媒体人必须懂得的10W+文章技巧》……诸如此类,导致“内容生产者们”的文章总按一个套路开端写,丧失了立异性,不断趋于同质化,乃至用户看了最初变觉得索然无味。
所以,想要遭到用户的喜爱,要么写出有深度、有见地、有沉积,没有商业气味的内容,这个关于很多站长来说难度比较大;另一种就是写出“新颖”的内容,这类对文笔要求略微低一些,但需求必定的构思 iDea,比方我们都在写“鹿晗和晓彤揭露爱情”的时分,那个能在第一时刻联写出“为何鹿晗没有选择迪丽热巴”这样文章的作者取得的重视度肯定会更大(可能些这样的文章会被网友喷,但肯定能取得重视度)。
查看全部
3招教你做符合百度抓取的内容(网站秒收录)
你知道在搜索引擎眼里什么才叫高质量的文章吗?
在 SEO 圈,“内容”肯定是一个经久不衰的论题,尽管每个阶段的搜索引擎算法对待 SEO 都有不同的规范,益发智能化的算法也让深圳SEO 作业变得越来越不简略,但“好内容”永远是一个包围利器。那么问题来了,在搜索引擎看来,怎样的内容才是“高质量内容”呢?
简略来说,“高质量内容”是好内容、优质代码、以及杰出用户体会的集成体。
一、 根本规范
内容最根本的组成部分便是“文字”,写文章时千万首要不要呈现错别字、语病、无标点、长篇大论不分段的情况;在不必要的情况下,不要运用艰深、难明的文字、表述,尽量运用便于各个层次用户均可了解的、简略直观的语句。
二、排版布局
想要产出让用户满足的“高质量内容”,除了内容本身外,排版布局也是一项很重要的作业,毕竟人都是视觉动物。
将文本内容划分为标题、副标题、正文等不同的类型,然后让文本各司其职,具有杰出的层次,明晰的层次结构能够让内容具有更好的可读性,恰当的配图则会让文章显得更加生动。别的,不同文本类型运用不同格式、不同巨细、不同色彩的字体,也能够让用户取得更好的阅览体会。当需求引用其他平台内容时,尽量确保链接导向到高质、威望的站点(如政府平台、官方网站等)。
三、加载速度
“网站加载速度”的重要性终究有多大呢?据研讨查询标明,网站加载时刻过长是形成用户丢失的首要原因之一,关于电商网站来说更是如此。
“网站加载速度”与“用户购买行为”之间的联系,如下图:
快节奏的日子导致用户们耐心缺失,阅读网页的时分更是如此,能够说速度是决议网站胜败最重要的要素之一,网站加载时刻添加 1 秒,可能导致:转化率下降 7%,用户满足度下降 16%……
那么,该怎么进步“加载速度”呢?下面大概说几个点:
1)将JS代码和CSS款式别离合并到一个同享的文件;
2)恰当紧缩图片,优化格式;
3)优先显现可见区域中的内容,即优先加载第一屏的内容、款式等,当用户翻滚鼠标时再加载下方内容;
4)给代码做减法,去除不必要的冗余代码,如空格、注释等。
5)缓存静态资源,通过设置阅读器缓存,将CSS、JS等不太常常更新的文件进行缓存;
四、立异性
现在,网络上、交际媒体、自媒体等平台上总是充满着“怎么写好文章”套路、教程,比方《10W+的文章标题是怎么写出来的》、《自媒体人必须懂得的10W+文章技巧》……诸如此类,导致“内容生产者们”的文章总按一个套路开端写,丧失了立异性,不断趋于同质化,乃至用户看了最初变觉得索然无味。
所以,想要遭到用户的喜爱,要么写出有深度、有见地、有沉积,没有商业气味的内容,这个关于很多站长来说难度比较大;另一种就是写出“新颖”的内容,这类对文笔要求略微低一些,但需求必定的构思 iDea,比方我们都在写“鹿晗和晓彤揭露爱情”的时分,那个能在第一时刻联写出“为何鹿晗没有选择迪丽热巴”这样文章的作者取得的重视度肯定会更大(可能些这样的文章会被网友喷,但肯定能取得重视度)。
DomCurl:Curl + JavaScript前端抓取小工具
网站优化 • 优采云 发表了文章 • 0 个评论 • 83 次浏览 • 2022-05-09 07:43
21世纪技术官导读:开发过网页爬虫的同学,会发现一些网页越来越难抓,在后端我们可以使用curl来抓取,但是处理起来非常复杂。现在前端出来一些好工具,使用JavaScript就可以开发出类似curl的程序,帮助我们直接在浏览器端直接获取相关的内容,并充分利用好Chrome的开发工具。
很长一段时间以来,我一直在思考,我们常用的浏览器的未来。“如果所有东西都是由网络提供动力的,但为啥没有浏览器的事儿?”
如果你有完整权限访问浏览器,但是没有看见“金子”,那么和大家说一个新的服务和机会,浏览器里蕴藏着新的机会。
使用浏览器作可以让开发者利用已经输出的HTML,与自定义的JavaScript函数执行相结合,对其内容进行深入分析。
在服务器上运行浏览器,我们可以更轻松的构建和分析动态生成数据的服务,这将使我们能够更轻松地运行自己的逻辑,对页面上的数据能更有效操作的能力。
从想法到实现需要一段时间,但我现在认为已经到达了那里。
Puppeteer是一个基于Chrome Dev Tools协议之上的JavaScript库,它允许开发自动化和编写Chrome浏览器的脚本。
我的日常工作涉及很多调试Web服务器,以确保网站质量。与许多开发人员一样,我使用curl向Web服务器发出请求并获取返回的内容。
而如今,开发者正在构建使用大量JavaScript构建的网站,还有像react开发的这类网站,这使得抓取到的内容不是完整的内容。
于是我决定创建一个类似cUrl的工具来获取资源,并在称为domcurl的页面上运行JavaScript。
domcurl是一个使用Puppeteer的小型Node.js应用程序,可以通过以下命令进行安装:
npm install domcurl
像curl命令一样,您可以发出一个简单的domcurl [url]来获取资源并在页面上运行JS。
它不会复制所有的curl ,但它具有以下功能:
指定要抓取的网址,即domcurl [url]
用-v检查响应标题。 即, domcurl -v [url]
使用-b即, domcurl [url] -b "test=hello; Domain=; HttpOnly;" -b setcookie domcurl [url] -b "test=hello; Domain=; HttpOnly;" -b domcurl [url] -b "test=hello; Domain=; HttpOnly;" -b
"hello=world; Domain=; HttpOnly;"
使用-H参数添加自定义标题。
使用--stderr手动设置STDOUT和-o和STDERR
我发现它非常有用,但它不能像curl那样流式传输结果,必须等待CSS和JS被下载和执行。
后来我又添加了一些基于JavaScript和Chrome的特性。
输出一个Chrome开发工具跟踪文件(包括屏幕截图):
domcurl --url --trace test.json
如果你需要将其集成到任何现有应用程序中,可以将其作为JavaScript模块加入。
const {domcurl} = require('domcurl'); domcurl(``, {});
现在这个工具还不是特别全面,但我认为The Headless Web正在成熟,像Puppeteer和其它工具将帮助开发者在浏览器端抓取页面持续提供强大功能。 我们只需建立规则逻辑就可以了。
译者:春晖 查看全部
DomCurl:Curl + JavaScript前端抓取小工具
21世纪技术官导读:开发过网页爬虫的同学,会发现一些网页越来越难抓,在后端我们可以使用curl来抓取,但是处理起来非常复杂。现在前端出来一些好工具,使用JavaScript就可以开发出类似curl的程序,帮助我们直接在浏览器端直接获取相关的内容,并充分利用好Chrome的开发工具。
很长一段时间以来,我一直在思考,我们常用的浏览器的未来。“如果所有东西都是由网络提供动力的,但为啥没有浏览器的事儿?”
如果你有完整权限访问浏览器,但是没有看见“金子”,那么和大家说一个新的服务和机会,浏览器里蕴藏着新的机会。
使用浏览器作可以让开发者利用已经输出的HTML,与自定义的JavaScript函数执行相结合,对其内容进行深入分析。
在服务器上运行浏览器,我们可以更轻松的构建和分析动态生成数据的服务,这将使我们能够更轻松地运行自己的逻辑,对页面上的数据能更有效操作的能力。
从想法到实现需要一段时间,但我现在认为已经到达了那里。
Puppeteer是一个基于Chrome Dev Tools协议之上的JavaScript库,它允许开发自动化和编写Chrome浏览器的脚本。
我的日常工作涉及很多调试Web服务器,以确保网站质量。与许多开发人员一样,我使用curl向Web服务器发出请求并获取返回的内容。
而如今,开发者正在构建使用大量JavaScript构建的网站,还有像react开发的这类网站,这使得抓取到的内容不是完整的内容。
于是我决定创建一个类似cUrl的工具来获取资源,并在称为domcurl的页面上运行JavaScript。
domcurl是一个使用Puppeteer的小型Node.js应用程序,可以通过以下命令进行安装:
npm install domcurl
像curl命令一样,您可以发出一个简单的domcurl [url]来获取资源并在页面上运行JS。
它不会复制所有的curl ,但它具有以下功能:
指定要抓取的网址,即domcurl [url]
用-v检查响应标题。 即, domcurl -v [url]
使用-b即, domcurl [url] -b "test=hello; Domain=; HttpOnly;" -b setcookie domcurl [url] -b "test=hello; Domain=; HttpOnly;" -b domcurl [url] -b "test=hello; Domain=; HttpOnly;" -b
"hello=world; Domain=; HttpOnly;"
使用-H参数添加自定义标题。
使用--stderr手动设置STDOUT和-o和STDERR
我发现它非常有用,但它不能像curl那样流式传输结果,必须等待CSS和JS被下载和执行。
后来我又添加了一些基于JavaScript和Chrome的特性。
输出一个Chrome开发工具跟踪文件(包括屏幕截图):
domcurl --url --trace test.json
如果你需要将其集成到任何现有应用程序中,可以将其作为JavaScript模块加入。
const {domcurl} = require('domcurl'); domcurl(``, {});
现在这个工具还不是特别全面,但我认为The Headless Web正在成熟,像Puppeteer和其它工具将帮助开发者在浏览器端抓取页面持续提供强大功能。 我们只需建立规则逻辑就可以了。
译者:春晖
用 Javascript 和 Node.js 爬取网页
网站优化 • 优采云 发表了文章 • 0 个评论 • 298 次浏览 • 2022-05-06 17:06
HTTP 客户端是能够将请求发送到服务器,然后接收服务器响应的工具。下面提到的所有工具底的层都是用 HTTP 客户端来访问你要抓取的网站。
Request
Request 是 Javascript 生态中使用最广泛的 HTTP 客户端之一,但是 Request 库的作者已正式声明弃用了。不过这并不意味着它不可用了,相当多的库仍在使用它,并且非常好用。用 Request 发出 HTTP 请求是非常简单的:
1const request = require('request')<br />2request('https://www.reddit.com/r/programming.json', function (<br />3 error,<br />4 response,<br />5 body<br />6) {<br />7 console.error('error:', error)<br />8 console.log('body:', body)<br />9})<br />
你可以在 Github 上找到 Request 库,安装它非常简单。你还可以在 找到弃用通知及其含义。
Axios
Axios 是基于 promise 的 HTTP 客户端,可在浏览器和 Node.js 中运行。如果你用 Typescript,那么 axios 会为你覆盖内置类型。通过 Axios 发起 HTTP 请求非常简单,默认情况下它带有 Promise 支持,而不是在 Request 中去使用回调:
1const axios = require('axios')<br /> 2<br /> 3axios<br /> 4 .get('https://www.reddit.com/r/programming.json')<br /> 5 .then((response) => {<br /> 6 console.log(response)<br /> 7 })<br /> 8 .catch((error) => {<br /> 9 console.error(error)<br />10 });<br />
如果你喜欢 Promises API 的 async/await 语法糖,那么你也可以用,但是由于顶级 await 仍处于 stage 3 ,所以我们只好先用异步函数来代替:
1async function getForum() {<br /> 2 try {<br /> 3 const response = await axios.get(<br /> 4 'https://www.reddit.com/r/programming.json'<br /> 5 )<br /> 6 console.log(response)<br /> 7 } catch (error) {<br /> 8 console.error(error)<br /> 9 }<br />10}<br />
你所要做的就是调用 getForum!可以在 上找到Axios库。
Superagent
与 Axios 一样,Superagent 是另一个强大的 HTTP 客户端,它支持 Promise 和 async/await 语法糖。它具有像 Axios 这样相当简单的 API,但是 Superagent 由于存在更多的依赖关系并且不那么流行。
用 promise、async/await 或回调向 Superagent 发出HTTP请求看起来像这样:
1const superagent = require("superagent")<br /> 2const forumURL = "https://www.reddit.com/r/progr ... %3Bbr /> 3<br /> 4// callbacks<br /> 5superagent<br /> 6 .get(forumURL)<br /> 7 .end((error, response) => {<br /> 8 console.log(response)<br /> 9 })<br />10<br />11// promises<br />12superagent<br />13 .get(forumURL)<br />14 .then((response) => {<br />15 console.log(response)<br />16 })<br />17 .catch((error) => {<br />18 console.error(error)<br />19 })<br />20<br />21// promises with async/await<br />22async function getForum() {<br />23 try {<br />24 const response = await superagent.get(forumURL)<br />25 console.log(response)<br />26 } catch (error) {<br />27 console.error(error)<br />28 }<br />29}<br />
可以在 找到 Superagent。
正则表达式:艰难的路
在没有任何依赖性的情况下,最简单的进行网络抓取的方法是,使用 HTTP 客户端查询网页时,在收到的 HTML 字符串上使用一堆正则表达式。正则表达式不那么灵活,而且很多专业人士和业余爱好者都难以编写正确的正则表达式。
让我们试一试,假设其中有一个带有用户名的标签,我们需要该用户名,这类似于你依赖正则表达式时必须执行的操作
1const htmlString = 'Username: John Doe'<br />2const result = htmlString.match(/(.+)/)<br />3<br />4console.log(result[1], result[1].split(": ")[1])<br />5// Username: John Doe, John Doe<br />
在 Javascript 中,match() 通常返回一个数组,该数组包含与正则表达式匹配的所有内容。第二个元素(在索引1中)将找到我们想要的 标记的 textContent 或 innerHTML。但是结果中包含一些不需要的文本( “Username: “),必须将其删除。
如你所见,对于一个非常简单的用例,步骤和要做的工作都很多。这就是为什么应该依赖 HTML 解析器的原因,我们将在后面讨论。
Cheerio:用于遍历 DOM 的核心 JQuery
Cheerio 是一个高效轻便的库,它使你可以在服务器端使用 JQuery 的丰富而强大的 API。如果你以前用过 JQuery,那么将会对 Cheerio 感到很熟悉,它消除了 DOM 所有不一致和与浏览器相关的功能,并公开了一种有效的 API 来解析和操作 DOM。
1const cheerio = require('cheerio')<br />2const $ = cheerio.load('Hello world')<br />3<br />4$('h2.title').text('Hello there!')<br />5$('h2').addClass('welcome')<br />6<br />7$.html()<br />8// Hello there!<br />
如你所见,Cheerio 与 JQuery 用起来非常相似。
但是,尽管它的工作方式不同于网络浏览器,也就这意味着它不能:
因此,如果你尝试爬取的网站或 Web 应用是严重依赖 Javascript 的(例如“单页应用”),那么 Cheerio 并不是最佳选择,你可能不得不依赖稍后讨论的其他选项。
为了展示 Cheerio 的强大功能,我们将尝试在 Reddit 中抓取 r/programming 论坛,尝试获取帖子名称列表。
首先,通过运行以下命令来安装 Cheerio 和 axios:npm install cheerio axios。
然后创建一个名为 crawler.js 的新文件,并复制粘贴以下代码:
1const axios = require('axios');<br /> 2const cheerio = require('cheerio');<br /> 3<br /> 4const getPostTitles = async () => {<br /> 5 try {<br /> 6 const { data } = await axios.get(<br /> 7 'https://old.reddit.com/r/programming/'<br /> 8 );<br /> 9 const $ = cheerio.load(data);<br />10 const postTitles = [];<br />11<br />12 $('div > p.title > a').each((_idx, el) => {<br />13 const postTitle = $(el).text()<br />14 postTitles.push(postTitle)<br />15 });<br />16<br />17 return postTitles;<br />18 } catch (error) {<br />19 throw error;<br />20 }<br />21};<br />22<br />23getPostTitles()<br />24.then((postTitles) => console.log(postTitles));<br />
getPostTitles() 是一个异步函数,将对旧的 reddit 的 r/programming 论坛进行爬取。首先,用带有 axios HTTP 客户端库的简单 HTTP GET 请求获取网站的 HTML,然后用 cheerio.load() 函数将 html 数据输入到 Cheerio 中。
然后在浏览器的 Dev Tools 帮助下,可以获得可以定位所有列表项的选择器。如果你使用过 JQuery,则必须非常熟悉 $('div> p.title> a')。这将得到所有帖子,因为你只希望单独获取每个帖子的标题,所以必须遍历每个帖子,这些操作是在 each() 函数的帮助下完成的。
要从每个标题中提取文本,必须在 Cheerio 的帮助下获取 DOM元素( el 指代当前元素)。然后在每个元素上调用 text() 能够为你提供文本。
现在,打开终端并运行 node crawler.js,然后你将看到大约存有标题的数组,它会很长。尽管这是一个非常简单的用例,但它展示了 Cheerio 提供的 API 的简单性质。
如果你的用例需要执行 Javascript 并加载外部源,那么以下几个选项将很有帮助。
JSDOM:Node 的 DOM
JSDOM 是在 Node.js 中使用的文档对象模型的纯 Javascript 实现,如前所述,DOM 对 Node 不可用,但是 JSDOM 是最接近的。它或多或少地模仿了浏览器。
由于创建了 DOM,所以可以通过编程与要爬取的 Web 应用或网站进行交互,也可以模拟单击按钮。如果你熟悉 DOM 操作,那么使用 JSDOM 将会非常简单。
1const { JSDOM } = require('jsdom')<br /> 2const { document } = new JSDOM(<br /> 3 'Hello world'<br /> 4).window<br /> 5const heading = document.querySelector('.title')<br /> 6heading.textContent = 'Hello there!'<br /> 7heading.classList.add('welcome')<br /> 8<br /> 9heading.innerHTML<br />10// Hello there!<br />
代码中用 JSDOM 创建一个 DOM,然后你可以用和操纵浏览器 DOM 相同的方法和属性来操纵该 DOM。
为了演示如何用 JSDOM 与网站进行交互,我们将获得 Reddit r/programming 论坛的第一篇帖子并对其进行投票,然后验证该帖子是否已被投票。
首先运行以下命令来安装 jsdom 和 axios:npm install jsdom axios
然后创建名为 crawler.js的文件,并复制粘贴以下代码:
1const { JSDOM } = require("jsdom")<br /> 2const axios = require('axios')<br /> 3<br /> 4const upvoteFirstPost = async () => {<br /> 5 try {<br /> 6 const { data } = await axios.get("https://old.reddit.com/r/programming/");<br /> 7 const dom = new JSDOM(data, {<br /> 8 runScripts: "dangerously",<br /> 9 resources: "usable"<br />10 });<br />11 const { document } = dom.window;<br />12 const firstPost = document.querySelector("div > div.midcol > div.arrow");<br />13 firstPost.click();<br />14 const isUpvoted = firstPost.classList.contains("upmod");<br />15 const msg = isUpvoted<br />16 ? "Post has been upvoted successfully!"<br />17 : "The post has not been upvoted!";<br />18<br />19 return msg;<br />20 } catch (error) {<br />21 throw error;<br />22 }<br />23};<br />24<br />25upvoteFirstPost().then(msg => console.log(msg));<br />
upvoteFirstPost() 是一个异步函数,它将在 r/programming 中获取第一个帖子,然后对其进行投票。axios 发送 HTTP GET 请求获取指定 URL 的HTML。然后通过先前获取的 HTML 来创建新的 DOM。JSDOM 构造函数把HTML 作为第一个参数,把 option 作为第二个参数,已添加的 2 个 option 项执行以下功能:
创建 DOM 后,用相同的 DOM 方法得到第一篇文章的 upvote 按钮,然后单击。要验证是否确实单击了它,可以检查 classList 中是否有一个名为 upmod 的类。如果存在于 classList 中,则返回一条消息。
打开终端并运行 node crawler.js,然后会看到一个整洁的字符串,该字符串将表明帖子是否被赞过。尽管这个例子很简单,但你可以在这个基础上构建功能强大的东西,例如,一个围绕特定用户的帖子进行投票的机器人。
如果你不喜欢缺乏表达能力的 JSDOM ,并且实践中要依赖于许多此类操作,或者需要重新创建许多不同的 DOM,那么下面将是更好的选择。
Puppeteer:无头浏览器
顾名思义,Puppeteer 允许你以编程方式操纵浏览器,就像操纵木偶一样。它通过为开发人员提供高级 API 来默认控制无头版本的 Chrome。
摘自 Puppeter DocsPuppeteer 比上述工具更有用,因为它可以使你像真正的人在与浏览器进行交互一样对网络进行爬取。这就具备了一些以前没有的可能性:
它还可以在 Web 爬取之外的其他任务中发挥重要作用,例如 UI 测试、辅助性能优化等。
通常你会想要截取网站的屏幕截图,也许是为了了解竞争对手的产品目录,可以用 puppeteer 来做到。首先运行以下命令安装 puppeteer,:npm install puppeteer
这将下载 Chromium 的 bundle 版本,根据操作系统的不同,该版本大约 180 MB 至 300 MB。如果你要禁用此功能。
让我们尝试在 Reddit 中获取 r/programming 论坛的屏幕截图和 PDF,创建一个名为 crawler.js的新文件,然后复制粘贴以下代码:
1const puppeteer = require('puppeteer')<br /> 2<br /> 3async function getVisual() {<br /> 4 try {<br /> 5 const URL = 'https://www.reddit.com/r/programming/'<br /> 6 const browser = await puppeteer.launch()<br /> 7 const page = await browser.newPage()<br /> 8<br /> 9 await page.goto(URL)<br />10 await page.screenshot({ path: 'screenshot.png' })<br />11 await page.pdf({ path: 'page.pdf' })<br />12<br />13 await browser.close()<br />14 } catch (error) {<br />15 console.error(error)<br />16 }<br />17}<br />18<br />19getVisual()<br />
getVisual() 是一个异步函数,它将获 URL 变量中 url 对应的屏幕截图和 pdf。首先,通过 puppeteer.launch() 创建浏览器实例,然后创建一个新页面。可以将该页面视为常规浏览器中的选项卡。然后通过以 URL 为参数调用 page.goto() ,将先前创建的页面定向到指定的 URL。最终,浏览器实例与页面一起被销毁。
完成操作并完成页面加载后,将分别使用 page.screenshot() 和 page.pdf() 获取屏幕截图和 pdf。你也可以侦听 javascript load 事件,然后执行这些操作,在生产环境级别下强烈建议这样做。
在终端上运行 node crawler.js ,几秒钟后,你会注意到已经创建了两个文件,分别名为 screenshot.jpg 和 page.pdf。
Nightmare:Puppeteer 的替代者
Nightmare 是类似 Puppeteer 的高级浏览器自动化库,该库使用 Electron,但据说速度是其前身 PhantomJS 的两倍。
如果你在某种程度上不喜欢 Puppeteer 或对 Chromium 捆绑包的大小感到沮丧,那么 nightmare 是一个理想的选择。首先,运行以下命令安装 nightmare 库:npm install nightmare
然后,一旦下载了 nightmare,我们将用它通过 Google 搜索引擎找到 ScrapingBee 的网站。创建一个名为crawler.js的文件,然后将以下代码复制粘贴到其中:
1const Nightmare = require('nightmare')<br /> 2const nightmare = Nightmare()<br /> 3<br /> 4nightmare<br /> 5 .goto('https://www.google.com/')<br /> 6 .type("input[title='Search']", 'ScrapingBee')<br /> 7 .click("input[value='Google Search']")<br /> 8 .wait('#rso > div:nth-child(1) > div > div > div.r > a')<br /> 9 .evaluate(<br />10 () =><br />11 document.querySelector(<br />12 '#rso > div:nth-child(1) > div > div > div.r > a'<br />13 ).href<br />14 )<br />15 .end()<br />16 .then((link) => {<br />17 console.log('Scraping Bee Web Link': link)<br />18 })<br />19 .catch((error) => {<br />20 console.error('Search failed:', error)<br />21 })<br />
首先创建一个 Nighmare 实例,然后通过调用 goto() 将该实例定向到 Google 搜索引擎,加载后,使用其选择器获取搜索框,然后使用搜索框的值(输入标签)更改为“ScrapingBee”。完成后,通过单击 “Google搜索” 按钮提交搜索表单。然后告诉 Nightmare 等到第一个链接加载完毕,一旦完成,它将使用 DOM 方法来获取包含该链接的定位标记的 href 属性的值。
最后,完成所有操作后,链接将打印到控制台。
总结
往期精彩回顾
如果觉得有帮助,请点击“在看”让更多小伙伴知道 查看全部
用 Javascript 和 Node.js 爬取网页
HTTP 客户端是能够将请求发送到服务器,然后接收服务器响应的工具。下面提到的所有工具底的层都是用 HTTP 客户端来访问你要抓取的网站。
Request
Request 是 Javascript 生态中使用最广泛的 HTTP 客户端之一,但是 Request 库的作者已正式声明弃用了。不过这并不意味着它不可用了,相当多的库仍在使用它,并且非常好用。用 Request 发出 HTTP 请求是非常简单的:
1const request = require('request')<br />2request('https://www.reddit.com/r/programming.json', function (<br />3 error,<br />4 response,<br />5 body<br />6) {<br />7 console.error('error:', error)<br />8 console.log('body:', body)<br />9})<br />
你可以在 Github 上找到 Request 库,安装它非常简单。你还可以在 找到弃用通知及其含义。
Axios
Axios 是基于 promise 的 HTTP 客户端,可在浏览器和 Node.js 中运行。如果你用 Typescript,那么 axios 会为你覆盖内置类型。通过 Axios 发起 HTTP 请求非常简单,默认情况下它带有 Promise 支持,而不是在 Request 中去使用回调:
1const axios = require('axios')<br /> 2<br /> 3axios<br /> 4 .get('https://www.reddit.com/r/programming.json')<br /> 5 .then((response) => {<br /> 6 console.log(response)<br /> 7 })<br /> 8 .catch((error) => {<br /> 9 console.error(error)<br />10 });<br />
如果你喜欢 Promises API 的 async/await 语法糖,那么你也可以用,但是由于顶级 await 仍处于 stage 3 ,所以我们只好先用异步函数来代替:
1async function getForum() {<br /> 2 try {<br /> 3 const response = await axios.get(<br /> 4 'https://www.reddit.com/r/programming.json'<br /> 5 )<br /> 6 console.log(response)<br /> 7 } catch (error) {<br /> 8 console.error(error)<br /> 9 }<br />10}<br />
你所要做的就是调用 getForum!可以在 上找到Axios库。
Superagent
与 Axios 一样,Superagent 是另一个强大的 HTTP 客户端,它支持 Promise 和 async/await 语法糖。它具有像 Axios 这样相当简单的 API,但是 Superagent 由于存在更多的依赖关系并且不那么流行。
用 promise、async/await 或回调向 Superagent 发出HTTP请求看起来像这样:
1const superagent = require("superagent")<br /> 2const forumURL = "https://www.reddit.com/r/progr ... %3Bbr /> 3<br /> 4// callbacks<br /> 5superagent<br /> 6 .get(forumURL)<br /> 7 .end((error, response) => {<br /> 8 console.log(response)<br /> 9 })<br />10<br />11// promises<br />12superagent<br />13 .get(forumURL)<br />14 .then((response) => {<br />15 console.log(response)<br />16 })<br />17 .catch((error) => {<br />18 console.error(error)<br />19 })<br />20<br />21// promises with async/await<br />22async function getForum() {<br />23 try {<br />24 const response = await superagent.get(forumURL)<br />25 console.log(response)<br />26 } catch (error) {<br />27 console.error(error)<br />28 }<br />29}<br />
可以在 找到 Superagent。
正则表达式:艰难的路
在没有任何依赖性的情况下,最简单的进行网络抓取的方法是,使用 HTTP 客户端查询网页时,在收到的 HTML 字符串上使用一堆正则表达式。正则表达式不那么灵活,而且很多专业人士和业余爱好者都难以编写正确的正则表达式。
让我们试一试,假设其中有一个带有用户名的标签,我们需要该用户名,这类似于你依赖正则表达式时必须执行的操作
1const htmlString = 'Username: John Doe'<br />2const result = htmlString.match(/(.+)/)<br />3<br />4console.log(result[1], result[1].split(": ")[1])<br />5// Username: John Doe, John Doe<br />
在 Javascript 中,match() 通常返回一个数组,该数组包含与正则表达式匹配的所有内容。第二个元素(在索引1中)将找到我们想要的 标记的 textContent 或 innerHTML。但是结果中包含一些不需要的文本( “Username: “),必须将其删除。
如你所见,对于一个非常简单的用例,步骤和要做的工作都很多。这就是为什么应该依赖 HTML 解析器的原因,我们将在后面讨论。
Cheerio:用于遍历 DOM 的核心 JQuery
Cheerio 是一个高效轻便的库,它使你可以在服务器端使用 JQuery 的丰富而强大的 API。如果你以前用过 JQuery,那么将会对 Cheerio 感到很熟悉,它消除了 DOM 所有不一致和与浏览器相关的功能,并公开了一种有效的 API 来解析和操作 DOM。
1const cheerio = require('cheerio')<br />2const $ = cheerio.load('Hello world')<br />3<br />4$('h2.title').text('Hello there!')<br />5$('h2').addClass('welcome')<br />6<br />7$.html()<br />8// Hello there!<br />
如你所见,Cheerio 与 JQuery 用起来非常相似。
但是,尽管它的工作方式不同于网络浏览器,也就这意味着它不能:
因此,如果你尝试爬取的网站或 Web 应用是严重依赖 Javascript 的(例如“单页应用”),那么 Cheerio 并不是最佳选择,你可能不得不依赖稍后讨论的其他选项。
为了展示 Cheerio 的强大功能,我们将尝试在 Reddit 中抓取 r/programming 论坛,尝试获取帖子名称列表。
首先,通过运行以下命令来安装 Cheerio 和 axios:npm install cheerio axios。
然后创建一个名为 crawler.js 的新文件,并复制粘贴以下代码:
1const axios = require('axios');<br /> 2const cheerio = require('cheerio');<br /> 3<br /> 4const getPostTitles = async () => {<br /> 5 try {<br /> 6 const { data } = await axios.get(<br /> 7 'https://old.reddit.com/r/programming/'<br /> 8 );<br /> 9 const $ = cheerio.load(data);<br />10 const postTitles = [];<br />11<br />12 $('div > p.title > a').each((_idx, el) => {<br />13 const postTitle = $(el).text()<br />14 postTitles.push(postTitle)<br />15 });<br />16<br />17 return postTitles;<br />18 } catch (error) {<br />19 throw error;<br />20 }<br />21};<br />22<br />23getPostTitles()<br />24.then((postTitles) => console.log(postTitles));<br />
getPostTitles() 是一个异步函数,将对旧的 reddit 的 r/programming 论坛进行爬取。首先,用带有 axios HTTP 客户端库的简单 HTTP GET 请求获取网站的 HTML,然后用 cheerio.load() 函数将 html 数据输入到 Cheerio 中。
然后在浏览器的 Dev Tools 帮助下,可以获得可以定位所有列表项的选择器。如果你使用过 JQuery,则必须非常熟悉 $('div> p.title> a')。这将得到所有帖子,因为你只希望单独获取每个帖子的标题,所以必须遍历每个帖子,这些操作是在 each() 函数的帮助下完成的。
要从每个标题中提取文本,必须在 Cheerio 的帮助下获取 DOM元素( el 指代当前元素)。然后在每个元素上调用 text() 能够为你提供文本。
现在,打开终端并运行 node crawler.js,然后你将看到大约存有标题的数组,它会很长。尽管这是一个非常简单的用例,但它展示了 Cheerio 提供的 API 的简单性质。
如果你的用例需要执行 Javascript 并加载外部源,那么以下几个选项将很有帮助。
JSDOM:Node 的 DOM
JSDOM 是在 Node.js 中使用的文档对象模型的纯 Javascript 实现,如前所述,DOM 对 Node 不可用,但是 JSDOM 是最接近的。它或多或少地模仿了浏览器。
由于创建了 DOM,所以可以通过编程与要爬取的 Web 应用或网站进行交互,也可以模拟单击按钮。如果你熟悉 DOM 操作,那么使用 JSDOM 将会非常简单。
1const { JSDOM } = require('jsdom')<br /> 2const { document } = new JSDOM(<br /> 3 'Hello world'<br /> 4).window<br /> 5const heading = document.querySelector('.title')<br /> 6heading.textContent = 'Hello there!'<br /> 7heading.classList.add('welcome')<br /> 8<br /> 9heading.innerHTML<br />10// Hello there!<br />
代码中用 JSDOM 创建一个 DOM,然后你可以用和操纵浏览器 DOM 相同的方法和属性来操纵该 DOM。
为了演示如何用 JSDOM 与网站进行交互,我们将获得 Reddit r/programming 论坛的第一篇帖子并对其进行投票,然后验证该帖子是否已被投票。
首先运行以下命令来安装 jsdom 和 axios:npm install jsdom axios
然后创建名为 crawler.js的文件,并复制粘贴以下代码:
1const { JSDOM } = require("jsdom")<br /> 2const axios = require('axios')<br /> 3<br /> 4const upvoteFirstPost = async () => {<br /> 5 try {<br /> 6 const { data } = await axios.get("https://old.reddit.com/r/programming/");<br /> 7 const dom = new JSDOM(data, {<br /> 8 runScripts: "dangerously",<br /> 9 resources: "usable"<br />10 });<br />11 const { document } = dom.window;<br />12 const firstPost = document.querySelector("div > div.midcol > div.arrow");<br />13 firstPost.click();<br />14 const isUpvoted = firstPost.classList.contains("upmod");<br />15 const msg = isUpvoted<br />16 ? "Post has been upvoted successfully!"<br />17 : "The post has not been upvoted!";<br />18<br />19 return msg;<br />20 } catch (error) {<br />21 throw error;<br />22 }<br />23};<br />24<br />25upvoteFirstPost().then(msg => console.log(msg));<br />
upvoteFirstPost() 是一个异步函数,它将在 r/programming 中获取第一个帖子,然后对其进行投票。axios 发送 HTTP GET 请求获取指定 URL 的HTML。然后通过先前获取的 HTML 来创建新的 DOM。JSDOM 构造函数把HTML 作为第一个参数,把 option 作为第二个参数,已添加的 2 个 option 项执行以下功能:
创建 DOM 后,用相同的 DOM 方法得到第一篇文章的 upvote 按钮,然后单击。要验证是否确实单击了它,可以检查 classList 中是否有一个名为 upmod 的类。如果存在于 classList 中,则返回一条消息。
打开终端并运行 node crawler.js,然后会看到一个整洁的字符串,该字符串将表明帖子是否被赞过。尽管这个例子很简单,但你可以在这个基础上构建功能强大的东西,例如,一个围绕特定用户的帖子进行投票的机器人。
如果你不喜欢缺乏表达能力的 JSDOM ,并且实践中要依赖于许多此类操作,或者需要重新创建许多不同的 DOM,那么下面将是更好的选择。
Puppeteer:无头浏览器
顾名思义,Puppeteer 允许你以编程方式操纵浏览器,就像操纵木偶一样。它通过为开发人员提供高级 API 来默认控制无头版本的 Chrome。
摘自 Puppeter DocsPuppeteer 比上述工具更有用,因为它可以使你像真正的人在与浏览器进行交互一样对网络进行爬取。这就具备了一些以前没有的可能性:
它还可以在 Web 爬取之外的其他任务中发挥重要作用,例如 UI 测试、辅助性能优化等。
通常你会想要截取网站的屏幕截图,也许是为了了解竞争对手的产品目录,可以用 puppeteer 来做到。首先运行以下命令安装 puppeteer,:npm install puppeteer
这将下载 Chromium 的 bundle 版本,根据操作系统的不同,该版本大约 180 MB 至 300 MB。如果你要禁用此功能。
让我们尝试在 Reddit 中获取 r/programming 论坛的屏幕截图和 PDF,创建一个名为 crawler.js的新文件,然后复制粘贴以下代码:
1const puppeteer = require('puppeteer')<br /> 2<br /> 3async function getVisual() {<br /> 4 try {<br /> 5 const URL = 'https://www.reddit.com/r/programming/'<br /> 6 const browser = await puppeteer.launch()<br /> 7 const page = await browser.newPage()<br /> 8<br /> 9 await page.goto(URL)<br />10 await page.screenshot({ path: 'screenshot.png' })<br />11 await page.pdf({ path: 'page.pdf' })<br />12<br />13 await browser.close()<br />14 } catch (error) {<br />15 console.error(error)<br />16 }<br />17}<br />18<br />19getVisual()<br />
getVisual() 是一个异步函数,它将获 URL 变量中 url 对应的屏幕截图和 pdf。首先,通过 puppeteer.launch() 创建浏览器实例,然后创建一个新页面。可以将该页面视为常规浏览器中的选项卡。然后通过以 URL 为参数调用 page.goto() ,将先前创建的页面定向到指定的 URL。最终,浏览器实例与页面一起被销毁。
完成操作并完成页面加载后,将分别使用 page.screenshot() 和 page.pdf() 获取屏幕截图和 pdf。你也可以侦听 javascript load 事件,然后执行这些操作,在生产环境级别下强烈建议这样做。
在终端上运行 node crawler.js ,几秒钟后,你会注意到已经创建了两个文件,分别名为 screenshot.jpg 和 page.pdf。
Nightmare:Puppeteer 的替代者
Nightmare 是类似 Puppeteer 的高级浏览器自动化库,该库使用 Electron,但据说速度是其前身 PhantomJS 的两倍。
如果你在某种程度上不喜欢 Puppeteer 或对 Chromium 捆绑包的大小感到沮丧,那么 nightmare 是一个理想的选择。首先,运行以下命令安装 nightmare 库:npm install nightmare
然后,一旦下载了 nightmare,我们将用它通过 Google 搜索引擎找到 ScrapingBee 的网站。创建一个名为crawler.js的文件,然后将以下代码复制粘贴到其中:
1const Nightmare = require('nightmare')<br /> 2const nightmare = Nightmare()<br /> 3<br /> 4nightmare<br /> 5 .goto('https://www.google.com/')<br /> 6 .type("input[title='Search']", 'ScrapingBee')<br /> 7 .click("input[value='Google Search']")<br /> 8 .wait('#rso > div:nth-child(1) > div > div > div.r > a')<br /> 9 .evaluate(<br />10 () =><br />11 document.querySelector(<br />12 '#rso > div:nth-child(1) > div > div > div.r > a'<br />13 ).href<br />14 )<br />15 .end()<br />16 .then((link) => {<br />17 console.log('Scraping Bee Web Link': link)<br />18 })<br />19 .catch((error) => {<br />20 console.error('Search failed:', error)<br />21 })<br />
首先创建一个 Nighmare 实例,然后通过调用 goto() 将该实例定向到 Google 搜索引擎,加载后,使用其选择器获取搜索框,然后使用搜索框的值(输入标签)更改为“ScrapingBee”。完成后,通过单击 “Google搜索” 按钮提交搜索表单。然后告诉 Nightmare 等到第一个链接加载完毕,一旦完成,它将使用 DOM 方法来获取包含该链接的定位标记的 href 属性的值。
最后,完成所有操作后,链接将打印到控制台。
总结
往期精彩回顾
如果觉得有帮助,请点击“在看”让更多小伙伴知道
Node.js开发RPA-自动抓取网页的文字内容
网站优化 • 优采云 发表了文章 • 0 个评论 • 308 次浏览 • 2022-05-06 16:28
背景
RPA工作流中最常见的场景是操作浏览器,对页面内容进行相关操作。本例中以 页面为例。带领大家初步探索如何使用RPA 工具进行自动化抓取页面文本内容。
本文开发RPA脚本会用到JavaScript语言。这里所用到的RPA工具LeanRunner,可从Windows的应用商店上直接下载,它可以支持使用node.js的开源自动化库做RPA开发。用户可以按照下面操作步骤,逐步实现自己的RPA脚本。
操作步骤
新建项目
打开LeanRunner, 选择【项目】--【新建】--【选择基本项目模板】,输入项目名称:demo,选择项目路径:
安装依赖库
selenium-webdriver 是流行的操作Web自动化库,使用chromedriver库可以驱动Chrome实现各类网页自动化,当然文字的提取也不在话下,本次RPA就是利用这两个库来实现功能。所以创建好项目之后需要安装对应的库。
点击LeanRunner打开命令行工具按钮
,执行安装命令:
npm init -ynpm install chromedriver selenium-webdriver @types/selenium-webdriver --save
<br />
备注:npm作为node.js的包管理机制,需要安装node.js环境才能使用
(下载地址:)
定义流程步骤
定义流程步骤是为了让自动化流程有好的可读性。
a. 打开 main.js,在【工具箱】--【框架】中找到 stepGroup 方法,拖拽到js 文件中。
b. 在弹出的对话框中 输入描述文本:抓取网页文本内容并点击插入代码。
c. 此时,main.js 的文件内容:
const { stepGroup } = require('leanrunner');<br />async function main() { await stepGroup("抓取网页文本内容", async () => { })}
d. 继续拖拽【工具箱】--【框架】中的step 方法,描述文本输入:使用Chrome浏览器打开要抓取的网站:
e. 按照上面操作步骤,再次插入 抓取文本 和 关闭浏览器 的步骤定义。
main.js如下:
const { step } = require('leanrunner');const { stepGroup } = require('leanrunner');<br />async function main() { await stepGroup("抓取网页文本内容", async () => { await step("使用Chrome浏览器打开要抓取的网站", async (world) => { }) await step("抓取文本", async (world) => { }) await step("关闭浏览器", async (world) => { }) })}
<br />
f. 插入Workflow.run函数, RPA执行最终要执行,选择【工具箱】--【Framework】中的Workrun.run()函数:
g. 运行的函数中 输入“main”:
最终代码为:
const { Workflow } = require('leanrunner');const { step } = require('leanrunner');const { stepGroup } = require('leanrunner');<br />async function main() { await stepGroup("抓取网页文本内容", async () => { await step("使用Chrome浏览器打开要抓取的网站", async (world) => { }) await step("抓取文本", async (world) => { }) await step("关闭浏览器", async (world) => { }) })}<br />Workflow.run(main);
<br />
实现操作步骤
参考 selenium-webdriver API
(). 分别实现上述操作步骤:
a. 使用Chrome浏览器打开要抓取的网站:
const WebDriver = require('selenium-webdriver');let driver = new WebDriver.Builder().forBrowser('chrome').build();const url = 'http://wufazhuce.com/one/2558';await driver.get(url);
上述代码创建了一个WebDriver实例,打开浏览器窗口,并导航到目标url。
b. 抓取文本:
let text = await driver.findElement({ css:'div[class="one-cita"]'}).getText();console.log(text);
上面代码用css选择器定位到要访问的元素,并打印输出。
c. 关闭浏览器
await driver.close();
<br />
最终实现的代码如下:
const { Workflow } = require('leanrunner');const { step } = require('leanrunner');const { stepGroup } = require('leanrunner');require('chromedriver');const WebDriver = require('selenium-webdriver');let driver = new WebDriver.Builder().forBrowser('chrome').build();<br />async function main() { await stepGroup("抓取网页文本内容", async () => { await step("使用Chrome浏览器打开要抓取的网站", async (world) => { const url = 'http://wufazhuce.com/one/2558'; await driver.get(url); }) await step("抓取文本", async (world) => { let text = await driver.findElement({ css:'div[class="one-cita"]'}).getText(); console.log(text); world.attachText(text); }) await step("关闭浏览器", async (world) => { await driver.close() }) })}<br />Workflow.run(main);
<br />
执行
点击“运行”按钮
,或者点击“运行项目”按钮
可以看到浏览器打开网页并将文本内容打印在LeanRunner设计器的输出面板。
如果是运行项目,还会显示html的运行报告:
对用户来说,html报告有较强的可读性。
总结
至此,我们完成了一个基本操作网页的RPA。后续可以在此RPA基础上进一步加深操作,比如抓取的文本内容存放到Excel表格中,或者存放到数据库中。
本文用到的selenium-webdriver自动化库,是非常流行的开源库,能够支持各种类型的浏览器,并能及时更新,支持最新版本的浏览器。同时Node.js也是非常流行的开源平台。基于这样一些技术开发RPA自动化脚本,保持了RPA脚本的可用性和可维护性,结合LeanRunner RPA平台,能够帮助企业,快速打造您自己的流程自动化。 查看全部
Node.js开发RPA-自动抓取网页的文字内容
背景
RPA工作流中最常见的场景是操作浏览器,对页面内容进行相关操作。本例中以 页面为例。带领大家初步探索如何使用RPA 工具进行自动化抓取页面文本内容。
本文开发RPA脚本会用到JavaScript语言。这里所用到的RPA工具LeanRunner,可从Windows的应用商店上直接下载,它可以支持使用node.js的开源自动化库做RPA开发。用户可以按照下面操作步骤,逐步实现自己的RPA脚本。
操作步骤
新建项目
打开LeanRunner, 选择【项目】--【新建】--【选择基本项目模板】,输入项目名称:demo,选择项目路径:
安装依赖库
selenium-webdriver 是流行的操作Web自动化库,使用chromedriver库可以驱动Chrome实现各类网页自动化,当然文字的提取也不在话下,本次RPA就是利用这两个库来实现功能。所以创建好项目之后需要安装对应的库。
点击LeanRunner打开命令行工具按钮
,执行安装命令:
npm init -ynpm install chromedriver selenium-webdriver @types/selenium-webdriver --save
<br />
备注:npm作为node.js的包管理机制,需要安装node.js环境才能使用
(下载地址:)
定义流程步骤
定义流程步骤是为了让自动化流程有好的可读性。
a. 打开 main.js,在【工具箱】--【框架】中找到 stepGroup 方法,拖拽到js 文件中。
b. 在弹出的对话框中 输入描述文本:抓取网页文本内容并点击插入代码。
c. 此时,main.js 的文件内容:
const { stepGroup } = require('leanrunner');<br />async function main() { await stepGroup("抓取网页文本内容", async () => { })}
d. 继续拖拽【工具箱】--【框架】中的step 方法,描述文本输入:使用Chrome浏览器打开要抓取的网站:
e. 按照上面操作步骤,再次插入 抓取文本 和 关闭浏览器 的步骤定义。
main.js如下:
const { step } = require('leanrunner');const { stepGroup } = require('leanrunner');<br />async function main() { await stepGroup("抓取网页文本内容", async () => { await step("使用Chrome浏览器打开要抓取的网站", async (world) => { }) await step("抓取文本", async (world) => { }) await step("关闭浏览器", async (world) => { }) })}
<br />
f. 插入Workflow.run函数, RPA执行最终要执行,选择【工具箱】--【Framework】中的Workrun.run()函数:
g. 运行的函数中 输入“main”:
最终代码为:
const { Workflow } = require('leanrunner');const { step } = require('leanrunner');const { stepGroup } = require('leanrunner');<br />async function main() { await stepGroup("抓取网页文本内容", async () => { await step("使用Chrome浏览器打开要抓取的网站", async (world) => { }) await step("抓取文本", async (world) => { }) await step("关闭浏览器", async (world) => { }) })}<br />Workflow.run(main);
<br />
实现操作步骤
参考 selenium-webdriver API
(). 分别实现上述操作步骤:
a. 使用Chrome浏览器打开要抓取的网站:
const WebDriver = require('selenium-webdriver');let driver = new WebDriver.Builder().forBrowser('chrome').build();const url = 'http://wufazhuce.com/one/2558';await driver.get(url);
上述代码创建了一个WebDriver实例,打开浏览器窗口,并导航到目标url。
b. 抓取文本:
let text = await driver.findElement({ css:'div[class="one-cita"]'}).getText();console.log(text);
上面代码用css选择器定位到要访问的元素,并打印输出。
c. 关闭浏览器
await driver.close();
<br />
最终实现的代码如下:
const { Workflow } = require('leanrunner');const { step } = require('leanrunner');const { stepGroup } = require('leanrunner');require('chromedriver');const WebDriver = require('selenium-webdriver');let driver = new WebDriver.Builder().forBrowser('chrome').build();<br />async function main() { await stepGroup("抓取网页文本内容", async () => { await step("使用Chrome浏览器打开要抓取的网站", async (world) => { const url = 'http://wufazhuce.com/one/2558'; await driver.get(url); }) await step("抓取文本", async (world) => { let text = await driver.findElement({ css:'div[class="one-cita"]'}).getText(); console.log(text); world.attachText(text); }) await step("关闭浏览器", async (world) => { await driver.close() }) })}<br />Workflow.run(main);
<br />
执行
点击“运行”按钮
,或者点击“运行项目”按钮
可以看到浏览器打开网页并将文本内容打印在LeanRunner设计器的输出面板。
如果是运行项目,还会显示html的运行报告:
对用户来说,html报告有较强的可读性。
总结
至此,我们完成了一个基本操作网页的RPA。后续可以在此RPA基础上进一步加深操作,比如抓取的文本内容存放到Excel表格中,或者存放到数据库中。
本文用到的selenium-webdriver自动化库,是非常流行的开源库,能够支持各种类型的浏览器,并能及时更新,支持最新版本的浏览器。同时Node.js也是非常流行的开源平台。基于这样一些技术开发RPA自动化脚本,保持了RPA脚本的可用性和可维护性,结合LeanRunner RPA平台,能够帮助企业,快速打造您自己的流程自动化。
基于browser的爬虫(ghostinstaller.spider)基于python的数据库加速
网站优化 • 优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2022-05-02 03:00
js抓取网页内容文件结构文件结构从favicon.ico里面找,或者用浏览器浏览器标签里面找第一步我们获取的excel里面的数据第二步,webpy抓取网页内容python3爬虫+webpy实战(代码已放github)第三步,
webpy的webcontent模块
写爬虫嘛,o2magicjs的第一个版本,很基础的。别的啥都没有。
没有用过webpy,不知道难度,但是比python的方便多了。只要用。
webpy
当然是o2magic了啊
肯定是开源的webpy了呀,
excel会得到20000条基本数据可以不用编程了。
我找过的一些挺有意思的库:webpy基于get/post的网络请求库,不适合爬取数据。selenium基于模拟器的代理。基于browser的爬虫(ghostinstaller)基于python的爬虫(openitview.spider)基于selenium的爬虫加速库,爬下来就是图片。基于requests的爬虫基于flask的爬虫,参见flaskpy。
osgeocouter基于python的命令行工具pathfinder(java版本的)基于mysql的数据库加速。celery/python-sqlite(hbase这种,oracle也可以)(quickopenopen这类有线程池的,nio中的kqueue也可以用在爬虫里,关键是效率)如果需要写的excel能兼容就再考虑mongodb之类,或者借助其他第三方库。
最不推荐的就是c++的spider。因为爬取后,除了后续文件读写可能会遇到各种问题以外,最后还是需要进行转化才能跑起来。c++里,也没多少可以实现和效率相关的功能。 查看全部
基于browser的爬虫(ghostinstaller.spider)基于python的数据库加速
js抓取网页内容文件结构文件结构从favicon.ico里面找,或者用浏览器浏览器标签里面找第一步我们获取的excel里面的数据第二步,webpy抓取网页内容python3爬虫+webpy实战(代码已放github)第三步,
webpy的webcontent模块
写爬虫嘛,o2magicjs的第一个版本,很基础的。别的啥都没有。
没有用过webpy,不知道难度,但是比python的方便多了。只要用。
webpy
当然是o2magic了啊
肯定是开源的webpy了呀,
excel会得到20000条基本数据可以不用编程了。
我找过的一些挺有意思的库:webpy基于get/post的网络请求库,不适合爬取数据。selenium基于模拟器的代理。基于browser的爬虫(ghostinstaller)基于python的爬虫(openitview.spider)基于selenium的爬虫加速库,爬下来就是图片。基于requests的爬虫基于flask的爬虫,参见flaskpy。
osgeocouter基于python的命令行工具pathfinder(java版本的)基于mysql的数据库加速。celery/python-sqlite(hbase这种,oracle也可以)(quickopenopen这类有线程池的,nio中的kqueue也可以用在爬虫里,关键是效率)如果需要写的excel能兼容就再考虑mongodb之类,或者借助其他第三方库。
最不推荐的就是c++的spider。因为爬取后,除了后续文件读写可能会遇到各种问题以外,最后还是需要进行转化才能跑起来。c++里,也没多少可以实现和效率相关的功能。
分享优化前怎么做网站诊断(优化的前期准备有哪些)
网站优化 • 优采云 发表了文章 • 0 个评论 • 302 次浏览 • 2022-05-01 18:04
首先,在seo优化前我们要对网站进行诊断和分析。我们要分析网站的现状,网站做得不好的地方,如何改进,改进后会有什么效果。为了为每个网站制定相应的网站优化方案,预诊断是优化方案的关键。我会详细谈谈。
通常看它的标题,接管一个新的网站来诊断它。标题是否包含目标关键字,标题能传达给客户什么信息,客户能在最短的时间内知道你的网站在做什么吗
检查源文件时查看代码是否凌乱。有没有JS和CSS的封装。太乱了,搜索引擎对它很不友好,所以在没有封装的情况下,有必要对其进行封装,这样不仅可以使朋友搜索引擎更加友好,而且可以使主页更有利于搜索引擎的爬行。
合理分布,关键字布局。实现从左到右、从上到下的布局规则。有合理的标签使用(H标签,自旋标签等)合理自然的分布,不要让关键字重叠,把重要的有价值的关键字放在上面的导航栏上。关键词密度应控制在4%-5%之间。
现在的搜索引擎无法识别图片,一般每个网站都有自己的logo图片。所以我想修改图片的alt属性,并使用alt=here来描述“告诉搜索引擎这张图片是什么”。当然,它也可以像我的网站。logo采用背景的方式,在其上写入文本,然后用CSS控制显示效果。这也是一张非常好的照片。使用太多太大的图片往往会影响网速所有图片都应该添加alt属性。
制作一张地图非常重要,就像一个人来到一个全新的地方,搜索引擎蜘蛛来了。虽然不熟悉。但是有了地图。然后你可以找到网站的所有位置。制作一张这个地点的地图。蜘蛛爬行比较友好。
排除网站的死链接,使404页。死链接会影响搜索引擎对网站的友好程度。一旦出现死链,蜘蛛无法接入会造成不良印象,必须确保每个连接都能接入。不要在网站上造成死角。应检测并修复死链路。让搜索引擎在网上畅通无阻。
就像你可以去任何地方。就这样。导航结果是面包屑导航。这将清楚地表明进入的地点。导航也有利于搜索引擎的爬行。同时,文章可以在前面的主题中加入,站点导航也很重要。下一个话题。使整个网站看起来是四面八方。没有人有死胡同。
为了保证网站的活力,检查内容的更新频率。高质量的内容在网站的权重中起着非常重要的作用。坚持竞争力,则内容更原创。长期没有更新,使网站失去了活力。有太多的蜘蛛,没有新的内容要抓取,所以要确保总是有新的内容注入。这对以后的SEO优化工作非常有帮助。
这是自己做的免费链接,网站的内部链也很重要。做好内部链接。它可以使整个互联网都可以访问。不做外链,等于切断了与外界的联系,从外无法进入本站,多发外链,更利于用户进入你的网站。
查看全部
分享优化前怎么做网站诊断(优化的前期准备有哪些)
首先,在seo优化前我们要对网站进行诊断和分析。我们要分析网站的现状,网站做得不好的地方,如何改进,改进后会有什么效果。为了为每个网站制定相应的网站优化方案,预诊断是优化方案的关键。我会详细谈谈。
通常看它的标题,接管一个新的网站来诊断它。标题是否包含目标关键字,标题能传达给客户什么信息,客户能在最短的时间内知道你的网站在做什么吗
检查源文件时查看代码是否凌乱。有没有JS和CSS的封装。太乱了,搜索引擎对它很不友好,所以在没有封装的情况下,有必要对其进行封装,这样不仅可以使朋友搜索引擎更加友好,而且可以使主页更有利于搜索引擎的爬行。
合理分布,关键字布局。实现从左到右、从上到下的布局规则。有合理的标签使用(H标签,自旋标签等)合理自然的分布,不要让关键字重叠,把重要的有价值的关键字放在上面的导航栏上。关键词密度应控制在4%-5%之间。
现在的搜索引擎无法识别图片,一般每个网站都有自己的logo图片。所以我想修改图片的alt属性,并使用alt=here来描述“告诉搜索引擎这张图片是什么”。当然,它也可以像我的网站。logo采用背景的方式,在其上写入文本,然后用CSS控制显示效果。这也是一张非常好的照片。使用太多太大的图片往往会影响网速所有图片都应该添加alt属性。
制作一张地图非常重要,就像一个人来到一个全新的地方,搜索引擎蜘蛛来了。虽然不熟悉。但是有了地图。然后你可以找到网站的所有位置。制作一张这个地点的地图。蜘蛛爬行比较友好。
排除网站的死链接,使404页。死链接会影响搜索引擎对网站的友好程度。一旦出现死链,蜘蛛无法接入会造成不良印象,必须确保每个连接都能接入。不要在网站上造成死角。应检测并修复死链路。让搜索引擎在网上畅通无阻。
就像你可以去任何地方。就这样。导航结果是面包屑导航。这将清楚地表明进入的地点。导航也有利于搜索引擎的爬行。同时,文章可以在前面的主题中加入,站点导航也很重要。下一个话题。使整个网站看起来是四面八方。没有人有死胡同。
为了保证网站的活力,检查内容的更新频率。高质量的内容在网站的权重中起着非常重要的作用。坚持竞争力,则内容更原创。长期没有更新,使网站失去了活力。有太多的蜘蛛,没有新的内容要抓取,所以要确保总是有新的内容注入。这对以后的SEO优化工作非常有帮助。
这是自己做的免费链接,网站的内部链也很重要。做好内部链接。它可以使整个互联网都可以访问。不做外链,等于切断了与外界的联系,从外无法进入本站,多发外链,更利于用户进入你的网站。
网站终于被收录了!
网站优化 • 优采云 发表了文章 • 0 个评论 • 140 次浏览 • 2022-04-30 08:30
陌溪的学习笔记:
大家好,我是陌溪
之前一直有小伙伴跑来问我,为啥蘑菇博客上线了这么久,百度出来只有首页?
百度收录
在聊这个问题之前,我们先谈谈什么是 SEO。搜索引擎优化(Search engine optimization,简称 SEO ),指为了提升网页在搜索引擎自然搜索结果中(非商业性推广结果)的收录数量以及排序位置而做的优化行为,是为了从搜索引擎中获得更多的免费流量,以及更好的展现形象。
其实蘑菇网站上线快几年了,但是只收录了首页,归根到底还是因为之前项目选型的时候,采用了 Vue 作为前端开发框架,而我们知道 Vue 作为单页面应用框架,所有的数据都是通过 axios 进行返回的,也可以想成是 ajax 请求异步返回的,是非常不利于 SEO 的。
而百度收录的原理,其实就是百度的爬虫程序去爬取咱们的网站网站,但是因为我们内容都是通过 axios 异步返回,所以只能看到下面这样的骨架代码,因此百度也就只会收录咱们的首页了。
蘑菇页面源码
一般爬虫抓取页面内容是先从一个页面出发,从中提取出其他页面的链接,然后当作下一个请求的对象,一直重复这个过程。所以要有良好的 SEO,需要你在各大网站上拥有外链,这样会提高你的网站被搜索引擎爬虫的几率。
而 Vue 为了解决 SEO 问题,官方有 Vue SSR 方案,后面又推出了 Nuxt.js 框架。
蘑菇其实在旧版本中,也是使用 nuxt.js 实现了一波,经过测试后也确实能够被百度所收录,但是因为同时维护两份代码,有些耗时耗力,并且切换到 nuxt.js后,因为是服务器渲染,网站打开也变慢了很多,因此在种种因素下,也放弃了维护 nuxt_mogu_web 项目
nuxt.js版蘑菇博客
同时,后面也在积极的探索更优雅的 SEO 实现方案,预期是不会较大的改变现有逻辑的基础上,就能够实现。
回归到原始需求,为了提高用户体验我们用了 Vue、React 这些 SPA 技术、为了 SEO 我们用了 SSR、预渲染等技术。
不同技术方案有一定差距,不能兼顾优点。但仔细想,需要这些技术优点的 "用户",其实时不一样的,SPA 针对的是浏览器普通用户、SSR 针对的是网页爬虫,如 googlebot、baiduspider 等,那为什么我们不能给不同“用户”不同的页面呢,服务端动态渲染就是这种方案。
后来,陌溪在网上冲浪的时候,在 Github 上发现了 prender-alpine 这个开源项目
prerender项目
prender-alpine 的原理,在 Alpine Linux 上构建的轻量级 Prerender 容器,带有 Node 和 Headless Chrome
Prerender :可以当做是一个预渲染的容器,项目的原理其实就是相当于跑了一层 node.js 的 Render 层,帮助我们做服务器渲染。
针对爬虫的预渲染
服务端对请求的 user-agent 进行判断,浏览器端直接给 SPA 页面,如果是爬虫,需要通过 Prerender 容器动态渲染的 html 页面进行返回
完整的流程图如下,我们需要通过 nginx 识别出访问我们网站的用户是否是爬虫,还是普通用户,从而请求不同的页面。
完整流程蘑菇 SEO 改造
为了方便小伙伴们的使用,陌溪也把 prender-alpine 项目放到了蘑菇镜像仓库,同时提供了一份 prerender.yml 文件
version: '3.1'<br />services:<br /> prerender:<br /> restart: always<br /> image: registry.cn-shenzhen.aliyuncs.com/mogublog/prerender<br /> container_name: prerender<br /> ports:<br /> - 3000:3000<br /> environment:<br /> MEMORY_CACHE: 1<br /> CACHE_MAXSIZE: 300<br /> CACHE_TTL: 6000<br /> networks:<br /> - mogu<br /><br />networks:<br /> mogu:<br /> external: true<br />
只需要将其拷贝到蘑菇一键部署的 yaml 目录下即可,同时使用命令进行启动
docker-compose -f prerender.yml<br />
启动完成后,可以看到项目运行在 3000 端口
容器运行
搭建完成后,我们可以打开浏览器进行测试,打开 172.184.166.150:3000/ 页面,后面挂着的就是你要预渲染的页面,如果能够打开下面的页面,说明已经预渲染成功了
预渲染成功
同时,通过查看网页源码,也能够看到页面的文字和链接了,这样爬虫也就能爬取到我们网站的其它信息
查看源码
下面,我们就需要改造我们的 nginx 了,通过 $http_user_agent 来识别请求的 user_agent 是否属于 Google、百度、必应、360…. 的爬虫
如果识别成功,那么会跳转到刚刚搭建的 prerender 容器中进行预渲染,否则继续返回原来的 Vue 页面
下面是完整的 nginx 配置文件 vue_mogu_web.conf
server {<br /> listen 80;<br /> server_name localhost;<br /><br /> add_header Access-Control-Allow-Origin *;<br /> add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';<br /> add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,lang,access-token';<br /> if ($request_method = 'OPTIONS') {<br /> return 204;<br /> }<br /><br /> root /usr/share/nginx/html/;<br /> index index.html;<br /><br /> location / {<br /> try_files $uri @render;<br /> }<br /><br /> location @render {<br /> set $render 0;<br /> if ($http_user_agent ~* "googlebot|bingbot|Baiduspider|360Spider|Sogou web spider|Bytespider") {<br /> set $render 1;<br /> }<br /><br /> if ($uri ~* "\.(js|css|xml|less|png|jpg|jpeg|gif|pdf|doc|txt|ico|rss|zip|mp3|rar|exe|wmv|doc|avi|ppt|mpg|mpeg|tif|wav|mov|psd|ai|xls|mp4|m4a|swf|dat|dmg|iso|flv|m4v|torrent|ttf|woff|svg|eot)") {<br /> set $render 0;<br /> }<br />
if ($render = 1) {<br /> set $render "172.184.166.150:3000";<br /> rewrite .* /$scheme://$host:$server_port$request_uri? break;<br /> proxy_pass http://$render;<br /> }<br /><br /> if ($render = 0) {<br /> rewrite .* /index.html break;<br /> }<br /><br /> }<br />}<br />
注意,这个配置需要修改 vue_mogu_web.yml,把刚刚创建的配置文件挂载出来
version: '3'<br />services:<br /> #授权服务<br /> vue_mogu_web:<br /> image: registry.cn-shenzhen.aliyuncs.com/mogublog_business/vue_mogu_web:latest<br /> container_name: vue_mogu_web<br /> restart: always<br /> ports:<br /> - 9527:80<br /> networks:<br /> - mogu<br /> env_file:<br /> - ../config/vue_mogu_web.env<br /> environment:<br /> - COMPOSE_PROJECT_NAME=vue_mogu_web<br /> volumes:<br /> - ../config/vue_mogu_web.conf:/etc/nginx/conf.d/default.conf<br /><br />networks:<br /> mogu:<br /> external: true<br />
修改完成后,就可以开始使用接口工具进行测试了,通过设置 Headers 设置请求头信息,加入 User-agent = googlebot 用来标识这个请求是爬虫
调用接口可以看到,我们的页面能够把完整的数据给返回
模拟爬虫请求
同时,如果我们把 User-agent 删掉,这个时候返回的就是我们正常的 SPA 单应用页面了
模拟正常用户
到这里,网站针对爬虫专属的 SEO 就改造完毕了
经过几天测试后,通过 site: 进行查询,也可以看到被百度收录了好几个页面了~
百度收录多个页面
好了,本期蘑菇 SEO 优化讲解就到这里
我是陌溪,我们下期再见~
往期推荐
博主就职于字节跳动商业化部门,一直维护校招笔记仓库LearningNote「在Gitee上已有5kstar,地址」,公众号上的文章也会在此同步更新,欢迎各位小伙伴一起交流学习,回复「PDF」获取PDF笔记。
同时,想要丰富项目经验的小伙伴,可以参考我维护的开源微服务博客项目:蘑菇博客「Gitee官方推荐项目,博客类搜索排名第一,在Gitee已有4.7Kstar,仓库地址:」。
本公众号申请较晚,暂时没有开通留言功能,欢迎小伙伴们添加我的私人微信coder_moxi【备注:加群】,我将邀请你加入到蘑菇博客交流群中,欢迎小伙伴们找陌溪一块聊天唠嗑,共同学习进步。最后,如果你觉得本文对你有所帮助,麻烦小伙伴们动动手指给文章点个「赞」和「在看」,非常感谢大家的支持。
快来找陌溪唠嗑吧
点个在看你最好看 查看全部
网站终于被收录了!
陌溪的学习笔记:
大家好,我是陌溪
之前一直有小伙伴跑来问我,为啥蘑菇博客上线了这么久,百度出来只有首页?
百度收录
在聊这个问题之前,我们先谈谈什么是 SEO。搜索引擎优化(Search engine optimization,简称 SEO ),指为了提升网页在搜索引擎自然搜索结果中(非商业性推广结果)的收录数量以及排序位置而做的优化行为,是为了从搜索引擎中获得更多的免费流量,以及更好的展现形象。
其实蘑菇网站上线快几年了,但是只收录了首页,归根到底还是因为之前项目选型的时候,采用了 Vue 作为前端开发框架,而我们知道 Vue 作为单页面应用框架,所有的数据都是通过 axios 进行返回的,也可以想成是 ajax 请求异步返回的,是非常不利于 SEO 的。
而百度收录的原理,其实就是百度的爬虫程序去爬取咱们的网站网站,但是因为我们内容都是通过 axios 异步返回,所以只能看到下面这样的骨架代码,因此百度也就只会收录咱们的首页了。
蘑菇页面源码
一般爬虫抓取页面内容是先从一个页面出发,从中提取出其他页面的链接,然后当作下一个请求的对象,一直重复这个过程。所以要有良好的 SEO,需要你在各大网站上拥有外链,这样会提高你的网站被搜索引擎爬虫的几率。
而 Vue 为了解决 SEO 问题,官方有 Vue SSR 方案,后面又推出了 Nuxt.js 框架。
蘑菇其实在旧版本中,也是使用 nuxt.js 实现了一波,经过测试后也确实能够被百度所收录,但是因为同时维护两份代码,有些耗时耗力,并且切换到 nuxt.js后,因为是服务器渲染,网站打开也变慢了很多,因此在种种因素下,也放弃了维护 nuxt_mogu_web 项目
nuxt.js版蘑菇博客
同时,后面也在积极的探索更优雅的 SEO 实现方案,预期是不会较大的改变现有逻辑的基础上,就能够实现。
回归到原始需求,为了提高用户体验我们用了 Vue、React 这些 SPA 技术、为了 SEO 我们用了 SSR、预渲染等技术。
不同技术方案有一定差距,不能兼顾优点。但仔细想,需要这些技术优点的 "用户",其实时不一样的,SPA 针对的是浏览器普通用户、SSR 针对的是网页爬虫,如 googlebot、baiduspider 等,那为什么我们不能给不同“用户”不同的页面呢,服务端动态渲染就是这种方案。
后来,陌溪在网上冲浪的时候,在 Github 上发现了 prender-alpine 这个开源项目
prerender项目
prender-alpine 的原理,在 Alpine Linux 上构建的轻量级 Prerender 容器,带有 Node 和 Headless Chrome
Prerender :可以当做是一个预渲染的容器,项目的原理其实就是相当于跑了一层 node.js 的 Render 层,帮助我们做服务器渲染。
针对爬虫的预渲染
服务端对请求的 user-agent 进行判断,浏览器端直接给 SPA 页面,如果是爬虫,需要通过 Prerender 容器动态渲染的 html 页面进行返回
完整的流程图如下,我们需要通过 nginx 识别出访问我们网站的用户是否是爬虫,还是普通用户,从而请求不同的页面。
完整流程蘑菇 SEO 改造
为了方便小伙伴们的使用,陌溪也把 prender-alpine 项目放到了蘑菇镜像仓库,同时提供了一份 prerender.yml 文件
version: '3.1'<br />services:<br /> prerender:<br /> restart: always<br /> image: registry.cn-shenzhen.aliyuncs.com/mogublog/prerender<br /> container_name: prerender<br /> ports:<br /> - 3000:3000<br /> environment:<br /> MEMORY_CACHE: 1<br /> CACHE_MAXSIZE: 300<br /> CACHE_TTL: 6000<br /> networks:<br /> - mogu<br /><br />networks:<br /> mogu:<br /> external: true<br />
只需要将其拷贝到蘑菇一键部署的 yaml 目录下即可,同时使用命令进行启动
docker-compose -f prerender.yml<br />
启动完成后,可以看到项目运行在 3000 端口
容器运行
搭建完成后,我们可以打开浏览器进行测试,打开 172.184.166.150:3000/ 页面,后面挂着的就是你要预渲染的页面,如果能够打开下面的页面,说明已经预渲染成功了
预渲染成功
同时,通过查看网页源码,也能够看到页面的文字和链接了,这样爬虫也就能爬取到我们网站的其它信息
查看源码
下面,我们就需要改造我们的 nginx 了,通过 $http_user_agent 来识别请求的 user_agent 是否属于 Google、百度、必应、360…. 的爬虫
如果识别成功,那么会跳转到刚刚搭建的 prerender 容器中进行预渲染,否则继续返回原来的 Vue 页面
下面是完整的 nginx 配置文件 vue_mogu_web.conf
server {<br /> listen 80;<br /> server_name localhost;<br /><br /> add_header Access-Control-Allow-Origin *;<br /> add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';<br /> add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,lang,access-token';<br /> if ($request_method = 'OPTIONS') {<br /> return 204;<br /> }<br /><br /> root /usr/share/nginx/html/;<br /> index index.html;<br /><br /> location / {<br /> try_files $uri @render;<br /> }<br /><br /> location @render {<br /> set $render 0;<br /> if ($http_user_agent ~* "googlebot|bingbot|Baiduspider|360Spider|Sogou web spider|Bytespider") {<br /> set $render 1;<br /> }<br /><br /> if ($uri ~* "\.(js|css|xml|less|png|jpg|jpeg|gif|pdf|doc|txt|ico|rss|zip|mp3|rar|exe|wmv|doc|avi|ppt|mpg|mpeg|tif|wav|mov|psd|ai|xls|mp4|m4a|swf|dat|dmg|iso|flv|m4v|torrent|ttf|woff|svg|eot)") {<br /> set $render 0;<br /> }<br />
if ($render = 1) {<br /> set $render "172.184.166.150:3000";<br /> rewrite .* /$scheme://$host:$server_port$request_uri? break;<br /> proxy_pass http://$render;<br /> }<br /><br /> if ($render = 0) {<br /> rewrite .* /index.html break;<br /> }<br /><br /> }<br />}<br />
注意,这个配置需要修改 vue_mogu_web.yml,把刚刚创建的配置文件挂载出来
version: '3'<br />services:<br /> #授权服务<br /> vue_mogu_web:<br /> image: registry.cn-shenzhen.aliyuncs.com/mogublog_business/vue_mogu_web:latest<br /> container_name: vue_mogu_web<br /> restart: always<br /> ports:<br /> - 9527:80<br /> networks:<br /> - mogu<br /> env_file:<br /> - ../config/vue_mogu_web.env<br /> environment:<br /> - COMPOSE_PROJECT_NAME=vue_mogu_web<br /> volumes:<br /> - ../config/vue_mogu_web.conf:/etc/nginx/conf.d/default.conf<br /><br />networks:<br /> mogu:<br /> external: true<br />
修改完成后,就可以开始使用接口工具进行测试了,通过设置 Headers 设置请求头信息,加入 User-agent = googlebot 用来标识这个请求是爬虫
调用接口可以看到,我们的页面能够把完整的数据给返回
模拟爬虫请求
同时,如果我们把 User-agent 删掉,这个时候返回的就是我们正常的 SPA 单应用页面了
模拟正常用户
到这里,网站针对爬虫专属的 SEO 就改造完毕了
经过几天测试后,通过 site: 进行查询,也可以看到被百度收录了好几个页面了~
百度收录多个页面
好了,本期蘑菇 SEO 优化讲解就到这里
我是陌溪,我们下期再见~
往期推荐
博主就职于字节跳动商业化部门,一直维护校招笔记仓库LearningNote「在Gitee上已有5kstar,地址」,公众号上的文章也会在此同步更新,欢迎各位小伙伴一起交流学习,回复「PDF」获取PDF笔记。
同时,想要丰富项目经验的小伙伴,可以参考我维护的开源微服务博客项目:蘑菇博客「Gitee官方推荐项目,博客类搜索排名第一,在Gitee已有4.7Kstar,仓库地址:」。
本公众号申请较晚,暂时没有开通留言功能,欢迎小伙伴们添加我的私人微信coder_moxi【备注:加群】,我将邀请你加入到蘑菇博客交流群中,欢迎小伙伴们找陌溪一块聊天唠嗑,共同学习进步。最后,如果你觉得本文对你有所帮助,麻烦小伙伴们动动手指给文章点个「赞」和「在看」,非常感谢大家的支持。
快来找陌溪唠嗑吧
点个在看你最好看
js 抓取网页内容(js爬虫如何实现网页数据(js函数爬虫)怎样实现)
网站优化 • 优采云 发表了文章 • 0 个评论 • 43 次浏览 • 2022-04-17 21:05
js爬虫如何实现网页数据抓取-:使用http抓包工具获取下一页的url,然后分析url的规律再下载你给的url我打不开
javascript如何抓取网页上的内容——:基本上是通过页面上定义的id来抓取,例如: 前提:页面中的某个文本定义了一个id,即id="test",goal获取此文本方法中的内容:可以使用以下方法:document.getEle...
如何使用javascript提取网页内容??:document.getElementById('iframe1').value
如何爬取js函数生成的网页内容——:我查过你提供的页面代码:在首页,你用ajax动态获取服务器每一列的数据,然后动态生成页面。这样搜索引擎就无法爬取了,因为目前的搜索引擎还没有爬取ajax页面的技术。当然,目前有 163 个博客使用这种方法来构建博客。但是人...
如何抓取js函数生成的网页内容——:如果是网页中的html元素,可以直接使用获取值的方法,jq的val()或者js的value(),也可以描述详细说明你要抢什么东西。
如何抓取网站的js文件?- : ie----view----source文件,搜索.js,可以找到js脚本路径,可以下载
如何采集javascript-generated pages-:phantomjs和casperjs Casperjs是基于Phantomjs的,而Phantom JS是一个服务器端的JavaScript API WebKit可以做采集javascript-generated pages 当然你也可以分析然后js直接通过接口获取网页的数据。
Javascript可以提取网页数据进行运算和计算吗?- :是的,你可以把这两个数据保存在一个cookie中,然后进行计算,就是这样!
javascript网页提取 - :可以通过使用锚来解决
网页内容爬取(js):这种js做不到,推荐使用PHP的curl功能来实现!具体使用方法网上有很多资料! 查看全部
js 抓取网页内容(js爬虫如何实现网页数据(js函数爬虫)怎样实现)
js爬虫如何实现网页数据抓取-:使用http抓包工具获取下一页的url,然后分析url的规律再下载你给的url我打不开
javascript如何抓取网页上的内容——:基本上是通过页面上定义的id来抓取,例如: 前提:页面中的某个文本定义了一个id,即id="test",goal获取此文本方法中的内容:可以使用以下方法:document.getEle...
如何使用javascript提取网页内容??:document.getElementById('iframe1').value
如何爬取js函数生成的网页内容——:我查过你提供的页面代码:在首页,你用ajax动态获取服务器每一列的数据,然后动态生成页面。这样搜索引擎就无法爬取了,因为目前的搜索引擎还没有爬取ajax页面的技术。当然,目前有 163 个博客使用这种方法来构建博客。但是人...
如何抓取js函数生成的网页内容——:如果是网页中的html元素,可以直接使用获取值的方法,jq的val()或者js的value(),也可以描述详细说明你要抢什么东西。
如何抓取网站的js文件?- : ie----view----source文件,搜索.js,可以找到js脚本路径,可以下载
如何采集javascript-generated pages-:phantomjs和casperjs Casperjs是基于Phantomjs的,而Phantom JS是一个服务器端的JavaScript API WebKit可以做采集javascript-generated pages 当然你也可以分析然后js直接通过接口获取网页的数据。
Javascript可以提取网页数据进行运算和计算吗?- :是的,你可以把这两个数据保存在一个cookie中,然后进行计算,就是这样!
javascript网页提取 - :可以通过使用锚来解决
网页内容爬取(js):这种js做不到,推荐使用PHP的curl功能来实现!具体使用方法网上有很多资料!
js 抓取网页内容(python怎么用python爬取视频网站的数据如何用爬取js渲染加载的视频文件不是)
网站优化 • 优采云 发表了文章 • 0 个评论 • 68 次浏览 • 2022-04-17 20:47
如何用python爬取视频网站的数据
如何用python爬取js渲染加载的视频文件不是每个人都有资格说喜欢,也不是每个人都可以选择陪你一辈子!
在哪位大神的指导下,视频网站上的一些视频文件是通过js加载的,不知道能不能用selenium+phantomjs PhantomJS是一个基于webkit的JavaScript API。它使用 QtWebKit 作为其核心浏览器功能,并使用 webkit 来编译、解释和执行 JavaScript 代码。您可以在基于 webkit 的浏览器中做的任何事情,它都能做到。
python如何爬取头条付费栏视频 python如何爬取头条付费栏视频
前往今日头条官网自媒体申请账号,选择发布信息的类别,等待今日头条审核通过,即可发布视频。
想用Python做一个数据库,其结构大致是“歌手-歌曲名-专辑名-歌曲时长”,以及爬取网页、模拟登录等背后的大致逻辑和原理;
以songtaste网页标题提取为例,详细讲解如何爬取网站并提取网页内容;
以模拟登录百度为例,详细讲解如何模拟登录网站;
如何用Python爬取搜索引擎的结果 一个人的心,一个人的孤岛,可能只需要弹指一挥。
我选择爬取百度知道的html作为我的搜索源数据。目前,我打算搜索网页的标题。我选择Python的scrapy库来抓取网页,抓取网页的title、url、html。使用 sqlist3 管理爬取的数据源。爬行过程是深度优先的过程。
Python爬虫可以爬什么
用Python脚本在哔哩哔哩上爬视频是我离开彩妆后一个人的时候。面对电脑屏幕的二十四种本色,我无动于衷地哀悼。黑与白,失恋的缤纷色彩。没有您的网络,计算机简直就是地狱! 查看全部
js 抓取网页内容(python怎么用python爬取视频网站的数据如何用爬取js渲染加载的视频文件不是)
如何用python爬取视频网站的数据
如何用python爬取js渲染加载的视频文件不是每个人都有资格说喜欢,也不是每个人都可以选择陪你一辈子!
在哪位大神的指导下,视频网站上的一些视频文件是通过js加载的,不知道能不能用selenium+phantomjs PhantomJS是一个基于webkit的JavaScript API。它使用 QtWebKit 作为其核心浏览器功能,并使用 webkit 来编译、解释和执行 JavaScript 代码。您可以在基于 webkit 的浏览器中做的任何事情,它都能做到。
python如何爬取头条付费栏视频 python如何爬取头条付费栏视频
前往今日头条官网自媒体申请账号,选择发布信息的类别,等待今日头条审核通过,即可发布视频。
想用Python做一个数据库,其结构大致是“歌手-歌曲名-专辑名-歌曲时长”,以及爬取网页、模拟登录等背后的大致逻辑和原理;
以songtaste网页标题提取为例,详细讲解如何爬取网站并提取网页内容;
以模拟登录百度为例,详细讲解如何模拟登录网站;
如何用Python爬取搜索引擎的结果 一个人的心,一个人的孤岛,可能只需要弹指一挥。
我选择爬取百度知道的html作为我的搜索源数据。目前,我打算搜索网页的标题。我选择Python的scrapy库来抓取网页,抓取网页的title、url、html。使用 sqlist3 管理爬取的数据源。爬行过程是深度优先的过程。
Python爬虫可以爬什么
用Python脚本在哔哩哔哩上爬视频是我离开彩妆后一个人的时候。面对电脑屏幕的二十四种本色,我无动于衷地哀悼。黑与白,失恋的缤纷色彩。没有您的网络,计算机简直就是地狱!
js 抓取网页内容(怎么显示在网页上的呢?网页的代码里面直接包含内容)
网站优化 • 优采云 发表了文章 • 0 个评论 • 58 次浏览 • 2022-04-16 01:01
网页内容一般是指我们最终在网页上看到的内容,但是这个过程并不像直接在网页的代码中收录内容那么简单,所以对于很多新手来说,会遇到很多问题,比如:
显然,当用 Chrome 或 Firefox 检查页面时,可以看到 HTML 标签中收录的内容,但在抓取时为空。
很多内容必须通过点击按钮或执行交互操作来显示在页面上。
因此,对于很多新手来说,做法是使用别人模拟浏览器操作的某种语言的库。其实就是调用本地浏览器或者收录一些执行javascript的引擎进行模拟操作来抓取数据。在抓取大量数据的情况下,效率很低,相当于给技术人员自己用了一个盒子,那么这些内容到底是如何在网页上显示的呢?
主要分为以下几种情况:
网页收录内容的情况是最容易解决的。一般来说,基本上都是写死的静态网页,或者是使用模板渲染的动态网页。当浏览器获取 HTML 时,它已经收录了所有的关键信息,所以你在网页上直接看到的内容可以通过特定的 HTML 标签由 javascript 代码加载。这是因为虽然网页显示时内容在HTML标签中,但实际上是通过执行js代码添加到标签中的。所以此时内容在js代码中,js的执行是在浏览器端,所以当你使用程序请求网页地址时,得到的响应是网页代码和js代码,所以你可以在浏览器端看到它。说到内容,由于解析时没有执行js,所以一定要发现指定html标签下的内容一定是空的。此时的处理方式一般是找到收录该内容的js代码字符串,然后通过正则表达式获取对应的内容。, 而不是解析 HTML 标签。 查看全部
js 抓取网页内容(怎么显示在网页上的呢?网页的代码里面直接包含内容)
网页内容一般是指我们最终在网页上看到的内容,但是这个过程并不像直接在网页的代码中收录内容那么简单,所以对于很多新手来说,会遇到很多问题,比如:
显然,当用 Chrome 或 Firefox 检查页面时,可以看到 HTML 标签中收录的内容,但在抓取时为空。
很多内容必须通过点击按钮或执行交互操作来显示在页面上。
因此,对于很多新手来说,做法是使用别人模拟浏览器操作的某种语言的库。其实就是调用本地浏览器或者收录一些执行javascript的引擎进行模拟操作来抓取数据。在抓取大量数据的情况下,效率很低,相当于给技术人员自己用了一个盒子,那么这些内容到底是如何在网页上显示的呢?
主要分为以下几种情况:
网页收录内容的情况是最容易解决的。一般来说,基本上都是写死的静态网页,或者是使用模板渲染的动态网页。当浏览器获取 HTML 时,它已经收录了所有的关键信息,所以你在网页上直接看到的内容可以通过特定的 HTML 标签由 javascript 代码加载。这是因为虽然网页显示时内容在HTML标签中,但实际上是通过执行js代码添加到标签中的。所以此时内容在js代码中,js的执行是在浏览器端,所以当你使用程序请求网页地址时,得到的响应是网页代码和js代码,所以你可以在浏览器端看到它。说到内容,由于解析时没有执行js,所以一定要发现指定html标签下的内容一定是空的。此时的处理方式一般是找到收录该内容的js代码字符串,然后通过正则表达式获取对应的内容。, 而不是解析 HTML 标签。
js 抓取网页内容(谷歌TKD标签是什么?标签中的T即title)
网站优化 • 优采云 发表了文章 • 0 个评论 • 44 次浏览 • 2022-04-15 17:30
谷歌是全球最大的搜索引擎,也是独立网站卖家的重要流量来源之一。独立网站卖家通过不断优化和提升网站在谷歌页面的有机排名,可以获得更多的曝光率和免费流量。这不仅可以帮助卖家无形中降低销售成本,还可以在一定程度上提高网站的转化率和热度。
什么是 TKD 标签?
TKD标签中的T是标题(网页标题),是网站中最重要的标签。标题是对当前页面的简要描述,所以标题不仅要给访问者一个清晰的引导,还要让访问者有阅读的兴趣网站。
但是不要为了吸引人而写与页面内容不匹配的标题,因为相关性越高,搜索引擎排名就越好。同时,与内容不符的标题也会让访问者感到被欺骗,从而降低网站的信任度和好感度。
标题是您在搜索结果中看到的第一个信息,因此最好将标题字符保持在 30 个字以内。这样标题就可以完整显示,不会因为显示不完整而影响用户体验。此外,在标题中收录一个核心 关键词,以强调 关键词 的重要性。
K代表Keyword,是网站的标题和描述的标签。关键字描述应尽可能简洁明了。关键词标签在TKD标签优化中的重要性近年来逐渐下降,很多卖家甚至选择完全不设置关键词,因为这样很容易被搜索引擎判定违规。
D是Deion(网页描述),是对网站标题的补充和解释。适当增加其中关键词的密度,对于提升排名会有显着的效果。因为页面描述会像标题一样出现在访问者的搜索结果列表中,卖家不仅要注意关键词的密度,还要尽量让页面描述对访问者有吸引力。
好的描述信息不仅可以提高网站的点击率,还可以提高网站的竞争力。遵循完整显示的原则,描述信息的字符最好控制在80个字符以内。
Ueeshop TKD标签
<p>Ueeshop TKD标签可以快速编辑产品、产品类别、单文、文章、案例、博客等TKD信息,还提供自动添加TKD标签的功能,帮助卖家提升 查看全部
js 抓取网页内容(谷歌TKD标签是什么?标签中的T即title)
谷歌是全球最大的搜索引擎,也是独立网站卖家的重要流量来源之一。独立网站卖家通过不断优化和提升网站在谷歌页面的有机排名,可以获得更多的曝光率和免费流量。这不仅可以帮助卖家无形中降低销售成本,还可以在一定程度上提高网站的转化率和热度。
什么是 TKD 标签?
TKD标签中的T是标题(网页标题),是网站中最重要的标签。标题是对当前页面的简要描述,所以标题不仅要给访问者一个清晰的引导,还要让访问者有阅读的兴趣网站。
但是不要为了吸引人而写与页面内容不匹配的标题,因为相关性越高,搜索引擎排名就越好。同时,与内容不符的标题也会让访问者感到被欺骗,从而降低网站的信任度和好感度。
标题是您在搜索结果中看到的第一个信息,因此最好将标题字符保持在 30 个字以内。这样标题就可以完整显示,不会因为显示不完整而影响用户体验。此外,在标题中收录一个核心 关键词,以强调 关键词 的重要性。
K代表Keyword,是网站的标题和描述的标签。关键字描述应尽可能简洁明了。关键词标签在TKD标签优化中的重要性近年来逐渐下降,很多卖家甚至选择完全不设置关键词,因为这样很容易被搜索引擎判定违规。
D是Deion(网页描述),是对网站标题的补充和解释。适当增加其中关键词的密度,对于提升排名会有显着的效果。因为页面描述会像标题一样出现在访问者的搜索结果列表中,卖家不仅要注意关键词的密度,还要尽量让页面描述对访问者有吸引力。
好的描述信息不仅可以提高网站的点击率,还可以提高网站的竞争力。遵循完整显示的原则,描述信息的字符最好控制在80个字符以内。
Ueeshop TKD标签
<p>Ueeshop TKD标签可以快速编辑产品、产品类别、单文、文章、案例、博客等TKD信息,还提供自动添加TKD标签的功能,帮助卖家提升
js 抓取网页内容(js抓取网页内容会先被转换成map格式,怎么处理)
网站优化 • 优采云 发表了文章 • 0 个评论 • 61 次浏览 • 2022-04-14 12:02
js抓取网页内容会先被转换成map格式,内容会被简单的整理一下,例如:check</a>echo"check
check
"但是没有url的话会取不到内容,所以建议用urllib2。
百度。
可以用scrapy,可以在webscrapy-scrapy或者meganscrapy项目下载到前端返回的html文件,再继续发起后面的连接来接收数据。
我一直在用这个,然后前端操作挺方便的。
简单的做法是爬取首页大部分商品。因为大部分商品的商品价格固定,对应的url自然就能设计出来。这样方便用模板写页面css等,标准的url格式对静态页面也是够用的。然后正则,例如首页的url是/abab2be143ebe8235be7106c36841546ed828/beci/goods/这样的dom就可以爬下来。
一共大概几千行代码不到十分钟搞定。不推荐那种上千字符搜索,因为太多是指向商品页面内容页的,部分网站正则匹配排序算法不一定受得了。如果页面中有宝贝链接的话,可以抓取部分宝贝链接,但不推荐。因为这样做会对页面进行程序化解析,每个商品页面的宝贝链接都会有对应页数,每个页数多少url就是几千字符,需要关联上层链接。
不能简单拿链接直接输出了。这部分后期可以有后端处理。是有后端的,你不会用后端的话,可以用后端可用的html来接收,然后发起连接。然后拿抓到的数据给商品页面使用。这样就可以得到首页大部分商品的url对应的数据了。其他页面的数据没有抓到,应该有后端工具可以抓取其他页面或内容。在看下这些页面的数据怎么处理。
肯定不是从外部爬取下来一样就完了。数据处理也是很耗时的。这里推荐一个比较容易的方法。去爬取微博好像有很多爬虫在抓取粉丝数量前几名的,然后把这些url保存在数据库里,那么在某些场景可以不用保存粉丝信息就直接抓取。 查看全部
js 抓取网页内容(js抓取网页内容会先被转换成map格式,怎么处理)
js抓取网页内容会先被转换成map格式,内容会被简单的整理一下,例如:check</a>echo"check
check
"但是没有url的话会取不到内容,所以建议用urllib2。
百度。
可以用scrapy,可以在webscrapy-scrapy或者meganscrapy项目下载到前端返回的html文件,再继续发起后面的连接来接收数据。
我一直在用这个,然后前端操作挺方便的。
简单的做法是爬取首页大部分商品。因为大部分商品的商品价格固定,对应的url自然就能设计出来。这样方便用模板写页面css等,标准的url格式对静态页面也是够用的。然后正则,例如首页的url是/abab2be143ebe8235be7106c36841546ed828/beci/goods/这样的dom就可以爬下来。
一共大概几千行代码不到十分钟搞定。不推荐那种上千字符搜索,因为太多是指向商品页面内容页的,部分网站正则匹配排序算法不一定受得了。如果页面中有宝贝链接的话,可以抓取部分宝贝链接,但不推荐。因为这样做会对页面进行程序化解析,每个商品页面的宝贝链接都会有对应页数,每个页数多少url就是几千字符,需要关联上层链接。
不能简单拿链接直接输出了。这部分后期可以有后端处理。是有后端的,你不会用后端的话,可以用后端可用的html来接收,然后发起连接。然后拿抓到的数据给商品页面使用。这样就可以得到首页大部分商品的url对应的数据了。其他页面的数据没有抓到,应该有后端工具可以抓取其他页面或内容。在看下这些页面的数据怎么处理。
肯定不是从外部爬取下来一样就完了。数据处理也是很耗时的。这里推荐一个比较容易的方法。去爬取微博好像有很多爬虫在抓取粉丝数量前几名的,然后把这些url保存在数据库里,那么在某些场景可以不用保存粉丝信息就直接抓取。
js 抓取网页内容(1.javascript怎么获取元素的所有内容ContentEditable)
网站优化 • 优采云 发表了文章 • 0 个评论 • 40 次浏览 • 2022-04-13 02:09
1.javascript如何获取元素的所有内容
试试 ContentEditable 属性。
看看这个演示:
HTML5 演示:ContentEditable
/内容可编辑
相关代码:
1
2
3
4
5
6
vareditable = document.getElementById('editable');addEvent(editable, 'blur', function() {
// 很糟糕,我们正在挂钩模糊事件
localStorage.setItem('contenteditable', this.innerHTML);
document.designMode = 'off';});addEvent(editable, 'focus', function () {
document.designMode = 'on';});if (localStorage.getItem('contenteditable')) {
editable.innerHTML = localStorage.getItem('contenteditable');}
不过,最好用JQuery,而且简单。 jquery有个属性可以直接获取当前元素的所有子元素
2.Javascript获取Html界面元素的几种方法
getElementById()
//通过ID获取元素,所以只能访问设置了ID的元素,例如有一个ID为docid的DIV:
//
// 然后可以使用getElementById("docid") 来获取这个元素。
getElementsByName()
// 按名称获取元素。 DOCUMENT 中元素的名称可以重复。如果一个文档中有两个以上的同名标签,那么getElementsByName()可以获取这些元素组成一个数组。
// 比如有两个DIV:
//
//
// 然后就可以用getElementsByName("docname")获取这两个DIV,用getElementsByName("docname")[0]访问第一个DIV。 getElementsByTagName()
// 元素通过TAGNAME(标签名)获取。一个DOCUMENT中会有相同的标签,所以这个方法也得到一个数组。
// 可以使用 getElementsByTagName("div") 访问,第一个 DIV 使用 getElementsByTagName("div")[0],第二个 DIV 使用 getElementsByTagName("div")[1]。
3.Javascript获取Html界面元素的几种方法
getElementById() // 通过 ID 获取元素,因此只能访问设置了 ID 的元素。例如,如果有一个ID为docid的DIV: // // 那么你可以使用getElementById("docid") 来获取它这个元素。
getElementsByName()//通过NAME获取元素,DOCUMENT中元素的NAME可以重复,如果一个文档中有两个以上标签//同名,那么getElementsByName()可以获取这些元素形成数组 。 // 比如有两个DIV: // // // 那么可以使用getElementsByName("docname") 获取这两个DIV,使用getElementsByName("docname")[0] 访问第一个DIV。
getElementsByTagName()//通过TAGNAME(标签名)获取元素,一个DOCUMENT中会有相同的标签,所以这个方法也是获取一个数组。 // 可以使用 getElementsByTagName("div") 访问它们,第一个 DIV 使用 getElementsByTagName("div")[0],第二个 DIV 使用 getElementsByTagName("div")[1]。
4.javascript如何获取元素的所有内容
试试 ContentEditable 属性。
看这个Demo: HTML5 Demo: ContentEditable /contenteditable 相关代码: 1 2 3 4 5 6 var editable = document.getElementById('editable');addEvent(editable, 'blur', function () { // lame我们正在挂钩模糊事件 localStorage.setItem('contenteditable', this.innerHTML); document.designMode = 'off';});addEvent(editable, 'focus', function () { document.designMode = 'on ';});if (localStorage.getItem('contenteditable')) { editable.innerHTML = localStorage.getItem('contenteditable');} 不过还是推荐使用JQuery,而且很简单,Jquery有一个属性,可以直接获取当前元素的所有子元素。
转载请注明出处 JS码网 » js获取页面元素内容(javascript如何获取元素所有内容) 查看全部
js 抓取网页内容(1.javascript怎么获取元素的所有内容ContentEditable)
1.javascript如何获取元素的所有内容
试试 ContentEditable 属性。
看看这个演示:
HTML5 演示:ContentEditable
/内容可编辑
相关代码:
1
2
3
4
5
6
vareditable = document.getElementById('editable');addEvent(editable, 'blur', function() {
// 很糟糕,我们正在挂钩模糊事件
localStorage.setItem('contenteditable', this.innerHTML);
document.designMode = 'off';});addEvent(editable, 'focus', function () {
document.designMode = 'on';});if (localStorage.getItem('contenteditable')) {
editable.innerHTML = localStorage.getItem('contenteditable');}
不过,最好用JQuery,而且简单。 jquery有个属性可以直接获取当前元素的所有子元素
2.Javascript获取Html界面元素的几种方法
getElementById()
//通过ID获取元素,所以只能访问设置了ID的元素,例如有一个ID为docid的DIV:
//
// 然后可以使用getElementById("docid") 来获取这个元素。
getElementsByName()
// 按名称获取元素。 DOCUMENT 中元素的名称可以重复。如果一个文档中有两个以上的同名标签,那么getElementsByName()可以获取这些元素组成一个数组。
// 比如有两个DIV:
//
//
// 然后就可以用getElementsByName("docname")获取这两个DIV,用getElementsByName("docname")[0]访问第一个DIV。 getElementsByTagName()
// 元素通过TAGNAME(标签名)获取。一个DOCUMENT中会有相同的标签,所以这个方法也得到一个数组。
// 可以使用 getElementsByTagName("div") 访问,第一个 DIV 使用 getElementsByTagName("div")[0],第二个 DIV 使用 getElementsByTagName("div")[1]。
3.Javascript获取Html界面元素的几种方法
getElementById() // 通过 ID 获取元素,因此只能访问设置了 ID 的元素。例如,如果有一个ID为docid的DIV: // // 那么你可以使用getElementById("docid") 来获取它这个元素。
getElementsByName()//通过NAME获取元素,DOCUMENT中元素的NAME可以重复,如果一个文档中有两个以上标签//同名,那么getElementsByName()可以获取这些元素形成数组 。 // 比如有两个DIV: // // // 那么可以使用getElementsByName("docname") 获取这两个DIV,使用getElementsByName("docname")[0] 访问第一个DIV。
getElementsByTagName()//通过TAGNAME(标签名)获取元素,一个DOCUMENT中会有相同的标签,所以这个方法也是获取一个数组。 // 可以使用 getElementsByTagName("div") 访问它们,第一个 DIV 使用 getElementsByTagName("div")[0],第二个 DIV 使用 getElementsByTagName("div")[1]。
4.javascript如何获取元素的所有内容
试试 ContentEditable 属性。
看这个Demo: HTML5 Demo: ContentEditable /contenteditable 相关代码: 1 2 3 4 5 6 var editable = document.getElementById('editable');addEvent(editable, 'blur', function () { // lame我们正在挂钩模糊事件 localStorage.setItem('contenteditable', this.innerHTML); document.designMode = 'off';});addEvent(editable, 'focus', function () { document.designMode = 'on ';});if (localStorage.getItem('contenteditable')) { editable.innerHTML = localStorage.getItem('contenteditable');} 不过还是推荐使用JQuery,而且很简单,Jquery有一个属性,可以直接获取当前元素的所有子元素。
转载请注明出处 JS码网 » js获取页面元素内容(javascript如何获取元素所有内容)