抓取动态网页

抓取动态网页

干货内容:python网络爬虫学习笔记(4)静态网页抓取(一)知识

网站优化优采云 发表了文章 • 0 个评论 • 48 次浏览 • 2022-09-21 18:07 • 来自相关话题

  干货内容:python网络爬虫学习笔记(4)静态网页抓取(一)知识
  1 信息 2 笔记 静态网页抓取(一)知识
  静态网页是纯HTML格式的网页,使用AJAX动态加载网页的数据不一定会出现在HTML代码中。
  对于静态网页,前面使用的Requests库非常有用。这次主要是详细介绍一下。
  Requests库使用前期工作(简述),安装介绍在notes(1)中,至于pycharm中使用库之前的工作,notes(3)有一个介绍,简而言之)首先是将库安装到项目中,这里单独粘贴其安装代码:
  pip install requests
  请求库 - 1 获取响应内容
  通常这样使用,返回一个响应响应对象(req是变量名,或者对象名):
  req = requests.get(url, 其它参数(可选择))
  req.encoding
req.status_code
req.text
……
  import requests
key_dict = {'key1': 'value1'}
req = requests.get('http://httpbin.org/get', params=key_dict)
  {
"args": {
<p>
"key1": "value1",
"key2": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.22.0"
},
"origin": "223.167.175.166, 223.167.175.166",
"url": "https://httpbin.org/get%3Fkey1 ... ot%3B
}
</p>
  POST 请求
  这段原文很清楚,我分段粘贴。
  除了GET请求外,有时还需要发送一些以表单形式编码的数据。比如登录时,请求是POST,因为如果使用GET请求,会在URL中显示密码,非常不安全。
  如果要实现POST请求,只需将字典传递给Requests中的data参数,请求时数据字典会自动编码为表单。
  def data_use():
key_dict = {&#39;key1&#39;: &#39;value1&#39;, &#39;key2&#39;: &#39;value2&#39;}
# 注意是post和data的组合
req = requests.post(&#39;http://httpbin.org/post&#39;, data=key_dict)
print(req.text)
<p>
</p>
  {
"args": {},
"data": "",
"files": {},
"form": {
"key1": "value1",
"key2": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "23",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.22.0"
},
"json": null,
"origin": "223.167.175.166, 223.167.175.166",
"url": "https://httpbin.org/post"
}
  入门到精通:java网页爬虫测试源码
  StringBuffer 缓冲区=new StringBuffer();
  网址 urlObj=null;
  URLConnection uc=null;
  InputStreamReader in=null;
  BufferedReader reader=null;
  试试{
  //建立网络连接
  urlObj=新网址(url);
  //打开网络连接
  uc=urlObj.openConnection();
  //创建网络输入流
  in=new InputStreamReader(uc.getInputStream(), encoding);
  //缓冲写文件流
  reader=new BufferedReader(in);
  //临时变量
  
  字符串 tempLine=null;
  //循环读取文件流
  while((tempLine=reader.readLine())!=null){
  //循环追加数据
  buffer.append(tempLine+"\n");
  }
  }catch(异常 e){
  e.getStackTrace();
  System.out.println("网页抓取失败,连接超时!");
  }终于{
  如果(在 !=null){
  试试{
  in.close();
  }catch(异常 e){
  e.getStackTrace();
  }
  
  }
  }
  返回缓冲区.toString();
  }
  public static void main(String[] args) {
  System.out.println("开始爬取网页源码");
  //根据URL和页面的代码集获取网页的源代码
  字符串 url="";
  字符串编码="utf-8";
  String str=getHtmlResourceByURL(url, encoding);
  System.out.println(str);
  //解析源码
  //解析需要下载的内容部分
  }
  } 查看全部

  干货内容:python网络爬虫学习笔记(4)静态网页抓取(一)知识
  1 信息 2 笔记 静态网页抓取(一)知识
  静态网页是纯HTML格式的网页,使用AJAX动态加载网页的数据不一定会出现在HTML代码中。
  对于静态网页,前面使用的Requests库非常有用。这次主要是详细介绍一下。
  Requests库使用前期工作(简述),安装介绍在notes(1)中,至于pycharm中使用库之前的工作,notes(3)有一个介绍,简而言之)首先是将库安装到项目中,这里单独粘贴其安装代码:
  pip install requests
  请求库 - 1 获取响应内容
  通常这样使用,返回一个响应响应对象(req是变量名,或者对象名):
  req = requests.get(url, 其它参数(可选择))
  req.encoding
req.status_code
req.text
……
  import requests
key_dict = {&#39;key1&#39;: &#39;value1&#39;}
req = requests.get(&#39;http://httpbin.org/get&#39;, params=key_dict)
  {
"args": {
<p>
"key1": "value1",
"key2": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.22.0"
},
"origin": "223.167.175.166, 223.167.175.166",
"url": "https://httpbin.org/get%3Fkey1 ... ot%3B
}
</p>
  POST 请求
  这段原文很清楚,我分段粘贴。
  除了GET请求外,有时还需要发送一些以表单形式编码的数据。比如登录时,请求是POST,因为如果使用GET请求,会在URL中显示密码,非常不安全。
  如果要实现POST请求,只需将字典传递给Requests中的data参数,请求时数据字典会自动编码为表单。
  def data_use():
key_dict = {&#39;key1&#39;: &#39;value1&#39;, &#39;key2&#39;: &#39;value2&#39;}
# 注意是post和data的组合
req = requests.post(&#39;http://httpbin.org/post&#39;, data=key_dict)
print(req.text)
<p>
</p>
  {
"args": {},
"data": "",
"files": {},
"form": {
"key1": "value1",
"key2": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "23",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.22.0"
},
"json": null,
"origin": "223.167.175.166, 223.167.175.166",
"url": "https://httpbin.org/post"
}
  入门到精通:java网页爬虫测试源码
  StringBuffer 缓冲区=new StringBuffer();
  网址 urlObj=null;
  URLConnection uc=null;
  InputStreamReader in=null;
  BufferedReader reader=null;
  试试{
  //建立网络连接
  urlObj=新网址(url);
  //打开网络连接
  uc=urlObj.openConnection();
  //创建网络输入流
  in=new InputStreamReader(uc.getInputStream(), encoding);
  //缓冲写文件流
  reader=new BufferedReader(in);
  //临时变量
  
  字符串 tempLine=null;
  //循环读取文件流
  while((tempLine=reader.readLine())!=null){
  //循环追加数据
  buffer.append(tempLine+"\n");
  }
  }catch(异常 e){
  e.getStackTrace();
  System.out.println("网页抓取失败,连接超时!");
  }终于{
  如果(在 !=null){
  试试{
  in.close();
  }catch(异常 e){
  e.getStackTrace();
  }
  
  }
  }
  返回缓冲区.toString();
  }
  public static void main(String[] args) {
  System.out.println("开始爬取网页源码");
  //根据URL和页面的代码集获取网页的源代码
  字符串 url="";
  字符串编码="utf-8";
  String str=getHtmlResourceByURL(url, encoding);
  System.out.println(str);
  //解析源码
  //解析需要下载的内容部分
  }
  }

少有的福利网站,不要再被封杀了

网站优化优采云 发表了文章 • 0 个评论 • 94 次浏览 • 2022-09-02 10:11 • 来自相关话题

  少有的福利网站,不要再被封杀了
  在国外有这么个神奇的网站,可从任何网站,抓取网页上所有的图像,然后进行打包下载。质量也是非常的棒,可完美解决批量下载等诸多问题。
  Image Cyborg
  网站的主要功能就是抓取并下载网页中的所有图像。除此之外它还有图片处理、PDF处理、网页转为PDF、网页视频转为MP3 等多达33个在线工具,而且每个都带有详细介绍
  
  网页图像下载:支持的图像格式有png,svg,jpeg,jpg,gif,bmp,eps,icns,im,mps,pcx,ppm,spider,tiff,webp ,xbm
  比如我想下载下面网页中的美食图片,只需把该网址粘贴到 Image Cyborg 中,它便会自动抓取该网页内的所有图片。
  支持打包下载到本地。速度也是很快,1000 多张图片不到 1 分钟就下载完成
  测试网站▼:
  
  可以看到图片很多都是高清原图,和在网站上直接下载没什么区别
  由于网页中含有不少只有十几 KB 的缩略图。所以还需最后一步,按大小筛选,把小于100KB 的直接删除,只保留高质量的图片即可
  放张图感受一下▼
  既然网站中所有图像都可以下载,那表情包之类的动态图片当然也不例外。步骤和上面一样,直接复制链接一键下载到本地! 查看全部

  少有的福利网站,不要再被封杀了
  在国外有这么个神奇的网站,可从任何网站,抓取网页上所有的图像,然后进行打包下载。质量也是非常的棒,可完美解决批量下载等诸多问题。
  Image Cyborg
  网站的主要功能就是抓取并下载网页中的所有图像。除此之外它还有图片处理、PDF处理、网页转为PDF、网页视频转为MP3 等多达33个在线工具,而且每个都带有详细介绍
  
  网页图像下载:支持的图像格式有png,svg,jpeg,jpg,gif,bmp,eps,icns,im,mps,pcx,ppm,spider,tiff,webp ,xbm
  比如我想下载下面网页中的美食图片,只需把该网址粘贴到 Image Cyborg 中,它便会自动抓取该网页内的所有图片。
  支持打包下载到本地。速度也是很快,1000 多张图片不到 1 分钟就下载完成
  测试网站▼:
  
  可以看到图片很多都是高清原图,和在网站上直接下载没什么区别
  由于网页中含有不少只有十几 KB 的缩略图。所以还需最后一步,按大小筛选,把小于100KB 的直接删除,只保留高质量的图片即可
  放张图感受一下▼
  既然网站中所有图像都可以下载,那表情包之类的动态图片当然也不例外。步骤和上面一样,直接复制链接一键下载到本地!

Excel教程Excel函数Excel透视表Excel电子表格Excel基础入门到精通Excel实用技巧Excel2010高效办公office2010Excel视频教程

网站优化优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2022-08-26 10:00 • 来自相关话题

  Excel教程Excel函数Excel透视表Excel电子表格Excel基础入门到精通Excel实用技巧Excel2010高效办公office2010Excel视频教程
  抓取动态网页,加载到页面上的内容一定有offset值,获取offset值并加载原网页,
  forin-eachwilluseit,notforwhetherornothappeningin-eachwilluseit,notforwhetherornothappeningin-eachwilluseit,forwhetherornothappeningin-eachforwhetherornothappeningin-each。
  
<p>for(i=0;i 查看全部

  Excel教程Excel函数Excel透视表Excel电子表格Excel基础入门到精通Excel实用技巧Excel2010高效办公office2010Excel视频教程
  抓取动态网页,加载到页面上的内容一定有offset值,获取offset值并加载原网页,
  forin-eachwilluseit,notforwhetherornothappeningin-eachwilluseit,notforwhetherornothappeningin-eachwilluseit,forwhetherornothappeningin-eachforwhetherornothappeningin-each。
  
<p>for(i=0;i

校园网默认是开的,那数据量怎么处理?

网站优化优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2022-08-22 20:03 • 来自相关话题

  校园网默认是开的,那数据量怎么处理?
  抓取动态网页,如果显示出问题不去解决,那数据量怎么处理,怎么保证即时性。连接到服务器,可以做很多事,但如果数据量大,时延会很慢。
  
  post提交那个202客户端不打开就以为你post了要显示页面就必须得连接服务器注意打开窗口的加载
  问题不在你,是运营商没有提供同步接口,必须上网后实时同步你的上网地址,这个才是最难解决的。
  
  记得以前听网络工程师说过,当时连接的其实不是运营商而是你和学校系统,那是因为系统,也就是校园网默认是开的,运营商这边根本没有写好,你在联网的过程中他们可能会窃听或者和其他运营商进行合作,偷走你的地址,也就是从你的学校路由出去可能会覆盖到更多同学,那么这个时候如果来了一个大件,就断网了所以这个时候运营商只能自己提供同步接口,或者学校自己要发布一个给运营商直接连接,这个时候你的地址会生成一个号,然后由运营商这边做负载均衡,那么你的大件自然会均匀的分布到每个人的网络内,运营商也就断不了你的网。
  ==所以就出现了你说的状况。你说你的同学地址一共6个省份会断掉一个,实际上可能这个同学省份也就2个!!!你所说的导致你同学号出问题就说明由于你以前对地址的修改(确定是你真的修改了,或者没有作过修改?或者修改成功了,只是改错了?)造成了这个号出问题,你可以和相关部门反映一下,用你们的帐号登录学校的服务器查看自己的过程是否严谨,如果没有错误说明你修改的内容没有和你校园网其他的同学重叠,如果有错误说明学校服务器收录了这个号码,以致出现你理解的同步问题!!=。 查看全部

  校园网默认是开的,那数据量怎么处理?
  抓取动态网页,如果显示出问题不去解决,那数据量怎么处理,怎么保证即时性。连接到服务器,可以做很多事,但如果数据量大,时延会很慢。
  
  post提交那个202客户端不打开就以为你post了要显示页面就必须得连接服务器注意打开窗口的加载
  问题不在你,是运营商没有提供同步接口,必须上网后实时同步你的上网地址,这个才是最难解决的。
  
  记得以前听网络工程师说过,当时连接的其实不是运营商而是你和学校系统,那是因为系统,也就是校园网默认是开的,运营商这边根本没有写好,你在联网的过程中他们可能会窃听或者和其他运营商进行合作,偷走你的地址,也就是从你的学校路由出去可能会覆盖到更多同学,那么这个时候如果来了一个大件,就断网了所以这个时候运营商只能自己提供同步接口,或者学校自己要发布一个给运营商直接连接,这个时候你的地址会生成一个号,然后由运营商这边做负载均衡,那么你的大件自然会均匀的分布到每个人的网络内,运营商也就断不了你的网。
  ==所以就出现了你说的状况。你说你的同学地址一共6个省份会断掉一个,实际上可能这个同学省份也就2个!!!你所说的导致你同学号出问题就说明由于你以前对地址的修改(确定是你真的修改了,或者没有作过修改?或者修改成功了,只是改错了?)造成了这个号出问题,你可以和相关部门反映一下,用你们的帐号登录学校的服务器查看自己的过程是否严谨,如果没有错误说明你修改的内容没有和你校园网其他的同学重叠,如果有错误说明学校服务器收录了这个号码,以致出现你理解的同步问题!!=。

爬取游戏之单线程的技术知识-乐题库

网站优化优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2022-08-19 20:04 • 来自相关话题

  爬取游戏之单线程的技术知识-乐题库
  抓取动态网页,用于统计好友的好友列表,好友数量等详细信息,单线程没问题。爬取游戏相关的内容,用于优化服务器性能。自己写了一个blog作为技术博客,分享一些技术知识。
  
  你是没用过qos:qualityofserviceavailability.我们做公有云编排,常用到的编排技术有:gevent,proxy.实现的效果跟开源的编排系统,还有你说的单线程。基本是nginx等来负责服务服务的开启与关闭,连接池来保证资源的均衡使用。requestdirectory来保证这些request能够进行有效的递减。
  另外你说的多线程对于网络通信来说的确是存在的。但是我们是单线程为主,好的程序一般没必要考虑线程冲突的问题。
  
  一般来说,大部分业务系统,有三种架构,分别是:单体应用架构,单模块架构,分布式架构。单体应用架构:即仅服务于单个应用的业务系统,一般面向某一特定领域,在客户端为不同业务模块独立而服务。该架构最典型的应用系统,是开发基于java的各种内部业务系统,客户端仅对每个模块单独提供服务,此类系统的好处是调试上层应用速度较快,正常的系统生命周期大概2-3周。
  但是,由于微服务架构的需要,必须基于网络来进行代码编写。单模块架构:各业务模块都放在一个虚拟机上,互不打扰,可以称之为微服务架构。此架构的最大好处是降低网络带宽和硬件资源的消耗,而且可以为不同模块规划子模块,并在其基础上扩展。服务间开发模块耦合程度较低,可以充分发挥系统灵活性,但是,它最常用于分布式网络的应用中。
  分布式服务架构:这种架构的服务可以在不同的虚拟机上运行,通过网络相互调用,通过通信中间件形成通信流水线,适合于分布式小规模的业务系统。通常,我们所说的多线程,就是指的分布式服务架构。 查看全部

  爬取游戏之单线程的技术知识-乐题库
  抓取动态网页,用于统计好友的好友列表,好友数量等详细信息,单线程没问题。爬取游戏相关的内容,用于优化服务器性能。自己写了一个blog作为技术博客,分享一些技术知识。
  
  你是没用过qos:qualityofserviceavailability.我们做公有云编排,常用到的编排技术有:gevent,proxy.实现的效果跟开源的编排系统,还有你说的单线程。基本是nginx等来负责服务服务的开启与关闭,连接池来保证资源的均衡使用。requestdirectory来保证这些request能够进行有效的递减。
  另外你说的多线程对于网络通信来说的确是存在的。但是我们是单线程为主,好的程序一般没必要考虑线程冲突的问题。
  
  一般来说,大部分业务系统,有三种架构,分别是:单体应用架构,单模块架构,分布式架构。单体应用架构:即仅服务于单个应用的业务系统,一般面向某一特定领域,在客户端为不同业务模块独立而服务。该架构最典型的应用系统,是开发基于java的各种内部业务系统,客户端仅对每个模块单独提供服务,此类系统的好处是调试上层应用速度较快,正常的系统生命周期大概2-3周。
  但是,由于微服务架构的需要,必须基于网络来进行代码编写。单模块架构:各业务模块都放在一个虚拟机上,互不打扰,可以称之为微服务架构。此架构的最大好处是降低网络带宽和硬件资源的消耗,而且可以为不同模块规划子模块,并在其基础上扩展。服务间开发模块耦合程度较低,可以充分发挥系统灵活性,但是,它最常用于分布式网络的应用中。
  分布式服务架构:这种架构的服务可以在不同的虚拟机上运行,通过网络相互调用,通过通信中间件形成通信流水线,适合于分布式小规模的业务系统。通常,我们所说的多线程,就是指的分布式服务架构。

查找网站真实 IP 的方法

网站优化优采云 发表了文章 • 0 个评论 • 68 次浏览 • 2022-08-04 04:35 • 来自相关话题

  查找网站真实 IP 的方法
  情报分析师
  全国警务人员和情报人员都在关注
  首先,我们来认识下最寻常的真实ip隐藏的方法“CDN”。
  内容分发网络(content delivery network或content distribution network,缩写作CDN)指一种通过互联网互相连接的电脑网络系统,利用最靠近每位用户的服务器,更快、更可靠地将音乐、图片、视频、应用程序及其他文件发送给用户,来提供高性能、可扩展性及低成本的网络内容传递给用户。
  CDN节点会在多个地点,不同的网络上摆放。这些节点之间会动态的互相传输内容,对用户的下载行为最优化,并借此减少内容供应者所需要的带宽成本,改善用户的下载速度,提高系统的稳定性。
  运用一些命令查看,比如:ping、nslookup、ipconfig 这类方法需要打开windows的dos运行界面
  用nslookup命令查询想要查的域名,若是有多个ip就是用了cdn,多半不是真实IP;如图:
  其他方法类似
  
  用ping命令输入:ping
  用ipconfig命令输入:ipconfig
  可以从多个地点ping他们想要确认的域名,若返回的是不同的ip,那么服务器确定使用了cdn,返回的ip也不是服务器的真实ip;
  常用的网址有just ping:等等。
  1、子域名查找法
  因为cdn和反向代理是需要成本的,有的网站只在比较常用的域名使用cdn或反向代理,有的时候一些测试子域名和新的子域名都没来得及加入cdn和反向代理,所以有时候是通过查找子域名来查找网站的真实IP。下面介绍些常用的子域名查找的方法和工具:
  微步在线()
  上文提到的微步在线功能强大,黑客只需输入要查找的域名(如),点击子域名选项就可以查找它的子域名了,但是免费用户每月只有5次免费查询机会。如图:
  Dnsdb查询法。()
  黑客只需输入 type:A就能收集百度的子域名和ip了。如图:
  
  Google 搜索
  Google site: -www就能查看除www外的子域名,如图:
  各种子域名扫描器
  这里,主要为大家推荐子域名挖掘机和lijiejie的subdomainbrute()
  子域名挖掘机仅需输入域名即可基于字典挖掘它的子域名,如图:
  Subdomainbrute以windows为例,黑客仅需打开cmd进入它所在的目录输入Python subdomainbrute.py --full即可收集百度的子域名,如图:
  总结:收集子域名后尝试以解析ip不在cdn上的ip解析主站,真实ip成功被获取到。
  2、IP历史记录解析查询法
  有的网站是后来才加入CDN的,所以只需查询它的解析历史即可获取真实ip,这里我们就简单介绍几个网站:微步在线,dnsdb.ionetcraft(),Viewdns()等等。
  3、网站漏洞查找法
  通过网站的信息泄露如phpinfo泄露,github信息泄露,命令执行等漏洞获取真实ip。 查看全部

  查找网站真实 IP 的方法
  情报分析师
  全国警务人员和情报人员都在关注
  首先,我们来认识下最寻常的真实ip隐藏的方法“CDN”。
  内容分发网络(content delivery network或content distribution network,缩写作CDN)指一种通过互联网互相连接的电脑网络系统,利用最靠近每位用户的服务器,更快、更可靠地将音乐、图片、视频、应用程序及其他文件发送给用户,来提供高性能、可扩展性及低成本的网络内容传递给用户。
  CDN节点会在多个地点,不同的网络上摆放。这些节点之间会动态的互相传输内容,对用户的下载行为最优化,并借此减少内容供应者所需要的带宽成本,改善用户的下载速度,提高系统的稳定性。
  运用一些命令查看,比如:ping、nslookup、ipconfig 这类方法需要打开windows的dos运行界面
  用nslookup命令查询想要查的域名,若是有多个ip就是用了cdn,多半不是真实IP;如图:
  其他方法类似
  
  用ping命令输入:ping
  用ipconfig命令输入:ipconfig
  可以从多个地点ping他们想要确认的域名,若返回的是不同的ip,那么服务器确定使用了cdn,返回的ip也不是服务器的真实ip;
  常用的网址有just ping:等等。
  1、子域名查找法
  因为cdn和反向代理是需要成本的,有的网站只在比较常用的域名使用cdn或反向代理,有的时候一些测试子域名和新的子域名都没来得及加入cdn和反向代理,所以有时候是通过查找子域名来查找网站的真实IP。下面介绍些常用的子域名查找的方法和工具:
  微步在线()
  上文提到的微步在线功能强大,黑客只需输入要查找的域名(如),点击子域名选项就可以查找它的子域名了,但是免费用户每月只有5次免费查询机会。如图:
  Dnsdb查询法。()
  黑客只需输入 type:A就能收集百度的子域名和ip了。如图:
  
  Google 搜索
  Google site: -www就能查看除www外的子域名,如图:
  各种子域名扫描器
  这里,主要为大家推荐子域名挖掘机和lijiejie的subdomainbrute()
  子域名挖掘机仅需输入域名即可基于字典挖掘它的子域名,如图:
  Subdomainbrute以windows为例,黑客仅需打开cmd进入它所在的目录输入Python subdomainbrute.py --full即可收集百度的子域名,如图:
  总结:收集子域名后尝试以解析ip不在cdn上的ip解析主站,真实ip成功被获取到。
  2、IP历史记录解析查询法
  有的网站是后来才加入CDN的,所以只需查询它的解析历史即可获取真实ip,这里我们就简单介绍几个网站:微步在线,dnsdb.ionetcraft(),Viewdns()等等。
  3、网站漏洞查找法
  通过网站的信息泄露如phpinfo泄露,github信息泄露,命令执行等漏洞获取真实ip。

吕梁商城网站建设价格(吕梁市网上商城)

网站优化优采云 发表了文章 • 0 个评论 • 18 次浏览 • 2022-07-16 13:05 • 来自相关话题

  吕梁商城网站建设价格(吕梁市网上商城)
  吕梁商城网站建设价格(吕梁市网上商城)
  █百度排名联系排名大神【QQ/V:897569356】【╇飞机libing8899】专业网站搭建,网站搭建设计,系统程序开发,各种网站和小程序都可以做,H5平台制作-采票OA信用盘时间盘打赏台-APP制作,网站三端开发.专业搭建制作公司,一条龙搭建
  毫无疑问,在移动互联网时代,短视频已经成为用户最喜欢的内容形式,它容量大,方便,快捷,同文字和图片相比,更能满足现代人在感官体验上对视听一体的要求。
  
  静态化页面有利于搜索引擎蜘蛛的爬行抓取,简明的“xxx.html”地址比动态页面地址更便于让用户记忆。当用户打开静态化页面时,会减少读取的时间,让网站的响应速度更快;由于网站的路径更加直观,针对网站的排名也更容易提升;HTML静态化还可以使网站更加稳定。
  目标关键词是一个网站成功的与否,如果一开始在确定目标关键词不够谨慎,网站上线之后随意修改,那么很有可能会被搜索引擎“K掉”。
  前言:几乎所有行业都在为流量而感到焦虑,在这个五花八门的世界,到底该如何去选择广告投放的工具呢?惊梦对此进行了梳理如下:
  市场环境在不断变化,企业必须保持在这个领域的领先地位,才能击败对手,才能保持企业相关品牌在行业的地位。在2019年,要跟上时代的发展,更重要的是与此同时不要踩到发展道路上的陷阱。
  
  所以说到营销的变化,其实核心还在于用户感知的变化。有人也许会说,现在的抖音、快手直播带货跟十年前电视购物有什么区别?如果说从形式上说,确实没啥区别。
  为什么品牌的理性还没有产生?或者说大规模产生?品牌主在其他的渠道是理性的,大家知道这个渠道我应该花多少钱,哪个渠道应该花多少钱,但是为什么在抖音没有呢?
  相比上周的榜单几乎被美食内容占领,本周的美食内容大幅减少,只有6个视频,本周新增了穿搭、时尚以及萌宠类的视频内容。 查看全部

  吕梁商城网站建设价格(吕梁市网上商城)
  吕梁商城网站建设价格(吕梁市网上商城)
  █百度排名联系排名大神【QQ/V:897569356】【╇飞机libing8899】专业网站搭建,网站搭建设计,系统程序开发,各种网站和小程序都可以做,H5平台制作-采票OA信用盘时间盘打赏台-APP制作,网站三端开发.专业搭建制作公司,一条龙搭建
  毫无疑问,在移动互联网时代,短视频已经成为用户最喜欢的内容形式,它容量大,方便,快捷,同文字和图片相比,更能满足现代人在感官体验上对视听一体的要求。
  
  静态化页面有利于搜索引擎蜘蛛的爬行抓取,简明的“xxx.html”地址比动态页面地址更便于让用户记忆。当用户打开静态化页面时,会减少读取的时间,让网站的响应速度更快;由于网站的路径更加直观,针对网站的排名也更容易提升;HTML静态化还可以使网站更加稳定。
  目标关键词是一个网站成功的与否,如果一开始在确定目标关键词不够谨慎,网站上线之后随意修改,那么很有可能会被搜索引擎“K掉”。
  前言:几乎所有行业都在为流量而感到焦虑,在这个五花八门的世界,到底该如何去选择广告投放的工具呢?惊梦对此进行了梳理如下:
  市场环境在不断变化,企业必须保持在这个领域的领先地位,才能击败对手,才能保持企业相关品牌在行业的地位。在2019年,要跟上时代的发展,更重要的是与此同时不要踩到发展道路上的陷阱。
  
  所以说到营销的变化,其实核心还在于用户感知的变化。有人也许会说,现在的抖音、快手直播带货跟十年前电视购物有什么区别?如果说从形式上说,确实没啥区别。
  为什么品牌的理性还没有产生?或者说大规模产生?品牌主在其他的渠道是理性的,大家知道这个渠道我应该花多少钱,哪个渠道应该花多少钱,但是为什么在抖音没有呢?
  相比上周的榜单几乎被美食内容占领,本周的美食内容大幅减少,只有6个视频,本周新增了穿搭、时尚以及萌宠类的视频内容。

个人网站建设专业学校(网站建设专业好就业吗)

网站优化优采云 发表了文章 • 0 个评论 • 25 次浏览 • 2022-07-16 13:05 • 来自相关话题

  个人网站建设专业学校(网站建设专业好就业吗)
  个人网站建设专业学校(网站建设专业好就业吗)
  █百度排名联系排名大神【QQ/V:897569356】【╇飞机libing8899】专业网站搭建,网站搭建设计,系统程序开发,各种网站和小程序都可以做,H5平台制作-采票OA信用盘时间盘打赏台-APP制作,网站三端开发.专业搭建制作公司,一条龙搭建
  以我们国内为例,我们都很习惯去百度上搜索各种服务和产品信息,那么如果你的相关网页可以出现在搜索结果的前几页甚至是前几名,就可以获得大量的用户访问,由此带来巨大的实际收益。
  
  在大多数传统行业里,其实是没有“运营”的概念的。伴随着互联网和新媒体的发展,“运营”的功能和作用越来越被放大出来。而短视频的运营,其实也是新媒体运营概念里的一个具体分支,所以,想了解短视频运营,还是要回归到新媒体运营的本质上来。
  重庆入微文化传媒就是这样的一家mcn机构在直播、短视频和电商等多领域均具有广泛的影响!力,围绕“直播+”的商业生态持续助力于企业和个人影响力变现!团队具备优质的PGC能力,全域营销解决方案,以及丰富的商业经纪经验。公司目前全约孵化达人账号超过96个,如抖音短视频红人:棚棚朱古?、炫?.Derek、美少?壮? 、钟志煜(飘柔哥)、雾都?等;公会主播上万名;全网粉丝覆盖2亿+;总播放量超过65 亿。
  网页分为静态网页与动态衡水seo网页两种,动态网页即具有交互功能的网页,也就是通过数据库搜索返回数据,这样搜索引擎在搜索时所费的时间较长,而且一旦数据库中的内容更新,搜索引擎抓取的数据也不再准确,所以搜索引擎很少收录动态网络推广广告语网页,排名结果也不好。
  但是中海南网站优化小企业需要理解的是,查找竞价可以快速带来流量而不是带来收益,在接触一些小企业进行竞价后,发现大收获往往较小,这也是标价格具有成本效益的缺点,我想在排名前投放很多广告费,但是高输入有时不会产生高输出,所以有些公司喜欢和讨厌种族的价格。网络推广(非竞价推广方法)除非竞争性推广外,常见的推广方式有SEO全网推广自媒体推广和公众账号推广网站策划方案。另外,你可以想到的在线推广方法可以分为网络推广。
  
  哈尔滨竞价包年推广公司点击了解更多神马搜索seo优化排名,效果,就采用极端的手段去优网络营销运营化,其实这个时候只要你坚持,百度还是会给予好的排名,就是因为许多人觉得优化没有达到预期效果,就采用其他的非正规优化手段,结果排名下降,直至被K;许多企业的营销网站都缺失的,前期优化一直在坚持,按照搜索引擎优化规则,但一直难以看到友好度保持不够坚。
  湖北君寻网络科技有限公司,主要专注于互联网推广服务,公司致力于为中小企业客户提供专业的大数据全媒体推广、互联网推广、网站建设、SEO优化、关键词排名、运营顾问、运营规划与指导等服务。推广:社交类:**朋友圈、微博粉丝通、陌陌app、微博DSP定向地区:可针对全国或任意地区,投放;优质平台,即开即投:优质平台,即开网络营销模式有哪些即投:定向时段:可针对如白天晚上或周末等,时段投放;搜索类:神马搜索、百度、360、搜狗定向人群:可针对性别、爱好或任意属性,投放;定向时段:可针对如白天晚上或周末等,时段投放;30+平台,五大功能:搜索类:神马搜索、百度、360、搜狗?手机:*?**:****本文章截至更新日期:人民网2019年11月12讯(记者:翁奇羽)本内容为公司原创,转载本文标题以及内容,请注明来源,分享和转载)广东无网络销售是什么忧云网络科技有限公司为您详细解读XzMLCf广州推广怎么样的相关知识与详情,寡所周知,网站SEO优化实际上涉及到很多工做,从网站要求到网站建立,到SEO优化排名,涉及到很多专业常识,并且往往需要一个团队来完成所有的工做。既然涉及营销策略,那我们不得不提品牌营销的特点及优势,既然深受欢迎就证明这项策略能为的发展创造价值。
  1,作为网站优化师我们要监seo教学控网站运营状态。网站分析最基本的应用就是监控网站的运营状态。收集网站日常产生的各类企业网站推广方案数据,包括浏览量、点击量、IP数等,并通过统计这些数据生成相应的报表,对网站的运营状态进行系统的展现。从浏览量、点击量等数据的变化趋势,以及页面访问时长、页面跳出率等数据,能帮助运营者从各个角度了解网站的状况是否良好。 查看全部

  个人网站建设专业学校(网站建设专业好就业吗)
  个人网站建设专业学校(网站建设专业好就业吗)
  █百度排名联系排名大神【QQ/V:897569356】【╇飞机libing8899】专业网站搭建,网站搭建设计,系统程序开发,各种网站和小程序都可以做,H5平台制作-采票OA信用盘时间盘打赏台-APP制作,网站三端开发.专业搭建制作公司,一条龙搭建
  以我们国内为例,我们都很习惯去百度上搜索各种服务和产品信息,那么如果你的相关网页可以出现在搜索结果的前几页甚至是前几名,就可以获得大量的用户访问,由此带来巨大的实际收益。
  
  在大多数传统行业里,其实是没有“运营”的概念的。伴随着互联网和新媒体的发展,“运营”的功能和作用越来越被放大出来。而短视频的运营,其实也是新媒体运营概念里的一个具体分支,所以,想了解短视频运营,还是要回归到新媒体运营的本质上来。
  重庆入微文化传媒就是这样的一家mcn机构在直播、短视频和电商等多领域均具有广泛的影响!力,围绕“直播+”的商业生态持续助力于企业和个人影响力变现!团队具备优质的PGC能力,全域营销解决方案,以及丰富的商业经纪经验。公司目前全约孵化达人账号超过96个,如抖音短视频红人:棚棚朱古?、炫?.Derek、美少?壮? 、钟志煜(飘柔哥)、雾都?等;公会主播上万名;全网粉丝覆盖2亿+;总播放量超过65 亿。
  网页分为静态网页与动态衡水seo网页两种,动态网页即具有交互功能的网页,也就是通过数据库搜索返回数据,这样搜索引擎在搜索时所费的时间较长,而且一旦数据库中的内容更新,搜索引擎抓取的数据也不再准确,所以搜索引擎很少收录动态网络推广广告语网页,排名结果也不好。
  但是中海南网站优化小企业需要理解的是,查找竞价可以快速带来流量而不是带来收益,在接触一些小企业进行竞价后,发现大收获往往较小,这也是标价格具有成本效益的缺点,我想在排名前投放很多广告费,但是高输入有时不会产生高输出,所以有些公司喜欢和讨厌种族的价格。网络推广(非竞价推广方法)除非竞争性推广外,常见的推广方式有SEO全网推广自媒体推广和公众账号推广网站策划方案。另外,你可以想到的在线推广方法可以分为网络推广。
  
  哈尔滨竞价包年推广公司点击了解更多神马搜索seo优化排名,效果,就采用极端的手段去优网络营销运营化,其实这个时候只要你坚持,百度还是会给予好的排名,就是因为许多人觉得优化没有达到预期效果,就采用其他的非正规优化手段,结果排名下降,直至被K;许多企业的营销网站都缺失的,前期优化一直在坚持,按照搜索引擎优化规则,但一直难以看到友好度保持不够坚。
  湖北君寻网络科技有限公司,主要专注于互联网推广服务,公司致力于为中小企业客户提供专业的大数据全媒体推广、互联网推广、网站建设、SEO优化、关键词排名、运营顾问、运营规划与指导等服务。推广:社交类:**朋友圈、微博粉丝通、陌陌app、微博DSP定向地区:可针对全国或任意地区,投放;优质平台,即开即投:优质平台,即开网络营销模式有哪些即投:定向时段:可针对如白天晚上或周末等,时段投放;搜索类:神马搜索、百度、360、搜狗定向人群:可针对性别、爱好或任意属性,投放;定向时段:可针对如白天晚上或周末等,时段投放;30+平台,五大功能:搜索类:神马搜索、百度、360、搜狗?手机:*?**:****本文章截至更新日期:人民网2019年11月12讯(记者:翁奇羽)本内容为公司原创,转载本文标题以及内容,请注明来源,分享和转载)广东无网络销售是什么忧云网络科技有限公司为您详细解读XzMLCf广州推广怎么样的相关知识与详情,寡所周知,网站SEO优化实际上涉及到很多工做,从网站要求到网站建立,到SEO优化排名,涉及到很多专业常识,并且往往需要一个团队来完成所有的工做。既然涉及营销策略,那我们不得不提品牌营销的特点及优势,既然深受欢迎就证明这项策略能为的发展创造价值。
  1,作为网站优化师我们要监seo教学控网站运营状态。网站分析最基本的应用就是监控网站的运营状态。收集网站日常产生的各类企业网站推广方案数据,包括浏览量、点击量、IP数等,并通过统计这些数据生成相应的报表,对网站的运营状态进行系统的展现。从浏览量、点击量等数据的变化趋势,以及页面访问时长、页面跳出率等数据,能帮助运营者从各个角度了解网站的状况是否良好。

抓取动态网页时需要全局变量,使用json能较为简单

网站优化优采云 发表了文章 • 0 个评论 • 97 次浏览 • 2022-07-12 05:01 • 来自相关话题

  抓取动态网页时需要全局变量,使用json能较为简单
  抓取动态网页时需要全局变量,处理动态数据比较繁琐。如果仅仅需要获取每个栏目下的名称,列表等信息,使用json能较为简单。本教程对初学者比较友好,操作步骤简单,让你的chrome浏览器随时处理动态数据。chrome浏览器首先我们需要下载这个jsonx扩展程序,github地址是:。下载了扩展程序后,我们需要先手动安装,安装过程比较繁琐。
  如果是对json有较为熟悉的同学,可以直接使用“分析json数据”命令。例如我已经自行完成了登录和网页的编码修改,需要编码修改命令即可。注意必须要将你电脑上的json解析库安装至系统环境中,例如在linux下只能手动编译安装,linux可以google上查找最新的版本。regedit打开chrome浏览器,通过打开开发者工具。
  
  在f12键中的“开发者工具”选项卡中,选择“network”选项卡。如果你觉得找不到你需要的json,是因为你选择的浏览器中不支持json解析库,我们可以通过手动设置的方式来解决。我是这样设置的,打开开发者工具后,选择菜单栏的“tools”-->“jsonapi”,切换到“addtolibrary”选项卡。
  我们的jsonx扩展程序路径如下:f:\jsonx\。鼠标右键属性,将version属性选中f12,即可看到更多信息。本教程选择默认值即可。如果你选择不正确也可以手动修改。设置完成后点击“打开”即可进入修改过程。修改后的结果如下:网页列表-查看json数据列表列表数据每一个栏目所有的数据如果列表数据还不能完整显示,请右键列表属性->headertext属性设置你想显示的内容。
  
  比如我只是把列表名称改成中文,并没有添加对应的表头。下面我们要把列表数据修改为内容可显示,把原本的中文改成英文。修改json数据需要把json数据移到“#jsonx”属性中,并设置数据的json格式。代码如下:chrome浏览器点击浏览器右上角的“刷新”按钮,我们需要重新来分析content-type变量。
  首先我们还是点击浏览器右上角的“刷新”按钮,进入浏览器的刷新页面动作。然后我们就可以来看json变量的格式是怎样的。json变量可理解为javascript对象,jsondata里包含了变量的值,而json变量是字符串。chrome浏览器的数字类型通常不是以十六进制显示,而是以特殊的写法进行类型转换。
  其对象的json格式如下:${fields.value}值必须是一个数字,且必须用formdata标签在外面包裹。注意:对同一个属性只能有一个fields属性,属性对象是原始的对象,但方法fields属性中必须有一个value属性。验证方法:bash(jsonx.json)>${fields.value}关于变量的顺序,如下:数字从小到大, 查看全部

  抓取动态网页时需要全局变量,使用json能较为简单
  抓取动态网页时需要全局变量,处理动态数据比较繁琐。如果仅仅需要获取每个栏目下的名称,列表等信息,使用json能较为简单。本教程对初学者比较友好,操作步骤简单,让你的chrome浏览器随时处理动态数据。chrome浏览器首先我们需要下载这个jsonx扩展程序,github地址是:。下载了扩展程序后,我们需要先手动安装,安装过程比较繁琐。
  如果是对json有较为熟悉的同学,可以直接使用“分析json数据”命令。例如我已经自行完成了登录和网页的编码修改,需要编码修改命令即可。注意必须要将你电脑上的json解析库安装至系统环境中,例如在linux下只能手动编译安装,linux可以google上查找最新的版本。regedit打开chrome浏览器,通过打开开发者工具。
  
  在f12键中的“开发者工具”选项卡中,选择“network”选项卡。如果你觉得找不到你需要的json,是因为你选择的浏览器中不支持json解析库,我们可以通过手动设置的方式来解决。我是这样设置的,打开开发者工具后,选择菜单栏的“tools”-->“jsonapi”,切换到“addtolibrary”选项卡。
  我们的jsonx扩展程序路径如下:f:\jsonx\。鼠标右键属性,将version属性选中f12,即可看到更多信息。本教程选择默认值即可。如果你选择不正确也可以手动修改。设置完成后点击“打开”即可进入修改过程。修改后的结果如下:网页列表-查看json数据列表列表数据每一个栏目所有的数据如果列表数据还不能完整显示,请右键列表属性->headertext属性设置你想显示的内容。
  
  比如我只是把列表名称改成中文,并没有添加对应的表头。下面我们要把列表数据修改为内容可显示,把原本的中文改成英文。修改json数据需要把json数据移到“#jsonx”属性中,并设置数据的json格式。代码如下:chrome浏览器点击浏览器右上角的“刷新”按钮,我们需要重新来分析content-type变量。
  首先我们还是点击浏览器右上角的“刷新”按钮,进入浏览器的刷新页面动作。然后我们就可以来看json变量的格式是怎样的。json变量可理解为javascript对象,jsondata里包含了变量的值,而json变量是字符串。chrome浏览器的数字类型通常不是以十六进制显示,而是以特殊的写法进行类型转换。
  其对象的json格式如下:${fields.value}值必须是一个数字,且必须用formdata标签在外面包裹。注意:对同一个属性只能有一个fields属性,属性对象是原始的对象,但方法fields属性中必须有一个value属性。验证方法:bash(jsonx.json)>${fields.value}关于变量的顺序,如下:数字从小到大,

【第1268期】字蛛+发布!支持动态渲染、远程多页面字体压缩

网站优化优采云 发表了文章 • 0 个评论 • 188 次浏览 • 2022-06-19 23:23 • 来自相关话题

  【第1268期】字蛛+发布!支持动态渲染、远程多页面字体压缩
  前言
  字蛛在2016年的时候就知道了,当今天再次看到的时候更多想起网页游戏的官网跟活动页,可能在这类型的设计还原中蛮有适用场景的。今日早读文章由腾讯tgideas@Allan投稿分享。
  @Allan,来自腾讯互娱tgideas团队,负责游戏相关的web业务。喜欢鼓捣提高生产力的前端工具和研究创意相关的技术实现。
  正文从这开始~
  自从多年前刚入行的时候,中文自定义字体在网页上差不多只有一种存在,那就是“图片”。因为中文字体的体积实在太大了,还存在各种问题,这多多少少限制了中文网页在设计上的发展,但是人们也没有停下寻找解决方案的脚步。比如前nodejs时代的各种GUI工具,nodejs时代的fontmin、font-spider(字蛛)
  目前来说,最方便的要数font-spider(字蛛)了,它可以自动提取网页里面使用的自定义字体的文字,并且输出多终端兼容。在大多数不需要兼容IE7(大部分IE8还是网吧客户端内嵌页面)的现在,很多专题都十分适合使用字蛛压缩自定义字体。例如这个专题的倒计时文字:
  
  倒计时
  但是为什么稍大型项目或是单页应用不太推荐使用呢?
  从我的使用体验和字蛛的一些issue上来看,虽然字蛛已经是字体优化界的宇宙第一了,但是还存在几个问题:
  1、不支持动态渲染的项目
  2、不支持GBK编码
  3、多页面的支持不友好
  4、在线页面配置繁琐
  在做堡垒之夜官网的时候,刚好碰到了这样几个问题,GBK编码、有些元素是脚本插入的、有些页面是系统生成的,用字蛛十分痛苦。于是就想能不能搭配无头浏览器把线上页面down在本地之后,模拟出适合字蛛的环境。
  说干就干,经过一段时间的鼓捣,FSP(font-spider-plus)工具腾空发布啦!从现在开始,彻底拥抱中文WebFont时代!
  原理:使用puppeteer分析线上页面 -> 合并压缩线上页面外联样式 -> 样式添加到线上页面文本流 -> 用font-spider api压缩WebFont
  FSP除了兼容字蛛的所有特性以外,它还支持GBK编码,支持线上多页面配置、支持vue等动态渲染的界面!
  使用概览
  
  示例中70个字体压缩后各兼容版本只需要10K~26K,不仅提高浏览器加载速度,扩展性也更好!改文字改大小甚至改简单的效果再也不需要麻烦射鸡湿了。
  特性
  除了兼容font-spider(字蛛)支持的特性:
  font-spider-plus(字蛛+)还具有以下特性:
  安装
      npm i font-spider-plus -g
  使用范例一、书写 CSS
  出自:font-spider中文文档
  /*声明 WebFont*/<br style="box-sizing: border-box;" />@font-face {  <br style="box-sizing: border-box;" />    font-family: 'source'; <br style="box-sizing: border-box;" />    src: url('../font/source.eot');  <br style="box-sizing: border-box;" />    src: url('../font/source.eot?#font-spider') format('embedded-opentype'),    <br style="box-sizing: border-box;" />    url('../font/source.woff2') format('woff2'),    <br style="box-sizing: border-box;" />    url('../font/source.woff') format('woff'),    <br style="box-sizing: border-box;" />    url('../font/source.ttf') format('truetype'),    <br style="box-sizing: border-box;" />    url('../font/source.svg') format('svg');  <br style="box-sizing: border-box;" />    font-weight: normal;  <br style="box-sizing: border-box;" />    font-style: normal;<br style="box-sizing: border-box;" />}<br style="box-sizing: border-box;" />/*使用指定字体*/<br style="box-sizing: border-box;" />.home h1, .demo > .test {font-family: 'source';}
  特别说明:@font-face中的src定义的 .ttf 文件必须存在,其余的格式将由工具自动生成
  二、压缩本地WebFont
  fsp local [options]
  特别说明:htmlFile支持通配符,例如.htm,.shtml
  三、压缩URL中的WebFont1、初始化fspconfig文件
  fsp init
  在根目录下生成fspconfig.js文件
  2、完善fspconfig.js文件
  {    <br style="box-sizing: border-box;" />    /**     <br style="box-sizing: border-box;" />    * 本地font存放路径    
   * @type    {String}    
   */    <br style="box-sizing: border-box;" />    "localPath" : "../font/",    <br style="box-sizing: border-box;" />    /**     <br style="box-sizing: border-box;" />    * 线上字体文件路径 (网址中样式文件内font-family的src路径)    
   * @type    {String}    
   */    <br style="box-sizing: border-box;" />    "onlinePath" : "../font/",    <br style="box-sizing: border-box;" />    /**     <br style="box-sizing: border-box;" />    * URL    
   * @type    {Array}    
   */    <br style="box-sizing: border-box;" />    "url" :  [    <br style="box-sizing: border-box;" />        "http://ieg.tencent.com/",    <br style="box-sizing: border-box;" />        "http://game.qq.com/"<br style="box-sizing: border-box;" />    ]<br style="box-sizing: border-box;" />}
  3、执行
  fsp run
  示例文件下载:
  项目地址:
  最后,为你推荐
  关于本文 查看全部

  【第1268期】字蛛+发布!支持动态渲染、远程多页面字体压缩
  前言
  字蛛在2016年的时候就知道了,当今天再次看到的时候更多想起网页游戏的官网跟活动页,可能在这类型的设计还原中蛮有适用场景的。今日早读文章由腾讯tgideas@Allan投稿分享。
  @Allan,来自腾讯互娱tgideas团队,负责游戏相关的web业务。喜欢鼓捣提高生产力的前端工具和研究创意相关的技术实现。
  正文从这开始~
  自从多年前刚入行的时候,中文自定义字体在网页上差不多只有一种存在,那就是“图片”。因为中文字体的体积实在太大了,还存在各种问题,这多多少少限制了中文网页在设计上的发展,但是人们也没有停下寻找解决方案的脚步。比如前nodejs时代的各种GUI工具,nodejs时代的fontmin、font-spider(字蛛)
  目前来说,最方便的要数font-spider(字蛛)了,它可以自动提取网页里面使用的自定义字体的文字,并且输出多终端兼容。在大多数不需要兼容IE7(大部分IE8还是网吧客户端内嵌页面)的现在,很多专题都十分适合使用字蛛压缩自定义字体。例如这个专题的倒计时文字:
  
  倒计时
  但是为什么稍大型项目或是单页应用不太推荐使用呢?
  从我的使用体验和字蛛的一些issue上来看,虽然字蛛已经是字体优化界的宇宙第一了,但是还存在几个问题:
  1、不支持动态渲染的项目
  2、不支持GBK编码
  3、多页面的支持不友好
  4、在线页面配置繁琐
  在做堡垒之夜官网的时候,刚好碰到了这样几个问题,GBK编码、有些元素是脚本插入的、有些页面是系统生成的,用字蛛十分痛苦。于是就想能不能搭配无头浏览器把线上页面down在本地之后,模拟出适合字蛛的环境。
  说干就干,经过一段时间的鼓捣,FSP(font-spider-plus)工具腾空发布啦!从现在开始,彻底拥抱中文WebFont时代!
  原理:使用puppeteer分析线上页面 -> 合并压缩线上页面外联样式 -> 样式添加到线上页面文本流 -> 用font-spider api压缩WebFont
  FSP除了兼容字蛛的所有特性以外,它还支持GBK编码,支持线上多页面配置、支持vue等动态渲染的界面!
  使用概览
  
  示例中70个字体压缩后各兼容版本只需要10K~26K,不仅提高浏览器加载速度,扩展性也更好!改文字改大小甚至改简单的效果再也不需要麻烦射鸡湿了。
  特性
  除了兼容font-spider(字蛛)支持的特性:
  font-spider-plus(字蛛+)还具有以下特性:
  安装
      npm i font-spider-plus -g
  使用范例一、书写 CSS
  出自:font-spider中文文档
  /*声明 WebFont*/<br style="box-sizing: border-box;" />@font-face {  <br style="box-sizing: border-box;" />    font-family: 'source'; <br style="box-sizing: border-box;" />    src: url('../font/source.eot');  <br style="box-sizing: border-box;" />    src: url('../font/source.eot?#font-spider') format('embedded-opentype'),    <br style="box-sizing: border-box;" />    url('../font/source.woff2') format('woff2'),    <br style="box-sizing: border-box;" />    url('../font/source.woff') format('woff'),    <br style="box-sizing: border-box;" />    url('../font/source.ttf') format('truetype'),    <br style="box-sizing: border-box;" />    url('../font/source.svg') format('svg');  <br style="box-sizing: border-box;" />    font-weight: normal;  <br style="box-sizing: border-box;" />    font-style: normal;<br style="box-sizing: border-box;" />}<br style="box-sizing: border-box;" />/*使用指定字体*/<br style="box-sizing: border-box;" />.home h1, .demo > .test {font-family: 'source';}
  特别说明:@font-face中的src定义的 .ttf 文件必须存在,其余的格式将由工具自动生成
  二、压缩本地WebFont
  fsp local [options]
  特别说明:htmlFile支持通配符,例如.htm,.shtml
  三、压缩URL中的WebFont1、初始化fspconfig文件
  fsp init
  在根目录下生成fspconfig.js文件
  2、完善fspconfig.js文件
  {    <br style="box-sizing: border-box;" />    /**     <br style="box-sizing: border-box;" />    * 本地font存放路径    
   * @type    {String}    
   */    <br style="box-sizing: border-box;" />    "localPath" : "../font/",    <br style="box-sizing: border-box;" />    /**     <br style="box-sizing: border-box;" />    * 线上字体文件路径 (网址中样式文件内font-family的src路径)    
   * @type    {String}    
   */    <br style="box-sizing: border-box;" />    "onlinePath" : "../font/",    <br style="box-sizing: border-box;" />    /**     <br style="box-sizing: border-box;" />    * URL    
   * @type    {Array}    
   */    <br style="box-sizing: border-box;" />    "url" :  [    <br style="box-sizing: border-box;" />        "http://ieg.tencent.com/",    <br style="box-sizing: border-box;" />        "http://game.qq.com/"<br style="box-sizing: border-box;" />    ]<br style="box-sizing: border-box;" />}
  3、执行
  fsp run
  示例文件下载:
  项目地址:
  最后,为你推荐
  关于本文

抓取动态网页 “即使断网

网站优化优采云 发表了文章 • 0 个评论 • 40 次浏览 • 2022-06-18 12:21 • 来自相关话题

  抓取动态网页 “即使断网
  加入慢牛社区,共建 Web 3.0!知名CMS系统网站搭建商创始人构建第一个Web3.0网站,更喜欢IPFS API而不是亚马逊专有API。
  全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站
  “即使我的笔记本电脑与互联网断开连接,我的网页仍然可用”
  
  对于国内很多互联网从业者来说,CMS是再熟悉不过的建站程序了,自从有了CMS后,改变了过去网站搭建需要完全手动敲代码的尴尬,毋须四处去找免费的建站程序,从而也避免了被代码后门木马一类的攻击的威胁。
  CMS是content management system的英文缩写,即内容管理系统,是一种位于WEB前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。
  内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。
  内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  内容抓取工具国内比较熟悉的有优采云,小蜜蜂采集器,让没有时间打理自己网站的个人站长免去了需要繁杂的从其他网站复制粘贴内容的劳烦。
  
  近日,全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站,
  
  原文如下:
  今天,我将使用 web3 技术发布我的第一个网页。我将上传一个页面到 IPFS(星际文件系统),dries.eth使用 ENS(以太坊名称服务)使其可用,并使用支持 web3 的浏览器访问它。
  如果您不知道这意味着什么,请准备好参加速成课程。
  第1步:购买 ENS 域名
  去年,我铸造buytaert.eth了.,最近,我购买了dries.eth. 两者都是ENS 域名。
  ENS代表以太坊名称服务,是一种基于开源区块链的命名协议。
  您可以将 ENS 视为 web3 的 DNS。DNS 将域名映射到 IP 地址,ENS 将域名映射到以太坊地址。以太坊地址可以指向加密货币钱包、内容哈希等。
  ENS 不仅仅是以太坊的服务;它是使用智能合约在以太坊上构建的通用 web3 服务。因为 ENS 是建立在区块链之上的,所以它比 DNS 更能抵抗审查。
  今天,拥有自己的 ENS 域的主要用例是使接收加密货币更容易。如果你想给我寄一些以太币,你必须把它0xbAD65DE65AE2c23f5eA30d12fC8c2f883cbe671f寄到我的以太坊钱包的地址。因为我拥有dries.eth,所以您可以发送它dries.eth。更容易记住!
  dries.eth无需任何中间人就可以从世界任何地方的任何人那里未经许可地收集加密货币,这真是太神奇了。
  但是,这不是今天博客文章的主题。在这篇博文中,我想展示如何dries.eth使用它来托管一个完全去中心化的 web3 网页。
  如果您想购买.eth域名,可以在ENS 域名网站上购买。由于.eth域名是 NFT(非同质代币),您还可以在OpenSea等 NFT 市场买卖域名。
  ENS 于 2017 年 5 月推出时,它仅支持 ENS 原生 TLD .eth。自 2021 年 8 月起,ENS 增加了对完整 DNS 命名空间的支持。
  因此,如果您拥有DNS,则可以使用ENS Domains 网站为.
  第 2 步:将 HTML 文件上传到 IPFS
  IPFS是InterPlanetary File System的缩写,是一种用于存储和共享数据的开源协议和点对点网络。
  如今,大多数网页都存储在单个服务器上,托管在单个数据中心中。这些站点对单点故障、拒绝服务攻击或政府审查的弹性不大。
  更高级的网站使用CDN和其他缓存系统复制他们的网页。我的网站使用多个 Kubernetes Web 节点,Varnish 和 Cloudflare,但那是因为我的公司帮助运行了世界上一些最大的网站,而不是因为我的网站需要它。所有这些技术都可以用来提高网站的弹性。
  使用 IPFS,您的网页可以在全球数百个“IPFS 节点”上复制。世界上每个人都可以运行一个 IPFS 节点。
  节点创建一个单一的全球网络,网络中的每个文件都有一个唯一的全球标识符。
  从理论上讲,IPFS比传统的网站托管更具弹性。由于 IPFS 节点由世界各地不同的人和组织运行,并且内容在它们之间复制,因此托管的内容更能抵抗单点故障、拒绝服务攻击或政府审查。另一方面,缓和错误信息也更加困难。
  我之所以写“理论上”是因为上传到 IPFS 的内容只有在世界某个地方的一个节点选择托管它时才保持可用。
  默认情况下,IPFS 不包含用于激励网络中其他节点复制数据的内置机制。每个 IPFS 节点都倾向于托管自己的数据。其他节点可以合作复制数据,也可以作为服务复制数据。
  这就是Filecoin的用武之地。与 IPFS 一样,Filecoin 是一个开源协议。
  IPFS 本身不是基于区块链的,但 Filecoin 是。Filecoin 通过一个用于存储和复制数据的公共市场扩展了 IPFS。
  矿工可以赚取Filecoin(一种加密货币代币)以换取存储和复制 IPFS 数据。因为 Filecoin 是基于区块链的,所以市场不属于单一中介。存储交易由网络上的节点以编程方式进行代理。
  长话短说,要在 IPFS 上托管我的网页,我需要至少一个 IPFS 节点愿意托管我的内容。
  有两种解决方案:
  1)我可以运行我自己的 IPFS 节点或(2)我可以支付第三方 IPFS 服务来托管我的内容。
  运行我自己的 IPFS 节点
  本着帮助构建去中心化网络的精神,运行自己的 IPFS 节点应该是首选。您可以在下面看到我的本地 IPFS 节点托管我的index.html文件:
  
  
  因为我的本地 IPFS 节点在我的笔记本电脑上运行,所以我的网页只有在我的笔记本电脑连接到互联网时才可用。
  如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。
  我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  有几个朋友在 IPFS 上钉住彼此的网站,您不再需要为虚拟主机付费!
  第三方 IPFS 和 pinning 服务
  如果您不想运行自己的 IPFS 服务,或者您没有可以复制您的数据的朋友,您可以使用第三方 IPFS 和 pinning 服务。
  我找到了十几个固定服务,并尝试了以下方法:
  Infura使用其命令行工具可以轻松上传文件:
  $ ipfs-upload-client --id xxx --secret yyy ./index.html
  xxx是 Infura 项目 ID 和yyyInfura 项目密钥。
  Fleek和Pinata允许您从 Web 浏览器上传文件:
  
  
  如果您正在寻找基于 Filecoin 的解决方案,推荐使用web3.storage和estuary.tech。
  第 3 步:访问您的 web3 网页
  将文件上传到 IPFS 后,您将获得文件的“哈希”(唯一 ID 或地址)。index.html我的文件的哈希是:
  bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q可以使用与 IPFS 兼容的浏览器(例如Brave )访问托管在 IPFS 上的内容。
  Firefox、Safari 和 Chrome 目前不原生支持 IPFS,但存在各种 IPFS 浏览器扩展。
  使用 Brave,您可以访问我的网页ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q(注意ipfs://架构)。
  
  第 4 步:将您的网页映射到您的域名
  能够访问您的 IPFS 托管网站非常简洁,但您可能不会要求其他人在 ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q 上查看您的新网页。使用 60 个字符的十六进制散列并不完全理想。
  这就是 ENS 的用武之地。我只需将Content Resolver记录设置dries.eth为与我的网页关联的 IPFS 哈希。
  
  更新 ENS 记录会永久更新以太坊区块链的状态。
  这意味着您必须支付“汽油费”或网络交易费。
  正如你在Etherscan上看到的,更新我的 ENS 记录花了我0.004369 以太币(当时 11.69 美元)。
  您现在可以使用 ENS 和 IPFS 兼容的浏览器访问。瞧,一个真正去中心化的网站!
  
  ENS 和 IPFS 是网络的未来吗?
  有各种各样的大缺点:
  我相信这些缺点将在未来几年得到解决。有些人可能已经有了解决方案。
  撇开缺点不谈,我相信 IPFS 和 ENS 有希望:
  Web3 对开发者意味着什么?
  如果您是开发人员,请将 web3 视为不断增长的新“Web 服务”集合。
  IPFS 和 ENS 就是两个这样的 Web 服务。
  今天,它们主要提供改进的弹性和审查保护。
  如果弹性和审查保护对您的网站很重要,请使用它们。
  如果不是,您不必使用它们。
  作为的所有者和开发者,我不关心审查保护。出于这个原因,我很高兴继续使用传统的托管技术。
  但我确实认识到 IPFS 和 ENS 在未来可能会变得更有趣。
  在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。
  这包括其商业模式依赖于专有数据库和分类账的组织;金融机构、中央银行、某些非营利组织、社会团体。其中许多可以变成真正去中心化的网络服务。
  例如,许多商业网站使用 PayPal 或 Square 等中介提供贷款和贷款偿还计划。
  随着时间的推移,其中一些中介机构可能会被无需许可的分布式网络服务所取代,这些服务收取的利息和/或交易费用较低。
  想象一下有一天,商业网站无需中介即可直接向客户提供贷款偿还计划变得非常容易。当利润率受益时,技术解决方案就会迅速被采用。
  区块链还将使我们能够以新的方式解决协调和所有权问题。
  在网络上创建内容(图像、音乐、视频、博客文章)的每个人都可以从中受益。其他人使用您的内容并以编程方式将价值流回您的能力非常令人兴奋。
  最重要的是,我希望这些去中心化服务能够帮助我们推进公共产品的管理方式、我们维持开源项目的方式,以及我们如何能够有意义地将权力从大型组织转移到个人和社区。但这是未来博客文章的主题。
  — Dries Buytaert
  
  Dries Buytaert 是 Drupal 开源 Web 发布和协作平台的原始创建者和项目负责人。
  Buytaert 担任 Drupal 协会主席,该协会是一个旨在帮助 Drupal 蓬勃发展的非营利组织。
  他还是 Acquia 的联合创始人兼首席技术官,Acquia 是一家风险投资支持的软件公司,为 Drupal 提供产品和服务。
  Dries 还是 Mollom 的联合创始人,Mollom 是一种网络服务,可以帮助您识别内容质量,更重要的是,可以帮助您阻止网站垃圾邮件。
  Buytaert 出生于比利时,拥有根特大学计算机科学与工程博士学位和安特卫普大学计算机科学 (MSC) 学位。
  2008 年,Buytaert 被《商业周刊》评为科技青年企业家以及 MIT TR 35 Young Innovator。
  2011 年,《福布斯》将 Acquia 评为最有前途的 100 家公司之一。
  2012 年,Inc 宣布 Acquia 是美国发展最快的私人软件公司。
  重点:
  如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。
  我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。
  评:
  如何使用IPFS和Filecoin配合起来进行网站的搭建,这次给出了具体答案,最大的一点就是即使跟目前的互联网断开,依旧可以访问,这在实践上证实了IPFS和Filecoin的巨大价值,对于弥补或取代Http传统互联网天然弊端产生很大的影响。
  Filecoin是IPFS唯一的激励层,在操作中是相互关联和配合使用的。
  包括搭建网站在内的很多功能实现,虽然在目前还需要不断探索和改进,相信在全球社区和开发人员不断努力下,会开发出更多的应用工具,在不久未来会得到更好的使用体验,并得到更多的使用。
  IPFS和Filecoin是相辅相成,互相配合,相互关联,IPFS需要Filecoin激励来存储更多数据,从而让更多的人参与进来,把数据传输网络壮大;同时,Filecoin也需要IPFS的底层传输技术把网络变得有价值。
  就好比以太坊和以太币一样。任何试图把IPFS和Filecoin分开,或者说独立无关者,要么是对项目的无知,就是混淆视听,另有所图,有着不可告人的目的。
  你的选择,决定你的未来!你选择相信什么,相信谁,就会给你什么样的答案!一切取决于你!
  本文内容综合整理于网络,版权归原作者所有,本号只用于信息传递分享。侵删。
  关注慢牛聊IPFS
  发现Web 3.0 时代新机遇
  
  点个在看你最好看 查看全部

  抓取动态网页 “即使断网
  加入慢牛社区,共建 Web 3.0!知名CMS系统网站搭建商创始人构建第一个Web3.0网站,更喜欢IPFS API而不是亚马逊专有API。
  全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站
  “即使我的笔记本电脑与互联网断开连接,我的网页仍然可用”
  
  对于国内很多互联网从业者来说,CMS是再熟悉不过的建站程序了,自从有了CMS后,改变了过去网站搭建需要完全手动敲代码的尴尬,毋须四处去找免费的建站程序,从而也避免了被代码后门木马一类的攻击的威胁。
  CMS是content management system的英文缩写,即内容管理系统,是一种位于WEB前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。
  内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。
  内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  内容抓取工具国内比较熟悉的有优采云,小蜜蜂采集器,让没有时间打理自己网站的个人站长免去了需要繁杂的从其他网站复制粘贴内容的劳烦。
  
  近日,全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站,
  
  原文如下:
  今天,我将使用 web3 技术发布我的第一个网页。我将上传一个页面到 IPFS(星际文件系统),dries.eth使用 ENS(以太坊名称服务)使其可用,并使用支持 web3 的浏览器访问它。
  如果您不知道这意味着什么,请准备好参加速成课程。
  第1步:购买 ENS 域名
  去年,我铸造buytaert.eth了.,最近,我购买了dries.eth. 两者都是ENS 域名。
  ENS代表以太坊名称服务,是一种基于开源区块链的命名协议。
  您可以将 ENS 视为 web3 的 DNS。DNS 将域名映射到 IP 地址,ENS 将域名映射到以太坊地址。以太坊地址可以指向加密货币钱包、内容哈希等。
  ENS 不仅仅是以太坊的服务;它是使用智能合约在以太坊上构建的通用 web3 服务。因为 ENS 是建立在区块链之上的,所以它比 DNS 更能抵抗审查。
  今天,拥有自己的 ENS 域的主要用例是使接收加密货币更容易。如果你想给我寄一些以太币,你必须把它0xbAD65DE65AE2c23f5eA30d12fC8c2f883cbe671f寄到我的以太坊钱包的地址。因为我拥有dries.eth,所以您可以发送它dries.eth。更容易记住!
  dries.eth无需任何中间人就可以从世界任何地方的任何人那里未经许可地收集加密货币,这真是太神奇了。
  但是,这不是今天博客文章的主题。在这篇博文中,我想展示如何dries.eth使用它来托管一个完全去中心化的 web3 网页。
  如果您想购买.eth域名,可以在ENS 域名网站上购买。由于.eth域名是 NFT(非同质代币),您还可以在OpenSea等 NFT 市场买卖域名。
  ENS 于 2017 年 5 月推出时,它仅支持 ENS 原生 TLD .eth。自 2021 年 8 月起,ENS 增加了对完整 DNS 命名空间的支持。
  因此,如果您拥有DNS,则可以使用ENS Domains 网站为.
  第 2 步:将 HTML 文件上传到 IPFS
  IPFS是InterPlanetary File System的缩写,是一种用于存储和共享数据的开源协议和点对点网络。
  如今,大多数网页都存储在单个服务器上,托管在单个数据中心中。这些站点对单点故障、拒绝服务攻击或政府审查的弹性不大。
  更高级的网站使用CDN和其他缓存系统复制他们的网页。我的网站使用多个 Kubernetes Web 节点,Varnish 和 Cloudflare,但那是因为我的公司帮助运行了世界上一些最大的网站,而不是因为我的网站需要它。所有这些技术都可以用来提高网站的弹性。
  使用 IPFS,您的网页可以在全球数百个“IPFS 节点”上复制。世界上每个人都可以运行一个 IPFS 节点。
  节点创建一个单一的全球网络,网络中的每个文件都有一个唯一的全球标识符。
  从理论上讲,IPFS比传统的网站托管更具弹性。由于 IPFS 节点由世界各地不同的人和组织运行,并且内容在它们之间复制,因此托管的内容更能抵抗单点故障、拒绝服务攻击或政府审查。另一方面,缓和错误信息也更加困难。
  我之所以写“理论上”是因为上传到 IPFS 的内容只有在世界某个地方的一个节点选择托管它时才保持可用。
  默认情况下,IPFS 不包含用于激励网络中其他节点复制数据的内置机制。每个 IPFS 节点都倾向于托管自己的数据。其他节点可以合作复制数据,也可以作为服务复制数据。
  这就是Filecoin的用武之地。与 IPFS 一样,Filecoin 是一个开源协议。
  IPFS 本身不是基于区块链的,但 Filecoin 是。Filecoin 通过一个用于存储和复制数据的公共市场扩展了 IPFS。
  矿工可以赚取Filecoin(一种加密货币代币)以换取存储和复制 IPFS 数据。因为 Filecoin 是基于区块链的,所以市场不属于单一中介。存储交易由网络上的节点以编程方式进行代理。
  长话短说,要在 IPFS 上托管我的网页,我需要至少一个 IPFS 节点愿意托管我的内容。
  有两种解决方案:
  1)我可以运行我自己的 IPFS 节点或(2)我可以支付第三方 IPFS 服务来托管我的内容。
  运行我自己的 IPFS 节点
  本着帮助构建去中心化网络的精神,运行自己的 IPFS 节点应该是首选。您可以在下面看到我的本地 IPFS 节点托管我的index.html文件:
  
  
  因为我的本地 IPFS 节点在我的笔记本电脑上运行,所以我的网页只有在我的笔记本电脑连接到互联网时才可用。
  如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。
  我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  有几个朋友在 IPFS 上钉住彼此的网站,您不再需要为虚拟主机付费!
  第三方 IPFS 和 pinning 服务
  如果您不想运行自己的 IPFS 服务,或者您没有可以复制您的数据的朋友,您可以使用第三方 IPFS 和 pinning 服务。
  我找到了十几个固定服务,并尝试了以下方法:
  Infura使用其命令行工具可以轻松上传文件:
  $ ipfs-upload-client --id xxx --secret yyy ./index.html
  xxx是 Infura 项目 ID 和yyyInfura 项目密钥。
  Fleek和Pinata允许您从 Web 浏览器上传文件:
  
  
  如果您正在寻找基于 Filecoin 的解决方案,推荐使用web3.storage和estuary.tech。
  第 3 步:访问您的 web3 网页
  将文件上传到 IPFS 后,您将获得文件的“哈希”(唯一 ID 或地址)。index.html我的文件的哈希是:
  bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q可以使用与 IPFS 兼容的浏览器(例如Brave )访问托管在 IPFS 上的内容。
  Firefox、Safari 和 Chrome 目前不原生支持 IPFS,但存在各种 IPFS 浏览器扩展。
  使用 Brave,您可以访问我的网页ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q(注意ipfs://架构)。
  
  第 4 步:将您的网页映射到您的域名
  能够访问您的 IPFS 托管网站非常简洁,但您可能不会要求其他人在 ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q 上查看您的新网页。使用 60 个字符的十六进制散列并不完全理想。
  这就是 ENS 的用武之地。我只需将Content Resolver记录设置dries.eth为与我的网页关联的 IPFS 哈希。
  
  更新 ENS 记录会永久更新以太坊区块链的状态。
  这意味着您必须支付“汽油费”或网络交易费。
  正如你在Etherscan上看到的,更新我的 ENS 记录花了我0.004369 以太币(当时 11.69 美元)。
  您现在可以使用 ENS 和 IPFS 兼容的浏览器访问。瞧,一个真正去中心化的网站!
  
  ENS 和 IPFS 是网络的未来吗?
  有各种各样的大缺点:
  我相信这些缺点将在未来几年得到解决。有些人可能已经有了解决方案。
  撇开缺点不谈,我相信 IPFS 和 ENS 有希望:
  Web3 对开发者意味着什么?
  如果您是开发人员,请将 web3 视为不断增长的新“Web 服务”集合。
  IPFS 和 ENS 就是两个这样的 Web 服务。
  今天,它们主要提供改进的弹性和审查保护。
  如果弹性和审查保护对您的网站很重要,请使用它们。
  如果不是,您不必使用它们。
  作为的所有者和开发者,我不关心审查保护。出于这个原因,我很高兴继续使用传统的托管技术。
  但我确实认识到 IPFS 和 ENS 在未来可能会变得更有趣。
  在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。
  这包括其商业模式依赖于专有数据库和分类账的组织;金融机构、中央银行、某些非营利组织、社会团体。其中许多可以变成真正去中心化的网络服务。
  例如,许多商业网站使用 PayPal 或 Square 等中介提供贷款和贷款偿还计划。
  随着时间的推移,其中一些中介机构可能会被无需许可的分布式网络服务所取代,这些服务收取的利息和/或交易费用较低。
  想象一下有一天,商业网站无需中介即可直接向客户提供贷款偿还计划变得非常容易。当利润率受益时,技术解决方案就会迅速被采用。
  区块链还将使我们能够以新的方式解决协调和所有权问题。
  在网络上创建内容(图像、音乐、视频、博客文章)的每个人都可以从中受益。其他人使用您的内容并以编程方式将价值流回您的能力非常令人兴奋。
  最重要的是,我希望这些去中心化服务能够帮助我们推进公共产品的管理方式、我们维持开源项目的方式,以及我们如何能够有意义地将权力从大型组织转移到个人和社区。但这是未来博客文章的主题。
  — Dries Buytaert
  
  Dries Buytaert 是 Drupal 开源 Web 发布和协作平台的原始创建者和项目负责人。
  Buytaert 担任 Drupal 协会主席,该协会是一个旨在帮助 Drupal 蓬勃发展的非营利组织。
  他还是 Acquia 的联合创始人兼首席技术官,Acquia 是一家风险投资支持的软件公司,为 Drupal 提供产品和服务。
  Dries 还是 Mollom 的联合创始人,Mollom 是一种网络服务,可以帮助您识别内容质量,更重要的是,可以帮助您阻止网站垃圾邮件。
  Buytaert 出生于比利时,拥有根特大学计算机科学与工程博士学位和安特卫普大学计算机科学 (MSC) 学位。
  2008 年,Buytaert 被《商业周刊》评为科技青年企业家以及 MIT TR 35 Young Innovator。
  2011 年,《福布斯》将 Acquia 评为最有前途的 100 家公司之一。
  2012 年,Inc 宣布 Acquia 是美国发展最快的私人软件公司。
  重点:
  如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。
  我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。
  评:
  如何使用IPFS和Filecoin配合起来进行网站的搭建,这次给出了具体答案,最大的一点就是即使跟目前的互联网断开,依旧可以访问,这在实践上证实了IPFS和Filecoin的巨大价值,对于弥补或取代Http传统互联网天然弊端产生很大的影响。
  Filecoin是IPFS唯一的激励层,在操作中是相互关联和配合使用的。
  包括搭建网站在内的很多功能实现,虽然在目前还需要不断探索和改进,相信在全球社区和开发人员不断努力下,会开发出更多的应用工具,在不久未来会得到更好的使用体验,并得到更多的使用。
  IPFS和Filecoin是相辅相成,互相配合,相互关联,IPFS需要Filecoin激励来存储更多数据,从而让更多的人参与进来,把数据传输网络壮大;同时,Filecoin也需要IPFS的底层传输技术把网络变得有价值。
  就好比以太坊和以太币一样。任何试图把IPFS和Filecoin分开,或者说独立无关者,要么是对项目的无知,就是混淆视听,另有所图,有着不可告人的目的。
  你的选择,决定你的未来!你选择相信什么,相信谁,就会给你什么样的答案!一切取决于你!
  本文内容综合整理于网络,版权归原作者所有,本号只用于信息传递分享。侵删。
  关注慢牛聊IPFS
  发现Web 3.0 时代新机遇
  
  点个在看你最好看

如何利用Python网络爬虫抓取微信朋友圈的动态(上)

网站优化优采云 发表了文章 • 0 个评论 • 506 次浏览 • 2022-06-18 12:20 • 来自相关话题

  如何利用Python网络爬虫抓取微信朋友圈的动态(上)
  
  2、之后在主页中点击【创作书籍】-->【微信书】。
  
  3、点击【开始制作】-->【添加随机分配的出书啦小编为好友即可】,长按二维码之后便可以进行添加好友了。
  4、之后耐心等待微信书制作,待完成之后,会收到小编发送的消息提醒,如下图所示。
  至此,我们已经将微信朋友圈的数据入口搞定了,并且获取了外链。
  确保朋友圈设置为【全部开放】,默认就是全部开放,如果不知道怎么设置的话,请自行百度吧。
  
  5、点击该外链,之后进入网页,需要使用微信扫码授权登录。
  6、扫码授权之后,就可以进入到微信书网页版了,如下图所示。
  
  7、接下来我们就可以正常的写爬虫程序进行抓取信息了。在这里,小编采用的是Scrapy爬虫框架,Python用的是3版本,集成开发环境用的是Pycharm。下图是微信书的首页,图片是小编自己自定义的。
  
  二、创建爬虫项目
  1、确保您的电脑上已经安装好了Scrapy。之后选定一个文件夹,在该文件夹下进入命令行,输入执行命令:
  scrapy startproject weixin_moment
  ,等待生成Scrapy爬虫项目。
  2、在命令行中输入cd weixin_moment,进入创建的weixin_moment目录。之后输入命令:
  scrapy genspider 'moment' 'chushu.la'
  ,创建朋友圈爬虫,如下图所示。
  
  3、执行以上两步后的文件夹结构如下:
  
  三、分析网页数据
  1、进入微信书首页,按下F12,建议使用谷歌浏览器,审查元素,点击“Network”选项卡,然后勾选“Preserve log”,表示保存日志,如下图所示。可以看到主页的请求方式是get,返回的状态码是200,代表请求成功。
  2、点击“Response”(服务器响应),可以看到系统返回的数据是JSON格式的。说明我们之后在程序中需要对JSON格式的数据进行处理。
  
  3、点击微信书的“导航”窗口,可以看到数据是按月份进行加载的。当点击导航按钮,其加载对应月份的朋友圈数据。
  4、当点击【2014/04】月份,之后查看服务器响应数据,可以看到页面上显示的数据和服务器的响应是相对应的。
  
  5、查看请求方式,可以看到此时的请求方式变成了POST。细心的伙伴可以看到在点击“下个月”或者其他导航月份的时候,主页的URL是始终没有变化的,说明该网页是动态加载的。之后对比多个网页请求,我们可以看到在“Request Payload”下边的数据包参数不断的发生变化,如下图所示。
  6、展开服务器响应的数据,将数据放到JSON在线解析器里,如下图所示:
  可以看到朋友圈的数据存储在paras /data节点下。
  至此,网页分析和数据的来源都已经确定好了,接下来将写程序,进行数据抓取,敬请期待下篇文章~~
  看完本文有收获?请转发分享给更多的人
  Python爬虫与数据挖掘
  入群请在微信后台回复【Python学习】 查看全部

  如何利用Python网络爬虫抓取微信朋友圈的动态(上)
  
  2、之后在主页中点击【创作书籍】-->【微信书】。
  
  3、点击【开始制作】-->【添加随机分配的出书啦小编为好友即可】,长按二维码之后便可以进行添加好友了。
  4、之后耐心等待微信书制作,待完成之后,会收到小编发送的消息提醒,如下图所示。
  至此,我们已经将微信朋友圈的数据入口搞定了,并且获取了外链。
  确保朋友圈设置为【全部开放】,默认就是全部开放,如果不知道怎么设置的话,请自行百度吧。
  
  5、点击该外链,之后进入网页,需要使用微信扫码授权登录。
  6、扫码授权之后,就可以进入到微信书网页版了,如下图所示。
  
  7、接下来我们就可以正常的写爬虫程序进行抓取信息了。在这里,小编采用的是Scrapy爬虫框架,Python用的是3版本,集成开发环境用的是Pycharm。下图是微信书的首页,图片是小编自己自定义的。
  
  二、创建爬虫项目
  1、确保您的电脑上已经安装好了Scrapy。之后选定一个文件夹,在该文件夹下进入命令行,输入执行命令:
  scrapy startproject weixin_moment
  ,等待生成Scrapy爬虫项目。
  2、在命令行中输入cd weixin_moment,进入创建的weixin_moment目录。之后输入命令:
  scrapy genspider 'moment' 'chushu.la'
  ,创建朋友圈爬虫,如下图所示。
  
  3、执行以上两步后的文件夹结构如下:
  
  三、分析网页数据
  1、进入微信书首页,按下F12,建议使用谷歌浏览器,审查元素,点击“Network”选项卡,然后勾选“Preserve log”,表示保存日志,如下图所示。可以看到主页的请求方式是get,返回的状态码是200,代表请求成功。
  2、点击“Response”(服务器响应),可以看到系统返回的数据是JSON格式的。说明我们之后在程序中需要对JSON格式的数据进行处理。
  
  3、点击微信书的“导航”窗口,可以看到数据是按月份进行加载的。当点击导航按钮,其加载对应月份的朋友圈数据。
  4、当点击【2014/04】月份,之后查看服务器响应数据,可以看到页面上显示的数据和服务器的响应是相对应的。
  
  5、查看请求方式,可以看到此时的请求方式变成了POST。细心的伙伴可以看到在点击“下个月”或者其他导航月份的时候,主页的URL是始终没有变化的,说明该网页是动态加载的。之后对比多个网页请求,我们可以看到在“Request Payload”下边的数据包参数不断的发生变化,如下图所示。
  6、展开服务器响应的数据,将数据放到JSON在线解析器里,如下图所示:
  可以看到朋友圈的数据存储在paras /data节点下。
  至此,网页分析和数据的来源都已经确定好了,接下来将写程序,进行数据抓取,敬请期待下篇文章~~
  看完本文有收获?请转发分享给更多的人
  Python爬虫与数据挖掘
  入群请在微信后台回复【Python学习】

Python:爬取动态网站

网站优化优采云 发表了文章 • 0 个评论 • 25 次浏览 • 2022-06-18 01:00 • 来自相关话题

  Python:爬取动态网站
  邮箱:
  目录
  4. 完整代码
  5. 相关推文
  温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:
  在之前的推文中,我们介绍了如何爬取一个简单的静态网站——「Python爬取静态网站:以历史天气为例」,但是在实际过程中,常常会遇到需要爬取动态网站数据的情况。在本文中,我们也将通过一个比较简单的案例,来介绍爬取动态网站数据的基本思路和步骤。
  1. 动态网页特征
  首先,简单回顾一下动态网页的特征:
  2. 动态网页爬取的基本思路
  动态网页数据爬取通常有两种方法:
  在本次介绍中,我们将通过获取接口的方式来爬取动态网页的数据。由于动态网页结构会更加复杂一些,我们主要的精力是在解析网页结构这一步。但是在找到了数据接口后 (知道数据 “藏” 在哪),数据的爬取也比较简单。具体来看,爬取动态网页数据主要可分为以下几步:
  同样的,如果涉及多页的数据,需要分析接口的变化规律:
  3. 实战案例
  接下来,我们以爬取 bilibili 视频评论为例,来具体介绍如何通过 Python 爬取动态网页的数据。主要内容包括:
  3.1 分析网页结构
  在动态网页的数据爬取中,分析网页结构至关重要。因为我们需要找到数据 “藏” 在哪,否则不知道应该去哪请求数据。在本案例中,我们将爬取「bilibili」的数据,具体选择 bilibili 入站第一名的视频「【才浅】15天花20万元用500克黄金敲数万锤纯手工打造三星堆黄金面具」的评论数据。
  按照惯例,我们先看一下网页源代码,由于信息太多了,可以直接使用搜索功能。在网页源代码页面,搜索评论内容,发现没有这个数据。
  
  那怎么办呢?我们就要找一找这个数据到底藏在哪了。通常,查找动态网页的数据接口有以下几个步骤:
  问题又来了,动态网页里的数据很多,有时候就算筛选了类型,也还是有很多页面。要找到我们需要的数据,真的是大海捞针,那怎么办呢?有一个小技巧,就是利用搜索功能。在检查页面,搜索一下评论内容,立马就找到了数据藏在哪里!
  3.2 请求接口数据
  历经千辛万苦,终于找到了数据藏的位置,接下来就是要把数据获取下来。这里简单三个步骤就可以完成:
  我们先来看看接口网址 (Request URL) 的情况,可以看到网址包括以下几个部分:
  也就是说,这个数据接口由 1 个主结构和 8 个参数构成。关于参数需要注意两点,一是有没有这个参数会不会影响数据获取,二是这个参数的含义和变化规律。具体的确定方法只有不断尝试:
  当然,有时候不知道含义也可以爬取数据,但是建议还是了解一下,一般不清楚含义但必需的参数保持默认值即可。在这里,我们省略一下不断尝试的结果。最终,发现了部分参数的基本含义:
  接下来我们就可以复制请求头,构造请求参数,请求需要的数据。
  # 导入模块<br />import requests<br />import time<br /><br /># 网址<br />url = "https://api.bilibili.com/x/v2/reply/main"  # 接口网址的主要结构<br /><br /># 请求头数据<br />headers = {<br />    'accept': '*/*',<br />    'accept-encoding': 'gzip, deflate, br',<br />    'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',<br />    'referer': 'https://www.bilibili.com/video/BV16X4y1g7wT',<br />    'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"',<br />    'sec-ch-ua-mobile': '?0',<br />    'sec-ch-ua-platform': 'Windows',<br />    'sec-fetch-dest': 'script',<br />    'sec-fetch-mode': 'no-cors',<br />    'sec-fetch-site': 'same-site',<br />    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '<br />                  '(KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36'<br />    # 根据测试不需要 cookie 信息也可以获取数据<br />    # 需要 cookie 的话在自己的浏览器中复制,这里涉及隐私就不放 cookie 信息了<br />}<br /><br /># 构造请求参数<br />params = {<br />    # 'callback': 'jQuery17201888299578386794_' + str(round(time.time() * 1000)),<br />    # 'jsonp': 'jsonp',<br />    'next': 0,  # 页码<br />    'type': 1,<br />    'oid': 715024588,  # 视频av号<br />    # 'mode': 3,  # 评论排序方式<br />    # 'plat': 1,<br />    # '_': str(round(time.time() * 1000))  # 生成当前时间戳<br />}<br /><br /># 通过get方法请求数据<br />response = requests.get(url, headers=headers, params=params)<br />
  查看返回结果, 代表请求数据成功。如果是 403 或 404 则说明请求不成功,可能需要检查电脑网络是否通畅、目标网址是否可以正常访问、headers 是否有正确设置等。
  3.3 解析网页数据
  请求成功后,我们再来看请求回来的数据是什么样的,如何根据获取自己需要的数据。回到数据接口中,我们可以看到数据是通过 json 格式存储的,而每条评论的数据在 data 下面的 replies 中。
  因此,我们用 json 解析请求到的数据,并把需要的评论数据提取出来。
  # 导入模块<br />import json<br />import time<br /><br />response.encoding = 'utf-8'                  # 修改编码格式<br />data_json = json.loads(response.text)        # 通过 json 解析数据<br />comment_list = data_json['data']['replies']  # 获取 data 下面的 replies 列表<br /><br />comments = []                       # 构建空列表保存每页的评论数据<br />for i in range(len(comment_list)):  # 循环获取每条评论的数据<br />    comment = {<br />        'id': comment_list[i]['rpid'],  # 评论id<br />        # 评论时间,由时间戳转换<br />        'time': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(comment_list[i]['ctime'])),  <br />        'parent': comment_list[i]['parent'],  # 父评论id<br />        'like': comment_list[i]['like'],      # 点赞数<br />        'user_id': comment_list[i]['member']['mid'],      # 评论用户id<br />        'user_name': comment_list[i]['member']['uname'],  # 用户名<br />        'content': comment_list[i]['content']['message']  # 评论内容<br />        # 需要其他数据的可以再在 json 中查看并获取对应的名称<br />    }<br />    comments.append(comment)  # 每页的评论数据<br />
  3.4 储存爬取数据
  接下来,把爬取到的数据存入 csv 文件。当然,还是建议爬取一页保存一页。同时,使用 utf-8 格式保存数据,因此打开数据文件时,也要使用同样的格式。
  # 导入模块<br />import csv<br /><br /># 保存数据的文件路径<br />save_path = 'bilibili.csv'<br /><br /># 将数据写入 csv<br /> with open(save_path, 'a', newline='', encoding='utf-8') as fp:<br />     csv_header = ['id', 'time', 'parent', 'like', 'user_id', 'user_name', 'content']  # 设置表头,即列名<br />     csv_writer = csv.DictWriter(fp, csv_header)<br />     # 如果文件不存在,则写入表头;如果文件已经存在,则直接追加数据不再次写入表头<br />     if fp.tell() == 0:<br />         csv_writer.writeheader()    <br />     csv_writer.writerows(comments)  # 写入数据<br />
  3.5 循环爬取数据
  终于成功获取了一页的数据,接下来就要循环获取更多数据了。这里也分为三个步骤:
  由于前面已经详细分析过接口的参数变化,这里不再具体说明。通过分析,翻页变化的参数是 next,所以只要变化这个参数就可以进行翻页。另外,如果要爬取不同视频的评论,则要通过 av 号来循环,也就是 oid 参数。
  4. 完整代码
  # -*- coding: utf-8 -*-<br /># Author: W.Y.<br /># Email: wangyingchn@outlook.com<br /># Date: 2022/4/12<br /><br /># 导入模块<br />import requests  # 请求数据<br />import time      # 时间模块<br />import json      # json 模块,储存数据<br />import csv       # 保存数据<br /><br /># 请求数据<br />def get_response(page):<br />    url = 'https://api.bilibili.com/x/v2/reply/main'  # 接口网址的主要结构<br />    # 请求头数据<br />    headers = {<br />        'accept': '*/*',<br />        'accept-encoding': 'gzip, deflate, br',<br />        'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',<br />        'referer': 'https://www.bilibili.com/video/BV16X4y1g7wT',<br />        'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"',<br />        'sec-ch-ua-mobile': '?0',<br />        'sec-ch-ua-platform': 'Windows',<br />        'sec-fetch-dest': 'script',<br />        'sec-fetch-mode': 'no-cors',<br />        'sec-fetch-site': 'same-site',<br />        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '<br />                      '(KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36'<br />        # 根据测试不需要 cookie 信息也可以获取数据<br />        # 需要 cookie 的话在自己的浏览器中复制,这里涉及隐私就不放 cookie 信息了<br />    }<br />    # 构造请求参数<br />    params = {<br />        # 'callback': 'jQuery17201888299578386794_' + str(round(time.time() * 1000)),<br />        # 'jsonp': 'jsonp',<br />        'next': page,  # 页码<br />        'type': 1,<br />        'oid': 715024588,  # 视频av号<br />        'mode': 3,  # 评论排序方式<br />        # 'plat': 1,<br />        # '_': str(round(time.time() * 1000))  # 生成当前时间戳<br />    }<br />    # 通过get方法请求数据<br />    response = requests.get(url, headers=headers, params=params)<br />    return response<br /><br /># 解析数据<br />def parse_data(response):<br />    response.encoding = 'utf-8'                  # 修改编码格式<br />    data_json = json.loads(response.text)        # 通过 json 解析数据<br />    comment_list = data_json['data']['replies']  # 获取 data 下面的 replies 列表<br />    comments = []                       # 构建空列表保存每页的评论数据<br />    for i in range(len(comment_list)):  # 循环获取每条评论的数据<br />        comment = {<br />            'id': comment_list[i]['rpid'],   # 评论id<br />            'time': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(comment_list[i]['ctime'])),  <br />            # 评论时间,由时间戳转换<br />            'parent': comment_list[i]['parent'],  # 父评论id<br />            'like': comment_list[i]['like'],      # 点赞数<br />            'user_id': comment_list[i]['member']['mid'],      # 评论用户id<br />            'user_name': comment_list[i]['member']['uname'],  # 用户名<br />            'content': comment_list[i]['content']['message']  # 评论内容<br />            # 需要其他数据的可以再在 json 中查看并获取对应的名称<br />        }<br />        comments.append(comment)  # 每页的评论数据<br />    return comments<br /><br /># 保存数据<br />def save_data(comments, save_path):<br />    with open(save_path, 'a', newline='', encoding='utf-8') as fp:<br />        # 设置表头,即列名<br />        csv_header = ['id', 'time', 'parent', 'like', 'user_id', 'user_name', 'content']  <br />        csv_writer = csv.DictWriter(fp, csv_header)<br />        # 如果文件不存在,则写入表头;如果文件已经存在,则直接追加数据不再次写入表头<br />        if fp.tell() == 0:<br />            csv_writer.writeheader()  <br />        csv_writer.writerows(comments)  # 写入数据<br /><br /># 定义爬取函数<br />def crawler(page, save_path):<br />    time.sleep(2)  # 暂停 2 秒,避免请求过于频繁<br />    response = get_response(page)    # 请求数据<br />    comments = parse_data(response)  # 解析数据<br />    save_data(comments, save_path)   # 储存数据<br />    print(f'成功爬取第{page+1}页')<br /><br />if __name__ == '__main__':<br />    save_file = 'bilibili.csv'  # 保存路径<br />    total_counts = 1000         # 爬取 1000 条评论<br />    # 如果要爬取所有评论,可以改成全部评论数。<br />    # 如果要爬取多个视频的评论,可以通过下面的代码,爬取第一页的时候返回所有的评论数<br />    # total_counts = data_json['data']['cursor']['all_count']<br />    # 页码循环,每页有 20 条评论,所以通过总评论数计算页码<br />    for p in range(total_counts//20 + 1):  <br />        crawler(p, save_file)<br />
  5. 相关推文
  Note:产生如下推文列表的 Stata 命令为:
  lianxh python, m
  安装最新版 lianxh 命令:
  ssc install lianxh, replace
  专题:文本分析-爬虫专题:Python-R-Matlab
  
  课程推荐:因果推断实用计量方法
  主讲老师:丘嘉平教授
  课程主页:
  
  New! Stata 搜索神器:lianxh 和 songbl
  搜: 推文、数据分享、期刊论文、重现代码 ……
  安装:
  . ssc install lianxh
  . ssc install songbl
  使用:
  . lianxh DID 倍分法
  . songbl all
  
  关于我们
   查看全部

  Python:爬取动态网站
  邮箱:
  目录
  4. 完整代码
  5. 相关推文
  温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:
  在之前的推文中,我们介绍了如何爬取一个简单的静态网站——「Python爬取静态网站:以历史天气为例」,但是在实际过程中,常常会遇到需要爬取动态网站数据的情况。在本文中,我们也将通过一个比较简单的案例,来介绍爬取动态网站数据的基本思路和步骤。
  1. 动态网页特征
  首先,简单回顾一下动态网页的特征:
  2. 动态网页爬取的基本思路
  动态网页数据爬取通常有两种方法:
  在本次介绍中,我们将通过获取接口的方式来爬取动态网页的数据。由于动态网页结构会更加复杂一些,我们主要的精力是在解析网页结构这一步。但是在找到了数据接口后 (知道数据 “藏” 在哪),数据的爬取也比较简单。具体来看,爬取动态网页数据主要可分为以下几步:
  同样的,如果涉及多页的数据,需要分析接口的变化规律:
  3. 实战案例
  接下来,我们以爬取 bilibili 视频评论为例,来具体介绍如何通过 Python 爬取动态网页的数据。主要内容包括:
  3.1 分析网页结构
  在动态网页的数据爬取中,分析网页结构至关重要。因为我们需要找到数据 “藏” 在哪,否则不知道应该去哪请求数据。在本案例中,我们将爬取「bilibili」的数据,具体选择 bilibili 入站第一名的视频「【才浅】15天花20万元用500克黄金敲数万锤纯手工打造三星堆黄金面具」的评论数据。
  按照惯例,我们先看一下网页源代码,由于信息太多了,可以直接使用搜索功能。在网页源代码页面,搜索评论内容,发现没有这个数据。
  
  那怎么办呢?我们就要找一找这个数据到底藏在哪了。通常,查找动态网页的数据接口有以下几个步骤:
  问题又来了,动态网页里的数据很多,有时候就算筛选了类型,也还是有很多页面。要找到我们需要的数据,真的是大海捞针,那怎么办呢?有一个小技巧,就是利用搜索功能。在检查页面,搜索一下评论内容,立马就找到了数据藏在哪里!
  3.2 请求接口数据
  历经千辛万苦,终于找到了数据藏的位置,接下来就是要把数据获取下来。这里简单三个步骤就可以完成:
  我们先来看看接口网址 (Request URL) 的情况,可以看到网址包括以下几个部分:
  也就是说,这个数据接口由 1 个主结构和 8 个参数构成。关于参数需要注意两点,一是有没有这个参数会不会影响数据获取,二是这个参数的含义和变化规律。具体的确定方法只有不断尝试:
  当然,有时候不知道含义也可以爬取数据,但是建议还是了解一下,一般不清楚含义但必需的参数保持默认值即可。在这里,我们省略一下不断尝试的结果。最终,发现了部分参数的基本含义:
  接下来我们就可以复制请求头,构造请求参数,请求需要的数据。
  # 导入模块<br />import requests<br />import time<br /><br /># 网址<br />url = "https://api.bilibili.com/x/v2/reply/main"  # 接口网址的主要结构<br /><br /># 请求头数据<br />headers = {<br />    'accept': '*/*',<br />    'accept-encoding': 'gzip, deflate, br',<br />    'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',<br />    'referer': 'https://www.bilibili.com/video/BV16X4y1g7wT',<br />    'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"',<br />    'sec-ch-ua-mobile': '?0',<br />    'sec-ch-ua-platform': 'Windows',<br />    'sec-fetch-dest': 'script',<br />    'sec-fetch-mode': 'no-cors',<br />    'sec-fetch-site': 'same-site',<br />    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '<br />                  '(KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36'<br />    # 根据测试不需要 cookie 信息也可以获取数据<br />    # 需要 cookie 的话在自己的浏览器中复制,这里涉及隐私就不放 cookie 信息了<br />}<br /><br /># 构造请求参数<br />params = {<br />    # 'callback': 'jQuery17201888299578386794_' + str(round(time.time() * 1000)),<br />    # 'jsonp': 'jsonp',<br />    'next': 0,  # 页码<br />    'type': 1,<br />    'oid': 715024588,  # 视频av号<br />    # 'mode': 3,  # 评论排序方式<br />    # 'plat': 1,<br />    # '_': str(round(time.time() * 1000))  # 生成当前时间戳<br />}<br /><br /># 通过get方法请求数据<br />response = requests.get(url, headers=headers, params=params)<br />
  查看返回结果, 代表请求数据成功。如果是 403 或 404 则说明请求不成功,可能需要检查电脑网络是否通畅、目标网址是否可以正常访问、headers 是否有正确设置等。
  3.3 解析网页数据
  请求成功后,我们再来看请求回来的数据是什么样的,如何根据获取自己需要的数据。回到数据接口中,我们可以看到数据是通过 json 格式存储的,而每条评论的数据在 data 下面的 replies 中。
  因此,我们用 json 解析请求到的数据,并把需要的评论数据提取出来。
  # 导入模块<br />import json<br />import time<br /><br />response.encoding = 'utf-8'                  # 修改编码格式<br />data_json = json.loads(response.text)        # 通过 json 解析数据<br />comment_list = data_json['data']['replies']  # 获取 data 下面的 replies 列表<br /><br />comments = []                       # 构建空列表保存每页的评论数据<br />for i in range(len(comment_list)):  # 循环获取每条评论的数据<br />    comment = {<br />        'id': comment_list[i]['rpid'],  # 评论id<br />        # 评论时间,由时间戳转换<br />        'time': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(comment_list[i]['ctime'])),  <br />        'parent': comment_list[i]['parent'],  # 父评论id<br />        'like': comment_list[i]['like'],      # 点赞数<br />        'user_id': comment_list[i]['member']['mid'],      # 评论用户id<br />        'user_name': comment_list[i]['member']['uname'],  # 用户名<br />        'content': comment_list[i]['content']['message']  # 评论内容<br />        # 需要其他数据的可以再在 json 中查看并获取对应的名称<br />    }<br />    comments.append(comment)  # 每页的评论数据<br />
  3.4 储存爬取数据
  接下来,把爬取到的数据存入 csv 文件。当然,还是建议爬取一页保存一页。同时,使用 utf-8 格式保存数据,因此打开数据文件时,也要使用同样的格式。
  # 导入模块<br />import csv<br /><br /># 保存数据的文件路径<br />save_path = 'bilibili.csv'<br /><br /># 将数据写入 csv<br /> with open(save_path, 'a', newline='', encoding='utf-8') as fp:<br />     csv_header = ['id', 'time', 'parent', 'like', 'user_id', 'user_name', 'content']  # 设置表头,即列名<br />     csv_writer = csv.DictWriter(fp, csv_header)<br />     # 如果文件不存在,则写入表头;如果文件已经存在,则直接追加数据不再次写入表头<br />     if fp.tell() == 0:<br />         csv_writer.writeheader()    <br />     csv_writer.writerows(comments)  # 写入数据<br />
  3.5 循环爬取数据
  终于成功获取了一页的数据,接下来就要循环获取更多数据了。这里也分为三个步骤:
  由于前面已经详细分析过接口的参数变化,这里不再具体说明。通过分析,翻页变化的参数是 next,所以只要变化这个参数就可以进行翻页。另外,如果要爬取不同视频的评论,则要通过 av 号来循环,也就是 oid 参数。
  4. 完整代码
  # -*- coding: utf-8 -*-<br /># Author: W.Y.<br /># Email: wangyingchn@outlook.com<br /># Date: 2022/4/12<br /><br /># 导入模块<br />import requests  # 请求数据<br />import time      # 时间模块<br />import json      # json 模块,储存数据<br />import csv       # 保存数据<br /><br /># 请求数据<br />def get_response(page):<br />    url = 'https://api.bilibili.com/x/v2/reply/main'  # 接口网址的主要结构<br />    # 请求头数据<br />    headers = {<br />        'accept': '*/*',<br />        'accept-encoding': 'gzip, deflate, br',<br />        'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',<br />        'referer': 'https://www.bilibili.com/video/BV16X4y1g7wT',<br />        'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"',<br />        'sec-ch-ua-mobile': '?0',<br />        'sec-ch-ua-platform': 'Windows',<br />        'sec-fetch-dest': 'script',<br />        'sec-fetch-mode': 'no-cors',<br />        'sec-fetch-site': 'same-site',<br />        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '<br />                      '(KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36'<br />        # 根据测试不需要 cookie 信息也可以获取数据<br />        # 需要 cookie 的话在自己的浏览器中复制,这里涉及隐私就不放 cookie 信息了<br />    }<br />    # 构造请求参数<br />    params = {<br />        # 'callback': 'jQuery17201888299578386794_' + str(round(time.time() * 1000)),<br />        # 'jsonp': 'jsonp',<br />        'next': page,  # 页码<br />        'type': 1,<br />        'oid': 715024588,  # 视频av号<br />        'mode': 3,  # 评论排序方式<br />        # 'plat': 1,<br />        # '_': str(round(time.time() * 1000))  # 生成当前时间戳<br />    }<br />    # 通过get方法请求数据<br />    response = requests.get(url, headers=headers, params=params)<br />    return response<br /><br /># 解析数据<br />def parse_data(response):<br />    response.encoding = 'utf-8'                  # 修改编码格式<br />    data_json = json.loads(response.text)        # 通过 json 解析数据<br />    comment_list = data_json['data']['replies']  # 获取 data 下面的 replies 列表<br />    comments = []                       # 构建空列表保存每页的评论数据<br />    for i in range(len(comment_list)):  # 循环获取每条评论的数据<br />        comment = {<br />            'id': comment_list[i]['rpid'],   # 评论id<br />            'time': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(comment_list[i]['ctime'])),  <br />            # 评论时间,由时间戳转换<br />            'parent': comment_list[i]['parent'],  # 父评论id<br />            'like': comment_list[i]['like'],      # 点赞数<br />            'user_id': comment_list[i]['member']['mid'],      # 评论用户id<br />            'user_name': comment_list[i]['member']['uname'],  # 用户名<br />            'content': comment_list[i]['content']['message']  # 评论内容<br />            # 需要其他数据的可以再在 json 中查看并获取对应的名称<br />        }<br />        comments.append(comment)  # 每页的评论数据<br />    return comments<br /><br /># 保存数据<br />def save_data(comments, save_path):<br />    with open(save_path, 'a', newline='', encoding='utf-8') as fp:<br />        # 设置表头,即列名<br />        csv_header = ['id', 'time', 'parent', 'like', 'user_id', 'user_name', 'content']  <br />        csv_writer = csv.DictWriter(fp, csv_header)<br />        # 如果文件不存在,则写入表头;如果文件已经存在,则直接追加数据不再次写入表头<br />        if fp.tell() == 0:<br />            csv_writer.writeheader()  <br />        csv_writer.writerows(comments)  # 写入数据<br /><br /># 定义爬取函数<br />def crawler(page, save_path):<br />    time.sleep(2)  # 暂停 2 秒,避免请求过于频繁<br />    response = get_response(page)    # 请求数据<br />    comments = parse_data(response)  # 解析数据<br />    save_data(comments, save_path)   # 储存数据<br />    print(f'成功爬取第{page+1}页')<br /><br />if __name__ == '__main__':<br />    save_file = 'bilibili.csv'  # 保存路径<br />    total_counts = 1000         # 爬取 1000 条评论<br />    # 如果要爬取所有评论,可以改成全部评论数。<br />    # 如果要爬取多个视频的评论,可以通过下面的代码,爬取第一页的时候返回所有的评论数<br />    # total_counts = data_json['data']['cursor']['all_count']<br />    # 页码循环,每页有 20 条评论,所以通过总评论数计算页码<br />    for p in range(total_counts//20 + 1):  <br />        crawler(p, save_file)<br />
  5. 相关推文
  Note:产生如下推文列表的 Stata 命令为:
  lianxh python, m
  安装最新版 lianxh 命令:
  ssc install lianxh, replace
  专题:文本分析-爬虫专题:Python-R-Matlab
  
  课程推荐:因果推断实用计量方法
  主讲老师:丘嘉平教授
  课程主页:
  
  New! Stata 搜索神器:lianxh 和 songbl
  搜: 推文、数据分享、期刊论文、重现代码 ……
  安装:
  . ssc install lianxh
  . ssc install songbl
  使用:
  . lianxh DID 倍分法
  . songbl all
  
  关于我们
  

Python爬取静态网站:以历史天气为例

网站优化优采云 发表了文章 • 0 个评论 • 45 次浏览 • 2022-06-06 17:06 • 来自相关话题

  Python爬取静态网站:以历史天气为例
  邮箱:
  目录
  4. 完整代码
  5. 相关推文
  温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:
  
  数据获取是实证研究的第一步。随着互联网数据的指数级增长,网络数据成为重要且常用的数据源。网络爬虫也因此成为获取数据的重要方式。但是我们通常会觉得爬虫非常复杂,不知道从何下手。为此,本文将通过实际的爬取案例介绍,来帮助大家掌握相关知识。
  1. 静态网页和动态网页
  网页类型包括静态网页和动态网页。简单来说,静态网页是指数据直接存储在网页的 html 中,不论用户是否请求了数据,数据就 “静止” 在那里。动态网页的数据则被 “藏” 起来了,用户每次请求后,动态网页才会有一个向远程数据库请求数据的“动作”,再把数据显示出来,但用户无法直接从网页的 html 中获取数据。
  这里不细说静态网页和动态网页的官方定义,只说两个最明显的区别,以方便大家在分析网页时进行区分:
  直观来说,翻页时网址变化的网站就是静态网站,反之就是动态网站。比如微博评论、bilibili 评论这样一直下滑会一直出现新的数据,但是网址不变的,就是动态网站。
  2. 静态网页爬取的思路
  这次我们先聊聊如何爬取静态网页的数据。由于静态网页结构比较简单,可以直接通过获取网页源代码得到数据,所以爬取比较简单。有了目标网站后,静态网页数据的爬取可以分为四步:
  如果涉及多页的数据,还涉及到分析网址翻页规律和进行循环:
  小提示:多页循环时,可以先爬取单页数据,成功后再循环爬取部分数据 (比如 10 页),没问题再爬取完整数据。
  3. 案例之爬取历史天气
  接下来用一个简单的实战案例,来具体介绍如何通过 Python 爬取静态网页的数据。主要内容包括:
  3.1 分析网页结构
  分析网页结构是爬取数据的第一步,也是重中之重。在本案例中,我们需要爬取「天气网」的历史数据。以北京市 2022 年 3 月天气的「网页」为例,进行网页结构分析。首先,我们需要的数据如下图左所示,包括每天的日期、最高气温、最低气温、天气、风向。
  然后,在浏览器页面右键查看网页源代码,并在源代码中找到对应的数据 (如下图右)。这也是前面提到的静态网页第一个特征:页面上显示的数据都可以在源代码中找到。
  
  小提示:静态网页的结构都比较简单,我们不需要太多精力去分析网页结构,只需要在源代码中验证一下是否有需要的数据即可。
  3.2 请求网页数据
  由于数据都藏在源代码中,我们只需要请求网页内容,即把源代码下载到本地,进行分析。关于网页请求,我们需要用到 Python 爬虫中常用包 requests。
  # 导入模块<br />import requests<br /><br /># 输入网址。这里还是以北京市 2022 年 3 月的天气为例进行单页爬取。<br />url = "https://lishi.tianqi.com/beiji ... %3Bbr /><br /># 伪装一下,让服务器以为是正常浏览,而不是爬虫<br /># 静态网页通常反爬不严格,所以只要通过 User-Agent 伪装成浏览器即可<br />headers = {<br />    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \<br />     Chrome/77.0.3865.120 Safari/537.36"<br />}<br /><br /># 请求数据,使用 get 方法请求数据<br />response = requests.get(url, headers=headers)<br />response<br />
  如果返回 则代表请求数据成功。如果返回 403 或 404 则说明请求不成功,可能需要检查电脑网络是否通畅、目标网址是否可以正常访问、headers 是否有正确设置等。
  3.3 解析网页数据
  请求成功后,我们要再次回到源代码中,以查看数据结构。
  
  可以看到,在网页源代码中数据是以 html 格式存储的。首先,最外面的 div 标签包裹了整个表格,里面的 div 标签包裹了表头。接着,一个 ul 标签包裹了所有的行内容,其中每一行是一个 li 标签,每列具体数据是 div 标签。
  因此,我们需要的是每个 li 标签里所有 div 标签里的数据。这里,我们使用 Python 中 bs4 包的 BeautifulSoup 进行网页数据解析。
  # 导入模块<br />from bs4 import BeautifulSoup<br /><br />soup = BeautifulSoup(response.text, "html.parser")  # 由于是通过 html 格式存储的,所以用 “html.parser” 进行解析<br />data_table = soup.find('ul', class_="thrui").find_all("li")  # 找到包裹表内容的 ul 标签,找到里面所有的 li 标签<br /><br />weather_list = []  # 构造空列表以存储数据<br />for li in data_table[1:]:  # 循环获取每行的数据(li 标签)<br />    th_list = li.find_all('div')  # 获取每行的每个数据 (li 标签下的 div 标签)<br />    weather = {<br />        'date': th_list[0].get_text(),  # 获取第一个 div 标签中的内容,命名为 “date”<br />        'temp_high': th_list[1].get_text(),<br />        'temp_low': th_list[2].get_text(),<br />        'weather': th_list[3].get_text(),<br />        'wind': th_list[4].get_text(),<br />        'url': response.url  # 爬取时通常可以顺便保存一下当页的网址,方便溯源和排查错误<br />    }  # 每行数据存储在一个字典中<br />    weather_list.append(weather)  # 所有行的数据存入一个列表中<br />
  小提示:在爬取表格型数据时,如果列数很多,像上面一样单个获取再存储就比较麻烦。这里再提供一种适用于爬取表格型数据的更简洁的方式,需要用到 Python 中另一个强大的模块 numpy。
  import numpy as np<br />weather_list = []<br />for li in data_table[1:]:     <br />    th_list = li.find_all('div')<br />    for th in th_list:<br />        s = th.get_text()  # 循环获取 div 标签数据<br />        weather_list.append("".join(s.split()))  # 直接把获取的 div 标签全部存在一个列表中<br />result = np.array(weather_list).reshape(-1, 5)   # 通过 numpy 直接转为多行 5 列的数据表<br /># 最后再转化为数据框并重命名列即可<br /># 这种方式虽然方便,但可能不太直观,也可能出错(比如有的数据不全,就容易错位)<br /># 此外,还有很多不同的解析数据的方式,可以多去尝试<br />
  3.4 储存爬取数据
  把数据解析好之后,数据就可以通过更加结构化的形式进行存储,通常可以使用 txt、excel、csv 等格式。由于无格式、比 txt 更直观、可以用 excel 打开,一般比较推荐用 csv 格式储存。
  # 导入模块<br />import csv<br /><br /># 保存数据的文件路径<br />save_path = 'weather.csv'<br /><br /># 将数据写入 csv<br />with open(save_path, 'a', newline='', encoding='utf-8') as fp:<br />    csv_header = ['date', 'temp_high', 'temp_low', 'weather', 'wind', 'url']  # 设置表头,即列名<br />    csv_writer = csv.DictWriter(fp, csv_header)  <br />    if fp.tell() == 0:<br />        csv_writer.writeheader()  # 如果文件不存在,则写入表头;如果文件已经存在,则直接追加数据不再次写入表头。<br />    csv_writer.writerows(weather_list)  # 写入数据<br />
  小提示:爬取时,建议爬一页存一页。如果完全爬取完再一次写入,很可能会遇到循环爬取过程中出错,导致已爬取的数据无法成功储存。这里写入 csv 时用的编码格式是 utf-8,所以打开数据时也要用对应的编码格式,否则可能会出现乱码。
  3.5 循环爬取数据
  通常,我们需要的不仅仅是单页的数据,而是网站上的所有或大部分数据,所以需要多页循环爬取。在成功爬取一页数据之后,多页爬取就很简单了。只需要分析网址的变化规律,生成所有需要的网址,再把单页爬取重复多次就可以了。
  首先,来分析一下网址的变化规律。
  bejing<br />https://lishi.tianqi.com/beijing/202203.html<br />https://lishi.tianqi.com/beijing/202202.html<br />https://lishi.tianqi.com/beijing/202201.html<br />https://lishi.tianqi.com/beijing/202112.html<br /><br />shanghai<br />https://lishi.tianqi.com/shang ... %3Bbr />https://lishi.tianqi.com/shang ... %3Bbr />
  可以看到,网址在变化。这也是前面提到静态网页的另一个特征,网址不变数据不 “动”,数据要 “动” 网址就变。 回到例子中,只有两个地方在变化。一个是城市变化时,网址的城市代码部分变化,这里是城市的汉语拼音。另一个是时间变化时,网址的时间代码部分变化,这里是年月的 6 位数字。
  知道了网址的变化规律后,我们就可以通过循环来爬取多页数据。这里有两种思路,一种是先根据网址变化规律,一次性生成所有要爬取的网址,再在网址中循环获取数据。另一种是根据网址变化规律,生成一个网址,爬取一个网址,不断循环。两种方法都可以,这里使用第一种,先生成所有网址。
  url_pattern = 'https://lishi.tianqi.com/{}/{}.html'  # 网址的基本结构,有变化的两个部分用 {} 替代,后面循环补充<br /><br />city_list = ['beijing', 'shanghai']      # 构造需要爬取的城市的列表<br />years = [x for x in range(2020, 2022)]   # 使用列表生成式生成年份列表<br />months = [str(x).zfill(2) for x in range(1, 13)] # 生成月份列表,zfill 函数补充两位数<br />month_list = [str(year) + str(month) for year in years for month in months]  # 年月循环拼在一起<br /><br />url_list = []              # 空列表用于存储所有网址<br />for c in city_list:       # 先循环城市<br />    for m in month_list:  # 再循环时间<br />        url_list.append(url_pattern.format(c, m))  # 通过 format 函数生成网址<br />
  生成了所有的网址后,把前面单页爬取循环到不同的网址下,就可以获取所有的数据了。
  4. 完整代码
  在实际过程中,通常会把每个需要重复操作的步骤都构造成函数,方便在循环中调用。这里的完整代码是通过构造函数的方式来进行的,函数的主体部分就是前面每个步骤的具体代码。
  # -*- coding: utf-8 -*-<br /># Author: W.Y.<br /># Email: wangyingchn@outlook.com<br /># Date: 2022/4/4<br /><br /># 导入模块<br />import csv  # 用于存储数据<br />import time  # 用于时间间隔避免过频繁的请求<br />import requests  # 用于请求数据<br />from bs4 import BeautifulSoup  # 用于解析数据<br /><br /># 请求数据<br />def get_response(url):<br />    # 伪装一下,让服务器以为是正常浏览,而不是爬虫。<br />    # 静态网页通常反爬不严格,所以只要通过 User-Agent 伪装成浏览器即可。<br />    headers = {<br />        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 \<br />        (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"<br />    }<br />    # 请求数据。使用 get 方法请求数据<br />    response = requests.get(url, headers=headers)<br />    return response<br /><br /># 解析数据<br />def parse_data(response):<br />    soup = BeautifulSoup(response.text, "html.parser")  # 由于是通过 html 格式存储的,所以用 “html.parser” 进行解析<br />    data_table = soup.find('ul', class_="thrui").find_all("li")  # 找到包裹表内容的 ul 标签,找到里面所有的 li 标签<br />    weather_list = []  # 构造空列表以存储数据<br />    for li in data_table[1:]:  # 循环获取每行的数据(li 标签)<br />        th_list = li.find_all('div')  # 获取每行的每个数据 (li 标签下的 div 标签)<br />        weather = {<br />            'date': th_list[0].get_text(),  # 获取第一个 div 标签中的内容,命名为 “date”<br />            'temp_high': th_list[1].get_text(),<br />            'temp_low': th_list[2].get_text(),<br />            'weather': th_list[3].get_text(),<br />            'wind': th_list[4].get_text(),<br />            'url': response.url  # 爬取时通常可以顺便保存一下当页的网址,方便溯源和排查错误<br />            # 'city': response.url.split('/')[3]  # 如果需要增加一列城市,也可以通过 url 来获取<br />        }   # 每行数据存储在一个字典中<br />        weather_list.append(weather)  # 所有行的数据存入一个列表中<br />    return weather_list<br /><br /># 储存数据<br />def save_data(weather_list, save_path):<br />    with open(save_path, 'a', newline='', encoding='utf-8') as fp:<br />        csv_header = ['date', 'temp_high', 'temp_low', 'weather', 'wind', 'url']  # 设置表头,即列名<br />        csv_writer = csv.DictWriter(fp, csv_header)<br />        if fp.tell() == 0:<br />            csv_writer.writeheader()  # 如果文件不存在,则写入表头;如果文件已经存在,则直接追加数据不再次写入表头<br />        csv_writer.writerows(weather_list)  # 写入数据<br /><br /># 构造网址<br />def generate_urls():<br />    url_pattern = 'https://lishi.tianqi.com/{}/{}.html'  # 网址的基本结构,有变化的两个部分用 {} 替代,后面循环补充<br />    city_list = ['beijing', 'shanghai']  # 构造需要爬取的城市的列表<br />    years = [x for x in range(2020, 2022)]  # 使用列表生成式生成年份列表<br />    months = [str(x).zfill(2) for x in range(1, 13)]  # 生成月份列表,zfill 函数补充两位数<br />    month_list = [str(year) + str(month) for year in years for month in months]  # 年月循环拼在一起<br />    url_list = []  # 空列表用于存储所有网址<br />    for c in city_list:  # 先循环城市<br />        for m in month_list:  # 再循环时间<br />            url_list.append(url_pattern.format(c, m))  # 通过 format 函数生成网址<br />    return url_list<br /><br /># 定义爬取函数<br />def crawler(url, save_path):<br />    response = get_response(url)    # 请求数据<br />    results = parse_data(response)  # 解析数据<br />    save_data(results, save_path)   # 存储数据<br />    print(f'成功爬取数据:{url}')<br /><br />if __name__ == '__main__':<br />    urls = generate_urls()     # 构造所有网址<br />    save_file = 'weather.csv'  # 保存数据的文件路径<br />    for u in urls:     # 在网址中循环<br />        time.sleep(2)  # 每次爬取休息 2 秒,以免太过频繁的请求<br />        crawler(u, save_file)  # 进行爬取<br />
  5. 相关推文
  Note:产生如下推文列表的 Stata 命令为:
  lianxh 爬虫, m
  安装最新版 lianxh 命令:
  ssc install lianxh, replace
  专题:Python-R-Matlab
  
  连享会 ·
  
  
  New! Stata 搜索神器:lianxh 和 songbl
  搜: 推文、数据分享、期刊论文、重现代码 ……
  安装:
  . ssc install lianxh
  . ssc install songbl
  使用:
  . lianxh DID 倍分法
  . songbl all
  
  关于我们
   查看全部

  Python爬取静态网站:以历史天气为例
  邮箱:
  目录
  4. 完整代码
  5. 相关推文
  温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:
  
  数据获取是实证研究的第一步。随着互联网数据的指数级增长,网络数据成为重要且常用的数据源。网络爬虫也因此成为获取数据的重要方式。但是我们通常会觉得爬虫非常复杂,不知道从何下手。为此,本文将通过实际的爬取案例介绍,来帮助大家掌握相关知识。
  1. 静态网页和动态网页
  网页类型包括静态网页和动态网页。简单来说,静态网页是指数据直接存储在网页的 html 中,不论用户是否请求了数据,数据就 “静止” 在那里。动态网页的数据则被 “藏” 起来了,用户每次请求后,动态网页才会有一个向远程数据库请求数据的“动作”,再把数据显示出来,但用户无法直接从网页的 html 中获取数据。
  这里不细说静态网页和动态网页的官方定义,只说两个最明显的区别,以方便大家在分析网页时进行区分:
  直观来说,翻页时网址变化的网站就是静态网站,反之就是动态网站。比如微博评论、bilibili 评论这样一直下滑会一直出现新的数据,但是网址不变的,就是动态网站。
  2. 静态网页爬取的思路
  这次我们先聊聊如何爬取静态网页的数据。由于静态网页结构比较简单,可以直接通过获取网页源代码得到数据,所以爬取比较简单。有了目标网站后,静态网页数据的爬取可以分为四步:
  如果涉及多页的数据,还涉及到分析网址翻页规律和进行循环:
  小提示:多页循环时,可以先爬取单页数据,成功后再循环爬取部分数据 (比如 10 页),没问题再爬取完整数据。
  3. 案例之爬取历史天气
  接下来用一个简单的实战案例,来具体介绍如何通过 Python 爬取静态网页的数据。主要内容包括:
  3.1 分析网页结构
  分析网页结构是爬取数据的第一步,也是重中之重。在本案例中,我们需要爬取「天气网」的历史数据。以北京市 2022 年 3 月天气的「网页」为例,进行网页结构分析。首先,我们需要的数据如下图左所示,包括每天的日期、最高气温、最低气温、天气、风向。
  然后,在浏览器页面右键查看网页源代码,并在源代码中找到对应的数据 (如下图右)。这也是前面提到的静态网页第一个特征:页面上显示的数据都可以在源代码中找到。
  
  小提示:静态网页的结构都比较简单,我们不需要太多精力去分析网页结构,只需要在源代码中验证一下是否有需要的数据即可。
  3.2 请求网页数据
  由于数据都藏在源代码中,我们只需要请求网页内容,即把源代码下载到本地,进行分析。关于网页请求,我们需要用到 Python 爬虫中常用包 requests。
  # 导入模块<br />import requests<br /><br /># 输入网址。这里还是以北京市 2022 年 3 月的天气为例进行单页爬取。<br />url = "https://lishi.tianqi.com/beiji ... %3Bbr /><br /># 伪装一下,让服务器以为是正常浏览,而不是爬虫<br /># 静态网页通常反爬不严格,所以只要通过 User-Agent 伪装成浏览器即可<br />headers = {<br />    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \<br />     Chrome/77.0.3865.120 Safari/537.36"<br />}<br /><br /># 请求数据,使用 get 方法请求数据<br />response = requests.get(url, headers=headers)<br />response<br />
  如果返回 则代表请求数据成功。如果返回 403 或 404 则说明请求不成功,可能需要检查电脑网络是否通畅、目标网址是否可以正常访问、headers 是否有正确设置等。
  3.3 解析网页数据
  请求成功后,我们要再次回到源代码中,以查看数据结构。
  
  可以看到,在网页源代码中数据是以 html 格式存储的。首先,最外面的 div 标签包裹了整个表格,里面的 div 标签包裹了表头。接着,一个 ul 标签包裹了所有的行内容,其中每一行是一个 li 标签,每列具体数据是 div 标签。
  因此,我们需要的是每个 li 标签里所有 div 标签里的数据。这里,我们使用 Python 中 bs4 包的 BeautifulSoup 进行网页数据解析。
  # 导入模块<br />from bs4 import BeautifulSoup<br /><br />soup = BeautifulSoup(response.text, "html.parser")  # 由于是通过 html 格式存储的,所以用 “html.parser” 进行解析<br />data_table = soup.find('ul', class_="thrui").find_all("li")  # 找到包裹表内容的 ul 标签,找到里面所有的 li 标签<br /><br />weather_list = []  # 构造空列表以存储数据<br />for li in data_table[1:]:  # 循环获取每行的数据(li 标签)<br />    th_list = li.find_all('div')  # 获取每行的每个数据 (li 标签下的 div 标签)<br />    weather = {<br />        'date': th_list[0].get_text(),  # 获取第一个 div 标签中的内容,命名为 “date”<br />        'temp_high': th_list[1].get_text(),<br />        'temp_low': th_list[2].get_text(),<br />        'weather': th_list[3].get_text(),<br />        'wind': th_list[4].get_text(),<br />        'url': response.url  # 爬取时通常可以顺便保存一下当页的网址,方便溯源和排查错误<br />    }  # 每行数据存储在一个字典中<br />    weather_list.append(weather)  # 所有行的数据存入一个列表中<br />
  小提示:在爬取表格型数据时,如果列数很多,像上面一样单个获取再存储就比较麻烦。这里再提供一种适用于爬取表格型数据的更简洁的方式,需要用到 Python 中另一个强大的模块 numpy。
  import numpy as np<br />weather_list = []<br />for li in data_table[1:]:     <br />    th_list = li.find_all('div')<br />    for th in th_list:<br />        s = th.get_text()  # 循环获取 div 标签数据<br />        weather_list.append("".join(s.split()))  # 直接把获取的 div 标签全部存在一个列表中<br />result = np.array(weather_list).reshape(-1, 5)   # 通过 numpy 直接转为多行 5 列的数据表<br /># 最后再转化为数据框并重命名列即可<br /># 这种方式虽然方便,但可能不太直观,也可能出错(比如有的数据不全,就容易错位)<br /># 此外,还有很多不同的解析数据的方式,可以多去尝试<br />
  3.4 储存爬取数据
  把数据解析好之后,数据就可以通过更加结构化的形式进行存储,通常可以使用 txt、excel、csv 等格式。由于无格式、比 txt 更直观、可以用 excel 打开,一般比较推荐用 csv 格式储存。
  # 导入模块<br />import csv<br /><br /># 保存数据的文件路径<br />save_path = 'weather.csv'<br /><br /># 将数据写入 csv<br />with open(save_path, 'a', newline='', encoding='utf-8') as fp:<br />    csv_header = ['date', 'temp_high', 'temp_low', 'weather', 'wind', 'url']  # 设置表头,即列名<br />    csv_writer = csv.DictWriter(fp, csv_header)  <br />    if fp.tell() == 0:<br />        csv_writer.writeheader()  # 如果文件不存在,则写入表头;如果文件已经存在,则直接追加数据不再次写入表头。<br />    csv_writer.writerows(weather_list)  # 写入数据<br />
  小提示:爬取时,建议爬一页存一页。如果完全爬取完再一次写入,很可能会遇到循环爬取过程中出错,导致已爬取的数据无法成功储存。这里写入 csv 时用的编码格式是 utf-8,所以打开数据时也要用对应的编码格式,否则可能会出现乱码。
  3.5 循环爬取数据
  通常,我们需要的不仅仅是单页的数据,而是网站上的所有或大部分数据,所以需要多页循环爬取。在成功爬取一页数据之后,多页爬取就很简单了。只需要分析网址的变化规律,生成所有需要的网址,再把单页爬取重复多次就可以了。
  首先,来分析一下网址的变化规律。
  bejing<br />https://lishi.tianqi.com/beijing/202203.html<br />https://lishi.tianqi.com/beijing/202202.html<br />https://lishi.tianqi.com/beijing/202201.html<br />https://lishi.tianqi.com/beijing/202112.html<br /><br />shanghai<br />https://lishi.tianqi.com/shang ... %3Bbr />https://lishi.tianqi.com/shang ... %3Bbr />
  可以看到,网址在变化。这也是前面提到静态网页的另一个特征,网址不变数据不 “动”,数据要 “动” 网址就变。 回到例子中,只有两个地方在变化。一个是城市变化时,网址的城市代码部分变化,这里是城市的汉语拼音。另一个是时间变化时,网址的时间代码部分变化,这里是年月的 6 位数字。
  知道了网址的变化规律后,我们就可以通过循环来爬取多页数据。这里有两种思路,一种是先根据网址变化规律,一次性生成所有要爬取的网址,再在网址中循环获取数据。另一种是根据网址变化规律,生成一个网址,爬取一个网址,不断循环。两种方法都可以,这里使用第一种,先生成所有网址。
  url_pattern = 'https://lishi.tianqi.com/{}/{}.html'  # 网址的基本结构,有变化的两个部分用 {} 替代,后面循环补充<br /><br />city_list = ['beijing', 'shanghai']      # 构造需要爬取的城市的列表<br />years = [x for x in range(2020, 2022)]   # 使用列表生成式生成年份列表<br />months = [str(x).zfill(2) for x in range(1, 13)] # 生成月份列表,zfill 函数补充两位数<br />month_list = [str(year) + str(month) for year in years for month in months]  # 年月循环拼在一起<br /><br />url_list = []              # 空列表用于存储所有网址<br />for c in city_list:       # 先循环城市<br />    for m in month_list:  # 再循环时间<br />        url_list.append(url_pattern.format(c, m))  # 通过 format 函数生成网址<br />
  生成了所有的网址后,把前面单页爬取循环到不同的网址下,就可以获取所有的数据了。
  4. 完整代码
  在实际过程中,通常会把每个需要重复操作的步骤都构造成函数,方便在循环中调用。这里的完整代码是通过构造函数的方式来进行的,函数的主体部分就是前面每个步骤的具体代码。
  # -*- coding: utf-8 -*-<br /># Author: W.Y.<br /># Email: wangyingchn@outlook.com<br /># Date: 2022/4/4<br /><br /># 导入模块<br />import csv  # 用于存储数据<br />import time  # 用于时间间隔避免过频繁的请求<br />import requests  # 用于请求数据<br />from bs4 import BeautifulSoup  # 用于解析数据<br /><br /># 请求数据<br />def get_response(url):<br />    # 伪装一下,让服务器以为是正常浏览,而不是爬虫。<br />    # 静态网页通常反爬不严格,所以只要通过 User-Agent 伪装成浏览器即可。<br />    headers = {<br />        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 \<br />        (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"<br />    }<br />    # 请求数据。使用 get 方法请求数据<br />    response = requests.get(url, headers=headers)<br />    return response<br /><br /># 解析数据<br />def parse_data(response):<br />    soup = BeautifulSoup(response.text, "html.parser")  # 由于是通过 html 格式存储的,所以用 “html.parser” 进行解析<br />    data_table = soup.find('ul', class_="thrui").find_all("li")  # 找到包裹表内容的 ul 标签,找到里面所有的 li 标签<br />    weather_list = []  # 构造空列表以存储数据<br />    for li in data_table[1:]:  # 循环获取每行的数据(li 标签)<br />        th_list = li.find_all('div')  # 获取每行的每个数据 (li 标签下的 div 标签)<br />        weather = {<br />            'date': th_list[0].get_text(),  # 获取第一个 div 标签中的内容,命名为 “date”<br />            'temp_high': th_list[1].get_text(),<br />            'temp_low': th_list[2].get_text(),<br />            'weather': th_list[3].get_text(),<br />            'wind': th_list[4].get_text(),<br />            'url': response.url  # 爬取时通常可以顺便保存一下当页的网址,方便溯源和排查错误<br />            # 'city': response.url.split('/')[3]  # 如果需要增加一列城市,也可以通过 url 来获取<br />        }   # 每行数据存储在一个字典中<br />        weather_list.append(weather)  # 所有行的数据存入一个列表中<br />    return weather_list<br /><br /># 储存数据<br />def save_data(weather_list, save_path):<br />    with open(save_path, 'a', newline='', encoding='utf-8') as fp:<br />        csv_header = ['date', 'temp_high', 'temp_low', 'weather', 'wind', 'url']  # 设置表头,即列名<br />        csv_writer = csv.DictWriter(fp, csv_header)<br />        if fp.tell() == 0:<br />            csv_writer.writeheader()  # 如果文件不存在,则写入表头;如果文件已经存在,则直接追加数据不再次写入表头<br />        csv_writer.writerows(weather_list)  # 写入数据<br /><br /># 构造网址<br />def generate_urls():<br />    url_pattern = 'https://lishi.tianqi.com/{}/{}.html'  # 网址的基本结构,有变化的两个部分用 {} 替代,后面循环补充<br />    city_list = ['beijing', 'shanghai']  # 构造需要爬取的城市的列表<br />    years = [x for x in range(2020, 2022)]  # 使用列表生成式生成年份列表<br />    months = [str(x).zfill(2) for x in range(1, 13)]  # 生成月份列表,zfill 函数补充两位数<br />    month_list = [str(year) + str(month) for year in years for month in months]  # 年月循环拼在一起<br />    url_list = []  # 空列表用于存储所有网址<br />    for c in city_list:  # 先循环城市<br />        for m in month_list:  # 再循环时间<br />            url_list.append(url_pattern.format(c, m))  # 通过 format 函数生成网址<br />    return url_list<br /><br /># 定义爬取函数<br />def crawler(url, save_path):<br />    response = get_response(url)    # 请求数据<br />    results = parse_data(response)  # 解析数据<br />    save_data(results, save_path)   # 存储数据<br />    print(f'成功爬取数据:{url}')<br /><br />if __name__ == '__main__':<br />    urls = generate_urls()     # 构造所有网址<br />    save_file = 'weather.csv'  # 保存数据的文件路径<br />    for u in urls:     # 在网址中循环<br />        time.sleep(2)  # 每次爬取休息 2 秒,以免太过频繁的请求<br />        crawler(u, save_file)  # 进行爬取<br />
  5. 相关推文
  Note:产生如下推文列表的 Stata 命令为:
  lianxh 爬虫, m
  安装最新版 lianxh 命令:
  ssc install lianxh, replace
  专题:Python-R-Matlab
  
  连享会 ·
  
  
  New! Stata 搜索神器:lianxh 和 songbl
  搜: 推文、数据分享、期刊论文、重现代码 ……
  安装:
  . ssc install lianxh
  . ssc install songbl
  使用:
  . lianxh DID 倍分法
  . songbl all
  
  关于我们
  

SEO之网站快速被收录

网站优化优采云 发表了文章 • 0 个评论 • 30 次浏览 • 2022-06-04 10:19 • 来自相关话题

  SEO之网站快速被收录
  对前端而言,迎合搜索引擎的需求也是常有的。对于 Vue 技术栈而言,Nuxtjs 是不二之选。最近刚做完一个类似需求,在此记录一二。
  生成网站地图
  Nuxtjs 提供了相关的组件,我们直接使用即可。
  安装组件
  npm install @nuxtjs/sitemap --save
  配置
  在nuxt.config.js中添加组件的配置
  {<br />      ...<br />      modules: [<br />        '@nuxtjs/sitemap'<br />     ],<br />      ...<br />}
  配置网站地图
  {<br />      ...<br />      modules: [<br />        '@nuxtjs/sitemap'<br />      ],<br />      sitemap: {<br />        hostname: 'https://example.com',<br />        gzip: true,<br />        exclude: [<br />            '/login'<br />        ],<br />        routes: [<br />          '/'<br />        ]<br />     }<br />      ...<br />}
  以上为一个简单的例子,访问可以查看生成的网站地图
  <br />     <br />         https://example.com/<br />     <br />
  这种“写死”的用法肯定是无法满足项目需求的,根据数据动态生成才是我们想要的
  // 导入 axios,也可以是其他用着顺手的组件<br />import axios from 'axios'<br /><br />export default {<br />      ...<br />      sitemap: {<br />          hostname: 'https://example.com',<br />          gzip: true,<br />          exclude: [<br />              '/login'<br />         ],<br />          routes: async () => {<br />              const items = await axiox.get('https://example.com/api')<br />              const list = []<br />              items.forEach(item => {<br />                  list.push({<br />                      url: `/posts/${item.id}`,<br />                      changefred: 'weekly',<br />                      lastmod: new Date()<br />                  })<br />              })<br />              return list<br />          }<br />     }<br />     ...<br />}
  以上即可根据接口的数据动态生成网站地图。
  但是实际项目中,一个正在运营的网站,数据是巨大的,生成网站地图体积也是巨大的,所以我们需要对网站地图进行分类和压缩。另外,如果单个网站地图文件超过 50M,建议再进行一次切割。
  import axios from 'axios'<br /><br />export default {<br />      ...<br />      sitemap: {<br />          hostname: 'https://example.com',<br />         gzip: true,<br />          exclude: [<br />              '/login'<br />           ],<br />           sitemaps: [<br />               {<br />                    path: '/sitemap_cate.xml',<br />                    gzip: true,<br />                    routes: async () => {<br />                          const items = await axiox.get('https://example.com/cate')<br />                          const list = []<br />                          items.forEach(item => {<br />                              list.push({<br />                                  url: `/posts/${item.id}`,<br />                                  changefred: 'weekly',<br />                                  lastmod: new Date()<br />                               })<br />                           })<br />                          return list<br />                    }<br />                 },<br />                  ...<br />            ]<br />      }<br />      ...<br />}
  以上即可生成不同的网站地图文件(,)
  拓展
  每个项目的情况不一样,如果你不喜欢这种网站地图生成的方式,你也可以选择通过其他方式(脚本构建等)生成网站地图,然后将文件放到static目录中。
  robots.txt 文件
  想要网站更好的被搜索引擎抓取,而避免收到过多请求,则需要robots.txt文件配合。
  创建文件
  直接在static目录中创建robots.txt文件即可。
  注意事项:
  配置
  robots.txt需要包含以下内容:
  示例:
  User-agent: *<br />disabllow: <br />allow: /<br />sitemap: https://example.com/sitemap.xml
  一般而言,以上示例就能满足大多数网站,实际情况还得是根据项目自己决断。
  测试
  如果你完成了robots.txt文件,不确定是否有问题,可以测试一下。robots.txt在线测试()
  上传网站地图
  当我们完成以上配置,网站开发完成,并发布上线,如果是一个新项目的话,可能在很长的一段时间都没被搜索引擎收录,从而耽误发家致富。那我们要怎么快速的让搜索引擎收录呢?搜索引擎都支持上传网站地图,只要我们主动提交网站地图,就会第一时间被抓取。
  谷歌站长
  谷歌站长地址()
  添加网站
  输入需要提交网站地图的域名
  
  验证网站所有权
  验证网站的所有权,有三种方式:dns,html 标记,html 文件。
  当然首选是dns解析,如果你可以操作或者有同事能很快可以配合去验证的话。因为 html 标记跟 html 文件验证都需要重新发版,发版是一件比较“麻烦”的事。你懂的!
  
  我这里是使用 html 文件验证,直接把文件下载下来,放到static目录中,然后再重新发版。再回到后台,点一下验证,就会看到验证成功的提示。
  
  提交网站地图
  当网站验证完了之后就在后台提交网站地图了。
  
  百度站长
  注册百度站长 百度站长地址
  添加网站
  注册百度站长后,登陆到后台,点网站管理
  
  再点添加网站
   查看全部

  SEO之网站快速被收录
  对前端而言,迎合搜索引擎的需求也是常有的。对于 Vue 技术栈而言,Nuxtjs 是不二之选。最近刚做完一个类似需求,在此记录一二。
  生成网站地图
  Nuxtjs 提供了相关的组件,我们直接使用即可。
  安装组件
  npm install @nuxtjs/sitemap --save
  配置
  在nuxt.config.js中添加组件的配置
  {<br />      ...<br />      modules: [<br />        '@nuxtjs/sitemap'<br />     ],<br />      ...<br />}
  配置网站地图
  {<br />      ...<br />      modules: [<br />        '@nuxtjs/sitemap'<br />      ],<br />      sitemap: {<br />        hostname: 'https://example.com',<br />        gzip: true,<br />        exclude: [<br />            '/login'<br />        ],<br />        routes: [<br />          '/'<br />        ]<br />     }<br />      ...<br />}
  以上为一个简单的例子,访问可以查看生成的网站地图
  <br />     <br />         https://example.com/<br />     <br />
  这种“写死”的用法肯定是无法满足项目需求的,根据数据动态生成才是我们想要的
  // 导入 axios,也可以是其他用着顺手的组件<br />import axios from 'axios'<br /><br />export default {<br />      ...<br />      sitemap: {<br />          hostname: 'https://example.com',<br />          gzip: true,<br />          exclude: [<br />              '/login'<br />         ],<br />          routes: async () => {<br />              const items = await axiox.get('https://example.com/api')<br />              const list = []<br />              items.forEach(item => {<br />                  list.push({<br />                      url: `/posts/${item.id}`,<br />                      changefred: 'weekly',<br />                      lastmod: new Date()<br />                  })<br />              })<br />              return list<br />          }<br />     }<br />     ...<br />}
  以上即可根据接口的数据动态生成网站地图。
  但是实际项目中,一个正在运营的网站,数据是巨大的,生成网站地图体积也是巨大的,所以我们需要对网站地图进行分类和压缩。另外,如果单个网站地图文件超过 50M,建议再进行一次切割。
  import axios from 'axios'<br /><br />export default {<br />      ...<br />      sitemap: {<br />          hostname: 'https://example.com',<br />         gzip: true,<br />          exclude: [<br />              '/login'<br />           ],<br />           sitemaps: [<br />               {<br />                    path: '/sitemap_cate.xml',<br />                    gzip: true,<br />                    routes: async () => {<br />                          const items = await axiox.get('https://example.com/cate')<br />                          const list = []<br />                          items.forEach(item => {<br />                              list.push({<br />                                  url: `/posts/${item.id}`,<br />                                  changefred: 'weekly',<br />                                  lastmod: new Date()<br />                               })<br />                           })<br />                          return list<br />                    }<br />                 },<br />                  ...<br />            ]<br />      }<br />      ...<br />}
  以上即可生成不同的网站地图文件(,)
  拓展
  每个项目的情况不一样,如果你不喜欢这种网站地图生成的方式,你也可以选择通过其他方式(脚本构建等)生成网站地图,然后将文件放到static目录中。
  robots.txt 文件
  想要网站更好的被搜索引擎抓取,而避免收到过多请求,则需要robots.txt文件配合。
  创建文件
  直接在static目录中创建robots.txt文件即可。
  注意事项:
  配置
  robots.txt需要包含以下内容:
  示例:
  User-agent: *<br />disabllow: <br />allow: /<br />sitemap: https://example.com/sitemap.xml
  一般而言,以上示例就能满足大多数网站,实际情况还得是根据项目自己决断。
  测试
  如果你完成了robots.txt文件,不确定是否有问题,可以测试一下。robots.txt在线测试()
  上传网站地图
  当我们完成以上配置,网站开发完成,并发布上线,如果是一个新项目的话,可能在很长的一段时间都没被搜索引擎收录,从而耽误发家致富。那我们要怎么快速的让搜索引擎收录呢?搜索引擎都支持上传网站地图,只要我们主动提交网站地图,就会第一时间被抓取。
  谷歌站长
  谷歌站长地址()
  添加网站
  输入需要提交网站地图的域名
  
  验证网站所有权
  验证网站的所有权,有三种方式:dns,html 标记,html 文件。
  当然首选是dns解析,如果你可以操作或者有同事能很快可以配合去验证的话。因为 html 标记跟 html 文件验证都需要重新发版,发版是一件比较“麻烦”的事。你懂的!
  
  我这里是使用 html 文件验证,直接把文件下载下来,放到static目录中,然后再重新发版。再回到后台,点一下验证,就会看到验证成功的提示。
  
  提交网站地图
  当网站验证完了之后就在后台提交网站地图了。
  
  百度站长
  注册百度站长 百度站长地址
  添加网站
  注册百度站长后,登陆到后台,点网站管理
  
  再点添加网站
  

Web网页自动化实战《4.获取所有酒店的名字、价格、评分信息,并写入文件》上篇

网站优化优采云 发表了文章 • 0 个评论 • 31 次浏览 • 2022-06-04 00:41 • 来自相关话题

  Web网页自动化实战《4.获取所有酒店的名字、价格、评分信息,并写入文件》上篇
  目录二、分别拿到每家的价格、评分、酒店名并写入文件三、代码四、总结与扩展一、find_elements()的作用1.获取当前页面中所有酒店名称的元素
  
  通过元素的class属性获取酒店名,获取到了20个
  这20个酒店展示的格式都是一样的。每个div都是独立的。每个div都是个酒店的信息。
  
  这20个酒店名称都有同一个爸爸div1)find_element(By.XPATH,)
  find_element的意思是查找一个元素。 //span[@class="name"]这个表达式可能匹配到一个或多个元素,有多少个由页面来决定。
  find_element(By.XPATH,)只匹配找到的元素中的一个,而且是页面中第一个出现的元素。
  页面中按先后顺序,从最顶端的html开始从上往下加载。如果页面中有一个以上的,那么它匹配到的是第一个元素。
  2)find_elements(By.XPATH,)
  要获取找到的这20个元素的文本内容,它们的文本内容是酒店名称。
  find_elements(By.XPATH,) ----获取匹配到表达式的所有元素。
  
  Elements里面呈现的html中的元素呈现的顺序和页面中的顺序是一样的。2.获取当前页面中所有酒店价格的元素
  
  这个表达式匹配到20个元素3.获取当前页面中所有酒店评分的元素
  
  这个表达式匹配到20个元素二、分别拿到每家的价格、评分、酒店名并写入文件
  这20个元素,每个这样的元素里面都有价格、评分、酒店名称。
  1.分别拿到每家的价格、评分、酒店名
  
  这几行代码会一直反复执行,这是个遍历的过程。等到最后一个值全部取完了,它才会执行下面的部分。这几行全部缩进了,表示每取一个值,大家都会去做的事情。
  
  这个换行的效果是print()搞定的2.将拿到的数据写入文件
  fs = open("我的酒店数据.txt", "w",encoding='UTF-8') UTF-8支持中英文。
  读:比如读本地某个数据表格,本地必须有才能读,没有就读不到。
  w可写入模式:文件不存在,就创建文件并写入。文件存在,直接写入。
  w 这种模式写的时候是直接覆盖文件中的内容的。
  三、代码
  from selenium.webdriver.common.by import By<br /><br />from selenium import webdriver<br />import time<br /><br /># 打开谷歌浏览器,与浏览器建立了会话。<br /># driver变量=会话。<br />driver = webdriver.Chrome()<br />driver.get("https://www.elong.com/")  # 这行代码执行后,会等到页面加载得差不多了再去执行下一行代码。<br /># get()这个功能是会等到页面加载完成的。<br /># 有的时候页面加载出来了,但是渲染的方式有些慢。<br /># 所以我还想等1秒也是可以的。<br />time.sleep(1)<br /><br /># 查找元素通过xpath定位方式。<br />ele = driver.find_element(By.XPATH, '//input[@data-bindid="city"]')  # 定位到目的地的输入框,将刚才在写好的表达式复制过来。<br /># ele= 我找到的元素<br /># 点击操作 -- 点击目的地输入框,弹出城市选择框。<br />ele.click()<br />time.sleep(2)  # 运行这行代码后会停留2秒,然后再去运行下一行代码。<br /># 因为接下来要操作的元素,是动态出现的(不是一开始访问网站就有的,而是你做了一个动作让人家动态的出现了)。<br /># 它是需要时间呈现在页面上的。这个时间就需要你来等一等了。等一等网页,再去找这个元素去操作。<br /><br /><br /># 输入操作 --ele.send_keys("输入操作")<br /># 获取它的属性-- ele.get_attribute("属性名称")<br /># 获取它的文本内容-- ele.text<br /><br /><br /># 选择热门城市当中的广州<br />driver.find_element(By.XPATH, '//li[@data="0|15"]').click()<br />time.sleep(1)  # 加上等待时间。sleep时间不宜太长,7秒8秒,这个时间就太长了。<br /># 没加等待时间的时候运行代码,会发现操作太快了,且没有选择到对应的日期。<br /><br /># 选择入住日期<br />ele = driver.find_element(By.XPATH, '//input[@data-bindid="checkIn"]')<br />ele.clear()  # 输入日期前,先清空输入框的内容。<br />ele.send_keys("2022-05-27")<br /><br />time.sleep(1)  # 每个操作间都加了等待时间。<br /><br />'''<br />输入日期后,日期框没有消失,得让日期框消失。点击除了它以外的其它元素<br />(选一个页面固定的元素,那就点击目的地这个元素),<br />日期框就能消失了。再去处理下一个元素。不然日期框会挡住别的元素。<br />接下来点击搜索,搜索按钮被这个日期框遮住了。就会影响你的操作效果。<br />所以我是根据页面的特征习性来处理的。<br />'''<br /><br /># 把弹出的日期选择框关掉。<br />driver.find_element(By.XPATH, '//div[@id="domesticDiv"]//dt[text()="目的地"]').click()<br /><br /># 选择退房日期<br />b = driver.find_element(By.XPATH, '//input[@data-bindid="checkOut"]')<br />b.clear()<br />b.send_keys("2022-05-30")  # 输入日期<br />time.sleep(1)<br />driver.find_element(By.XPATH, '//div[@id="domesticDiv"]//dt[text()="目的地"]').click()<br />time.sleep(1)<br /><br /># a=driver.find_element(By.XPATH,'//input[@data-bindid="allInOne"]')<br /># a.clear()<br /># a.send_keys("喜悦门酒店(广州融创文旅城店)")<br /># time.sleep(1)<br /># driver.find_element(By.XPATH,'//div[@id="domesticDiv"]//dt[text()="目的地"]').click()<br /><br /># ========2、点击搜索按钮=========<br /># time.sleep(0.5)<br />driver.find_element(By.XPATH, '//span[@data-bindid="search"]').click()<br /><br /># ==========3、跳转到新的页面了,等待新的页面内容加载=========<br />time.sleep(7)  # 等待新的内容加载出来,用的是比较长的时间。<br /><br /># ================4、获取酒店的名字、酒店的价格、酒店的评价===============<br /># 拿到第一家酒店的信息<br /># hotel_name=driver.find_element(By.XPATH,'//span[@class="name"]').text<br /># hotel_price=driver.find_element(By.XPATH,'//p[@class="loginToSee"]').text<br /># hotel_review=driver.find_element(By.XPATH,'//p[@class="score mb5"]').text<br /># print("酒店信息:",hotel_name,hotel_review,hotel_price)<br /><br /><br /># ======================5、获取当前页面的所有酒店的价格、评分、名字<br /># find_elements(By.XPATH,) --- 获取匹配到表达式的所有元素。names是个列表。列表里面放的是元素对象。<br /># 所有酒店的名称元素<br />total_names = driver.find_elements(By.XPATH, '//span[@class="name"]')  # 20个同类型的元素。<br />time.sleep(1)<br /><br /># python中用来存放多个数据的是:list/字典/元组/集合这几种方式。<br /><br /><br /># 所有酒店的价格元素<br />total_prices = driver.find_elements(By.XPATH, '//p[@class="loginToSee"]')<br />time.sleep(1)<br /># 所有酒店的评分元素<br />total_previews = driver.find_elements(By.XPATH, '//p[@class="score mb5"]')<br /><br /># 从3个列表当中,每个值都要取出来。<br /># 店子里有20件衣服。从第1件开始到第20件都要去看一眼。把看一眼叫做访问。<br /># 这个叫做遍历/循环。从头到尾,每一个成员,你都要去访问。20个集合。<br /># 20个酒店。每一个酒店,都要去获取名字、价格、评分------遍历。<br />'''<br />for 变量 in 列表:# 在列表当中,取每一个成员,给到变量。<br />    取到的每一个成员,会去做的事情。<br />    取到的每个酒店,都要去拿酒店的名字、价格和评分。<br /><br />遍历的是:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]<br />'''<br /><br /><br /># 文件操作 -- 我的酒店数据.txt<br /># 读写操作。创建一个文件,写入数据,然后关闭。<br /># open -- 文件操作。<br /># 打开文件的时候,指明写入方式,以及编码格式为utf-8<br />fs = open("我的酒店数据.txt", "w",encoding='UTF-8')  # write -- w  可写入的模式。文件不存在会创建文件并写入。文件存在,直接写入。<br /># 这里只有文件名称,没有写路径,这就是告诉python,我就在当前路径下生成文件。<br />#w 这种模式是直接覆盖文件中的内容的。<br /># write写的时候,不会自动换行。  换行:\n<br /><br /><br /># for index in [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]:<br />for index in range(20):<br />    print(total_names[index].text, total_prices[index].text, total_previews[index].text)  # 拿到了每家酒店的名字价格和评分。<br />    fs.write(total_names[index].text + "  ")  # 在我没有关闭这个文件之前,是可以持续写入的。<br />    fs.write(total_prices[index].text + "  ")<br />    # fs.write(total_prices[index].get_attribute("属性名称")+"    ")#获取属性值<br />    # fs.write(total_prices[index].get_attribute('class') + "    ")<br />    fs.write(total_previews[index].text + "\n")<br /><br /># 关闭文件<br />fs.close()<br /><br /># for 后面的变量可以随便取名,in后面可以跟列表,当然除了列表以外,很多都可以的。<br />time.sleep(10)<br /><br />#########6.更多的事情:先选价格,再去看评分。###################<br />jiage=driver.find_element(By.XPATH,'//li[@class="radio fl"]//span[text()="150元以下"]').click()<br />try:<br />    pingfens = driver.find_elements(By.XPATH, '//p[@class="score mb5"]')<br />    fn = open("150元以下的评分数据.txt", "w",encoding='UTF-8')<br />    for score in range(20):<br />        print(pingfens[score].text)<br />        fn.write(pingfens[score].text+ "\n")<br />    fn.close()<br />except:<br />    pingfens = driver.find_elements(By.XPATH, '//p[@class="score mb5"]')<br />    fn = open("150元以下的评分数据.txt", "w",encoding='UTF-8')<br />    for score in range(20):<br />        print(pingfens[score].text)<br />        fn.write(pingfens[score].text+ "\n")<br />    fn.close()<br />#用捕获异常的方法规避当前遇到的异常了。否则代码是没问题,但多次运行后会报错。<br /><br /># ========7、关闭浏览器,关闭本次会话========<br />time.sleep(10)<br />driver.quit()  # 退出相关驱动,关闭所有窗口。<br /><br />
  
  运行成功四、总结与扩展1.总结
  1.find_elements()用来查找所有的元素,而且它的结果是个列表。
  2.列表的处理方式 -- 遍历取值,创建文件。
  3.遍历列表 -- for循环。
  4.数据写入文件。
  2.扩展
  根据列表的长度去遍历:再掌握range函数的用法。参考链接:
  运行这个fs.write(total_prices[index].get_attribute("属性名称")+" ")#获取属性值
  和fs.write(total_prices[index].text + " ")运行出来的结果都是一样的。
  
  第一种方式的运行结果
  
  第二种方式的运行结果
  以上所学,比如领导要看下平台的一些数据,可以利用这个脚本去访问公司的系统把数据拿下来。有些时候领导就想要个报告。学的这些不是没用,要在对应的时机用上来。
  爬虫有的时候会用到这么点自动化知识,但不是完全用的自动化知识。爬虫要学得好,真的要学得很深入。
  文章中的链接的版权归原作者所有,除标明“图片来自网络”的图片,皆为小编本人所画所截图。欢迎关注“清菡软件测试”,进群加v:qhtester,感谢点赞与分享! 查看全部

  Web网页自动化实战《4.获取所有酒店的名字、价格、评分信息,并写入文件》上篇
  目录二、分别拿到每家的价格、评分、酒店名并写入文件三、代码四、总结与扩展一、find_elements()的作用1.获取当前页面中所有酒店名称的元素
  
  通过元素的class属性获取酒店名,获取到了20个
  这20个酒店展示的格式都是一样的。每个div都是独立的。每个div都是个酒店的信息。
  
  这20个酒店名称都有同一个爸爸div1)find_element(By.XPATH,)
  find_element的意思是查找一个元素。 //span[@class="name"]这个表达式可能匹配到一个或多个元素,有多少个由页面来决定。
  find_element(By.XPATH,)只匹配找到的元素中的一个,而且是页面中第一个出现的元素。
  页面中按先后顺序,从最顶端的html开始从上往下加载。如果页面中有一个以上的,那么它匹配到的是第一个元素。
  2)find_elements(By.XPATH,)
  要获取找到的这20个元素的文本内容,它们的文本内容是酒店名称。
  find_elements(By.XPATH,) ----获取匹配到表达式的所有元素。
  
  Elements里面呈现的html中的元素呈现的顺序和页面中的顺序是一样的。2.获取当前页面中所有酒店价格的元素
  
  这个表达式匹配到20个元素3.获取当前页面中所有酒店评分的元素
  
  这个表达式匹配到20个元素二、分别拿到每家的价格、评分、酒店名并写入文件
  这20个元素,每个这样的元素里面都有价格、评分、酒店名称。
  1.分别拿到每家的价格、评分、酒店名
  
  这几行代码会一直反复执行,这是个遍历的过程。等到最后一个值全部取完了,它才会执行下面的部分。这几行全部缩进了,表示每取一个值,大家都会去做的事情。
  
  这个换行的效果是print()搞定的2.将拿到的数据写入文件
  fs = open("我的酒店数据.txt", "w",encoding='UTF-8') UTF-8支持中英文。
  读:比如读本地某个数据表格,本地必须有才能读,没有就读不到。
  w可写入模式:文件不存在,就创建文件并写入。文件存在,直接写入。
  w 这种模式写的时候是直接覆盖文件中的内容的。
  三、代码
  from selenium.webdriver.common.by import By<br /><br />from selenium import webdriver<br />import time<br /><br /># 打开谷歌浏览器,与浏览器建立了会话。<br /># driver变量=会话。<br />driver = webdriver.Chrome()<br />driver.get("https://www.elong.com/";)  # 这行代码执行后,会等到页面加载得差不多了再去执行下一行代码。<br /># get()这个功能是会等到页面加载完成的。<br /># 有的时候页面加载出来了,但是渲染的方式有些慢。<br /># 所以我还想等1秒也是可以的。<br />time.sleep(1)<br /><br /># 查找元素通过xpath定位方式。<br />ele = driver.find_element(By.XPATH, '//input[@data-bindid="city"]')  # 定位到目的地的输入框,将刚才在写好的表达式复制过来。<br /># ele= 我找到的元素<br /># 点击操作 -- 点击目的地输入框,弹出城市选择框。<br />ele.click()<br />time.sleep(2)  # 运行这行代码后会停留2秒,然后再去运行下一行代码。<br /># 因为接下来要操作的元素,是动态出现的(不是一开始访问网站就有的,而是你做了一个动作让人家动态的出现了)。<br /># 它是需要时间呈现在页面上的。这个时间就需要你来等一等了。等一等网页,再去找这个元素去操作。<br /><br /><br /># 输入操作 --ele.send_keys("输入操作")<br /># 获取它的属性-- ele.get_attribute("属性名称")<br /># 获取它的文本内容-- ele.text<br /><br /><br /># 选择热门城市当中的广州<br />driver.find_element(By.XPATH, '//li[@data="0|15"]').click()<br />time.sleep(1)  # 加上等待时间。sleep时间不宜太长,7秒8秒,这个时间就太长了。<br /># 没加等待时间的时候运行代码,会发现操作太快了,且没有选择到对应的日期。<br /><br /># 选择入住日期<br />ele = driver.find_element(By.XPATH, '//input[@data-bindid="checkIn"]')<br />ele.clear()  # 输入日期前,先清空输入框的内容。<br />ele.send_keys("2022-05-27")<br /><br />time.sleep(1)  # 每个操作间都加了等待时间。<br /><br />'''<br />输入日期后,日期框没有消失,得让日期框消失。点击除了它以外的其它元素<br />(选一个页面固定的元素,那就点击目的地这个元素),<br />日期框就能消失了。再去处理下一个元素。不然日期框会挡住别的元素。<br />接下来点击搜索,搜索按钮被这个日期框遮住了。就会影响你的操作效果。<br />所以我是根据页面的特征习性来处理的。<br />'''<br /><br /># 把弹出的日期选择框关掉。<br />driver.find_element(By.XPATH, '//div[@id="domesticDiv"]//dt[text()="目的地"]').click()<br /><br /># 选择退房日期<br />b = driver.find_element(By.XPATH, '//input[@data-bindid="checkOut"]')<br />b.clear()<br />b.send_keys("2022-05-30")  # 输入日期<br />time.sleep(1)<br />driver.find_element(By.XPATH, '//div[@id="domesticDiv"]//dt[text()="目的地"]').click()<br />time.sleep(1)<br /><br /># a=driver.find_element(By.XPATH,'//input[@data-bindid="allInOne"]')<br /># a.clear()<br /># a.send_keys("喜悦门酒店(广州融创文旅城店)")<br /># time.sleep(1)<br /># driver.find_element(By.XPATH,'//div[@id="domesticDiv"]//dt[text()="目的地"]').click()<br /><br /># ========2、点击搜索按钮=========<br /># time.sleep(0.5)<br />driver.find_element(By.XPATH, '//span[@data-bindid="search"]').click()<br /><br /># ==========3、跳转到新的页面了,等待新的页面内容加载=========<br />time.sleep(7)  # 等待新的内容加载出来,用的是比较长的时间。<br /><br /># ================4、获取酒店的名字、酒店的价格、酒店的评价===============<br /># 拿到第一家酒店的信息<br /># hotel_name=driver.find_element(By.XPATH,'//span[@class="name"]').text<br /># hotel_price=driver.find_element(By.XPATH,'//p[@class="loginToSee"]').text<br /># hotel_review=driver.find_element(By.XPATH,'//p[@class="score mb5"]').text<br /># print("酒店信息:",hotel_name,hotel_review,hotel_price)<br /><br /><br /># ======================5、获取当前页面的所有酒店的价格、评分、名字<br /># find_elements(By.XPATH,) --- 获取匹配到表达式的所有元素。names是个列表。列表里面放的是元素对象。<br /># 所有酒店的名称元素<br />total_names = driver.find_elements(By.XPATH, '//span[@class="name"]')  # 20个同类型的元素。<br />time.sleep(1)<br /><br /># python中用来存放多个数据的是:list/字典/元组/集合这几种方式。<br /><br /><br /># 所有酒店的价格元素<br />total_prices = driver.find_elements(By.XPATH, '//p[@class="loginToSee"]')<br />time.sleep(1)<br /># 所有酒店的评分元素<br />total_previews = driver.find_elements(By.XPATH, '//p[@class="score mb5"]')<br /><br /># 从3个列表当中,每个值都要取出来。<br /># 店子里有20件衣服。从第1件开始到第20件都要去看一眼。把看一眼叫做访问。<br /># 这个叫做遍历/循环。从头到尾,每一个成员,你都要去访问。20个集合。<br /># 20个酒店。每一个酒店,都要去获取名字、价格、评分------遍历。<br />'''<br />for 变量 in 列表:# 在列表当中,取每一个成员,给到变量。<br />    取到的每一个成员,会去做的事情。<br />    取到的每个酒店,都要去拿酒店的名字、价格和评分。<br /><br />遍历的是:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]<br />'''<br /><br /><br /># 文件操作 -- 我的酒店数据.txt<br /># 读写操作。创建一个文件,写入数据,然后关闭。<br /># open -- 文件操作。<br /># 打开文件的时候,指明写入方式,以及编码格式为utf-8<br />fs = open("我的酒店数据.txt", "w",encoding='UTF-8')  # write -- w  可写入的模式。文件不存在会创建文件并写入。文件存在,直接写入。<br /># 这里只有文件名称,没有写路径,这就是告诉python,我就在当前路径下生成文件。<br />#w 这种模式是直接覆盖文件中的内容的。<br /># write写的时候,不会自动换行。  换行:\n<br /><br /><br /># for index in [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]:<br />for index in range(20):<br />    print(total_names[index].text, total_prices[index].text, total_previews[index].text)  # 拿到了每家酒店的名字价格和评分。<br />    fs.write(total_names[index].text + "  ")  # 在我没有关闭这个文件之前,是可以持续写入的。<br />    fs.write(total_prices[index].text + "  ")<br />    # fs.write(total_prices[index].get_attribute("属性名称")+"    ")#获取属性值<br />    # fs.write(total_prices[index].get_attribute('class') + "    ")<br />    fs.write(total_previews[index].text + "\n")<br /><br /># 关闭文件<br />fs.close()<br /><br /># for 后面的变量可以随便取名,in后面可以跟列表,当然除了列表以外,很多都可以的。<br />time.sleep(10)<br /><br />#########6.更多的事情:先选价格,再去看评分。###################<br />jiage=driver.find_element(By.XPATH,'//li[@class="radio fl"]//span[text()="150元以下"]').click()<br />try:<br />    pingfens = driver.find_elements(By.XPATH, '//p[@class="score mb5"]')<br />    fn = open("150元以下的评分数据.txt", "w",encoding='UTF-8')<br />    for score in range(20):<br />        print(pingfens[score].text)<br />        fn.write(pingfens[score].text+ "\n")<br />    fn.close()<br />except:<br />    pingfens = driver.find_elements(By.XPATH, '//p[@class="score mb5"]')<br />    fn = open("150元以下的评分数据.txt", "w",encoding='UTF-8')<br />    for score in range(20):<br />        print(pingfens[score].text)<br />        fn.write(pingfens[score].text+ "\n")<br />    fn.close()<br />#用捕获异常的方法规避当前遇到的异常了。否则代码是没问题,但多次运行后会报错。<br /><br /># ========7、关闭浏览器,关闭本次会话========<br />time.sleep(10)<br />driver.quit()  # 退出相关驱动,关闭所有窗口。<br /><br />
  
  运行成功四、总结与扩展1.总结
  1.find_elements()用来查找所有的元素,而且它的结果是个列表。
  2.列表的处理方式 -- 遍历取值,创建文件。
  3.遍历列表 -- for循环。
  4.数据写入文件。
  2.扩展
  根据列表的长度去遍历:再掌握range函数的用法。参考链接:
  运行这个fs.write(total_prices[index].get_attribute("属性名称")+" ")#获取属性值
  和fs.write(total_prices[index].text + " ")运行出来的结果都是一样的。
  
  第一种方式的运行结果
  
  第二种方式的运行结果
  以上所学,比如领导要看下平台的一些数据,可以利用这个脚本去访问公司的系统把数据拿下来。有些时候领导就想要个报告。学的这些不是没用,要在对应的时机用上来。
  爬虫有的时候会用到这么点自动化知识,但不是完全用的自动化知识。爬虫要学得好,真的要学得很深入。
  文章中的链接的版权归原作者所有,除标明“图片来自网络”的图片,皆为小编本人所画所截图。欢迎关注“清菡软件测试”,进群加v:qhtester,感谢点赞与分享!

杭州seo整站优化:网站设计不合理怎么办?

网站优化优采云 发表了文章 • 0 个评论 • 41 次浏览 • 2022-05-29 14:50 • 来自相关话题

  杭州seo整站优化:网站设计不合理怎么办?
  很多seo优化进入一家公司后,在杭州seo整站优化时常常会遇到网站设计不合理的情况,很多经验丰富的seo都知道该如何处理,但是对于一些新手seo来说,就需要花费很长的时间去思考,去搜集资料,才能做好。今天seo知识网小编就为大家介绍一下杭州seo整站优化:网站设计不合理怎么办?
  
  杭州seo整站优化:网站设计不合理怎么办?只需要做好以下几点即可。
  一、对网站结构重新进行调整
  当遇到网站设计不合理的情况时,自然需要重新调整,这样网站才能恍然一新,不会给人一种杂乱无章的感觉。网站结构尽量简单明了,让人一目了然,让用户能够清楚的知道自己所要了解的内容在哪里,不会在网站中迷路。
  
  二、网站内链的调整
  seo优化人员虽然不需要你精通代码,但是一些基础性的东西还是要知道怎么改的,比如网站的相关推荐、面包屑、导航栏目位置的调整等等,做好这些工作,将网站内链做好布局,从而提升蜘蛛抓取效率,提升页面收录量,提升网站排名。
  三、网站层级不要超过三级,做好伪静态
  网站层级过深会导致网站蜘蛛爬行困难,我们需要做好网站的层级结构调整,让蜘蛛抓取网站更加有效率。同时动态链接蜘蛛抓取速度慢,建议修改成伪静态链接,网站页面收录速度更快。
  
  以上就是【杭州seo整站优化:网站设计不合理怎么办?】的介绍,希望对大家有所帮助。如果大家还想要了解更多seo优化知识,可以关注和收藏我们seo知识网,seo知识网会不定期更新网站建设、seo优化、网站优化方案、seo工具、seo外包、网络推广等方面知识,供大家参考、了解。
  期待你的 查看全部

  杭州seo整站优化:网站设计不合理怎么办?
  很多seo优化进入一家公司后,在杭州seo整站优化时常常会遇到网站设计不合理的情况,很多经验丰富的seo都知道该如何处理,但是对于一些新手seo来说,就需要花费很长的时间去思考,去搜集资料,才能做好。今天seo知识网小编就为大家介绍一下杭州seo整站优化:网站设计不合理怎么办?
  
  杭州seo整站优化:网站设计不合理怎么办?只需要做好以下几点即可。
  一、对网站结构重新进行调整
  当遇到网站设计不合理的情况时,自然需要重新调整,这样网站才能恍然一新,不会给人一种杂乱无章的感觉。网站结构尽量简单明了,让人一目了然,让用户能够清楚的知道自己所要了解的内容在哪里,不会在网站中迷路。
  
  二、网站内链的调整
  seo优化人员虽然不需要你精通代码,但是一些基础性的东西还是要知道怎么改的,比如网站的相关推荐、面包屑、导航栏目位置的调整等等,做好这些工作,将网站内链做好布局,从而提升蜘蛛抓取效率,提升页面收录量,提升网站排名。
  三、网站层级不要超过三级,做好伪静态
  网站层级过深会导致网站蜘蛛爬行困难,我们需要做好网站的层级结构调整,让蜘蛛抓取网站更加有效率。同时动态链接蜘蛛抓取速度慢,建议修改成伪静态链接,网站页面收录速度更快。
  
  以上就是【杭州seo整站优化:网站设计不合理怎么办?】的介绍,希望对大家有所帮助。如果大家还想要了解更多seo优化知识,可以关注和收藏我们seo知识网,seo知识网会不定期更新网站建设、seo优化、网站优化方案、seo工具、seo外包、网络推广等方面知识,供大家参考、了解。
  期待你的

抓取动态网页 【干货】PMO和项目经理必备的常用技术术语及解释—非技术项目经理必读

网站优化优采云 发表了文章 • 0 个评论 • 32 次浏览 • 2022-05-29 14:37 • 来自相关话题

  抓取动态网页 【干货】PMO和项目经理必备的常用技术术语及解释—非技术项目经理必读
  
  点击关注 不迷路--PMO前沿一个只分享干货的公号
  前一段时间,咱们整理了一份项目经理必备的术语表非常受欢迎
  很多非技术相关的项目经理希望咱们整理一份技术类常用的技术名词和术语解释,这不就来了嘛,希望对大家有帮助!
  
  AJAX:部分页面刷新的技术
  主要解决的是不用刷新网页,就能和后台交互获取数据,并应用于当前网页的问题。PMO前沿整理,禁止搬运!
  AJAX两项能力:
  1、发起网络请求、发起网络请求的能力由浏览器的内置能力提供,所有的浏览器都提供了XmlHttpRequest对象,它可以由网页调用,用来连接一个特定的地址。PMO前沿整理,禁止搬运!
  2、无须刷新,可动态操作网页。
  静态网页与动态网页
  用途:
  两者都是网页,都是再浏览器上用HTML展示出来的页面,HTML是网页的基础结构,网页如何排版,每个元素在什么位置,都是由它来描述的。
  区别:PMO前沿整理,禁止搬运!
  1、两者的核心区别是后台是否有数据库的支撑,也可以简单的描述为网页上展示的内容是否要变化,是因人而异显示不同内容,还是根据时间线呈现内容的变化,或者是保持不变。
  2、静态网页无须经过后台程序的处理,而动态网页要经过后后台处理程序。
  PMO前沿整理,禁止搬运!
  网页基础知识-表单
  用途:PMO前沿整理,禁止搬运!表单在很早的HTML版本中就已经存在,它是用户输入和网页之间数据交互的一个界面,在HTML中用标签标记。
  H5应用程序缓存
  提高服务器性能除了扩容外,还可通过Application Cache技术进行解决。
  1、该技术是HTML5中定义的一种离线存储技术标准,这种技术可以让开发者明确的指定页面中哪些静态资源可以在第一次访问网页的同时缓存到本地,并且在下次访问该网页时向服务器询问本地缓存的资源是否需要更新,PMO前沿。
  2、当浏览器打开适用了该技术得网页时,会尝试先从Cache中加载数据,并同时向服务器询问本地资源是否已经国企,如果本地资源过期,浏览器会自动从服务器上更新资源到cache中
  3、需要说明的时,如果Cache中的数据可用,浏览器就会对其进行加载,即使他们已经过期,页面可以用过注册监听器的方式获得Cache更新成功的时间,主动刷新下页面,将最新的内容及时展示给用户。
  优点:
  1、该技术通过缓存资源到本地,避免了每次打开网页都会从服务器拉取大量数据的过程,取而代之的只是一个轻量级的更新检查请求,这样开发者的服务器带宽就被大大的释放出来。
  2、由于网页的资源都是通过本地资源读取的,用户再次打开同一网页时,内容展示时间会大大缩短,甚至达到Native应用的水平,从而进一步优化用户体验,如果页面的所有资源都被缓存到了本地,那么页面就可以在离线的情况下被完整的加载了。
  。
  爬虫
  用途:
  抓取某个指定网页的数据并存储在本地。
  运行原理:
  首先给爬虫几个初始的URL链接,PMO前沿,爬虫把这些链接的网页抓取回来,经过对网页进行分析,得到两部分数据。
  1、一部分时网页的有效内容,可以用来建立搜索关键词的索引,这部分数据先存储起来。
  2、另一部分就是网页中的URL链接,可以作为下一轮爬虫抓取的目标网页,如此反复操作。
  
  客户端推送实现方式
  实现一个推送系统需要服务端和客户端的配合。1、一种方法时轮询,也就是不停的向服务器发起请求。2、另一种则是建立一条长时间链接服务器和APP的通道,通过这条捅到,不仅APP可以向服务器请求数据,服务器也可以向APP发送数据。
  缓存系统
  缓存的概念:缓存即临时,存即存储,故缓存即临时存储。刷圈的现象:1、刷了几页之后回到顶部,会发现看过的图片依旧在显示,并没有出现先显示占位符,再显示图片内容的情况,这表明图片一直在内存中,随时可被直接展示。2、点击一条新内容的图片时,会展示一张缩略图,然后出现loading图标旋转的动画,过一会儿一张清晰大图展现出来,表明这张图片是刚刚从网络拉取的。3、当用户翻到几天前的内容时,再次点击PMO前沿的图片,有时还需要从网络拉取,有时却瞬间打开,这是为什么呢?因为有可能高清图片已经被缓存系统删除,所以需要从网络重新拉取,也有可能高清图片还在缓存系统中,可以被快速加载,从而“瞬间打开”。缓存的分级:1、一级缓存也称内存缓存一级缓存存取速度最快,会多占一些内存,这是非常合理的一种以空间换取时间的程序设计,数据随着程序退出而消失,进入朋友圈,图片占用的内存空间不断增加,如果用户往回滑动,会发现刚才的图片都还在,因为这时一级缓存还没满,所有被缓存的图片都能正常满足业务需求,如果我们持续刷新朋友圈的内容,直至一级缓存的空间被完全占用,就必然要对缓存的图片进行淘汰,目前业界主要采用LRU(Least Recently Used)算法进行淘汰,也就是近期最少被使用的图片被淘汰,这里的“淘汰”,也仅仅是将图片从一级缓存迁移到二级缓存,并没有完全丢弃2、二级缓存也称磁盘缓存(SD卡或硬盘上的缓存)二级缓存容量更大,存取速度要慢一些,程序下次启动时,依然可以使用缓存内容。PMO前沿整理,禁止搬运!
  应用的生命周期
  PMO前沿整理,禁止搬运!
  概念:PMO前沿整理,禁止搬运!
  应用的生命周期是对应用在宿主的环境中从创建、运行到消亡的一种过程描述。
  图解:PMO前沿整理,禁止搬运!
  
  
  空指针是什么?
  空指针,顾名思义,就是指向空的指针。但是“空”是一种极度抽象的概念,管理员立一块箭头牌子,总得把它指向某个具体的地址。既然没法指向真正的“空”,那就在内存中模拟出一个地址来代表“空”。
  开发动画需要多少工作量?
  位移动画:PMO前沿整理,禁止搬运!
  让控件在一段时间内不断改变位置。程序员在实现这个功能时,只需要创建一个“TranslateAnimation”的对象,可以把它理解成位移动画的“配置清单”。
  缩放动画:PMO前沿整理,禁止搬运!
  缩放动画就是让控件在一段时间内不断改变自身大小。与位移动画类似,这种动画也有一个“配置清单”。
  渐隐渐现动画:PMO前沿整理,禁止搬运!
  就是在一定的时间内持续改变控件的透明度。
  旋转动画:PMO前沿整理,禁止搬运!
  就是让一个控件在一段时间内围绕一个固定点旋转指定的角度。
  代码重构
  代码重构是软件开发过程中提高开发效率和质量的重要手段。在软件开发过程中,每一款软件一开始都是经过精心设计的,具有良好的结构。但随着需求不断变更,之前的结构开始慢慢变得不适应。PMO前沿整理,禁止搬运!重构就是在保留现有功能的基础上,重新梳理软件中的代码结构,让原本杂乱无章的代码重新具有可读性、结构性和扩展性,增加软件的开发效率,优化程序的性能。重构的范围可大可小,大到涉及整个产品的各个模块,小到一个函数。
  PMO前沿整理,禁止搬运!
  多线程是什么?
  多线程是有效提升程序运行效率的方式之一。它还在提升优化算法、提高硬件配置、分布式计算、网格计算的效率方面起着重要作用。PMO前沿整理,禁止搬运!
  反向代理代码
  反向代理代码的意义
  首先,它可以实现负载均衡。有多台服务器可以为同一个 Web 服务提供服务,但是每台服务器的负荷不太一样,如果请求被发送到负荷较高的服务器,它的处理时间可能较长,但是客户端并不知道哪一台服务器比较空闲,所以将请求发送到反向代理服务器。反向代理服务器知道每台服务器的负载量,会将请求转发到相对空闲的服务器,以便更快地响应客户端。反向服务器还可以减轻后端服务器的一些压力,例如很多静态资源或者缓存数据,可以直接放在反向代理服务器上,不用将这些请求传递到后端服务器,这样就减轻了相同的请求对后端服务器产生的压力。PMO前沿整理,禁止搬运!它还可以对请求做进一步的封装和解封。如果我们想把所有请求升级到SSL加密连接,却不想改造后端服务器,那么可以只在客户端-反向代理服务器之间使用SSL加密连接,而代理服务器-后端服务器之间仍旧使用普通的HTTP连接,这样就事半功倍了。同时,反向代理服务器还可以为后端服务器阻挡一些网络攻击,提升后台服务器的安全性。总之,反向代理服务器对于后端服务器,就是一个接口人的角色,它接洽了所有客户端的请求,并进行简单的处理,然后分发到后端服务器。
  CDN是什么?
  CDN是什么?CDN(Content Delivery Network,内容分发网络。PMO前沿整理,禁止搬运!
  CDN专注于“内容”,也就是CDN的“C”所代表的“Content”,这里的“内容”是指静态的资源,比如一张图片、一个文本文件、一段视频、一个CSS、一个JavaScript,等等。任何以文件形式存储的“内容”都可以部署在CDN上。
  CDN的作用:
  它是一个基于互联网的数量巨大的服务器集群,专注于内容和资源分发,为用户提供快速访问资源的能力,进而提升内容访问的体验。
  PMO前沿整理,禁止搬运!
  VPN是什么?
  VPN是什么是虚拟专用网络。专用网络很好理解,就像上面的一根网线,只属于特定的人群,直达服务器。
  如何判断当前的流量达到极限呢?
  如何判断当前的流量达到极限呢?
  漏铜算法:我们把用户请求看作水,这些水会流进一个底部有洞的水桶,而我们的服务真正处理的是从底部洞里流出的水。当流量突然暴涨,桶中注满水后,再流入的水就会直接溢出,而对应的就是拒绝服务。令牌桶算法:PMO前沿整理,禁止搬运!系统以固定的速度(如每秒产生 r个令牌)产生令牌(token),产生的令牌都扔进一个桶里,如果令牌把桶塞满了(最多能装b个令牌),就会被扔掉。当用户请求到达服务的时候,去桶里取一个令牌,如果取到了,就给后面的模块继续处理;如果这个时候桶里一个令牌都没有了,就拒绝服务该请求。
  
  
  近期热文:
  应广大粉丝要求,我们建立了一个【PMO前沿交流群】,小伙伴们热情踊跃,目前人数已经上万人了,不能直接进群啦,想要进群的添加小编微信,拉你进群。两个添加其一即可!
  
  
  欢迎加入中国最大的PMO&PM社区 查看全部

  抓取动态网页 【干货】PMO和项目经理必备的常用技术术语及解释—非技术项目经理必读
  
  点击关注 不迷路--PMO前沿一个只分享干货的公号
  前一段时间,咱们整理了一份项目经理必备的术语表非常受欢迎
  很多非技术相关的项目经理希望咱们整理一份技术类常用的技术名词和术语解释,这不就来了嘛,希望对大家有帮助!
  
  AJAX:部分页面刷新的技术
  主要解决的是不用刷新网页,就能和后台交互获取数据,并应用于当前网页的问题。PMO前沿整理,禁止搬运!
  AJAX两项能力:
  1、发起网络请求、发起网络请求的能力由浏览器的内置能力提供,所有的浏览器都提供了XmlHttpRequest对象,它可以由网页调用,用来连接一个特定的地址。PMO前沿整理,禁止搬运!
  2、无须刷新,可动态操作网页。
  静态网页与动态网页
  用途:
  两者都是网页,都是再浏览器上用HTML展示出来的页面,HTML是网页的基础结构,网页如何排版,每个元素在什么位置,都是由它来描述的。
  区别:PMO前沿整理,禁止搬运!
  1、两者的核心区别是后台是否有数据库的支撑,也可以简单的描述为网页上展示的内容是否要变化,是因人而异显示不同内容,还是根据时间线呈现内容的变化,或者是保持不变。
  2、静态网页无须经过后台程序的处理,而动态网页要经过后后台处理程序。
  PMO前沿整理,禁止搬运!
  网页基础知识-表单
  用途:PMO前沿整理,禁止搬运!表单在很早的HTML版本中就已经存在,它是用户输入和网页之间数据交互的一个界面,在HTML中用标签标记。
  H5应用程序缓存
  提高服务器性能除了扩容外,还可通过Application Cache技术进行解决。
  1、该技术是HTML5中定义的一种离线存储技术标准,这种技术可以让开发者明确的指定页面中哪些静态资源可以在第一次访问网页的同时缓存到本地,并且在下次访问该网页时向服务器询问本地缓存的资源是否需要更新,PMO前沿。
  2、当浏览器打开适用了该技术得网页时,会尝试先从Cache中加载数据,并同时向服务器询问本地资源是否已经国企,如果本地资源过期,浏览器会自动从服务器上更新资源到cache中
  3、需要说明的时,如果Cache中的数据可用,浏览器就会对其进行加载,即使他们已经过期,页面可以用过注册监听器的方式获得Cache更新成功的时间,主动刷新下页面,将最新的内容及时展示给用户。
  优点:
  1、该技术通过缓存资源到本地,避免了每次打开网页都会从服务器拉取大量数据的过程,取而代之的只是一个轻量级的更新检查请求,这样开发者的服务器带宽就被大大的释放出来。
  2、由于网页的资源都是通过本地资源读取的,用户再次打开同一网页时,内容展示时间会大大缩短,甚至达到Native应用的水平,从而进一步优化用户体验,如果页面的所有资源都被缓存到了本地,那么页面就可以在离线的情况下被完整的加载了。
  。
  爬虫
  用途:
  抓取某个指定网页的数据并存储在本地。
  运行原理:
  首先给爬虫几个初始的URL链接,PMO前沿,爬虫把这些链接的网页抓取回来,经过对网页进行分析,得到两部分数据。
  1、一部分时网页的有效内容,可以用来建立搜索关键词的索引,这部分数据先存储起来。
  2、另一部分就是网页中的URL链接,可以作为下一轮爬虫抓取的目标网页,如此反复操作。
  
  客户端推送实现方式
  实现一个推送系统需要服务端和客户端的配合。1、一种方法时轮询,也就是不停的向服务器发起请求。2、另一种则是建立一条长时间链接服务器和APP的通道,通过这条捅到,不仅APP可以向服务器请求数据,服务器也可以向APP发送数据。
  缓存系统
  缓存的概念:缓存即临时,存即存储,故缓存即临时存储。刷圈的现象:1、刷了几页之后回到顶部,会发现看过的图片依旧在显示,并没有出现先显示占位符,再显示图片内容的情况,这表明图片一直在内存中,随时可被直接展示。2、点击一条新内容的图片时,会展示一张缩略图,然后出现loading图标旋转的动画,过一会儿一张清晰大图展现出来,表明这张图片是刚刚从网络拉取的。3、当用户翻到几天前的内容时,再次点击PMO前沿的图片,有时还需要从网络拉取,有时却瞬间打开,这是为什么呢?因为有可能高清图片已经被缓存系统删除,所以需要从网络重新拉取,也有可能高清图片还在缓存系统中,可以被快速加载,从而“瞬间打开”。缓存的分级:1、一级缓存也称内存缓存一级缓存存取速度最快,会多占一些内存,这是非常合理的一种以空间换取时间的程序设计,数据随着程序退出而消失,进入朋友圈,图片占用的内存空间不断增加,如果用户往回滑动,会发现刚才的图片都还在,因为这时一级缓存还没满,所有被缓存的图片都能正常满足业务需求,如果我们持续刷新朋友圈的内容,直至一级缓存的空间被完全占用,就必然要对缓存的图片进行淘汰,目前业界主要采用LRU(Least Recently Used)算法进行淘汰,也就是近期最少被使用的图片被淘汰,这里的“淘汰”,也仅仅是将图片从一级缓存迁移到二级缓存,并没有完全丢弃2、二级缓存也称磁盘缓存(SD卡或硬盘上的缓存)二级缓存容量更大,存取速度要慢一些,程序下次启动时,依然可以使用缓存内容。PMO前沿整理,禁止搬运!
  应用的生命周期
  PMO前沿整理,禁止搬运!
  概念:PMO前沿整理,禁止搬运!
  应用的生命周期是对应用在宿主的环境中从创建、运行到消亡的一种过程描述。
  图解:PMO前沿整理,禁止搬运!
  
  
  空指针是什么?
  空指针,顾名思义,就是指向空的指针。但是“空”是一种极度抽象的概念,管理员立一块箭头牌子,总得把它指向某个具体的地址。既然没法指向真正的“空”,那就在内存中模拟出一个地址来代表“空”。
  开发动画需要多少工作量?
  位移动画:PMO前沿整理,禁止搬运!
  让控件在一段时间内不断改变位置。程序员在实现这个功能时,只需要创建一个“TranslateAnimation”的对象,可以把它理解成位移动画的“配置清单”。
  缩放动画:PMO前沿整理,禁止搬运!
  缩放动画就是让控件在一段时间内不断改变自身大小。与位移动画类似,这种动画也有一个“配置清单”。
  渐隐渐现动画:PMO前沿整理,禁止搬运!
  就是在一定的时间内持续改变控件的透明度。
  旋转动画:PMO前沿整理,禁止搬运!
  就是让一个控件在一段时间内围绕一个固定点旋转指定的角度。
  代码重构
  代码重构是软件开发过程中提高开发效率和质量的重要手段。在软件开发过程中,每一款软件一开始都是经过精心设计的,具有良好的结构。但随着需求不断变更,之前的结构开始慢慢变得不适应。PMO前沿整理,禁止搬运!重构就是在保留现有功能的基础上,重新梳理软件中的代码结构,让原本杂乱无章的代码重新具有可读性、结构性和扩展性,增加软件的开发效率,优化程序的性能。重构的范围可大可小,大到涉及整个产品的各个模块,小到一个函数。
  PMO前沿整理,禁止搬运!
  多线程是什么?
  多线程是有效提升程序运行效率的方式之一。它还在提升优化算法、提高硬件配置、分布式计算、网格计算的效率方面起着重要作用。PMO前沿整理,禁止搬运!
  反向代理代码
  反向代理代码的意义
  首先,它可以实现负载均衡。有多台服务器可以为同一个 Web 服务提供服务,但是每台服务器的负荷不太一样,如果请求被发送到负荷较高的服务器,它的处理时间可能较长,但是客户端并不知道哪一台服务器比较空闲,所以将请求发送到反向代理服务器。反向代理服务器知道每台服务器的负载量,会将请求转发到相对空闲的服务器,以便更快地响应客户端。反向服务器还可以减轻后端服务器的一些压力,例如很多静态资源或者缓存数据,可以直接放在反向代理服务器上,不用将这些请求传递到后端服务器,这样就减轻了相同的请求对后端服务器产生的压力。PMO前沿整理,禁止搬运!它还可以对请求做进一步的封装和解封。如果我们想把所有请求升级到SSL加密连接,却不想改造后端服务器,那么可以只在客户端-反向代理服务器之间使用SSL加密连接,而代理服务器-后端服务器之间仍旧使用普通的HTTP连接,这样就事半功倍了。同时,反向代理服务器还可以为后端服务器阻挡一些网络攻击,提升后台服务器的安全性。总之,反向代理服务器对于后端服务器,就是一个接口人的角色,它接洽了所有客户端的请求,并进行简单的处理,然后分发到后端服务器。
  CDN是什么?
  CDN是什么?CDN(Content Delivery Network,内容分发网络。PMO前沿整理,禁止搬运!
  CDN专注于“内容”,也就是CDN的“C”所代表的“Content”,这里的“内容”是指静态的资源,比如一张图片、一个文本文件、一段视频、一个CSS、一个JavaScript,等等。任何以文件形式存储的“内容”都可以部署在CDN上。
  CDN的作用:
  它是一个基于互联网的数量巨大的服务器集群,专注于内容和资源分发,为用户提供快速访问资源的能力,进而提升内容访问的体验。
  PMO前沿整理,禁止搬运!
  VPN是什么?
  VPN是什么是虚拟专用网络。专用网络很好理解,就像上面的一根网线,只属于特定的人群,直达服务器。
  如何判断当前的流量达到极限呢?
  如何判断当前的流量达到极限呢?
  漏铜算法:我们把用户请求看作水,这些水会流进一个底部有洞的水桶,而我们的服务真正处理的是从底部洞里流出的水。当流量突然暴涨,桶中注满水后,再流入的水就会直接溢出,而对应的就是拒绝服务。令牌桶算法:PMO前沿整理,禁止搬运!系统以固定的速度(如每秒产生 r个令牌)产生令牌(token),产生的令牌都扔进一个桶里,如果令牌把桶塞满了(最多能装b个令牌),就会被扔掉。当用户请求到达服务的时候,去桶里取一个令牌,如果取到了,就给后面的模块继续处理;如果这个时候桶里一个令牌都没有了,就拒绝服务该请求。
  
  
  近期热文:
  应广大粉丝要求,我们建立了一个【PMO前沿交流群】,小伙伴们热情踊跃,目前人数已经上万人了,不能直接进群啦,想要进群的添加小编微信,拉你进群。两个添加其一即可!
  
  
  欢迎加入中国最大的PMO&PM社区

抓取动态网页怎么能能不用chrome插件呢,我第一次搞

网站优化优采云 发表了文章 • 0 个评论 • 36 次浏览 • 2022-05-26 02:01 • 来自相关话题

  抓取动态网页怎么能能不用chrome插件呢,我第一次搞
  抓取动态网页怎么能不用chrome插件呢,我第一次搞,用了很多天,
  一、chromepc官网:,该网站跟百度、谷歌是类似的,是一个提供动态网页爬虫的技术交流平台,每天提供最新最全的网页爬虫,跟新的技术博客,包括国内和国外的优秀爬虫系列,可以跟动态网页打交道。该网站访问很麻烦,也容易翻车。特别是问我一些技术或者网站发展问题,如果没有老鸟助手,基本上连到自己的数据库都不知道怎么操作的。
  这里总结一下该网站问题:1.没有历史记录。(网站只提供了百度、谷歌的动态网页下载,其它的不提供。)2.普通资源没有解析通道,只提供文章的正文插入,只提供示例和源码地址,比如搜索一个叫「性别转换」的回答,要翻一页才能看到源码地址,网站说没有考虑到数据结构的实际实现。3.该网站没有提供真正意义上的spider爬虫方面的技术。
  4.搜索结果格式不支持。5.只提供完整的列表页面,没有页面尾部、所在网站、回答等功能。6.该网站内容技术输出普遍比较原始,和官网的ui风格很不符合。看完以上6个问题,估计大家也觉得跟动态网页打交道的话很无力,很有可能就开始刷各种「不建议浏览器」下载的网站导航页面去了。来试试另外一个插件吧:小虫人工翻译。
  这个插件具体功能如下:1.输入字母就可以翻译英文2.与真正的人工翻译一样,直接输入中文,翻译也是真正的中文翻译,非软件翻译,能自动完成cnzz、idcnn等多种第三方网站代码对比。3.任意文本间可以重复翻译。跟人工翻译一样,直接输入中文或字母就可以翻译。4.可以查看全网cnzz、idcnn等多种第三方网站代码对比。5.时效性要求比较高的话,只要能识别出关键词,就可以自动抓取出真正的动态网页。
  二、chromeos浏览器官网:、桌面书签支持截图这里可以插入4张截图来看看截图。这是一个比较棒的功能,可以直接支持chromeos+windows/mac版本的书签,以及其它平台,如果能使用邮件,将很方便,如果是在「百度文库」等网站直接提取,不仅要转换网页,还要读取密码,对于一般的页面很麻烦。特别是抓取论文和说明书等文档很麻烦。
  三、chromeos浏览器官网:,google前端progresshud提供了分享google博客地址及其文章的功能,这个功能在chromeososchrome浏览器内部实现。除了可以批量导出,还能下载论文、博客、docs等文件,整个页面以及引用的网站这里我就不演示截图了,这些博客和docs在我们业内很多都是很。 查看全部

  抓取动态网页怎么能能不用chrome插件呢,我第一次搞
  抓取动态网页怎么能不用chrome插件呢,我第一次搞,用了很多天,
  一、chromepc官网:,该网站跟百度、谷歌是类似的,是一个提供动态网页爬虫的技术交流平台,每天提供最新最全的网页爬虫,跟新的技术博客,包括国内和国外的优秀爬虫系列,可以跟动态网页打交道。该网站访问很麻烦,也容易翻车。特别是问我一些技术或者网站发展问题,如果没有老鸟助手,基本上连到自己的数据库都不知道怎么操作的。
  这里总结一下该网站问题:1.没有历史记录。(网站只提供了百度、谷歌的动态网页下载,其它的不提供。)2.普通资源没有解析通道,只提供文章的正文插入,只提供示例和源码地址,比如搜索一个叫「性别转换」的回答,要翻一页才能看到源码地址,网站说没有考虑到数据结构的实际实现。3.该网站没有提供真正意义上的spider爬虫方面的技术。
  4.搜索结果格式不支持。5.只提供完整的列表页面,没有页面尾部、所在网站、回答等功能。6.该网站内容技术输出普遍比较原始,和官网的ui风格很不符合。看完以上6个问题,估计大家也觉得跟动态网页打交道的话很无力,很有可能就开始刷各种「不建议浏览器」下载的网站导航页面去了。来试试另外一个插件吧:小虫人工翻译。
  这个插件具体功能如下:1.输入字母就可以翻译英文2.与真正的人工翻译一样,直接输入中文,翻译也是真正的中文翻译,非软件翻译,能自动完成cnzz、idcnn等多种第三方网站代码对比。3.任意文本间可以重复翻译。跟人工翻译一样,直接输入中文或字母就可以翻译。4.可以查看全网cnzz、idcnn等多种第三方网站代码对比。5.时效性要求比较高的话,只要能识别出关键词,就可以自动抓取出真正的动态网页。
  二、chromeos浏览器官网:、桌面书签支持截图这里可以插入4张截图来看看截图。这是一个比较棒的功能,可以直接支持chromeos+windows/mac版本的书签,以及其它平台,如果能使用邮件,将很方便,如果是在「百度文库」等网站直接提取,不仅要转换网页,还要读取密码,对于一般的页面很麻烦。特别是抓取论文和说明书等文档很麻烦。
  三、chromeos浏览器官网:,google前端progresshud提供了分享google博客地址及其文章的功能,这个功能在chromeososchrome浏览器内部实现。除了可以批量导出,还能下载论文、博客、docs等文件,整个页面以及引用的网站这里我就不演示截图了,这些博客和docs在我们业内很多都是很。

页面加载时间过长?检测、优化、改善一站解决!

网站优化优采云 发表了文章 • 0 个评论 • 51 次浏览 • 2022-05-23 21:48 • 来自相关话题

  页面加载时间过长?检测、优化、改善一站解决!
  
  对于网站的加载速度,我们通常是专注与前端性能的优化来提高页面加载速度,但是,从运维网站的服务器着手进行优化也是不可忽视的。
  
  对于外贸企业来说,减少客户不必要的等待时间也是提高转化率的重要因素。那怎样才是更好的优化改善加载响应时间解决方案呢?
  了解什么是Waiting(TTFB)时间?…
  TTFB是Time to First Byte 的缩写,指的是浏览器开始收到服务器响应数据的时间(后台处理时间+重定向时间),是反映服务端响应速度的重要指标。
  打个比方:A问B一个问题,B思考了一会儿才给A答案,B思考的时间就相当于TTFB,对服务器来说,TTFB时间越短,说明服务器的响应越快。
  如何检测网站的TTFB时间? …
  检测网站TTFB时间的方法有很多种,但是建议简单并固定地使用一种工具并把它作为基准,这对测试结果的准确性是很重要的,本文主要介绍一下Google Chrome浏览器中的开发者工具来检测TTFB时间。
  操作步骤:·打开你要测试的网站·点击鼠标右键>点击检查(或者之间按F12)·切换到Network标签,点选你的网站首页在图片上所示位置即可查看每一个资源的载入时间和网站的Waiting(TTFB)时间。
  
  TTFB时长多长为优?…
  当你的TTFB 越少时,用户访问你网站的速度就会越快。通常,任何小于100毫秒的情况都是不错的TTFB。Google PageSpeed Insights建议服务器响应时间不超过200毫秒。如果您处于300-500毫秒范围内,这是十分标准的。
  导致TTFB时间过长的原因…
  先来看看网页加载的原理:对于需要读取数据库来生成的动态网页来说,服务器收到用户发送的请求时,首先要从数据库中读取该页面需要的数据,然后把这些数据传入到网站程序中,网站程序执行命令并渲染后,再返回给浏览器端用户。
  由于查询数据和执行命令都需要花费时间,在这个过程没有完成之前,浏览器就会一直处在等待接收服务器响应的状态。
  
  Waiting TTFB 统计的花费时间涉及3步交互过程,也就是影响 TTFB 的三大因素:
  请求服务器:访问者传送请求到服务器的时间服务器处理:服务器接收请求抓取资料的时间对访客回应:服务器回传资料给访问者的时间
  比如你的主机服务器在国外,国外客户访问你的网站页面,网页加载时可以直接在国外发送请求位于当地的服务器,服务器接收并处理完请求后,再传送数据并展示给位于国外客户,这样的服务器就可以明显减少 Waiting TTFB 时间。
  如何优化减少网站的TTFB时间? …
  - 方法1:选择好的服务器 -选择适合的服务器,能够直接帮助你改善网站的TTFB 时间。
  
  - 方法2:网站缓存 -许多人只认为缓存可以帮助减少加载时间,但实际上,它还可以减少TTFB,因为它可以减少服务器处理时间。
  - 方法3:使用CDN加速 -CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,可以使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
  
  - 方法4:选择好的DNS 服务 -你所使用的DNS 主机效能过于缓慢,那么就会导致使用者造访网站时,网域名称转换IP 地址的这一段时间拉长,进而影响整体TTFB 的时间。
  在致力于打造外贸营销型网站的过程中,全球搜融入了109种语言、全球CDN加速、美国服务器、大数据智能分析系统等种种优势,不仅让海外独立站在保证安全的情况下,实现极速访问,还让企业在建设私域流量,并形成转化等方面,拥有了领先同行的优势!
  
  你想要的干货知识都在这里
  点它!精彩不错过!
  往期推荐
  全球搜——外贸营销一站式解决方案:
  通过109种多语言建站系统、领先的搜索引擎SEO技术、多渠道营销推广技术、AI智能获客系统、社交营销和自动化营销系统,为企业提供多元、高效、高转化的外贸营销解决方案,帮助企业快速获取大量海外精准询盘,转化更多订单。 查看全部

  页面加载时间过长?检测、优化、改善一站解决!
  
  对于网站的加载速度,我们通常是专注与前端性能的优化来提高页面加载速度,但是,从运维网站的服务器着手进行优化也是不可忽视的。
  
  对于外贸企业来说,减少客户不必要的等待时间也是提高转化率的重要因素。那怎样才是更好的优化改善加载响应时间解决方案呢?
  了解什么是Waiting(TTFB)时间?…
  TTFB是Time to First Byte 的缩写,指的是浏览器开始收到服务器响应数据的时间(后台处理时间+重定向时间),是反映服务端响应速度的重要指标。
  打个比方:A问B一个问题,B思考了一会儿才给A答案,B思考的时间就相当于TTFB,对服务器来说,TTFB时间越短,说明服务器的响应越快。
  如何检测网站的TTFB时间? …
  检测网站TTFB时间的方法有很多种,但是建议简单并固定地使用一种工具并把它作为基准,这对测试结果的准确性是很重要的,本文主要介绍一下Google Chrome浏览器中的开发者工具来检测TTFB时间。
  操作步骤:·打开你要测试的网站·点击鼠标右键>点击检查(或者之间按F12)·切换到Network标签,点选你的网站首页在图片上所示位置即可查看每一个资源的载入时间和网站的Waiting(TTFB)时间。
  
  TTFB时长多长为优?…
  当你的TTFB 越少时,用户访问你网站的速度就会越快。通常,任何小于100毫秒的情况都是不错的TTFB。Google PageSpeed Insights建议服务器响应时间不超过200毫秒。如果您处于300-500毫秒范围内,这是十分标准的。
  导致TTFB时间过长的原因…
  先来看看网页加载的原理:对于需要读取数据库来生成的动态网页来说,服务器收到用户发送的请求时,首先要从数据库中读取该页面需要的数据,然后把这些数据传入到网站程序中,网站程序执行命令并渲染后,再返回给浏览器端用户。
  由于查询数据和执行命令都需要花费时间,在这个过程没有完成之前,浏览器就会一直处在等待接收服务器响应的状态。
  
  Waiting TTFB 统计的花费时间涉及3步交互过程,也就是影响 TTFB 的三大因素:
  请求服务器:访问者传送请求到服务器的时间服务器处理:服务器接收请求抓取资料的时间对访客回应:服务器回传资料给访问者的时间
  比如你的主机服务器在国外,国外客户访问你的网站页面,网页加载时可以直接在国外发送请求位于当地的服务器,服务器接收并处理完请求后,再传送数据并展示给位于国外客户,这样的服务器就可以明显减少 Waiting TTFB 时间。
  如何优化减少网站的TTFB时间? …
  - 方法1:选择好的服务器 -选择适合的服务器,能够直接帮助你改善网站的TTFB 时间。
  
  - 方法2:网站缓存 -许多人只认为缓存可以帮助减少加载时间,但实际上,它还可以减少TTFB,因为它可以减少服务器处理时间。
  - 方法3:使用CDN加速 -CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,可以使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
  
  - 方法4:选择好的DNS 服务 -你所使用的DNS 主机效能过于缓慢,那么就会导致使用者造访网站时,网域名称转换IP 地址的这一段时间拉长,进而影响整体TTFB 的时间。
  在致力于打造外贸营销型网站的过程中,全球搜融入了109种语言、全球CDN加速、美国服务器、大数据智能分析系统等种种优势,不仅让海外独立站在保证安全的情况下,实现极速访问,还让企业在建设私域流量,并形成转化等方面,拥有了领先同行的优势!
  
  你想要的干货知识都在这里
  点它!精彩不错过!
  往期推荐
  全球搜——外贸营销一站式解决方案:
  通过109种多语言建站系统、领先的搜索引擎SEO技术、多渠道营销推广技术、AI智能获客系统、社交营销和自动化营销系统,为企业提供多元、高效、高转化的外贸营销解决方案,帮助企业快速获取大量海外精准询盘,转化更多订单。

干货内容:python网络爬虫学习笔记(4)静态网页抓取(一)知识

网站优化优采云 发表了文章 • 0 个评论 • 48 次浏览 • 2022-09-21 18:07 • 来自相关话题

  干货内容:python网络爬虫学习笔记(4)静态网页抓取(一)知识
  1 信息 2 笔记 静态网页抓取(一)知识
  静态网页是纯HTML格式的网页,使用AJAX动态加载网页的数据不一定会出现在HTML代码中。
  对于静态网页,前面使用的Requests库非常有用。这次主要是详细介绍一下。
  Requests库使用前期工作(简述),安装介绍在notes(1)中,至于pycharm中使用库之前的工作,notes(3)有一个介绍,简而言之)首先是将库安装到项目中,这里单独粘贴其安装代码:
  pip install requests
  请求库 - 1 获取响应内容
  通常这样使用,返回一个响应响应对象(req是变量名,或者对象名):
  req = requests.get(url, 其它参数(可选择))
  req.encoding
req.status_code
req.text
……
  import requests
key_dict = {&#39;key1&#39;: &#39;value1&#39;}
req = requests.get(&#39;http://httpbin.org/get&#39;, params=key_dict)
  {
"args": {
<p>
"key1": "value1",
"key2": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.22.0"
},
"origin": "223.167.175.166, 223.167.175.166",
"url": "https://httpbin.org/get%3Fkey1 ... ot%3B
}
</p>
  POST 请求
  这段原文很清楚,我分段粘贴。
  除了GET请求外,有时还需要发送一些以表单形式编码的数据。比如登录时,请求是POST,因为如果使用GET请求,会在URL中显示密码,非常不安全。
  如果要实现POST请求,只需将字典传递给Requests中的data参数,请求时数据字典会自动编码为表单。
  def data_use():
key_dict = {&#39;key1&#39;: &#39;value1&#39;, &#39;key2&#39;: &#39;value2&#39;}
# 注意是post和data的组合
req = requests.post(&#39;http://httpbin.org/post&#39;, data=key_dict)
print(req.text)
<p>
</p>
  {
"args": {},
"data": "",
"files": {},
"form": {
"key1": "value1",
"key2": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "23",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.22.0"
},
"json": null,
"origin": "223.167.175.166, 223.167.175.166",
"url": "https://httpbin.org/post"
}
  入门到精通:java网页爬虫测试源码
  StringBuffer 缓冲区=new StringBuffer();
  网址 urlObj=null;
  URLConnection uc=null;
  InputStreamReader in=null;
  BufferedReader reader=null;
  试试{
  //建立网络连接
  urlObj=新网址(url);
  //打开网络连接
  uc=urlObj.openConnection();
  //创建网络输入流
  in=new InputStreamReader(uc.getInputStream(), encoding);
  //缓冲写文件流
  reader=new BufferedReader(in);
  //临时变量
  
  字符串 tempLine=null;
  //循环读取文件流
  while((tempLine=reader.readLine())!=null){
  //循环追加数据
  buffer.append(tempLine+"\n");
  }
  }catch(异常 e){
  e.getStackTrace();
  System.out.println("网页抓取失败,连接超时!");
  }终于{
  如果(在 !=null){
  试试{
  in.close();
  }catch(异常 e){
  e.getStackTrace();
  }
  
  }
  }
  返回缓冲区.toString();
  }
  public static void main(String[] args) {
  System.out.println("开始爬取网页源码");
  //根据URL和页面的代码集获取网页的源代码
  字符串 url="";
  字符串编码="utf-8";
  String str=getHtmlResourceByURL(url, encoding);
  System.out.println(str);
  //解析源码
  //解析需要下载的内容部分
  }
  } 查看全部

  干货内容:python网络爬虫学习笔记(4)静态网页抓取(一)知识
  1 信息 2 笔记 静态网页抓取(一)知识
  静态网页是纯HTML格式的网页,使用AJAX动态加载网页的数据不一定会出现在HTML代码中。
  对于静态网页,前面使用的Requests库非常有用。这次主要是详细介绍一下。
  Requests库使用前期工作(简述),安装介绍在notes(1)中,至于pycharm中使用库之前的工作,notes(3)有一个介绍,简而言之)首先是将库安装到项目中,这里单独粘贴其安装代码:
  pip install requests
  请求库 - 1 获取响应内容
  通常这样使用,返回一个响应响应对象(req是变量名,或者对象名):
  req = requests.get(url, 其它参数(可选择))
  req.encoding
req.status_code
req.text
……
  import requests
key_dict = {&#39;key1&#39;: &#39;value1&#39;}
req = requests.get(&#39;http://httpbin.org/get&#39;, params=key_dict)
  {
"args": {
<p>
"key1": "value1",
"key2": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.22.0"
},
"origin": "223.167.175.166, 223.167.175.166",
"url": "https://httpbin.org/get%3Fkey1 ... ot%3B
}
</p>
  POST 请求
  这段原文很清楚,我分段粘贴。
  除了GET请求外,有时还需要发送一些以表单形式编码的数据。比如登录时,请求是POST,因为如果使用GET请求,会在URL中显示密码,非常不安全。
  如果要实现POST请求,只需将字典传递给Requests中的data参数,请求时数据字典会自动编码为表单。
  def data_use():
key_dict = {&#39;key1&#39;: &#39;value1&#39;, &#39;key2&#39;: &#39;value2&#39;}
# 注意是post和data的组合
req = requests.post(&#39;http://httpbin.org/post&#39;, data=key_dict)
print(req.text)
<p>
</p>
  {
"args": {},
"data": "",
"files": {},
"form": {
"key1": "value1",
"key2": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "23",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.22.0"
},
"json": null,
"origin": "223.167.175.166, 223.167.175.166",
"url": "https://httpbin.org/post"
}
  入门到精通:java网页爬虫测试源码
  StringBuffer 缓冲区=new StringBuffer();
  网址 urlObj=null;
  URLConnection uc=null;
  InputStreamReader in=null;
  BufferedReader reader=null;
  试试{
  //建立网络连接
  urlObj=新网址(url);
  //打开网络连接
  uc=urlObj.openConnection();
  //创建网络输入流
  in=new InputStreamReader(uc.getInputStream(), encoding);
  //缓冲写文件流
  reader=new BufferedReader(in);
  //临时变量
  
  字符串 tempLine=null;
  //循环读取文件流
  while((tempLine=reader.readLine())!=null){
  //循环追加数据
  buffer.append(tempLine+"\n");
  }
  }catch(异常 e){
  e.getStackTrace();
  System.out.println("网页抓取失败,连接超时!");
  }终于{
  如果(在 !=null){
  试试{
  in.close();
  }catch(异常 e){
  e.getStackTrace();
  }
  
  }
  }
  返回缓冲区.toString();
  }
  public static void main(String[] args) {
  System.out.println("开始爬取网页源码");
  //根据URL和页面的代码集获取网页的源代码
  字符串 url="";
  字符串编码="utf-8";
  String str=getHtmlResourceByURL(url, encoding);
  System.out.println(str);
  //解析源码
  //解析需要下载的内容部分
  }
  }

少有的福利网站,不要再被封杀了

网站优化优采云 发表了文章 • 0 个评论 • 94 次浏览 • 2022-09-02 10:11 • 来自相关话题

  少有的福利网站,不要再被封杀了
  在国外有这么个神奇的网站,可从任何网站,抓取网页上所有的图像,然后进行打包下载。质量也是非常的棒,可完美解决批量下载等诸多问题。
  Image Cyborg
  网站的主要功能就是抓取并下载网页中的所有图像。除此之外它还有图片处理、PDF处理、网页转为PDF、网页视频转为MP3 等多达33个在线工具,而且每个都带有详细介绍
  
  网页图像下载:支持的图像格式有png,svg,jpeg,jpg,gif,bmp,eps,icns,im,mps,pcx,ppm,spider,tiff,webp ,xbm
  比如我想下载下面网页中的美食图片,只需把该网址粘贴到 Image Cyborg 中,它便会自动抓取该网页内的所有图片。
  支持打包下载到本地。速度也是很快,1000 多张图片不到 1 分钟就下载完成
  测试网站▼:
  
  可以看到图片很多都是高清原图,和在网站上直接下载没什么区别
  由于网页中含有不少只有十几 KB 的缩略图。所以还需最后一步,按大小筛选,把小于100KB 的直接删除,只保留高质量的图片即可
  放张图感受一下▼
  既然网站中所有图像都可以下载,那表情包之类的动态图片当然也不例外。步骤和上面一样,直接复制链接一键下载到本地! 查看全部

  少有的福利网站,不要再被封杀了
  在国外有这么个神奇的网站,可从任何网站,抓取网页上所有的图像,然后进行打包下载。质量也是非常的棒,可完美解决批量下载等诸多问题。
  Image Cyborg
  网站的主要功能就是抓取并下载网页中的所有图像。除此之外它还有图片处理、PDF处理、网页转为PDF、网页视频转为MP3 等多达33个在线工具,而且每个都带有详细介绍
  
  网页图像下载:支持的图像格式有png,svg,jpeg,jpg,gif,bmp,eps,icns,im,mps,pcx,ppm,spider,tiff,webp ,xbm
  比如我想下载下面网页中的美食图片,只需把该网址粘贴到 Image Cyborg 中,它便会自动抓取该网页内的所有图片。
  支持打包下载到本地。速度也是很快,1000 多张图片不到 1 分钟就下载完成
  测试网站▼:
  
  可以看到图片很多都是高清原图,和在网站上直接下载没什么区别
  由于网页中含有不少只有十几 KB 的缩略图。所以还需最后一步,按大小筛选,把小于100KB 的直接删除,只保留高质量的图片即可
  放张图感受一下▼
  既然网站中所有图像都可以下载,那表情包之类的动态图片当然也不例外。步骤和上面一样,直接复制链接一键下载到本地!

Excel教程Excel函数Excel透视表Excel电子表格Excel基础入门到精通Excel实用技巧Excel2010高效办公office2010Excel视频教程

网站优化优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2022-08-26 10:00 • 来自相关话题

  Excel教程Excel函数Excel透视表Excel电子表格Excel基础入门到精通Excel实用技巧Excel2010高效办公office2010Excel视频教程
  抓取动态网页,加载到页面上的内容一定有offset值,获取offset值并加载原网页,
  forin-eachwilluseit,notforwhetherornothappeningin-eachwilluseit,notforwhetherornothappeningin-eachwilluseit,forwhetherornothappeningin-eachforwhetherornothappeningin-each。
  
<p>for(i=0;i 查看全部

  Excel教程Excel函数Excel透视表Excel电子表格Excel基础入门到精通Excel实用技巧Excel2010高效办公office2010Excel视频教程
  抓取动态网页,加载到页面上的内容一定有offset值,获取offset值并加载原网页,
  forin-eachwilluseit,notforwhetherornothappeningin-eachwilluseit,notforwhetherornothappeningin-eachwilluseit,forwhetherornothappeningin-eachforwhetherornothappeningin-each。
  
<p>for(i=0;i

校园网默认是开的,那数据量怎么处理?

网站优化优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2022-08-22 20:03 • 来自相关话题

  校园网默认是开的,那数据量怎么处理?
  抓取动态网页,如果显示出问题不去解决,那数据量怎么处理,怎么保证即时性。连接到服务器,可以做很多事,但如果数据量大,时延会很慢。
  
  post提交那个202客户端不打开就以为你post了要显示页面就必须得连接服务器注意打开窗口的加载
  问题不在你,是运营商没有提供同步接口,必须上网后实时同步你的上网地址,这个才是最难解决的。
  
  记得以前听网络工程师说过,当时连接的其实不是运营商而是你和学校系统,那是因为系统,也就是校园网默认是开的,运营商这边根本没有写好,你在联网的过程中他们可能会窃听或者和其他运营商进行合作,偷走你的地址,也就是从你的学校路由出去可能会覆盖到更多同学,那么这个时候如果来了一个大件,就断网了所以这个时候运营商只能自己提供同步接口,或者学校自己要发布一个给运营商直接连接,这个时候你的地址会生成一个号,然后由运营商这边做负载均衡,那么你的大件自然会均匀的分布到每个人的网络内,运营商也就断不了你的网。
  ==所以就出现了你说的状况。你说你的同学地址一共6个省份会断掉一个,实际上可能这个同学省份也就2个!!!你所说的导致你同学号出问题就说明由于你以前对地址的修改(确定是你真的修改了,或者没有作过修改?或者修改成功了,只是改错了?)造成了这个号出问题,你可以和相关部门反映一下,用你们的帐号登录学校的服务器查看自己的过程是否严谨,如果没有错误说明你修改的内容没有和你校园网其他的同学重叠,如果有错误说明学校服务器收录了这个号码,以致出现你理解的同步问题!!=。 查看全部

  校园网默认是开的,那数据量怎么处理?
  抓取动态网页,如果显示出问题不去解决,那数据量怎么处理,怎么保证即时性。连接到服务器,可以做很多事,但如果数据量大,时延会很慢。
  
  post提交那个202客户端不打开就以为你post了要显示页面就必须得连接服务器注意打开窗口的加载
  问题不在你,是运营商没有提供同步接口,必须上网后实时同步你的上网地址,这个才是最难解决的。
  
  记得以前听网络工程师说过,当时连接的其实不是运营商而是你和学校系统,那是因为系统,也就是校园网默认是开的,运营商这边根本没有写好,你在联网的过程中他们可能会窃听或者和其他运营商进行合作,偷走你的地址,也就是从你的学校路由出去可能会覆盖到更多同学,那么这个时候如果来了一个大件,就断网了所以这个时候运营商只能自己提供同步接口,或者学校自己要发布一个给运营商直接连接,这个时候你的地址会生成一个号,然后由运营商这边做负载均衡,那么你的大件自然会均匀的分布到每个人的网络内,运营商也就断不了你的网。
  ==所以就出现了你说的状况。你说你的同学地址一共6个省份会断掉一个,实际上可能这个同学省份也就2个!!!你所说的导致你同学号出问题就说明由于你以前对地址的修改(确定是你真的修改了,或者没有作过修改?或者修改成功了,只是改错了?)造成了这个号出问题,你可以和相关部门反映一下,用你们的帐号登录学校的服务器查看自己的过程是否严谨,如果没有错误说明你修改的内容没有和你校园网其他的同学重叠,如果有错误说明学校服务器收录了这个号码,以致出现你理解的同步问题!!=。

爬取游戏之单线程的技术知识-乐题库

网站优化优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2022-08-19 20:04 • 来自相关话题

  爬取游戏之单线程的技术知识-乐题库
  抓取动态网页,用于统计好友的好友列表,好友数量等详细信息,单线程没问题。爬取游戏相关的内容,用于优化服务器性能。自己写了一个blog作为技术博客,分享一些技术知识。
  
  你是没用过qos:qualityofserviceavailability.我们做公有云编排,常用到的编排技术有:gevent,proxy.实现的效果跟开源的编排系统,还有你说的单线程。基本是nginx等来负责服务服务的开启与关闭,连接池来保证资源的均衡使用。requestdirectory来保证这些request能够进行有效的递减。
  另外你说的多线程对于网络通信来说的确是存在的。但是我们是单线程为主,好的程序一般没必要考虑线程冲突的问题。
  
  一般来说,大部分业务系统,有三种架构,分别是:单体应用架构,单模块架构,分布式架构。单体应用架构:即仅服务于单个应用的业务系统,一般面向某一特定领域,在客户端为不同业务模块独立而服务。该架构最典型的应用系统,是开发基于java的各种内部业务系统,客户端仅对每个模块单独提供服务,此类系统的好处是调试上层应用速度较快,正常的系统生命周期大概2-3周。
  但是,由于微服务架构的需要,必须基于网络来进行代码编写。单模块架构:各业务模块都放在一个虚拟机上,互不打扰,可以称之为微服务架构。此架构的最大好处是降低网络带宽和硬件资源的消耗,而且可以为不同模块规划子模块,并在其基础上扩展。服务间开发模块耦合程度较低,可以充分发挥系统灵活性,但是,它最常用于分布式网络的应用中。
  分布式服务架构:这种架构的服务可以在不同的虚拟机上运行,通过网络相互调用,通过通信中间件形成通信流水线,适合于分布式小规模的业务系统。通常,我们所说的多线程,就是指的分布式服务架构。 查看全部

  爬取游戏之单线程的技术知识-乐题库
  抓取动态网页,用于统计好友的好友列表,好友数量等详细信息,单线程没问题。爬取游戏相关的内容,用于优化服务器性能。自己写了一个blog作为技术博客,分享一些技术知识。
  
  你是没用过qos:qualityofserviceavailability.我们做公有云编排,常用到的编排技术有:gevent,proxy.实现的效果跟开源的编排系统,还有你说的单线程。基本是nginx等来负责服务服务的开启与关闭,连接池来保证资源的均衡使用。requestdirectory来保证这些request能够进行有效的递减。
  另外你说的多线程对于网络通信来说的确是存在的。但是我们是单线程为主,好的程序一般没必要考虑线程冲突的问题。
  
  一般来说,大部分业务系统,有三种架构,分别是:单体应用架构,单模块架构,分布式架构。单体应用架构:即仅服务于单个应用的业务系统,一般面向某一特定领域,在客户端为不同业务模块独立而服务。该架构最典型的应用系统,是开发基于java的各种内部业务系统,客户端仅对每个模块单独提供服务,此类系统的好处是调试上层应用速度较快,正常的系统生命周期大概2-3周。
  但是,由于微服务架构的需要,必须基于网络来进行代码编写。单模块架构:各业务模块都放在一个虚拟机上,互不打扰,可以称之为微服务架构。此架构的最大好处是降低网络带宽和硬件资源的消耗,而且可以为不同模块规划子模块,并在其基础上扩展。服务间开发模块耦合程度较低,可以充分发挥系统灵活性,但是,它最常用于分布式网络的应用中。
  分布式服务架构:这种架构的服务可以在不同的虚拟机上运行,通过网络相互调用,通过通信中间件形成通信流水线,适合于分布式小规模的业务系统。通常,我们所说的多线程,就是指的分布式服务架构。

查找网站真实 IP 的方法

网站优化优采云 发表了文章 • 0 个评论 • 68 次浏览 • 2022-08-04 04:35 • 来自相关话题

  查找网站真实 IP 的方法
  情报分析师
  全国警务人员和情报人员都在关注
  首先,我们来认识下最寻常的真实ip隐藏的方法“CDN”。
  内容分发网络(content delivery network或content distribution network,缩写作CDN)指一种通过互联网互相连接的电脑网络系统,利用最靠近每位用户的服务器,更快、更可靠地将音乐、图片、视频、应用程序及其他文件发送给用户,来提供高性能、可扩展性及低成本的网络内容传递给用户。
  CDN节点会在多个地点,不同的网络上摆放。这些节点之间会动态的互相传输内容,对用户的下载行为最优化,并借此减少内容供应者所需要的带宽成本,改善用户的下载速度,提高系统的稳定性。
  运用一些命令查看,比如:ping、nslookup、ipconfig 这类方法需要打开windows的dos运行界面
  用nslookup命令查询想要查的域名,若是有多个ip就是用了cdn,多半不是真实IP;如图:
  其他方法类似
  
  用ping命令输入:ping
  用ipconfig命令输入:ipconfig
  可以从多个地点ping他们想要确认的域名,若返回的是不同的ip,那么服务器确定使用了cdn,返回的ip也不是服务器的真实ip;
  常用的网址有just ping:等等。
  1、子域名查找法
  因为cdn和反向代理是需要成本的,有的网站只在比较常用的域名使用cdn或反向代理,有的时候一些测试子域名和新的子域名都没来得及加入cdn和反向代理,所以有时候是通过查找子域名来查找网站的真实IP。下面介绍些常用的子域名查找的方法和工具:
  微步在线()
  上文提到的微步在线功能强大,黑客只需输入要查找的域名(如),点击子域名选项就可以查找它的子域名了,但是免费用户每月只有5次免费查询机会。如图:
  Dnsdb查询法。()
  黑客只需输入 type:A就能收集百度的子域名和ip了。如图:
  
  Google 搜索
  Google site: -www就能查看除www外的子域名,如图:
  各种子域名扫描器
  这里,主要为大家推荐子域名挖掘机和lijiejie的subdomainbrute()
  子域名挖掘机仅需输入域名即可基于字典挖掘它的子域名,如图:
  Subdomainbrute以windows为例,黑客仅需打开cmd进入它所在的目录输入Python subdomainbrute.py --full即可收集百度的子域名,如图:
  总结:收集子域名后尝试以解析ip不在cdn上的ip解析主站,真实ip成功被获取到。
  2、IP历史记录解析查询法
  有的网站是后来才加入CDN的,所以只需查询它的解析历史即可获取真实ip,这里我们就简单介绍几个网站:微步在线,dnsdb.ionetcraft(),Viewdns()等等。
  3、网站漏洞查找法
  通过网站的信息泄露如phpinfo泄露,github信息泄露,命令执行等漏洞获取真实ip。 查看全部

  查找网站真实 IP 的方法
  情报分析师
  全国警务人员和情报人员都在关注
  首先,我们来认识下最寻常的真实ip隐藏的方法“CDN”。
  内容分发网络(content delivery network或content distribution network,缩写作CDN)指一种通过互联网互相连接的电脑网络系统,利用最靠近每位用户的服务器,更快、更可靠地将音乐、图片、视频、应用程序及其他文件发送给用户,来提供高性能、可扩展性及低成本的网络内容传递给用户。
  CDN节点会在多个地点,不同的网络上摆放。这些节点之间会动态的互相传输内容,对用户的下载行为最优化,并借此减少内容供应者所需要的带宽成本,改善用户的下载速度,提高系统的稳定性。
  运用一些命令查看,比如:ping、nslookup、ipconfig 这类方法需要打开windows的dos运行界面
  用nslookup命令查询想要查的域名,若是有多个ip就是用了cdn,多半不是真实IP;如图:
  其他方法类似
  
  用ping命令输入:ping
  用ipconfig命令输入:ipconfig
  可以从多个地点ping他们想要确认的域名,若返回的是不同的ip,那么服务器确定使用了cdn,返回的ip也不是服务器的真实ip;
  常用的网址有just ping:等等。
  1、子域名查找法
  因为cdn和反向代理是需要成本的,有的网站只在比较常用的域名使用cdn或反向代理,有的时候一些测试子域名和新的子域名都没来得及加入cdn和反向代理,所以有时候是通过查找子域名来查找网站的真实IP。下面介绍些常用的子域名查找的方法和工具:
  微步在线()
  上文提到的微步在线功能强大,黑客只需输入要查找的域名(如),点击子域名选项就可以查找它的子域名了,但是免费用户每月只有5次免费查询机会。如图:
  Dnsdb查询法。()
  黑客只需输入 type:A就能收集百度的子域名和ip了。如图:
  
  Google 搜索
  Google site: -www就能查看除www外的子域名,如图:
  各种子域名扫描器
  这里,主要为大家推荐子域名挖掘机和lijiejie的subdomainbrute()
  子域名挖掘机仅需输入域名即可基于字典挖掘它的子域名,如图:
  Subdomainbrute以windows为例,黑客仅需打开cmd进入它所在的目录输入Python subdomainbrute.py --full即可收集百度的子域名,如图:
  总结:收集子域名后尝试以解析ip不在cdn上的ip解析主站,真实ip成功被获取到。
  2、IP历史记录解析查询法
  有的网站是后来才加入CDN的,所以只需查询它的解析历史即可获取真实ip,这里我们就简单介绍几个网站:微步在线,dnsdb.ionetcraft(),Viewdns()等等。
  3、网站漏洞查找法
  通过网站的信息泄露如phpinfo泄露,github信息泄露,命令执行等漏洞获取真实ip。

吕梁商城网站建设价格(吕梁市网上商城)

网站优化优采云 发表了文章 • 0 个评论 • 18 次浏览 • 2022-07-16 13:05 • 来自相关话题

  吕梁商城网站建设价格(吕梁市网上商城)
  吕梁商城网站建设价格(吕梁市网上商城)
  █百度排名联系排名大神【QQ/V:897569356】【╇飞机libing8899】专业网站搭建,网站搭建设计,系统程序开发,各种网站和小程序都可以做,H5平台制作-采票OA信用盘时间盘打赏台-APP制作,网站三端开发.专业搭建制作公司,一条龙搭建
  毫无疑问,在移动互联网时代,短视频已经成为用户最喜欢的内容形式,它容量大,方便,快捷,同文字和图片相比,更能满足现代人在感官体验上对视听一体的要求。
  
  静态化页面有利于搜索引擎蜘蛛的爬行抓取,简明的“xxx.html”地址比动态页面地址更便于让用户记忆。当用户打开静态化页面时,会减少读取的时间,让网站的响应速度更快;由于网站的路径更加直观,针对网站的排名也更容易提升;HTML静态化还可以使网站更加稳定。
  目标关键词是一个网站成功的与否,如果一开始在确定目标关键词不够谨慎,网站上线之后随意修改,那么很有可能会被搜索引擎“K掉”。
  前言:几乎所有行业都在为流量而感到焦虑,在这个五花八门的世界,到底该如何去选择广告投放的工具呢?惊梦对此进行了梳理如下:
  市场环境在不断变化,企业必须保持在这个领域的领先地位,才能击败对手,才能保持企业相关品牌在行业的地位。在2019年,要跟上时代的发展,更重要的是与此同时不要踩到发展道路上的陷阱。
  
  所以说到营销的变化,其实核心还在于用户感知的变化。有人也许会说,现在的抖音、快手直播带货跟十年前电视购物有什么区别?如果说从形式上说,确实没啥区别。
  为什么品牌的理性还没有产生?或者说大规模产生?品牌主在其他的渠道是理性的,大家知道这个渠道我应该花多少钱,哪个渠道应该花多少钱,但是为什么在抖音没有呢?
  相比上周的榜单几乎被美食内容占领,本周的美食内容大幅减少,只有6个视频,本周新增了穿搭、时尚以及萌宠类的视频内容。 查看全部

  吕梁商城网站建设价格(吕梁市网上商城)
  吕梁商城网站建设价格(吕梁市网上商城)
  █百度排名联系排名大神【QQ/V:897569356】【╇飞机libing8899】专业网站搭建,网站搭建设计,系统程序开发,各种网站和小程序都可以做,H5平台制作-采票OA信用盘时间盘打赏台-APP制作,网站三端开发.专业搭建制作公司,一条龙搭建
  毫无疑问,在移动互联网时代,短视频已经成为用户最喜欢的内容形式,它容量大,方便,快捷,同文字和图片相比,更能满足现代人在感官体验上对视听一体的要求。
  
  静态化页面有利于搜索引擎蜘蛛的爬行抓取,简明的“xxx.html”地址比动态页面地址更便于让用户记忆。当用户打开静态化页面时,会减少读取的时间,让网站的响应速度更快;由于网站的路径更加直观,针对网站的排名也更容易提升;HTML静态化还可以使网站更加稳定。
  目标关键词是一个网站成功的与否,如果一开始在确定目标关键词不够谨慎,网站上线之后随意修改,那么很有可能会被搜索引擎“K掉”。
  前言:几乎所有行业都在为流量而感到焦虑,在这个五花八门的世界,到底该如何去选择广告投放的工具呢?惊梦对此进行了梳理如下:
  市场环境在不断变化,企业必须保持在这个领域的领先地位,才能击败对手,才能保持企业相关品牌在行业的地位。在2019年,要跟上时代的发展,更重要的是与此同时不要踩到发展道路上的陷阱。
  
  所以说到营销的变化,其实核心还在于用户感知的变化。有人也许会说,现在的抖音、快手直播带货跟十年前电视购物有什么区别?如果说从形式上说,确实没啥区别。
  为什么品牌的理性还没有产生?或者说大规模产生?品牌主在其他的渠道是理性的,大家知道这个渠道我应该花多少钱,哪个渠道应该花多少钱,但是为什么在抖音没有呢?
  相比上周的榜单几乎被美食内容占领,本周的美食内容大幅减少,只有6个视频,本周新增了穿搭、时尚以及萌宠类的视频内容。

个人网站建设专业学校(网站建设专业好就业吗)

网站优化优采云 发表了文章 • 0 个评论 • 25 次浏览 • 2022-07-16 13:05 • 来自相关话题

  个人网站建设专业学校(网站建设专业好就业吗)
  个人网站建设专业学校(网站建设专业好就业吗)
  █百度排名联系排名大神【QQ/V:897569356】【╇飞机libing8899】专业网站搭建,网站搭建设计,系统程序开发,各种网站和小程序都可以做,H5平台制作-采票OA信用盘时间盘打赏台-APP制作,网站三端开发.专业搭建制作公司,一条龙搭建
  以我们国内为例,我们都很习惯去百度上搜索各种服务和产品信息,那么如果你的相关网页可以出现在搜索结果的前几页甚至是前几名,就可以获得大量的用户访问,由此带来巨大的实际收益。
  
  在大多数传统行业里,其实是没有“运营”的概念的。伴随着互联网和新媒体的发展,“运营”的功能和作用越来越被放大出来。而短视频的运营,其实也是新媒体运营概念里的一个具体分支,所以,想了解短视频运营,还是要回归到新媒体运营的本质上来。
  重庆入微文化传媒就是这样的一家mcn机构在直播、短视频和电商等多领域均具有广泛的影响!力,围绕“直播+”的商业生态持续助力于企业和个人影响力变现!团队具备优质的PGC能力,全域营销解决方案,以及丰富的商业经纪经验。公司目前全约孵化达人账号超过96个,如抖音短视频红人:棚棚朱古?、炫?.Derek、美少?壮? 、钟志煜(飘柔哥)、雾都?等;公会主播上万名;全网粉丝覆盖2亿+;总播放量超过65 亿。
  网页分为静态网页与动态衡水seo网页两种,动态网页即具有交互功能的网页,也就是通过数据库搜索返回数据,这样搜索引擎在搜索时所费的时间较长,而且一旦数据库中的内容更新,搜索引擎抓取的数据也不再准确,所以搜索引擎很少收录动态网络推广广告语网页,排名结果也不好。
  但是中海南网站优化小企业需要理解的是,查找竞价可以快速带来流量而不是带来收益,在接触一些小企业进行竞价后,发现大收获往往较小,这也是标价格具有成本效益的缺点,我想在排名前投放很多广告费,但是高输入有时不会产生高输出,所以有些公司喜欢和讨厌种族的价格。网络推广(非竞价推广方法)除非竞争性推广外,常见的推广方式有SEO全网推广自媒体推广和公众账号推广网站策划方案。另外,你可以想到的在线推广方法可以分为网络推广。
  
  哈尔滨竞价包年推广公司点击了解更多神马搜索seo优化排名,效果,就采用极端的手段去优网络营销运营化,其实这个时候只要你坚持,百度还是会给予好的排名,就是因为许多人觉得优化没有达到预期效果,就采用其他的非正规优化手段,结果排名下降,直至被K;许多企业的营销网站都缺失的,前期优化一直在坚持,按照搜索引擎优化规则,但一直难以看到友好度保持不够坚。
  湖北君寻网络科技有限公司,主要专注于互联网推广服务,公司致力于为中小企业客户提供专业的大数据全媒体推广、互联网推广、网站建设、SEO优化、关键词排名、运营顾问、运营规划与指导等服务。推广:社交类:**朋友圈、微博粉丝通、陌陌app、微博DSP定向地区:可针对全国或任意地区,投放;优质平台,即开即投:优质平台,即开网络营销模式有哪些即投:定向时段:可针对如白天晚上或周末等,时段投放;搜索类:神马搜索、百度、360、搜狗定向人群:可针对性别、爱好或任意属性,投放;定向时段:可针对如白天晚上或周末等,时段投放;30+平台,五大功能:搜索类:神马搜索、百度、360、搜狗?手机:*?**:****本文章截至更新日期:人民网2019年11月12讯(记者:翁奇羽)本内容为公司原创,转载本文标题以及内容,请注明来源,分享和转载)广东无网络销售是什么忧云网络科技有限公司为您详细解读XzMLCf广州推广怎么样的相关知识与详情,寡所周知,网站SEO优化实际上涉及到很多工做,从网站要求到网站建立,到SEO优化排名,涉及到很多专业常识,并且往往需要一个团队来完成所有的工做。既然涉及营销策略,那我们不得不提品牌营销的特点及优势,既然深受欢迎就证明这项策略能为的发展创造价值。
  1,作为网站优化师我们要监seo教学控网站运营状态。网站分析最基本的应用就是监控网站的运营状态。收集网站日常产生的各类企业网站推广方案数据,包括浏览量、点击量、IP数等,并通过统计这些数据生成相应的报表,对网站的运营状态进行系统的展现。从浏览量、点击量等数据的变化趋势,以及页面访问时长、页面跳出率等数据,能帮助运营者从各个角度了解网站的状况是否良好。 查看全部

  个人网站建设专业学校(网站建设专业好就业吗)
  个人网站建设专业学校(网站建设专业好就业吗)
  █百度排名联系排名大神【QQ/V:897569356】【╇飞机libing8899】专业网站搭建,网站搭建设计,系统程序开发,各种网站和小程序都可以做,H5平台制作-采票OA信用盘时间盘打赏台-APP制作,网站三端开发.专业搭建制作公司,一条龙搭建
  以我们国内为例,我们都很习惯去百度上搜索各种服务和产品信息,那么如果你的相关网页可以出现在搜索结果的前几页甚至是前几名,就可以获得大量的用户访问,由此带来巨大的实际收益。
  
  在大多数传统行业里,其实是没有“运营”的概念的。伴随着互联网和新媒体的发展,“运营”的功能和作用越来越被放大出来。而短视频的运营,其实也是新媒体运营概念里的一个具体分支,所以,想了解短视频运营,还是要回归到新媒体运营的本质上来。
  重庆入微文化传媒就是这样的一家mcn机构在直播、短视频和电商等多领域均具有广泛的影响!力,围绕“直播+”的商业生态持续助力于企业和个人影响力变现!团队具备优质的PGC能力,全域营销解决方案,以及丰富的商业经纪经验。公司目前全约孵化达人账号超过96个,如抖音短视频红人:棚棚朱古?、炫?.Derek、美少?壮? 、钟志煜(飘柔哥)、雾都?等;公会主播上万名;全网粉丝覆盖2亿+;总播放量超过65 亿。
  网页分为静态网页与动态衡水seo网页两种,动态网页即具有交互功能的网页,也就是通过数据库搜索返回数据,这样搜索引擎在搜索时所费的时间较长,而且一旦数据库中的内容更新,搜索引擎抓取的数据也不再准确,所以搜索引擎很少收录动态网络推广广告语网页,排名结果也不好。
  但是中海南网站优化小企业需要理解的是,查找竞价可以快速带来流量而不是带来收益,在接触一些小企业进行竞价后,发现大收获往往较小,这也是标价格具有成本效益的缺点,我想在排名前投放很多广告费,但是高输入有时不会产生高输出,所以有些公司喜欢和讨厌种族的价格。网络推广(非竞价推广方法)除非竞争性推广外,常见的推广方式有SEO全网推广自媒体推广和公众账号推广网站策划方案。另外,你可以想到的在线推广方法可以分为网络推广。
  
  哈尔滨竞价包年推广公司点击了解更多神马搜索seo优化排名,效果,就采用极端的手段去优网络营销运营化,其实这个时候只要你坚持,百度还是会给予好的排名,就是因为许多人觉得优化没有达到预期效果,就采用其他的非正规优化手段,结果排名下降,直至被K;许多企业的营销网站都缺失的,前期优化一直在坚持,按照搜索引擎优化规则,但一直难以看到友好度保持不够坚。
  湖北君寻网络科技有限公司,主要专注于互联网推广服务,公司致力于为中小企业客户提供专业的大数据全媒体推广、互联网推广、网站建设、SEO优化、关键词排名、运营顾问、运营规划与指导等服务。推广:社交类:**朋友圈、微博粉丝通、陌陌app、微博DSP定向地区:可针对全国或任意地区,投放;优质平台,即开即投:优质平台,即开网络营销模式有哪些即投:定向时段:可针对如白天晚上或周末等,时段投放;搜索类:神马搜索、百度、360、搜狗定向人群:可针对性别、爱好或任意属性,投放;定向时段:可针对如白天晚上或周末等,时段投放;30+平台,五大功能:搜索类:神马搜索、百度、360、搜狗?手机:*?**:****本文章截至更新日期:人民网2019年11月12讯(记者:翁奇羽)本内容为公司原创,转载本文标题以及内容,请注明来源,分享和转载)广东无网络销售是什么忧云网络科技有限公司为您详细解读XzMLCf广州推广怎么样的相关知识与详情,寡所周知,网站SEO优化实际上涉及到很多工做,从网站要求到网站建立,到SEO优化排名,涉及到很多专业常识,并且往往需要一个团队来完成所有的工做。既然涉及营销策略,那我们不得不提品牌营销的特点及优势,既然深受欢迎就证明这项策略能为的发展创造价值。
  1,作为网站优化师我们要监seo教学控网站运营状态。网站分析最基本的应用就是监控网站的运营状态。收集网站日常产生的各类企业网站推广方案数据,包括浏览量、点击量、IP数等,并通过统计这些数据生成相应的报表,对网站的运营状态进行系统的展现。从浏览量、点击量等数据的变化趋势,以及页面访问时长、页面跳出率等数据,能帮助运营者从各个角度了解网站的状况是否良好。

抓取动态网页时需要全局变量,使用json能较为简单

网站优化优采云 发表了文章 • 0 个评论 • 97 次浏览 • 2022-07-12 05:01 • 来自相关话题

  抓取动态网页时需要全局变量,使用json能较为简单
  抓取动态网页时需要全局变量,处理动态数据比较繁琐。如果仅仅需要获取每个栏目下的名称,列表等信息,使用json能较为简单。本教程对初学者比较友好,操作步骤简单,让你的chrome浏览器随时处理动态数据。chrome浏览器首先我们需要下载这个jsonx扩展程序,github地址是:。下载了扩展程序后,我们需要先手动安装,安装过程比较繁琐。
  如果是对json有较为熟悉的同学,可以直接使用“分析json数据”命令。例如我已经自行完成了登录和网页的编码修改,需要编码修改命令即可。注意必须要将你电脑上的json解析库安装至系统环境中,例如在linux下只能手动编译安装,linux可以google上查找最新的版本。regedit打开chrome浏览器,通过打开开发者工具。
  
  在f12键中的“开发者工具”选项卡中,选择“network”选项卡。如果你觉得找不到你需要的json,是因为你选择的浏览器中不支持json解析库,我们可以通过手动设置的方式来解决。我是这样设置的,打开开发者工具后,选择菜单栏的“tools”-->“jsonapi”,切换到“addtolibrary”选项卡。
  我们的jsonx扩展程序路径如下:f:\jsonx\。鼠标右键属性,将version属性选中f12,即可看到更多信息。本教程选择默认值即可。如果你选择不正确也可以手动修改。设置完成后点击“打开”即可进入修改过程。修改后的结果如下:网页列表-查看json数据列表列表数据每一个栏目所有的数据如果列表数据还不能完整显示,请右键列表属性->headertext属性设置你想显示的内容。
  
  比如我只是把列表名称改成中文,并没有添加对应的表头。下面我们要把列表数据修改为内容可显示,把原本的中文改成英文。修改json数据需要把json数据移到“#jsonx”属性中,并设置数据的json格式。代码如下:chrome浏览器点击浏览器右上角的“刷新”按钮,我们需要重新来分析content-type变量。
  首先我们还是点击浏览器右上角的“刷新”按钮,进入浏览器的刷新页面动作。然后我们就可以来看json变量的格式是怎样的。json变量可理解为javascript对象,jsondata里包含了变量的值,而json变量是字符串。chrome浏览器的数字类型通常不是以十六进制显示,而是以特殊的写法进行类型转换。
  其对象的json格式如下:${fields.value}值必须是一个数字,且必须用formdata标签在外面包裹。注意:对同一个属性只能有一个fields属性,属性对象是原始的对象,但方法fields属性中必须有一个value属性。验证方法:bash(jsonx.json)>${fields.value}关于变量的顺序,如下:数字从小到大, 查看全部

  抓取动态网页时需要全局变量,使用json能较为简单
  抓取动态网页时需要全局变量,处理动态数据比较繁琐。如果仅仅需要获取每个栏目下的名称,列表等信息,使用json能较为简单。本教程对初学者比较友好,操作步骤简单,让你的chrome浏览器随时处理动态数据。chrome浏览器首先我们需要下载这个jsonx扩展程序,github地址是:。下载了扩展程序后,我们需要先手动安装,安装过程比较繁琐。
  如果是对json有较为熟悉的同学,可以直接使用“分析json数据”命令。例如我已经自行完成了登录和网页的编码修改,需要编码修改命令即可。注意必须要将你电脑上的json解析库安装至系统环境中,例如在linux下只能手动编译安装,linux可以google上查找最新的版本。regedit打开chrome浏览器,通过打开开发者工具。
  
  在f12键中的“开发者工具”选项卡中,选择“network”选项卡。如果你觉得找不到你需要的json,是因为你选择的浏览器中不支持json解析库,我们可以通过手动设置的方式来解决。我是这样设置的,打开开发者工具后,选择菜单栏的“tools”-->“jsonapi”,切换到“addtolibrary”选项卡。
  我们的jsonx扩展程序路径如下:f:\jsonx\。鼠标右键属性,将version属性选中f12,即可看到更多信息。本教程选择默认值即可。如果你选择不正确也可以手动修改。设置完成后点击“打开”即可进入修改过程。修改后的结果如下:网页列表-查看json数据列表列表数据每一个栏目所有的数据如果列表数据还不能完整显示,请右键列表属性->headertext属性设置你想显示的内容。
  
  比如我只是把列表名称改成中文,并没有添加对应的表头。下面我们要把列表数据修改为内容可显示,把原本的中文改成英文。修改json数据需要把json数据移到“#jsonx”属性中,并设置数据的json格式。代码如下:chrome浏览器点击浏览器右上角的“刷新”按钮,我们需要重新来分析content-type变量。
  首先我们还是点击浏览器右上角的“刷新”按钮,进入浏览器的刷新页面动作。然后我们就可以来看json变量的格式是怎样的。json变量可理解为javascript对象,jsondata里包含了变量的值,而json变量是字符串。chrome浏览器的数字类型通常不是以十六进制显示,而是以特殊的写法进行类型转换。
  其对象的json格式如下:${fields.value}值必须是一个数字,且必须用formdata标签在外面包裹。注意:对同一个属性只能有一个fields属性,属性对象是原始的对象,但方法fields属性中必须有一个value属性。验证方法:bash(jsonx.json)>${fields.value}关于变量的顺序,如下:数字从小到大,

【第1268期】字蛛+发布!支持动态渲染、远程多页面字体压缩

网站优化优采云 发表了文章 • 0 个评论 • 188 次浏览 • 2022-06-19 23:23 • 来自相关话题

  【第1268期】字蛛+发布!支持动态渲染、远程多页面字体压缩
  前言
  字蛛在2016年的时候就知道了,当今天再次看到的时候更多想起网页游戏的官网跟活动页,可能在这类型的设计还原中蛮有适用场景的。今日早读文章由腾讯tgideas@Allan投稿分享。
  @Allan,来自腾讯互娱tgideas团队,负责游戏相关的web业务。喜欢鼓捣提高生产力的前端工具和研究创意相关的技术实现。
  正文从这开始~
  自从多年前刚入行的时候,中文自定义字体在网页上差不多只有一种存在,那就是“图片”。因为中文字体的体积实在太大了,还存在各种问题,这多多少少限制了中文网页在设计上的发展,但是人们也没有停下寻找解决方案的脚步。比如前nodejs时代的各种GUI工具,nodejs时代的fontmin、font-spider(字蛛)
  目前来说,最方便的要数font-spider(字蛛)了,它可以自动提取网页里面使用的自定义字体的文字,并且输出多终端兼容。在大多数不需要兼容IE7(大部分IE8还是网吧客户端内嵌页面)的现在,很多专题都十分适合使用字蛛压缩自定义字体。例如这个专题的倒计时文字:
  
  倒计时
  但是为什么稍大型项目或是单页应用不太推荐使用呢?
  从我的使用体验和字蛛的一些issue上来看,虽然字蛛已经是字体优化界的宇宙第一了,但是还存在几个问题:
  1、不支持动态渲染的项目
  2、不支持GBK编码
  3、多页面的支持不友好
  4、在线页面配置繁琐
  在做堡垒之夜官网的时候,刚好碰到了这样几个问题,GBK编码、有些元素是脚本插入的、有些页面是系统生成的,用字蛛十分痛苦。于是就想能不能搭配无头浏览器把线上页面down在本地之后,模拟出适合字蛛的环境。
  说干就干,经过一段时间的鼓捣,FSP(font-spider-plus)工具腾空发布啦!从现在开始,彻底拥抱中文WebFont时代!
  原理:使用puppeteer分析线上页面 -> 合并压缩线上页面外联样式 -> 样式添加到线上页面文本流 -> 用font-spider api压缩WebFont
  FSP除了兼容字蛛的所有特性以外,它还支持GBK编码,支持线上多页面配置、支持vue等动态渲染的界面!
  使用概览
  
  示例中70个字体压缩后各兼容版本只需要10K~26K,不仅提高浏览器加载速度,扩展性也更好!改文字改大小甚至改简单的效果再也不需要麻烦射鸡湿了。
  特性
  除了兼容font-spider(字蛛)支持的特性:
  font-spider-plus(字蛛+)还具有以下特性:
  安装
      npm i font-spider-plus -g
  使用范例一、书写 CSS
  出自:font-spider中文文档
  /*声明 WebFont*/<br style="box-sizing: border-box;" />@font-face {  <br style="box-sizing: border-box;" />    font-family: 'source'; <br style="box-sizing: border-box;" />    src: url('../font/source.eot');  <br style="box-sizing: border-box;" />    src: url('../font/source.eot?#font-spider') format('embedded-opentype'),    <br style="box-sizing: border-box;" />    url('../font/source.woff2') format('woff2'),    <br style="box-sizing: border-box;" />    url('../font/source.woff') format('woff'),    <br style="box-sizing: border-box;" />    url('../font/source.ttf') format('truetype'),    <br style="box-sizing: border-box;" />    url('../font/source.svg') format('svg');  <br style="box-sizing: border-box;" />    font-weight: normal;  <br style="box-sizing: border-box;" />    font-style: normal;<br style="box-sizing: border-box;" />}<br style="box-sizing: border-box;" />/*使用指定字体*/<br style="box-sizing: border-box;" />.home h1, .demo > .test {font-family: 'source';}
  特别说明:@font-face中的src定义的 .ttf 文件必须存在,其余的格式将由工具自动生成
  二、压缩本地WebFont
  fsp local [options]
  特别说明:htmlFile支持通配符,例如.htm,.shtml
  三、压缩URL中的WebFont1、初始化fspconfig文件
  fsp init
  在根目录下生成fspconfig.js文件
  2、完善fspconfig.js文件
  {    <br style="box-sizing: border-box;" />    /**     <br style="box-sizing: border-box;" />    * 本地font存放路径    
   * @type    {String}    
   */    <br style="box-sizing: border-box;" />    "localPath" : "../font/",    <br style="box-sizing: border-box;" />    /**     <br style="box-sizing: border-box;" />    * 线上字体文件路径 (网址中样式文件内font-family的src路径)    
   * @type    {String}    
   */    <br style="box-sizing: border-box;" />    "onlinePath" : "../font/",    <br style="box-sizing: border-box;" />    /**     <br style="box-sizing: border-box;" />    * URL    
   * @type    {Array}    
   */    <br style="box-sizing: border-box;" />    "url" :  [    <br style="box-sizing: border-box;" />        "http://ieg.tencent.com/",    <br style="box-sizing: border-box;" />        "http://game.qq.com/"<br style="box-sizing: border-box;" />    ]<br style="box-sizing: border-box;" />}
  3、执行
  fsp run
  示例文件下载:
  项目地址:
  最后,为你推荐
  关于本文 查看全部

  【第1268期】字蛛+发布!支持动态渲染、远程多页面字体压缩
  前言
  字蛛在2016年的时候就知道了,当今天再次看到的时候更多想起网页游戏的官网跟活动页,可能在这类型的设计还原中蛮有适用场景的。今日早读文章由腾讯tgideas@Allan投稿分享。
  @Allan,来自腾讯互娱tgideas团队,负责游戏相关的web业务。喜欢鼓捣提高生产力的前端工具和研究创意相关的技术实现。
  正文从这开始~
  自从多年前刚入行的时候,中文自定义字体在网页上差不多只有一种存在,那就是“图片”。因为中文字体的体积实在太大了,还存在各种问题,这多多少少限制了中文网页在设计上的发展,但是人们也没有停下寻找解决方案的脚步。比如前nodejs时代的各种GUI工具,nodejs时代的fontmin、font-spider(字蛛)
  目前来说,最方便的要数font-spider(字蛛)了,它可以自动提取网页里面使用的自定义字体的文字,并且输出多终端兼容。在大多数不需要兼容IE7(大部分IE8还是网吧客户端内嵌页面)的现在,很多专题都十分适合使用字蛛压缩自定义字体。例如这个专题的倒计时文字:
  
  倒计时
  但是为什么稍大型项目或是单页应用不太推荐使用呢?
  从我的使用体验和字蛛的一些issue上来看,虽然字蛛已经是字体优化界的宇宙第一了,但是还存在几个问题:
  1、不支持动态渲染的项目
  2、不支持GBK编码
  3、多页面的支持不友好
  4、在线页面配置繁琐
  在做堡垒之夜官网的时候,刚好碰到了这样几个问题,GBK编码、有些元素是脚本插入的、有些页面是系统生成的,用字蛛十分痛苦。于是就想能不能搭配无头浏览器把线上页面down在本地之后,模拟出适合字蛛的环境。
  说干就干,经过一段时间的鼓捣,FSP(font-spider-plus)工具腾空发布啦!从现在开始,彻底拥抱中文WebFont时代!
  原理:使用puppeteer分析线上页面 -> 合并压缩线上页面外联样式 -> 样式添加到线上页面文本流 -> 用font-spider api压缩WebFont
  FSP除了兼容字蛛的所有特性以外,它还支持GBK编码,支持线上多页面配置、支持vue等动态渲染的界面!
  使用概览
  
  示例中70个字体压缩后各兼容版本只需要10K~26K,不仅提高浏览器加载速度,扩展性也更好!改文字改大小甚至改简单的效果再也不需要麻烦射鸡湿了。
  特性
  除了兼容font-spider(字蛛)支持的特性:
  font-spider-plus(字蛛+)还具有以下特性:
  安装
      npm i font-spider-plus -g
  使用范例一、书写 CSS
  出自:font-spider中文文档
  /*声明 WebFont*/<br style="box-sizing: border-box;" />@font-face {  <br style="box-sizing: border-box;" />    font-family: 'source'; <br style="box-sizing: border-box;" />    src: url('../font/source.eot');  <br style="box-sizing: border-box;" />    src: url('../font/source.eot?#font-spider') format('embedded-opentype'),    <br style="box-sizing: border-box;" />    url('../font/source.woff2') format('woff2'),    <br style="box-sizing: border-box;" />    url('../font/source.woff') format('woff'),    <br style="box-sizing: border-box;" />    url('../font/source.ttf') format('truetype'),    <br style="box-sizing: border-box;" />    url('../font/source.svg') format('svg');  <br style="box-sizing: border-box;" />    font-weight: normal;  <br style="box-sizing: border-box;" />    font-style: normal;<br style="box-sizing: border-box;" />}<br style="box-sizing: border-box;" />/*使用指定字体*/<br style="box-sizing: border-box;" />.home h1, .demo > .test {font-family: 'source';}
  特别说明:@font-face中的src定义的 .ttf 文件必须存在,其余的格式将由工具自动生成
  二、压缩本地WebFont
  fsp local [options]
  特别说明:htmlFile支持通配符,例如.htm,.shtml
  三、压缩URL中的WebFont1、初始化fspconfig文件
  fsp init
  在根目录下生成fspconfig.js文件
  2、完善fspconfig.js文件
  {    <br style="box-sizing: border-box;" />    /**     <br style="box-sizing: border-box;" />    * 本地font存放路径    
   * @type    {String}    
   */    <br style="box-sizing: border-box;" />    "localPath" : "../font/",    <br style="box-sizing: border-box;" />    /**     <br style="box-sizing: border-box;" />    * 线上字体文件路径 (网址中样式文件内font-family的src路径)    
   * @type    {String}    
   */    <br style="box-sizing: border-box;" />    "onlinePath" : "../font/",    <br style="box-sizing: border-box;" />    /**     <br style="box-sizing: border-box;" />    * URL    
   * @type    {Array}    
   */    <br style="box-sizing: border-box;" />    "url" :  [    <br style="box-sizing: border-box;" />        "http://ieg.tencent.com/",    <br style="box-sizing: border-box;" />        "http://game.qq.com/"<br style="box-sizing: border-box;" />    ]<br style="box-sizing: border-box;" />}
  3、执行
  fsp run
  示例文件下载:
  项目地址:
  最后,为你推荐
  关于本文

抓取动态网页 “即使断网

网站优化优采云 发表了文章 • 0 个评论 • 40 次浏览 • 2022-06-18 12:21 • 来自相关话题

  抓取动态网页 “即使断网
  加入慢牛社区,共建 Web 3.0!知名CMS系统网站搭建商创始人构建第一个Web3.0网站,更喜欢IPFS API而不是亚马逊专有API。
  全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站
  “即使我的笔记本电脑与互联网断开连接,我的网页仍然可用”
  
  对于国内很多互联网从业者来说,CMS是再熟悉不过的建站程序了,自从有了CMS后,改变了过去网站搭建需要完全手动敲代码的尴尬,毋须四处去找免费的建站程序,从而也避免了被代码后门木马一类的攻击的威胁。
  CMS是content management system的英文缩写,即内容管理系统,是一种位于WEB前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。
  内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。
  内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  内容抓取工具国内比较熟悉的有优采云,小蜜蜂采集器,让没有时间打理自己网站的个人站长免去了需要繁杂的从其他网站复制粘贴内容的劳烦。
  
  近日,全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站,
  
  原文如下:
  今天,我将使用 web3 技术发布我的第一个网页。我将上传一个页面到 IPFS(星际文件系统),dries.eth使用 ENS(以太坊名称服务)使其可用,并使用支持 web3 的浏览器访问它。
  如果您不知道这意味着什么,请准备好参加速成课程。
  第1步:购买 ENS 域名
  去年,我铸造buytaert.eth了.,最近,我购买了dries.eth. 两者都是ENS 域名。
  ENS代表以太坊名称服务,是一种基于开源区块链的命名协议。
  您可以将 ENS 视为 web3 的 DNS。DNS 将域名映射到 IP 地址,ENS 将域名映射到以太坊地址。以太坊地址可以指向加密货币钱包、内容哈希等。
  ENS 不仅仅是以太坊的服务;它是使用智能合约在以太坊上构建的通用 web3 服务。因为 ENS 是建立在区块链之上的,所以它比 DNS 更能抵抗审查。
  今天,拥有自己的 ENS 域的主要用例是使接收加密货币更容易。如果你想给我寄一些以太币,你必须把它0xbAD65DE65AE2c23f5eA30d12fC8c2f883cbe671f寄到我的以太坊钱包的地址。因为我拥有dries.eth,所以您可以发送它dries.eth。更容易记住!
  dries.eth无需任何中间人就可以从世界任何地方的任何人那里未经许可地收集加密货币,这真是太神奇了。
  但是,这不是今天博客文章的主题。在这篇博文中,我想展示如何dries.eth使用它来托管一个完全去中心化的 web3 网页。
  如果您想购买.eth域名,可以在ENS 域名网站上购买。由于.eth域名是 NFT(非同质代币),您还可以在OpenSea等 NFT 市场买卖域名。
  ENS 于 2017 年 5 月推出时,它仅支持 ENS 原生 TLD .eth。自 2021 年 8 月起,ENS 增加了对完整 DNS 命名空间的支持。
  因此,如果您拥有DNS,则可以使用ENS Domains 网站为.
  第 2 步:将 HTML 文件上传到 IPFS
  IPFS是InterPlanetary File System的缩写,是一种用于存储和共享数据的开源协议和点对点网络。
  如今,大多数网页都存储在单个服务器上,托管在单个数据中心中。这些站点对单点故障、拒绝服务攻击或政府审查的弹性不大。
  更高级的网站使用CDN和其他缓存系统复制他们的网页。我的网站使用多个 Kubernetes Web 节点,Varnish 和 Cloudflare,但那是因为我的公司帮助运行了世界上一些最大的网站,而不是因为我的网站需要它。所有这些技术都可以用来提高网站的弹性。
  使用 IPFS,您的网页可以在全球数百个“IPFS 节点”上复制。世界上每个人都可以运行一个 IPFS 节点。
  节点创建一个单一的全球网络,网络中的每个文件都有一个唯一的全球标识符。
  从理论上讲,IPFS比传统的网站托管更具弹性。由于 IPFS 节点由世界各地不同的人和组织运行,并且内容在它们之间复制,因此托管的内容更能抵抗单点故障、拒绝服务攻击或政府审查。另一方面,缓和错误信息也更加困难。
  我之所以写“理论上”是因为上传到 IPFS 的内容只有在世界某个地方的一个节点选择托管它时才保持可用。
  默认情况下,IPFS 不包含用于激励网络中其他节点复制数据的内置机制。每个 IPFS 节点都倾向于托管自己的数据。其他节点可以合作复制数据,也可以作为服务复制数据。
  这就是Filecoin的用武之地。与 IPFS 一样,Filecoin 是一个开源协议。
  IPFS 本身不是基于区块链的,但 Filecoin 是。Filecoin 通过一个用于存储和复制数据的公共市场扩展了 IPFS。
  矿工可以赚取Filecoin(一种加密货币代币)以换取存储和复制 IPFS 数据。因为 Filecoin 是基于区块链的,所以市场不属于单一中介。存储交易由网络上的节点以编程方式进行代理。
  长话短说,要在 IPFS 上托管我的网页,我需要至少一个 IPFS 节点愿意托管我的内容。
  有两种解决方案:
  1)我可以运行我自己的 IPFS 节点或(2)我可以支付第三方 IPFS 服务来托管我的内容。
  运行我自己的 IPFS 节点
  本着帮助构建去中心化网络的精神,运行自己的 IPFS 节点应该是首选。您可以在下面看到我的本地 IPFS 节点托管我的index.html文件:
  
  
  因为我的本地 IPFS 节点在我的笔记本电脑上运行,所以我的网页只有在我的笔记本电脑连接到互联网时才可用。
  如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。
  我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  有几个朋友在 IPFS 上钉住彼此的网站,您不再需要为虚拟主机付费!
  第三方 IPFS 和 pinning 服务
  如果您不想运行自己的 IPFS 服务,或者您没有可以复制您的数据的朋友,您可以使用第三方 IPFS 和 pinning 服务。
  我找到了十几个固定服务,并尝试了以下方法:
  Infura使用其命令行工具可以轻松上传文件:
  $ ipfs-upload-client --id xxx --secret yyy ./index.html
  xxx是 Infura 项目 ID 和yyyInfura 项目密钥。
  Fleek和Pinata允许您从 Web 浏览器上传文件:
  
  
  如果您正在寻找基于 Filecoin 的解决方案,推荐使用web3.storage和estuary.tech。
  第 3 步:访问您的 web3 网页
  将文件上传到 IPFS 后,您将获得文件的“哈希”(唯一 ID 或地址)。index.html我的文件的哈希是:
  bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q可以使用与 IPFS 兼容的浏览器(例如Brave )访问托管在 IPFS 上的内容。
  Firefox、Safari 和 Chrome 目前不原生支持 IPFS,但存在各种 IPFS 浏览器扩展。
  使用 Brave,您可以访问我的网页ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q(注意ipfs://架构)。
  
  第 4 步:将您的网页映射到您的域名
  能够访问您的 IPFS 托管网站非常简洁,但您可能不会要求其他人在 ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q 上查看您的新网页。使用 60 个字符的十六进制散列并不完全理想。
  这就是 ENS 的用武之地。我只需将Content Resolver记录设置dries.eth为与我的网页关联的 IPFS 哈希。
  
  更新 ENS 记录会永久更新以太坊区块链的状态。
  这意味着您必须支付“汽油费”或网络交易费。
  正如你在Etherscan上看到的,更新我的 ENS 记录花了我0.004369 以太币(当时 11.69 美元)。
  您现在可以使用 ENS 和 IPFS 兼容的浏览器访问。瞧,一个真正去中心化的网站!
  
  ENS 和 IPFS 是网络的未来吗?
  有各种各样的大缺点:
  我相信这些缺点将在未来几年得到解决。有些人可能已经有了解决方案。
  撇开缺点不谈,我相信 IPFS 和 ENS 有希望:
  Web3 对开发者意味着什么?
  如果您是开发人员,请将 web3 视为不断增长的新“Web 服务”集合。
  IPFS 和 ENS 就是两个这样的 Web 服务。
  今天,它们主要提供改进的弹性和审查保护。
  如果弹性和审查保护对您的网站很重要,请使用它们。
  如果不是,您不必使用它们。
  作为的所有者和开发者,我不关心审查保护。出于这个原因,我很高兴继续使用传统的托管技术。
  但我确实认识到 IPFS 和 ENS 在未来可能会变得更有趣。
  在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。
  这包括其商业模式依赖于专有数据库和分类账的组织;金融机构、中央银行、某些非营利组织、社会团体。其中许多可以变成真正去中心化的网络服务。
  例如,许多商业网站使用 PayPal 或 Square 等中介提供贷款和贷款偿还计划。
  随着时间的推移,其中一些中介机构可能会被无需许可的分布式网络服务所取代,这些服务收取的利息和/或交易费用较低。
  想象一下有一天,商业网站无需中介即可直接向客户提供贷款偿还计划变得非常容易。当利润率受益时,技术解决方案就会迅速被采用。
  区块链还将使我们能够以新的方式解决协调和所有权问题。
  在网络上创建内容(图像、音乐、视频、博客文章)的每个人都可以从中受益。其他人使用您的内容并以编程方式将价值流回您的能力非常令人兴奋。
  最重要的是,我希望这些去中心化服务能够帮助我们推进公共产品的管理方式、我们维持开源项目的方式,以及我们如何能够有意义地将权力从大型组织转移到个人和社区。但这是未来博客文章的主题。
  — Dries Buytaert
  
  Dries Buytaert 是 Drupal 开源 Web 发布和协作平台的原始创建者和项目负责人。
  Buytaert 担任 Drupal 协会主席,该协会是一个旨在帮助 Drupal 蓬勃发展的非营利组织。
  他还是 Acquia 的联合创始人兼首席技术官,Acquia 是一家风险投资支持的软件公司,为 Drupal 提供产品和服务。
  Dries 还是 Mollom 的联合创始人,Mollom 是一种网络服务,可以帮助您识别内容质量,更重要的是,可以帮助您阻止网站垃圾邮件。
  Buytaert 出生于比利时,拥有根特大学计算机科学与工程博士学位和安特卫普大学计算机科学 (MSC) 学位。
  2008 年,Buytaert 被《商业周刊》评为科技青年企业家以及 MIT TR 35 Young Innovator。
  2011 年,《福布斯》将 Acquia 评为最有前途的 100 家公司之一。
  2012 年,Inc 宣布 Acquia 是美国发展最快的私人软件公司。
  重点:
  如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。
  我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。
  评:
  如何使用IPFS和Filecoin配合起来进行网站的搭建,这次给出了具体答案,最大的一点就是即使跟目前的互联网断开,依旧可以访问,这在实践上证实了IPFS和Filecoin的巨大价值,对于弥补或取代Http传统互联网天然弊端产生很大的影响。
  Filecoin是IPFS唯一的激励层,在操作中是相互关联和配合使用的。
  包括搭建网站在内的很多功能实现,虽然在目前还需要不断探索和改进,相信在全球社区和开发人员不断努力下,会开发出更多的应用工具,在不久未来会得到更好的使用体验,并得到更多的使用。
  IPFS和Filecoin是相辅相成,互相配合,相互关联,IPFS需要Filecoin激励来存储更多数据,从而让更多的人参与进来,把数据传输网络壮大;同时,Filecoin也需要IPFS的底层传输技术把网络变得有价值。
  就好比以太坊和以太币一样。任何试图把IPFS和Filecoin分开,或者说独立无关者,要么是对项目的无知,就是混淆视听,另有所图,有着不可告人的目的。
  你的选择,决定你的未来!你选择相信什么,相信谁,就会给你什么样的答案!一切取决于你!
  本文内容综合整理于网络,版权归原作者所有,本号只用于信息传递分享。侵删。
  关注慢牛聊IPFS
  发现Web 3.0 时代新机遇
  
  点个在看你最好看 查看全部

  抓取动态网页 “即使断网
  加入慢牛社区,共建 Web 3.0!知名CMS系统网站搭建商创始人构建第一个Web3.0网站,更喜欢IPFS API而不是亚马逊专有API。
  全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站
  “即使我的笔记本电脑与互联网断开连接,我的网页仍然可用”
  
  对于国内很多互联网从业者来说,CMS是再熟悉不过的建站程序了,自从有了CMS后,改变了过去网站搭建需要完全手动敲代码的尴尬,毋须四处去找免费的建站程序,从而也避免了被代码后门木马一类的攻击的威胁。
  CMS是content management system的英文缩写,即内容管理系统,是一种位于WEB前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。
  内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。
  内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  内容抓取工具国内比较熟悉的有优采云,小蜜蜂采集器,让没有时间打理自己网站的个人站长免去了需要繁杂的从其他网站复制粘贴内容的劳烦。
  
  近日,全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站,
  
  原文如下:
  今天,我将使用 web3 技术发布我的第一个网页。我将上传一个页面到 IPFS(星际文件系统),dries.eth使用 ENS(以太坊名称服务)使其可用,并使用支持 web3 的浏览器访问它。
  如果您不知道这意味着什么,请准备好参加速成课程。
  第1步:购买 ENS 域名
  去年,我铸造buytaert.eth了.,最近,我购买了dries.eth. 两者都是ENS 域名。
  ENS代表以太坊名称服务,是一种基于开源区块链的命名协议。
  您可以将 ENS 视为 web3 的 DNS。DNS 将域名映射到 IP 地址,ENS 将域名映射到以太坊地址。以太坊地址可以指向加密货币钱包、内容哈希等。
  ENS 不仅仅是以太坊的服务;它是使用智能合约在以太坊上构建的通用 web3 服务。因为 ENS 是建立在区块链之上的,所以它比 DNS 更能抵抗审查。
  今天,拥有自己的 ENS 域的主要用例是使接收加密货币更容易。如果你想给我寄一些以太币,你必须把它0xbAD65DE65AE2c23f5eA30d12fC8c2f883cbe671f寄到我的以太坊钱包的地址。因为我拥有dries.eth,所以您可以发送它dries.eth。更容易记住!
  dries.eth无需任何中间人就可以从世界任何地方的任何人那里未经许可地收集加密货币,这真是太神奇了。
  但是,这不是今天博客文章的主题。在这篇博文中,我想展示如何dries.eth使用它来托管一个完全去中心化的 web3 网页。
  如果您想购买.eth域名,可以在ENS 域名网站上购买。由于.eth域名是 NFT(非同质代币),您还可以在OpenSea等 NFT 市场买卖域名。
  ENS 于 2017 年 5 月推出时,它仅支持 ENS 原生 TLD .eth。自 2021 年 8 月起,ENS 增加了对完整 DNS 命名空间的支持。
  因此,如果您拥有DNS,则可以使用ENS Domains 网站为.
  第 2 步:将 HTML 文件上传到 IPFS
  IPFS是InterPlanetary File System的缩写,是一种用于存储和共享数据的开源协议和点对点网络。
  如今,大多数网页都存储在单个服务器上,托管在单个数据中心中。这些站点对单点故障、拒绝服务攻击或政府审查的弹性不大。
  更高级的网站使用CDN和其他缓存系统复制他们的网页。我的网站使用多个 Kubernetes Web 节点,Varnish 和 Cloudflare,但那是因为我的公司帮助运行了世界上一些最大的网站,而不是因为我的网站需要它。所有这些技术都可以用来提高网站的弹性。
  使用 IPFS,您的网页可以在全球数百个“IPFS 节点”上复制。世界上每个人都可以运行一个 IPFS 节点。
  节点创建一个单一的全球网络,网络中的每个文件都有一个唯一的全球标识符。
  从理论上讲,IPFS比传统的网站托管更具弹性。由于 IPFS 节点由世界各地不同的人和组织运行,并且内容在它们之间复制,因此托管的内容更能抵抗单点故障、拒绝服务攻击或政府审查。另一方面,缓和错误信息也更加困难。
  我之所以写“理论上”是因为上传到 IPFS 的内容只有在世界某个地方的一个节点选择托管它时才保持可用。
  默认情况下,IPFS 不包含用于激励网络中其他节点复制数据的内置机制。每个 IPFS 节点都倾向于托管自己的数据。其他节点可以合作复制数据,也可以作为服务复制数据。
  这就是Filecoin的用武之地。与 IPFS 一样,Filecoin 是一个开源协议。
  IPFS 本身不是基于区块链的,但 Filecoin 是。Filecoin 通过一个用于存储和复制数据的公共市场扩展了 IPFS。
  矿工可以赚取Filecoin(一种加密货币代币)以换取存储和复制 IPFS 数据。因为 Filecoin 是基于区块链的,所以市场不属于单一中介。存储交易由网络上的节点以编程方式进行代理。
  长话短说,要在 IPFS 上托管我的网页,我需要至少一个 IPFS 节点愿意托管我的内容。
  有两种解决方案:
  1)我可以运行我自己的 IPFS 节点或(2)我可以支付第三方 IPFS 服务来托管我的内容。
  运行我自己的 IPFS 节点
  本着帮助构建去中心化网络的精神,运行自己的 IPFS 节点应该是首选。您可以在下面看到我的本地 IPFS 节点托管我的index.html文件:
  
  
  因为我的本地 IPFS 节点在我的笔记本电脑上运行,所以我的网页只有在我的笔记本电脑连接到互联网时才可用。
  如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。
  我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  有几个朋友在 IPFS 上钉住彼此的网站,您不再需要为虚拟主机付费!
  第三方 IPFS 和 pinning 服务
  如果您不想运行自己的 IPFS 服务,或者您没有可以复制您的数据的朋友,您可以使用第三方 IPFS 和 pinning 服务。
  我找到了十几个固定服务,并尝试了以下方法:
  Infura使用其命令行工具可以轻松上传文件:
  $ ipfs-upload-client --id xxx --secret yyy ./index.html
  xxx是 Infura 项目 ID 和yyyInfura 项目密钥。
  Fleek和Pinata允许您从 Web 浏览器上传文件:
  
  
  如果您正在寻找基于 Filecoin 的解决方案,推荐使用web3.storage和estuary.tech。
  第 3 步:访问您的 web3 网页
  将文件上传到 IPFS 后,您将获得文件的“哈希”(唯一 ID 或地址)。index.html我的文件的哈希是:
  bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q可以使用与 IPFS 兼容的浏览器(例如Brave )访问托管在 IPFS 上的内容。
  Firefox、Safari 和 Chrome 目前不原生支持 IPFS,但存在各种 IPFS 浏览器扩展。
  使用 Brave,您可以访问我的网页ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q(注意ipfs://架构)。
  
  第 4 步:将您的网页映射到您的域名
  能够访问您的 IPFS 托管网站非常简洁,但您可能不会要求其他人在 ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q 上查看您的新网页。使用 60 个字符的十六进制散列并不完全理想。
  这就是 ENS 的用武之地。我只需将Content Resolver记录设置dries.eth为与我的网页关联的 IPFS 哈希。
  
  更新 ENS 记录会永久更新以太坊区块链的状态。
  这意味着您必须支付“汽油费”或网络交易费。
  正如你在Etherscan上看到的,更新我的 ENS 记录花了我0.004369 以太币(当时 11.69 美元)。
  您现在可以使用 ENS 和 IPFS 兼容的浏览器访问。瞧,一个真正去中心化的网站!
  
  ENS 和 IPFS 是网络的未来吗?
  有各种各样的大缺点:
  我相信这些缺点将在未来几年得到解决。有些人可能已经有了解决方案。
  撇开缺点不谈,我相信 IPFS 和 ENS 有希望:
  Web3 对开发者意味着什么?
  如果您是开发人员,请将 web3 视为不断增长的新“Web 服务”集合。
  IPFS 和 ENS 就是两个这样的 Web 服务。
  今天,它们主要提供改进的弹性和审查保护。
  如果弹性和审查保护对您的网站很重要,请使用它们。
  如果不是,您不必使用它们。
  作为的所有者和开发者,我不关心审查保护。出于这个原因,我很高兴继续使用传统的托管技术。
  但我确实认识到 IPFS 和 ENS 在未来可能会变得更有趣。
  在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。
  这包括其商业模式依赖于专有数据库和分类账的组织;金融机构、中央银行、某些非营利组织、社会团体。其中许多可以变成真正去中心化的网络服务。
  例如,许多商业网站使用 PayPal 或 Square 等中介提供贷款和贷款偿还计划。
  随着时间的推移,其中一些中介机构可能会被无需许可的分布式网络服务所取代,这些服务收取的利息和/或交易费用较低。
  想象一下有一天,商业网站无需中介即可直接向客户提供贷款偿还计划变得非常容易。当利润率受益时,技术解决方案就会迅速被采用。
  区块链还将使我们能够以新的方式解决协调和所有权问题。
  在网络上创建内容(图像、音乐、视频、博客文章)的每个人都可以从中受益。其他人使用您的内容并以编程方式将价值流回您的能力非常令人兴奋。
  最重要的是,我希望这些去中心化服务能够帮助我们推进公共产品的管理方式、我们维持开源项目的方式,以及我们如何能够有意义地将权力从大型组织转移到个人和社区。但这是未来博客文章的主题。
  — Dries Buytaert
  
  Dries Buytaert 是 Drupal 开源 Web 发布和协作平台的原始创建者和项目负责人。
  Buytaert 担任 Drupal 协会主席,该协会是一个旨在帮助 Drupal 蓬勃发展的非营利组织。
  他还是 Acquia 的联合创始人兼首席技术官,Acquia 是一家风险投资支持的软件公司,为 Drupal 提供产品和服务。
  Dries 还是 Mollom 的联合创始人,Mollom 是一种网络服务,可以帮助您识别内容质量,更重要的是,可以帮助您阻止网站垃圾邮件。
  Buytaert 出生于比利时,拥有根特大学计算机科学与工程博士学位和安特卫普大学计算机科学 (MSC) 学位。
  2008 年,Buytaert 被《商业周刊》评为科技青年企业家以及 MIT TR 35 Young Innovator。
  2011 年,《福布斯》将 Acquia 评为最有前途的 100 家公司之一。
  2012 年,Inc 宣布 Acquia 是美国发展最快的私人软件公司。
  重点:
  如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。
  我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。
  评:
  如何使用IPFS和Filecoin配合起来进行网站的搭建,这次给出了具体答案,最大的一点就是即使跟目前的互联网断开,依旧可以访问,这在实践上证实了IPFS和Filecoin的巨大价值,对于弥补或取代Http传统互联网天然弊端产生很大的影响。
  Filecoin是IPFS唯一的激励层,在操作中是相互关联和配合使用的。
  包括搭建网站在内的很多功能实现,虽然在目前还需要不断探索和改进,相信在全球社区和开发人员不断努力下,会开发出更多的应用工具,在不久未来会得到更好的使用体验,并得到更多的使用。
  IPFS和Filecoin是相辅相成,互相配合,相互关联,IPFS需要Filecoin激励来存储更多数据,从而让更多的人参与进来,把数据传输网络壮大;同时,Filecoin也需要IPFS的底层传输技术把网络变得有价值。
  就好比以太坊和以太币一样。任何试图把IPFS和Filecoin分开,或者说独立无关者,要么是对项目的无知,就是混淆视听,另有所图,有着不可告人的目的。
  你的选择,决定你的未来!你选择相信什么,相信谁,就会给你什么样的答案!一切取决于你!
  本文内容综合整理于网络,版权归原作者所有,本号只用于信息传递分享。侵删。
  关注慢牛聊IPFS
  发现Web 3.0 时代新机遇
  
  点个在看你最好看

如何利用Python网络爬虫抓取微信朋友圈的动态(上)

网站优化优采云 发表了文章 • 0 个评论 • 506 次浏览 • 2022-06-18 12:20 • 来自相关话题

  如何利用Python网络爬虫抓取微信朋友圈的动态(上)
  
  2、之后在主页中点击【创作书籍】-->【微信书】。
  
  3、点击【开始制作】-->【添加随机分配的出书啦小编为好友即可】,长按二维码之后便可以进行添加好友了。
  4、之后耐心等待微信书制作,待完成之后,会收到小编发送的消息提醒,如下图所示。
  至此,我们已经将微信朋友圈的数据入口搞定了,并且获取了外链。
  确保朋友圈设置为【全部开放】,默认就是全部开放,如果不知道怎么设置的话,请自行百度吧。
  
  5、点击该外链,之后进入网页,需要使用微信扫码授权登录。
  6、扫码授权之后,就可以进入到微信书网页版了,如下图所示。
  
  7、接下来我们就可以正常的写爬虫程序进行抓取信息了。在这里,小编采用的是Scrapy爬虫框架,Python用的是3版本,集成开发环境用的是Pycharm。下图是微信书的首页,图片是小编自己自定义的。
  
  二、创建爬虫项目
  1、确保您的电脑上已经安装好了Scrapy。之后选定一个文件夹,在该文件夹下进入命令行,输入执行命令:
  scrapy startproject weixin_moment
  ,等待生成Scrapy爬虫项目。
  2、在命令行中输入cd weixin_moment,进入创建的weixin_moment目录。之后输入命令:
  scrapy genspider 'moment' 'chushu.la'
  ,创建朋友圈爬虫,如下图所示。
  
  3、执行以上两步后的文件夹结构如下:
  
  三、分析网页数据
  1、进入微信书首页,按下F12,建议使用谷歌浏览器,审查元素,点击“Network”选项卡,然后勾选“Preserve log”,表示保存日志,如下图所示。可以看到主页的请求方式是get,返回的状态码是200,代表请求成功。
  2、点击“Response”(服务器响应),可以看到系统返回的数据是JSON格式的。说明我们之后在程序中需要对JSON格式的数据进行处理。
  
  3、点击微信书的“导航”窗口,可以看到数据是按月份进行加载的。当点击导航按钮,其加载对应月份的朋友圈数据。
  4、当点击【2014/04】月份,之后查看服务器响应数据,可以看到页面上显示的数据和服务器的响应是相对应的。
  
  5、查看请求方式,可以看到此时的请求方式变成了POST。细心的伙伴可以看到在点击“下个月”或者其他导航月份的时候,主页的URL是始终没有变化的,说明该网页是动态加载的。之后对比多个网页请求,我们可以看到在“Request Payload”下边的数据包参数不断的发生变化,如下图所示。
  6、展开服务器响应的数据,将数据放到JSON在线解析器里,如下图所示:
  可以看到朋友圈的数据存储在paras /data节点下。
  至此,网页分析和数据的来源都已经确定好了,接下来将写程序,进行数据抓取,敬请期待下篇文章~~
  看完本文有收获?请转发分享给更多的人
  Python爬虫与数据挖掘
  入群请在微信后台回复【Python学习】 查看全部

  如何利用Python网络爬虫抓取微信朋友圈的动态(上)
  
  2、之后在主页中点击【创作书籍】-->【微信书】。
  
  3、点击【开始制作】-->【添加随机分配的出书啦小编为好友即可】,长按二维码之后便可以进行添加好友了。
  4、之后耐心等待微信书制作,待完成之后,会收到小编发送的消息提醒,如下图所示。
  至此,我们已经将微信朋友圈的数据入口搞定了,并且获取了外链。
  确保朋友圈设置为【全部开放】,默认就是全部开放,如果不知道怎么设置的话,请自行百度吧。
  
  5、点击该外链,之后进入网页,需要使用微信扫码授权登录。
  6、扫码授权之后,就可以进入到微信书网页版了,如下图所示。
  
  7、接下来我们就可以正常的写爬虫程序进行抓取信息了。在这里,小编采用的是Scrapy爬虫框架,Python用的是3版本,集成开发环境用的是Pycharm。下图是微信书的首页,图片是小编自己自定义的。
  
  二、创建爬虫项目
  1、确保您的电脑上已经安装好了Scrapy。之后选定一个文件夹,在该文件夹下进入命令行,输入执行命令:
  scrapy startproject weixin_moment
  ,等待生成Scrapy爬虫项目。
  2、在命令行中输入cd weixin_moment,进入创建的weixin_moment目录。之后输入命令:
  scrapy genspider 'moment' 'chushu.la'
  ,创建朋友圈爬虫,如下图所示。
  
  3、执行以上两步后的文件夹结构如下:
  
  三、分析网页数据
  1、进入微信书首页,按下F12,建议使用谷歌浏览器,审查元素,点击“Network”选项卡,然后勾选“Preserve log”,表示保存日志,如下图所示。可以看到主页的请求方式是get,返回的状态码是200,代表请求成功。
  2、点击“Response”(服务器响应),可以看到系统返回的数据是JSON格式的。说明我们之后在程序中需要对JSON格式的数据进行处理。
  
  3、点击微信书的“导航”窗口,可以看到数据是按月份进行加载的。当点击导航按钮,其加载对应月份的朋友圈数据。
  4、当点击【2014/04】月份,之后查看服务器响应数据,可以看到页面上显示的数据和服务器的响应是相对应的。
  
  5、查看请求方式,可以看到此时的请求方式变成了POST。细心的伙伴可以看到在点击“下个月”或者其他导航月份的时候,主页的URL是始终没有变化的,说明该网页是动态加载的。之后对比多个网页请求,我们可以看到在“Request Payload”下边的数据包参数不断的发生变化,如下图所示。
  6、展开服务器响应的数据,将数据放到JSON在线解析器里,如下图所示:
  可以看到朋友圈的数据存储在paras /data节点下。
  至此,网页分析和数据的来源都已经确定好了,接下来将写程序,进行数据抓取,敬请期待下篇文章~~
  看完本文有收获?请转发分享给更多的人
  Python爬虫与数据挖掘
  入群请在微信后台回复【Python学习】

Python:爬取动态网站

网站优化优采云 发表了文章 • 0 个评论 • 25 次浏览 • 2022-06-18 01:00 • 来自相关话题

  Python:爬取动态网站
  邮箱:
  目录
  4. 完整代码
  5. 相关推文
  温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:
  在之前的推文中,我们介绍了如何爬取一个简单的静态网站——「Python爬取静态网站:以历史天气为例」,但是在实际过程中,常常会遇到需要爬取动态网站数据的情况。在本文中,我们也将通过一个比较简单的案例,来介绍爬取动态网站数据的基本思路和步骤。
  1. 动态网页特征
  首先,简单回顾一下动态网页的特征:
  2. 动态网页爬取的基本思路
  动态网页数据爬取通常有两种方法:
  在本次介绍中,我们将通过获取接口的方式来爬取动态网页的数据。由于动态网页结构会更加复杂一些,我们主要的精力是在解析网页结构这一步。但是在找到了数据接口后 (知道数据 “藏” 在哪),数据的爬取也比较简单。具体来看,爬取动态网页数据主要可分为以下几步:
  同样的,如果涉及多页的数据,需要分析接口的变化规律:
  3. 实战案例
  接下来,我们以爬取 bilibili 视频评论为例,来具体介绍如何通过 Python 爬取动态网页的数据。主要内容包括:
  3.1 分析网页结构
  在动态网页的数据爬取中,分析网页结构至关重要。因为我们需要找到数据 “藏” 在哪,否则不知道应该去哪请求数据。在本案例中,我们将爬取「bilibili」的数据,具体选择 bilibili 入站第一名的视频「【才浅】15天花20万元用500克黄金敲数万锤纯手工打造三星堆黄金面具」的评论数据。
  按照惯例,我们先看一下网页源代码,由于信息太多了,可以直接使用搜索功能。在网页源代码页面,搜索评论内容,发现没有这个数据。
  
  那怎么办呢?我们就要找一找这个数据到底藏在哪了。通常,查找动态网页的数据接口有以下几个步骤:
  问题又来了,动态网页里的数据很多,有时候就算筛选了类型,也还是有很多页面。要找到我们需要的数据,真的是大海捞针,那怎么办呢?有一个小技巧,就是利用搜索功能。在检查页面,搜索一下评论内容,立马就找到了数据藏在哪里!
  3.2 请求接口数据
  历经千辛万苦,终于找到了数据藏的位置,接下来就是要把数据获取下来。这里简单三个步骤就可以完成:
  我们先来看看接口网址 (Request URL) 的情况,可以看到网址包括以下几个部分:
  也就是说,这个数据接口由 1 个主结构和 8 个参数构成。关于参数需要注意两点,一是有没有这个参数会不会影响数据获取,二是这个参数的含义和变化规律。具体的确定方法只有不断尝试:
  当然,有时候不知道含义也可以爬取数据,但是建议还是了解一下,一般不清楚含义但必需的参数保持默认值即可。在这里,我们省略一下不断尝试的结果。最终,发现了部分参数的基本含义:
  接下来我们就可以复制请求头,构造请求参数,请求需要的数据。
  # 导入模块<br />import requests<br />import time<br /><br /># 网址<br />url = "https://api.bilibili.com/x/v2/reply/main"  # 接口网址的主要结构<br /><br /># 请求头数据<br />headers = {<br />    'accept': '*/*',<br />    'accept-encoding': 'gzip, deflate, br',<br />    'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',<br />    'referer': 'https://www.bilibili.com/video/BV16X4y1g7wT',<br />    'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"',<br />    'sec-ch-ua-mobile': '?0',<br />    'sec-ch-ua-platform': 'Windows',<br />    'sec-fetch-dest': 'script',<br />    'sec-fetch-mode': 'no-cors',<br />    'sec-fetch-site': 'same-site',<br />    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '<br />                  '(KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36'<br />    # 根据测试不需要 cookie 信息也可以获取数据<br />    # 需要 cookie 的话在自己的浏览器中复制,这里涉及隐私就不放 cookie 信息了<br />}<br /><br /># 构造请求参数<br />params = {<br />    # 'callback': 'jQuery17201888299578386794_' + str(round(time.time() * 1000)),<br />    # 'jsonp': 'jsonp',<br />    'next': 0,  # 页码<br />    'type': 1,<br />    'oid': 715024588,  # 视频av号<br />    # 'mode': 3,  # 评论排序方式<br />    # 'plat': 1,<br />    # '_': str(round(time.time() * 1000))  # 生成当前时间戳<br />}<br /><br /># 通过get方法请求数据<br />response = requests.get(url, headers=headers, params=params)<br />
  查看返回结果, 代表请求数据成功。如果是 403 或 404 则说明请求不成功,可能需要检查电脑网络是否通畅、目标网址是否可以正常访问、headers 是否有正确设置等。
  3.3 解析网页数据
  请求成功后,我们再来看请求回来的数据是什么样的,如何根据获取自己需要的数据。回到数据接口中,我们可以看到数据是通过 json 格式存储的,而每条评论的数据在 data 下面的 replies 中。
  因此,我们用 json 解析请求到的数据,并把需要的评论数据提取出来。
  # 导入模块<br />import json<br />import time<br /><br />response.encoding = 'utf-8'                  # 修改编码格式<br />data_json = json.loads(response.text)        # 通过 json 解析数据<br />comment_list = data_json['data']['replies']  # 获取 data 下面的 replies 列表<br /><br />comments = []                       # 构建空列表保存每页的评论数据<br />for i in range(len(comment_list)):  # 循环获取每条评论的数据<br />    comment = {<br />        'id': comment_list[i]['rpid'],  # 评论id<br />        # 评论时间,由时间戳转换<br />        'time': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(comment_list[i]['ctime'])),  <br />        'parent': comment_list[i]['parent'],  # 父评论id<br />        'like': comment_list[i]['like'],      # 点赞数<br />        'user_id': comment_list[i]['member']['mid'],      # 评论用户id<br />        'user_name': comment_list[i]['member']['uname'],  # 用户名<br />        'content': comment_list[i]['content']['message']  # 评论内容<br />        # 需要其他数据的可以再在 json 中查看并获取对应的名称<br />    }<br />    comments.append(comment)  # 每页的评论数据<br />
  3.4 储存爬取数据
  接下来,把爬取到的数据存入 csv 文件。当然,还是建议爬取一页保存一页。同时,使用 utf-8 格式保存数据,因此打开数据文件时,也要使用同样的格式。
  # 导入模块<br />import csv<br /><br /># 保存数据的文件路径<br />save_path = 'bilibili.csv'<br /><br /># 将数据写入 csv<br /> with open(save_path, 'a', newline='', encoding='utf-8') as fp:<br />     csv_header = ['id', 'time', 'parent', 'like', 'user_id', 'user_name', 'content']  # 设置表头,即列名<br />     csv_writer = csv.DictWriter(fp, csv_header)<br />     # 如果文件不存在,则写入表头;如果文件已经存在,则直接追加数据不再次写入表头<br />     if fp.tell() == 0:<br />         csv_writer.writeheader()    <br />     csv_writer.writerows(comments)  # 写入数据<br />
  3.5 循环爬取数据
  终于成功获取了一页的数据,接下来就要循环获取更多数据了。这里也分为三个步骤:
  由于前面已经详细分析过接口的参数变化,这里不再具体说明。通过分析,翻页变化的参数是 next,所以只要变化这个参数就可以进行翻页。另外,如果要爬取不同视频的评论,则要通过 av 号来循环,也就是 oid 参数。
  4. 完整代码
  # -*- coding: utf-8 -*-<br /># Author: W.Y.<br /># Email: wangyingchn@outlook.com<br /># Date: 2022/4/12<br /><br /># 导入模块<br />import requests  # 请求数据<br />import time      # 时间模块<br />import json      # json 模块,储存数据<br />import csv       # 保存数据<br /><br /># 请求数据<br />def get_response(page):<br />    url = 'https://api.bilibili.com/x/v2/reply/main'  # 接口网址的主要结构<br />    # 请求头数据<br />    headers = {<br />        'accept': '*/*',<br />        'accept-encoding': 'gzip, deflate, br',<br />        'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',<br />        'referer': 'https://www.bilibili.com/video/BV16X4y1g7wT',<br />        'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"',<br />        'sec-ch-ua-mobile': '?0',<br />        'sec-ch-ua-platform': 'Windows',<br />        'sec-fetch-dest': 'script',<br />        'sec-fetch-mode': 'no-cors',<br />        'sec-fetch-site': 'same-site',<br />        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '<br />                      '(KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36'<br />        # 根据测试不需要 cookie 信息也可以获取数据<br />        # 需要 cookie 的话在自己的浏览器中复制,这里涉及隐私就不放 cookie 信息了<br />    }<br />    # 构造请求参数<br />    params = {<br />        # 'callback': 'jQuery17201888299578386794_' + str(round(time.time() * 1000)),<br />        # 'jsonp': 'jsonp',<br />        'next': page,  # 页码<br />        'type': 1,<br />        'oid': 715024588,  # 视频av号<br />        'mode': 3,  # 评论排序方式<br />        # 'plat': 1,<br />        # '_': str(round(time.time() * 1000))  # 生成当前时间戳<br />    }<br />    # 通过get方法请求数据<br />    response = requests.get(url, headers=headers, params=params)<br />    return response<br /><br /># 解析数据<br />def parse_data(response):<br />    response.encoding = 'utf-8'                  # 修改编码格式<br />    data_json = json.loads(response.text)        # 通过 json 解析数据<br />    comment_list = data_json['data']['replies']  # 获取 data 下面的 replies 列表<br />    comments = []                       # 构建空列表保存每页的评论数据<br />    for i in range(len(comment_list)):  # 循环获取每条评论的数据<br />        comment = {<br />            'id': comment_list[i]['rpid'],   # 评论id<br />            'time': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(comment_list[i]['ctime'])),  <br />            # 评论时间,由时间戳转换<br />            'parent': comment_list[i]['parent'],  # 父评论id<br />            'like': comment_list[i]['like'],      # 点赞数<br />            'user_id': comment_list[i]['member']['mid'],      # 评论用户id<br />            'user_name': comment_list[i]['member']['uname'],  # 用户名<br />            'content': comment_list[i]['content']['message']  # 评论内容<br />            # 需要其他数据的可以再在 json 中查看并获取对应的名称<br />        }<br />        comments.append(comment)  # 每页的评论数据<br />    return comments<br /><br /># 保存数据<br />def save_data(comments, save_path):<br />    with open(save_path, 'a', newline='', encoding='utf-8') as fp:<br />        # 设置表头,即列名<br />        csv_header = ['id', 'time', 'parent', 'like', 'user_id', 'user_name', 'content']  <br />        csv_writer = csv.DictWriter(fp, csv_header)<br />        # 如果文件不存在,则写入表头;如果文件已经存在,则直接追加数据不再次写入表头<br />        if fp.tell() == 0:<br />            csv_writer.writeheader()  <br />        csv_writer.writerows(comments)  # 写入数据<br /><br /># 定义爬取函数<br />def crawler(page, save_path):<br />    time.sleep(2)  # 暂停 2 秒,避免请求过于频繁<br />    response = get_response(page)    # 请求数据<br />    comments = parse_data(response)  # 解析数据<br />    save_data(comments, save_path)   # 储存数据<br />    print(f'成功爬取第{page+1}页')<br /><br />if __name__ == '__main__':<br />    save_file = 'bilibili.csv'  # 保存路径<br />    total_counts = 1000         # 爬取 1000 条评论<br />    # 如果要爬取所有评论,可以改成全部评论数。<br />    # 如果要爬取多个视频的评论,可以通过下面的代码,爬取第一页的时候返回所有的评论数<br />    # total_counts = data_json['data']['cursor']['all_count']<br />    # 页码循环,每页有 20 条评论,所以通过总评论数计算页码<br />    for p in range(total_counts//20 + 1):  <br />        crawler(p, save_file)<br />
  5. 相关推文
  Note:产生如下推文列表的 Stata 命令为:
  lianxh python, m
  安装最新版 lianxh 命令:
  ssc install lianxh, replace
  专题:文本分析-爬虫专题:Python-R-Matlab
  
  课程推荐:因果推断实用计量方法
  主讲老师:丘嘉平教授
  课程主页:
  
  New! Stata 搜索神器:lianxh 和 songbl
  搜: 推文、数据分享、期刊论文、重现代码 ……
  安装:
  . ssc install lianxh
  . ssc install songbl
  使用:
  . lianxh DID 倍分法
  . songbl all
  
  关于我们
   查看全部

  Python:爬取动态网站
  邮箱:
  目录
  4. 完整代码
  5. 相关推文
  温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:
  在之前的推文中,我们介绍了如何爬取一个简单的静态网站——「Python爬取静态网站:以历史天气为例」,但是在实际过程中,常常会遇到需要爬取动态网站数据的情况。在本文中,我们也将通过一个比较简单的案例,来介绍爬取动态网站数据的基本思路和步骤。
  1. 动态网页特征
  首先,简单回顾一下动态网页的特征:
  2. 动态网页爬取的基本思路
  动态网页数据爬取通常有两种方法:
  在本次介绍中,我们将通过获取接口的方式来爬取动态网页的数据。由于动态网页结构会更加复杂一些,我们主要的精力是在解析网页结构这一步。但是在找到了数据接口后 (知道数据 “藏” 在哪),数据的爬取也比较简单。具体来看,爬取动态网页数据主要可分为以下几步:
  同样的,如果涉及多页的数据,需要分析接口的变化规律:
  3. 实战案例
  接下来,我们以爬取 bilibili 视频评论为例,来具体介绍如何通过 Python 爬取动态网页的数据。主要内容包括:
  3.1 分析网页结构
  在动态网页的数据爬取中,分析网页结构至关重要。因为我们需要找到数据 “藏” 在哪,否则不知道应该去哪请求数据。在本案例中,我们将爬取「bilibili」的数据,具体选择 bilibili 入站第一名的视频「【才浅】15天花20万元用500克黄金敲数万锤纯手工打造三星堆黄金面具」的评论数据。
  按照惯例,我们先看一下网页源代码,由于信息太多了,可以直接使用搜索功能。在网页源代码页面,搜索评论内容,发现没有这个数据。
  
  那怎么办呢?我们就要找一找这个数据到底藏在哪了。通常,查找动态网页的数据接口有以下几个步骤:
  问题又来了,动态网页里的数据很多,有时候就算筛选了类型,也还是有很多页面。要找到我们需要的数据,真的是大海捞针,那怎么办呢?有一个小技巧,就是利用搜索功能。在检查页面,搜索一下评论内容,立马就找到了数据藏在哪里!
  3.2 请求接口数据
  历经千辛万苦,终于找到了数据藏的位置,接下来就是要把数据获取下来。这里简单三个步骤就可以完成:
  我们先来看看接口网址 (Request URL) 的情况,可以看到网址包括以下几个部分:
  也就是说,这个数据接口由 1 个主结构和 8 个参数构成。关于参数需要注意两点,一是有没有这个参数会不会影响数据获取,二是这个参数的含义和变化规律。具体的确定方法只有不断尝试:
  当然,有时候不知道含义也可以爬取数据,但是建议还是了解一下,一般不清楚含义但必需的参数保持默认值即可。在这里,我们省略一下不断尝试的结果。最终,发现了部分参数的基本含义:
  接下来我们就可以复制请求头,构造请求参数,请求需要的数据。
  # 导入模块<br />import requests<br />import time<br /><br /># 网址<br />url = "https://api.bilibili.com/x/v2/reply/main"  # 接口网址的主要结构<br /><br /># 请求头数据<br />headers = {<br />    'accept': '*/*',<br />    'accept-encoding': 'gzip, deflate, br',<br />    'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',<br />    'referer': 'https://www.bilibili.com/video/BV16X4y1g7wT',<br />    'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"',<br />    'sec-ch-ua-mobile': '?0',<br />    'sec-ch-ua-platform': 'Windows',<br />    'sec-fetch-dest': 'script',<br />    'sec-fetch-mode': 'no-cors',<br />    'sec-fetch-site': 'same-site',<br />    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '<br />                  '(KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36'<br />    # 根据测试不需要 cookie 信息也可以获取数据<br />    # 需要 cookie 的话在自己的浏览器中复制,这里涉及隐私就不放 cookie 信息了<br />}<br /><br /># 构造请求参数<br />params = {<br />    # 'callback': 'jQuery17201888299578386794_' + str(round(time.time() * 1000)),<br />    # 'jsonp': 'jsonp',<br />    'next': 0,  # 页码<br />    'type': 1,<br />    'oid': 715024588,  # 视频av号<br />    # 'mode': 3,  # 评论排序方式<br />    # 'plat': 1,<br />    # '_': str(round(time.time() * 1000))  # 生成当前时间戳<br />}<br /><br /># 通过get方法请求数据<br />response = requests.get(url, headers=headers, params=params)<br />
  查看返回结果, 代表请求数据成功。如果是 403 或 404 则说明请求不成功,可能需要检查电脑网络是否通畅、目标网址是否可以正常访问、headers 是否有正确设置等。
  3.3 解析网页数据
  请求成功后,我们再来看请求回来的数据是什么样的,如何根据获取自己需要的数据。回到数据接口中,我们可以看到数据是通过 json 格式存储的,而每条评论的数据在 data 下面的 replies 中。
  因此,我们用 json 解析请求到的数据,并把需要的评论数据提取出来。
  # 导入模块<br />import json<br />import time<br /><br />response.encoding = 'utf-8'                  # 修改编码格式<br />data_json = json.loads(response.text)        # 通过 json 解析数据<br />comment_list = data_json['data']['replies']  # 获取 data 下面的 replies 列表<br /><br />comments = []                       # 构建空列表保存每页的评论数据<br />for i in range(len(comment_list)):  # 循环获取每条评论的数据<br />    comment = {<br />        'id': comment_list[i]['rpid'],  # 评论id<br />        # 评论时间,由时间戳转换<br />        'time': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(comment_list[i]['ctime'])),  <br />        'parent': comment_list[i]['parent'],  # 父评论id<br />        'like': comment_list[i]['like'],      # 点赞数<br />        'user_id': comment_list[i]['member']['mid'],      # 评论用户id<br />        'user_name': comment_list[i]['member']['uname'],  # 用户名<br />        'content': comment_list[i]['content']['message']  # 评论内容<br />        # 需要其他数据的可以再在 json 中查看并获取对应的名称<br />    }<br />    comments.append(comment)  # 每页的评论数据<br />
  3.4 储存爬取数据
  接下来,把爬取到的数据存入 csv 文件。当然,还是建议爬取一页保存一页。同时,使用 utf-8 格式保存数据,因此打开数据文件时,也要使用同样的格式。
  # 导入模块<br />import csv<br /><br /># 保存数据的文件路径<br />save_path = 'bilibili.csv'<br /><br /># 将数据写入 csv<br /> with open(save_path, 'a', newline='', encoding='utf-8') as fp:<br />     csv_header = ['id', 'time', 'parent', 'like', 'user_id', 'user_name', 'content']  # 设置表头,即列名<br />     csv_writer = csv.DictWriter(fp, csv_header)<br />     # 如果文件不存在,则写入表头;如果文件已经存在,则直接追加数据不再次写入表头<br />     if fp.tell() == 0:<br />         csv_writer.writeheader()    <br />     csv_writer.writerows(comments)  # 写入数据<br />
  3.5 循环爬取数据
  终于成功获取了一页的数据,接下来就要循环获取更多数据了。这里也分为三个步骤:
  由于前面已经详细分析过接口的参数变化,这里不再具体说明。通过分析,翻页变化的参数是 next,所以只要变化这个参数就可以进行翻页。另外,如果要爬取不同视频的评论,则要通过 av 号来循环,也就是 oid 参数。
  4. 完整代码
  # -*- coding: utf-8 -*-<br /># Author: W.Y.<br /># Email: wangyingchn@outlook.com<br /># Date: 2022/4/12<br /><br /># 导入模块<br />import requests  # 请求数据<br />import time      # 时间模块<br />import json      # json 模块,储存数据<br />import csv       # 保存数据<br /><br /># 请求数据<br />def get_response(page):<br />    url = 'https://api.bilibili.com/x/v2/reply/main'  # 接口网址的主要结构<br />    # 请求头数据<br />    headers = {<br />        'accept': '*/*',<br />        'accept-encoding': 'gzip, deflate, br',<br />        'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',<br />        'referer': 'https://www.bilibili.com/video/BV16X4y1g7wT',<br />        'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"',<br />        'sec-ch-ua-mobile': '?0',<br />        'sec-ch-ua-platform': 'Windows',<br />        'sec-fetch-dest': 'script',<br />        'sec-fetch-mode': 'no-cors',<br />        'sec-fetch-site': 'same-site',<br />        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '<br />                      '(KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36'<br />        # 根据测试不需要 cookie 信息也可以获取数据<br />        # 需要 cookie 的话在自己的浏览器中复制,这里涉及隐私就不放 cookie 信息了<br />    }<br />    # 构造请求参数<br />    params = {<br />        # 'callback': 'jQuery17201888299578386794_' + str(round(time.time() * 1000)),<br />        # 'jsonp': 'jsonp',<br />        'next': page,  # 页码<br />        'type': 1,<br />        'oid': 715024588,  # 视频av号<br />        'mode': 3,  # 评论排序方式<br />        # 'plat': 1,<br />        # '_': str(round(time.time() * 1000))  # 生成当前时间戳<br />    }<br />    # 通过get方法请求数据<br />    response = requests.get(url, headers=headers, params=params)<br />    return response<br /><br /># 解析数据<br />def parse_data(response):<br />    response.encoding = 'utf-8'                  # 修改编码格式<br />    data_json = json.loads(response.text)        # 通过 json 解析数据<br />    comment_list = data_json['data']['replies']  # 获取 data 下面的 replies 列表<br />    comments = []                       # 构建空列表保存每页的评论数据<br />    for i in range(len(comment_list)):  # 循环获取每条评论的数据<br />        comment = {<br />            'id': comment_list[i]['rpid'],   # 评论id<br />            'time': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(comment_list[i]['ctime'])),  <br />            # 评论时间,由时间戳转换<br />            'parent': comment_list[i]['parent'],  # 父评论id<br />            'like': comment_list[i]['like'],      # 点赞数<br />            'user_id': comment_list[i]['member']['mid'],      # 评论用户id<br />            'user_name': comment_list[i]['member']['uname'],  # 用户名<br />            'content': comment_list[i]['content']['message']  # 评论内容<br />            # 需要其他数据的可以再在 json 中查看并获取对应的名称<br />        }<br />        comments.append(comment)  # 每页的评论数据<br />    return comments<br /><br /># 保存数据<br />def save_data(comments, save_path):<br />    with open(save_path, 'a', newline='', encoding='utf-8') as fp:<br />        # 设置表头,即列名<br />        csv_header = ['id', 'time', 'parent', 'like', 'user_id', 'user_name', 'content']  <br />        csv_writer = csv.DictWriter(fp, csv_header)<br />        # 如果文件不存在,则写入表头;如果文件已经存在,则直接追加数据不再次写入表头<br />        if fp.tell() == 0:<br />            csv_writer.writeheader()  <br />        csv_writer.writerows(comments)  # 写入数据<br /><br /># 定义爬取函数<br />def crawler(page, save_path):<br />    time.sleep(2)  # 暂停 2 秒,避免请求过于频繁<br />    response = get_response(page)    # 请求数据<br />    comments = parse_data(response)  # 解析数据<br />    save_data(comments, save_path)   # 储存数据<br />    print(f'成功爬取第{page+1}页')<br /><br />if __name__ == '__main__':<br />    save_file = 'bilibili.csv'  # 保存路径<br />    total_counts = 1000         # 爬取 1000 条评论<br />    # 如果要爬取所有评论,可以改成全部评论数。<br />    # 如果要爬取多个视频的评论,可以通过下面的代码,爬取第一页的时候返回所有的评论数<br />    # total_counts = data_json['data']['cursor']['all_count']<br />    # 页码循环,每页有 20 条评论,所以通过总评论数计算页码<br />    for p in range(total_counts//20 + 1):  <br />        crawler(p, save_file)<br />
  5. 相关推文
  Note:产生如下推文列表的 Stata 命令为:
  lianxh python, m
  安装最新版 lianxh 命令:
  ssc install lianxh, replace
  专题:文本分析-爬虫专题:Python-R-Matlab
  
  课程推荐:因果推断实用计量方法
  主讲老师:丘嘉平教授
  课程主页:
  
  New! Stata 搜索神器:lianxh 和 songbl
  搜: 推文、数据分享、期刊论文、重现代码 ……
  安装:
  . ssc install lianxh
  . ssc install songbl
  使用:
  . lianxh DID 倍分法
  . songbl all
  
  关于我们
  

Python爬取静态网站:以历史天气为例

网站优化优采云 发表了文章 • 0 个评论 • 45 次浏览 • 2022-06-06 17:06 • 来自相关话题

  Python爬取静态网站:以历史天气为例
  邮箱:
  目录
  4. 完整代码
  5. 相关推文
  温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:
  
  数据获取是实证研究的第一步。随着互联网数据的指数级增长,网络数据成为重要且常用的数据源。网络爬虫也因此成为获取数据的重要方式。但是我们通常会觉得爬虫非常复杂,不知道从何下手。为此,本文将通过实际的爬取案例介绍,来帮助大家掌握相关知识。
  1. 静态网页和动态网页
  网页类型包括静态网页和动态网页。简单来说,静态网页是指数据直接存储在网页的 html 中,不论用户是否请求了数据,数据就 “静止” 在那里。动态网页的数据则被 “藏” 起来了,用户每次请求后,动态网页才会有一个向远程数据库请求数据的“动作”,再把数据显示出来,但用户无法直接从网页的 html 中获取数据。
  这里不细说静态网页和动态网页的官方定义,只说两个最明显的区别,以方便大家在分析网页时进行区分:
  直观来说,翻页时网址变化的网站就是静态网站,反之就是动态网站。比如微博评论、bilibili 评论这样一直下滑会一直出现新的数据,但是网址不变的,就是动态网站。
  2. 静态网页爬取的思路
  这次我们先聊聊如何爬取静态网页的数据。由于静态网页结构比较简单,可以直接通过获取网页源代码得到数据,所以爬取比较简单。有了目标网站后,静态网页数据的爬取可以分为四步:
  如果涉及多页的数据,还涉及到分析网址翻页规律和进行循环:
  小提示:多页循环时,可以先爬取单页数据,成功后再循环爬取部分数据 (比如 10 页),没问题再爬取完整数据。
  3. 案例之爬取历史天气
  接下来用一个简单的实战案例,来具体介绍如何通过 Python 爬取静态网页的数据。主要内容包括:
  3.1 分析网页结构
  分析网页结构是爬取数据的第一步,也是重中之重。在本案例中,我们需要爬取「天气网」的历史数据。以北京市 2022 年 3 月天气的「网页」为例,进行网页结构分析。首先,我们需要的数据如下图左所示,包括每天的日期、最高气温、最低气温、天气、风向。
  然后,在浏览器页面右键查看网页源代码,并在源代码中找到对应的数据 (如下图右)。这也是前面提到的静态网页第一个特征:页面上显示的数据都可以在源代码中找到。
  
  小提示:静态网页的结构都比较简单,我们不需要太多精力去分析网页结构,只需要在源代码中验证一下是否有需要的数据即可。
  3.2 请求网页数据
  由于数据都藏在源代码中,我们只需要请求网页内容,即把源代码下载到本地,进行分析。关于网页请求,我们需要用到 Python 爬虫中常用包 requests。
  # 导入模块<br />import requests<br /><br /># 输入网址。这里还是以北京市 2022 年 3 月的天气为例进行单页爬取。<br />url = "https://lishi.tianqi.com/beiji ... %3Bbr /><br /># 伪装一下,让服务器以为是正常浏览,而不是爬虫<br /># 静态网页通常反爬不严格,所以只要通过 User-Agent 伪装成浏览器即可<br />headers = {<br />    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \<br />     Chrome/77.0.3865.120 Safari/537.36"<br />}<br /><br /># 请求数据,使用 get 方法请求数据<br />response = requests.get(url, headers=headers)<br />response<br />
  如果返回 则代表请求数据成功。如果返回 403 或 404 则说明请求不成功,可能需要检查电脑网络是否通畅、目标网址是否可以正常访问、headers 是否有正确设置等。
  3.3 解析网页数据
  请求成功后,我们要再次回到源代码中,以查看数据结构。
  
  可以看到,在网页源代码中数据是以 html 格式存储的。首先,最外面的 div 标签包裹了整个表格,里面的 div 标签包裹了表头。接着,一个 ul 标签包裹了所有的行内容,其中每一行是一个 li 标签,每列具体数据是 div 标签。
  因此,我们需要的是每个 li 标签里所有 div 标签里的数据。这里,我们使用 Python 中 bs4 包的 BeautifulSoup 进行网页数据解析。
  # 导入模块<br />from bs4 import BeautifulSoup<br /><br />soup = BeautifulSoup(response.text, "html.parser")  # 由于是通过 html 格式存储的,所以用 “html.parser” 进行解析<br />data_table = soup.find('ul', class_="thrui").find_all("li")  # 找到包裹表内容的 ul 标签,找到里面所有的 li 标签<br /><br />weather_list = []  # 构造空列表以存储数据<br />for li in data_table[1:]:  # 循环获取每行的数据(li 标签)<br />    th_list = li.find_all('div')  # 获取每行的每个数据 (li 标签下的 div 标签)<br />    weather = {<br />        'date': th_list[0].get_text(),  # 获取第一个 div 标签中的内容,命名为 “date”<br />        'temp_high': th_list[1].get_text(),<br />        'temp_low': th_list[2].get_text(),<br />        'weather': th_list[3].get_text(),<br />        'wind': th_list[4].get_text(),<br />        'url': response.url  # 爬取时通常可以顺便保存一下当页的网址,方便溯源和排查错误<br />    }  # 每行数据存储在一个字典中<br />    weather_list.append(weather)  # 所有行的数据存入一个列表中<br />
  小提示:在爬取表格型数据时,如果列数很多,像上面一样单个获取再存储就比较麻烦。这里再提供一种适用于爬取表格型数据的更简洁的方式,需要用到 Python 中另一个强大的模块 numpy。
  import numpy as np<br />weather_list = []<br />for li in data_table[1:]:     <br />    th_list = li.find_all('div')<br />    for th in th_list:<br />        s = th.get_text()  # 循环获取 div 标签数据<br />        weather_list.append("".join(s.split()))  # 直接把获取的 div 标签全部存在一个列表中<br />result = np.array(weather_list).reshape(-1, 5)   # 通过 numpy 直接转为多行 5 列的数据表<br /># 最后再转化为数据框并重命名列即可<br /># 这种方式虽然方便,但可能不太直观,也可能出错(比如有的数据不全,就容易错位)<br /># 此外,还有很多不同的解析数据的方式,可以多去尝试<br />
  3.4 储存爬取数据
  把数据解析好之后,数据就可以通过更加结构化的形式进行存储,通常可以使用 txt、excel、csv 等格式。由于无格式、比 txt 更直观、可以用 excel 打开,一般比较推荐用 csv 格式储存。
  # 导入模块<br />import csv<br /><br /># 保存数据的文件路径<br />save_path = 'weather.csv'<br /><br /># 将数据写入 csv<br />with open(save_path, 'a', newline='', encoding='utf-8') as fp:<br />    csv_header = ['date', 'temp_high', 'temp_low', 'weather', 'wind', 'url']  # 设置表头,即列名<br />    csv_writer = csv.DictWriter(fp, csv_header)  <br />    if fp.tell() == 0:<br />        csv_writer.writeheader()  # 如果文件不存在,则写入表头;如果文件已经存在,则直接追加数据不再次写入表头。<br />    csv_writer.writerows(weather_list)  # 写入数据<br />
  小提示:爬取时,建议爬一页存一页。如果完全爬取完再一次写入,很可能会遇到循环爬取过程中出错,导致已爬取的数据无法成功储存。这里写入 csv 时用的编码格式是 utf-8,所以打开数据时也要用对应的编码格式,否则可能会出现乱码。
  3.5 循环爬取数据
  通常,我们需要的不仅仅是单页的数据,而是网站上的所有或大部分数据,所以需要多页循环爬取。在成功爬取一页数据之后,多页爬取就很简单了。只需要分析网址的变化规律,生成所有需要的网址,再把单页爬取重复多次就可以了。
  首先,来分析一下网址的变化规律。
  bejing<br />https://lishi.tianqi.com/beijing/202203.html<br />https://lishi.tianqi.com/beijing/202202.html<br />https://lishi.tianqi.com/beijing/202201.html<br />https://lishi.tianqi.com/beijing/202112.html<br /><br />shanghai<br />https://lishi.tianqi.com/shang ... %3Bbr />https://lishi.tianqi.com/shang ... %3Bbr />
  可以看到,网址在变化。这也是前面提到静态网页的另一个特征,网址不变数据不 “动”,数据要 “动” 网址就变。 回到例子中,只有两个地方在变化。一个是城市变化时,网址的城市代码部分变化,这里是城市的汉语拼音。另一个是时间变化时,网址的时间代码部分变化,这里是年月的 6 位数字。
  知道了网址的变化规律后,我们就可以通过循环来爬取多页数据。这里有两种思路,一种是先根据网址变化规律,一次性生成所有要爬取的网址,再在网址中循环获取数据。另一种是根据网址变化规律,生成一个网址,爬取一个网址,不断循环。两种方法都可以,这里使用第一种,先生成所有网址。
  url_pattern = 'https://lishi.tianqi.com/{}/{}.html'  # 网址的基本结构,有变化的两个部分用 {} 替代,后面循环补充<br /><br />city_list = ['beijing', 'shanghai']      # 构造需要爬取的城市的列表<br />years = [x for x in range(2020, 2022)]   # 使用列表生成式生成年份列表<br />months = [str(x).zfill(2) for x in range(1, 13)] # 生成月份列表,zfill 函数补充两位数<br />month_list = [str(year) + str(month) for year in years for month in months]  # 年月循环拼在一起<br /><br />url_list = []              # 空列表用于存储所有网址<br />for c in city_list:       # 先循环城市<br />    for m in month_list:  # 再循环时间<br />        url_list.append(url_pattern.format(c, m))  # 通过 format 函数生成网址<br />
  生成了所有的网址后,把前面单页爬取循环到不同的网址下,就可以获取所有的数据了。
  4. 完整代码
  在实际过程中,通常会把每个需要重复操作的步骤都构造成函数,方便在循环中调用。这里的完整代码是通过构造函数的方式来进行的,函数的主体部分就是前面每个步骤的具体代码。
  # -*- coding: utf-8 -*-<br /># Author: W.Y.<br /># Email: wangyingchn@outlook.com<br /># Date: 2022/4/4<br /><br /># 导入模块<br />import csv  # 用于存储数据<br />import time  # 用于时间间隔避免过频繁的请求<br />import requests  # 用于请求数据<br />from bs4 import BeautifulSoup  # 用于解析数据<br /><br /># 请求数据<br />def get_response(url):<br />    # 伪装一下,让服务器以为是正常浏览,而不是爬虫。<br />    # 静态网页通常反爬不严格,所以只要通过 User-Agent 伪装成浏览器即可。<br />    headers = {<br />        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 \<br />        (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"<br />    }<br />    # 请求数据。使用 get 方法请求数据<br />    response = requests.get(url, headers=headers)<br />    return response<br /><br /># 解析数据<br />def parse_data(response):<br />    soup = BeautifulSoup(response.text, "html.parser")  # 由于是通过 html 格式存储的,所以用 “html.parser” 进行解析<br />    data_table = soup.find('ul', class_="thrui").find_all("li")  # 找到包裹表内容的 ul 标签,找到里面所有的 li 标签<br />    weather_list = []  # 构造空列表以存储数据<br />    for li in data_table[1:]:  # 循环获取每行的数据(li 标签)<br />        th_list = li.find_all('div')  # 获取每行的每个数据 (li 标签下的 div 标签)<br />        weather = {<br />            'date': th_list[0].get_text(),  # 获取第一个 div 标签中的内容,命名为 “date”<br />            'temp_high': th_list[1].get_text(),<br />            'temp_low': th_list[2].get_text(),<br />            'weather': th_list[3].get_text(),<br />            'wind': th_list[4].get_text(),<br />            'url': response.url  # 爬取时通常可以顺便保存一下当页的网址,方便溯源和排查错误<br />            # 'city': response.url.split('/')[3]  # 如果需要增加一列城市,也可以通过 url 来获取<br />        }   # 每行数据存储在一个字典中<br />        weather_list.append(weather)  # 所有行的数据存入一个列表中<br />    return weather_list<br /><br /># 储存数据<br />def save_data(weather_list, save_path):<br />    with open(save_path, 'a', newline='', encoding='utf-8') as fp:<br />        csv_header = ['date', 'temp_high', 'temp_low', 'weather', 'wind', 'url']  # 设置表头,即列名<br />        csv_writer = csv.DictWriter(fp, csv_header)<br />        if fp.tell() == 0:<br />            csv_writer.writeheader()  # 如果文件不存在,则写入表头;如果文件已经存在,则直接追加数据不再次写入表头<br />        csv_writer.writerows(weather_list)  # 写入数据<br /><br /># 构造网址<br />def generate_urls():<br />    url_pattern = 'https://lishi.tianqi.com/{}/{}.html'  # 网址的基本结构,有变化的两个部分用 {} 替代,后面循环补充<br />    city_list = ['beijing', 'shanghai']  # 构造需要爬取的城市的列表<br />    years = [x for x in range(2020, 2022)]  # 使用列表生成式生成年份列表<br />    months = [str(x).zfill(2) for x in range(1, 13)]  # 生成月份列表,zfill 函数补充两位数<br />    month_list = [str(year) + str(month) for year in years for month in months]  # 年月循环拼在一起<br />    url_list = []  # 空列表用于存储所有网址<br />    for c in city_list:  # 先循环城市<br />        for m in month_list:  # 再循环时间<br />            url_list.append(url_pattern.format(c, m))  # 通过 format 函数生成网址<br />    return url_list<br /><br /># 定义爬取函数<br />def crawler(url, save_path):<br />    response = get_response(url)    # 请求数据<br />    results = parse_data(response)  # 解析数据<br />    save_data(results, save_path)   # 存储数据<br />    print(f'成功爬取数据:{url}')<br /><br />if __name__ == '__main__':<br />    urls = generate_urls()     # 构造所有网址<br />    save_file = 'weather.csv'  # 保存数据的文件路径<br />    for u in urls:     # 在网址中循环<br />        time.sleep(2)  # 每次爬取休息 2 秒,以免太过频繁的请求<br />        crawler(u, save_file)  # 进行爬取<br />
  5. 相关推文
  Note:产生如下推文列表的 Stata 命令为:
  lianxh 爬虫, m
  安装最新版 lianxh 命令:
  ssc install lianxh, replace
  专题:Python-R-Matlab
  
  连享会 ·
  
  
  New! Stata 搜索神器:lianxh 和 songbl
  搜: 推文、数据分享、期刊论文、重现代码 ……
  安装:
  . ssc install lianxh
  . ssc install songbl
  使用:
  . lianxh DID 倍分法
  . songbl all
  
  关于我们
   查看全部

  Python爬取静态网站:以历史天气为例
  邮箱:
  目录
  4. 完整代码
  5. 相关推文
  温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:
  
  数据获取是实证研究的第一步。随着互联网数据的指数级增长,网络数据成为重要且常用的数据源。网络爬虫也因此成为获取数据的重要方式。但是我们通常会觉得爬虫非常复杂,不知道从何下手。为此,本文将通过实际的爬取案例介绍,来帮助大家掌握相关知识。
  1. 静态网页和动态网页
  网页类型包括静态网页和动态网页。简单来说,静态网页是指数据直接存储在网页的 html 中,不论用户是否请求了数据,数据就 “静止” 在那里。动态网页的数据则被 “藏” 起来了,用户每次请求后,动态网页才会有一个向远程数据库请求数据的“动作”,再把数据显示出来,但用户无法直接从网页的 html 中获取数据。
  这里不细说静态网页和动态网页的官方定义,只说两个最明显的区别,以方便大家在分析网页时进行区分:
  直观来说,翻页时网址变化的网站就是静态网站,反之就是动态网站。比如微博评论、bilibili 评论这样一直下滑会一直出现新的数据,但是网址不变的,就是动态网站。
  2. 静态网页爬取的思路
  这次我们先聊聊如何爬取静态网页的数据。由于静态网页结构比较简单,可以直接通过获取网页源代码得到数据,所以爬取比较简单。有了目标网站后,静态网页数据的爬取可以分为四步:
  如果涉及多页的数据,还涉及到分析网址翻页规律和进行循环:
  小提示:多页循环时,可以先爬取单页数据,成功后再循环爬取部分数据 (比如 10 页),没问题再爬取完整数据。
  3. 案例之爬取历史天气
  接下来用一个简单的实战案例,来具体介绍如何通过 Python 爬取静态网页的数据。主要内容包括:
  3.1 分析网页结构
  分析网页结构是爬取数据的第一步,也是重中之重。在本案例中,我们需要爬取「天气网」的历史数据。以北京市 2022 年 3 月天气的「网页」为例,进行网页结构分析。首先,我们需要的数据如下图左所示,包括每天的日期、最高气温、最低气温、天气、风向。
  然后,在浏览器页面右键查看网页源代码,并在源代码中找到对应的数据 (如下图右)。这也是前面提到的静态网页第一个特征:页面上显示的数据都可以在源代码中找到。
  
  小提示:静态网页的结构都比较简单,我们不需要太多精力去分析网页结构,只需要在源代码中验证一下是否有需要的数据即可。
  3.2 请求网页数据
  由于数据都藏在源代码中,我们只需要请求网页内容,即把源代码下载到本地,进行分析。关于网页请求,我们需要用到 Python 爬虫中常用包 requests。
  # 导入模块<br />import requests<br /><br /># 输入网址。这里还是以北京市 2022 年 3 月的天气为例进行单页爬取。<br />url = "https://lishi.tianqi.com/beiji ... %3Bbr /><br /># 伪装一下,让服务器以为是正常浏览,而不是爬虫<br /># 静态网页通常反爬不严格,所以只要通过 User-Agent 伪装成浏览器即可<br />headers = {<br />    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \<br />     Chrome/77.0.3865.120 Safari/537.36"<br />}<br /><br /># 请求数据,使用 get 方法请求数据<br />response = requests.get(url, headers=headers)<br />response<br />
  如果返回 则代表请求数据成功。如果返回 403 或 404 则说明请求不成功,可能需要检查电脑网络是否通畅、目标网址是否可以正常访问、headers 是否有正确设置等。
  3.3 解析网页数据
  请求成功后,我们要再次回到源代码中,以查看数据结构。
  
  可以看到,在网页源代码中数据是以 html 格式存储的。首先,最外面的 div 标签包裹了整个表格,里面的 div 标签包裹了表头。接着,一个 ul 标签包裹了所有的行内容,其中每一行是一个 li 标签,每列具体数据是 div 标签。
  因此,我们需要的是每个 li 标签里所有 div 标签里的数据。这里,我们使用 Python 中 bs4 包的 BeautifulSoup 进行网页数据解析。
  # 导入模块<br />from bs4 import BeautifulSoup<br /><br />soup = BeautifulSoup(response.text, "html.parser")  # 由于是通过 html 格式存储的,所以用 “html.parser” 进行解析<br />data_table = soup.find('ul', class_="thrui").find_all("li")  # 找到包裹表内容的 ul 标签,找到里面所有的 li 标签<br /><br />weather_list = []  # 构造空列表以存储数据<br />for li in data_table[1:]:  # 循环获取每行的数据(li 标签)<br />    th_list = li.find_all('div')  # 获取每行的每个数据 (li 标签下的 div 标签)<br />    weather = {<br />        'date': th_list[0].get_text(),  # 获取第一个 div 标签中的内容,命名为 “date”<br />        'temp_high': th_list[1].get_text(),<br />        'temp_low': th_list[2].get_text(),<br />        'weather': th_list[3].get_text(),<br />        'wind': th_list[4].get_text(),<br />        'url': response.url  # 爬取时通常可以顺便保存一下当页的网址,方便溯源和排查错误<br />    }  # 每行数据存储在一个字典中<br />    weather_list.append(weather)  # 所有行的数据存入一个列表中<br />
  小提示:在爬取表格型数据时,如果列数很多,像上面一样单个获取再存储就比较麻烦。这里再提供一种适用于爬取表格型数据的更简洁的方式,需要用到 Python 中另一个强大的模块 numpy。
  import numpy as np<br />weather_list = []<br />for li in data_table[1:]:     <br />    th_list = li.find_all('div')<br />    for th in th_list:<br />        s = th.get_text()  # 循环获取 div 标签数据<br />        weather_list.append("".join(s.split()))  # 直接把获取的 div 标签全部存在一个列表中<br />result = np.array(weather_list).reshape(-1, 5)   # 通过 numpy 直接转为多行 5 列的数据表<br /># 最后再转化为数据框并重命名列即可<br /># 这种方式虽然方便,但可能不太直观,也可能出错(比如有的数据不全,就容易错位)<br /># 此外,还有很多不同的解析数据的方式,可以多去尝试<br />
  3.4 储存爬取数据
  把数据解析好之后,数据就可以通过更加结构化的形式进行存储,通常可以使用 txt、excel、csv 等格式。由于无格式、比 txt 更直观、可以用 excel 打开,一般比较推荐用 csv 格式储存。
  # 导入模块<br />import csv<br /><br /># 保存数据的文件路径<br />save_path = 'weather.csv'<br /><br /># 将数据写入 csv<br />with open(save_path, 'a', newline='', encoding='utf-8') as fp:<br />    csv_header = ['date', 'temp_high', 'temp_low', 'weather', 'wind', 'url']  # 设置表头,即列名<br />    csv_writer = csv.DictWriter(fp, csv_header)  <br />    if fp.tell() == 0:<br />        csv_writer.writeheader()  # 如果文件不存在,则写入表头;如果文件已经存在,则直接追加数据不再次写入表头。<br />    csv_writer.writerows(weather_list)  # 写入数据<br />
  小提示:爬取时,建议爬一页存一页。如果完全爬取完再一次写入,很可能会遇到循环爬取过程中出错,导致已爬取的数据无法成功储存。这里写入 csv 时用的编码格式是 utf-8,所以打开数据时也要用对应的编码格式,否则可能会出现乱码。
  3.5 循环爬取数据
  通常,我们需要的不仅仅是单页的数据,而是网站上的所有或大部分数据,所以需要多页循环爬取。在成功爬取一页数据之后,多页爬取就很简单了。只需要分析网址的变化规律,生成所有需要的网址,再把单页爬取重复多次就可以了。
  首先,来分析一下网址的变化规律。
  bejing<br />https://lishi.tianqi.com/beijing/202203.html<br />https://lishi.tianqi.com/beijing/202202.html<br />https://lishi.tianqi.com/beijing/202201.html<br />https://lishi.tianqi.com/beijing/202112.html<br /><br />shanghai<br />https://lishi.tianqi.com/shang ... %3Bbr />https://lishi.tianqi.com/shang ... %3Bbr />
  可以看到,网址在变化。这也是前面提到静态网页的另一个特征,网址不变数据不 “动”,数据要 “动” 网址就变。 回到例子中,只有两个地方在变化。一个是城市变化时,网址的城市代码部分变化,这里是城市的汉语拼音。另一个是时间变化时,网址的时间代码部分变化,这里是年月的 6 位数字。
  知道了网址的变化规律后,我们就可以通过循环来爬取多页数据。这里有两种思路,一种是先根据网址变化规律,一次性生成所有要爬取的网址,再在网址中循环获取数据。另一种是根据网址变化规律,生成一个网址,爬取一个网址,不断循环。两种方法都可以,这里使用第一种,先生成所有网址。
  url_pattern = 'https://lishi.tianqi.com/{}/{}.html'  # 网址的基本结构,有变化的两个部分用 {} 替代,后面循环补充<br /><br />city_list = ['beijing', 'shanghai']      # 构造需要爬取的城市的列表<br />years = [x for x in range(2020, 2022)]   # 使用列表生成式生成年份列表<br />months = [str(x).zfill(2) for x in range(1, 13)] # 生成月份列表,zfill 函数补充两位数<br />month_list = [str(year) + str(month) for year in years for month in months]  # 年月循环拼在一起<br /><br />url_list = []              # 空列表用于存储所有网址<br />for c in city_list:       # 先循环城市<br />    for m in month_list:  # 再循环时间<br />        url_list.append(url_pattern.format(c, m))  # 通过 format 函数生成网址<br />
  生成了所有的网址后,把前面单页爬取循环到不同的网址下,就可以获取所有的数据了。
  4. 完整代码
  在实际过程中,通常会把每个需要重复操作的步骤都构造成函数,方便在循环中调用。这里的完整代码是通过构造函数的方式来进行的,函数的主体部分就是前面每个步骤的具体代码。
  # -*- coding: utf-8 -*-<br /># Author: W.Y.<br /># Email: wangyingchn@outlook.com<br /># Date: 2022/4/4<br /><br /># 导入模块<br />import csv  # 用于存储数据<br />import time  # 用于时间间隔避免过频繁的请求<br />import requests  # 用于请求数据<br />from bs4 import BeautifulSoup  # 用于解析数据<br /><br /># 请求数据<br />def get_response(url):<br />    # 伪装一下,让服务器以为是正常浏览,而不是爬虫。<br />    # 静态网页通常反爬不严格,所以只要通过 User-Agent 伪装成浏览器即可。<br />    headers = {<br />        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 \<br />        (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"<br />    }<br />    # 请求数据。使用 get 方法请求数据<br />    response = requests.get(url, headers=headers)<br />    return response<br /><br /># 解析数据<br />def parse_data(response):<br />    soup = BeautifulSoup(response.text, "html.parser")  # 由于是通过 html 格式存储的,所以用 “html.parser” 进行解析<br />    data_table = soup.find('ul', class_="thrui").find_all("li")  # 找到包裹表内容的 ul 标签,找到里面所有的 li 标签<br />    weather_list = []  # 构造空列表以存储数据<br />    for li in data_table[1:]:  # 循环获取每行的数据(li 标签)<br />        th_list = li.find_all('div')  # 获取每行的每个数据 (li 标签下的 div 标签)<br />        weather = {<br />            'date': th_list[0].get_text(),  # 获取第一个 div 标签中的内容,命名为 “date”<br />            'temp_high': th_list[1].get_text(),<br />            'temp_low': th_list[2].get_text(),<br />            'weather': th_list[3].get_text(),<br />            'wind': th_list[4].get_text(),<br />            'url': response.url  # 爬取时通常可以顺便保存一下当页的网址,方便溯源和排查错误<br />            # 'city': response.url.split('/')[3]  # 如果需要增加一列城市,也可以通过 url 来获取<br />        }   # 每行数据存储在一个字典中<br />        weather_list.append(weather)  # 所有行的数据存入一个列表中<br />    return weather_list<br /><br /># 储存数据<br />def save_data(weather_list, save_path):<br />    with open(save_path, 'a', newline='', encoding='utf-8') as fp:<br />        csv_header = ['date', 'temp_high', 'temp_low', 'weather', 'wind', 'url']  # 设置表头,即列名<br />        csv_writer = csv.DictWriter(fp, csv_header)<br />        if fp.tell() == 0:<br />            csv_writer.writeheader()  # 如果文件不存在,则写入表头;如果文件已经存在,则直接追加数据不再次写入表头<br />        csv_writer.writerows(weather_list)  # 写入数据<br /><br /># 构造网址<br />def generate_urls():<br />    url_pattern = 'https://lishi.tianqi.com/{}/{}.html'  # 网址的基本结构,有变化的两个部分用 {} 替代,后面循环补充<br />    city_list = ['beijing', 'shanghai']  # 构造需要爬取的城市的列表<br />    years = [x for x in range(2020, 2022)]  # 使用列表生成式生成年份列表<br />    months = [str(x).zfill(2) for x in range(1, 13)]  # 生成月份列表,zfill 函数补充两位数<br />    month_list = [str(year) + str(month) for year in years for month in months]  # 年月循环拼在一起<br />    url_list = []  # 空列表用于存储所有网址<br />    for c in city_list:  # 先循环城市<br />        for m in month_list:  # 再循环时间<br />            url_list.append(url_pattern.format(c, m))  # 通过 format 函数生成网址<br />    return url_list<br /><br /># 定义爬取函数<br />def crawler(url, save_path):<br />    response = get_response(url)    # 请求数据<br />    results = parse_data(response)  # 解析数据<br />    save_data(results, save_path)   # 存储数据<br />    print(f'成功爬取数据:{url}')<br /><br />if __name__ == '__main__':<br />    urls = generate_urls()     # 构造所有网址<br />    save_file = 'weather.csv'  # 保存数据的文件路径<br />    for u in urls:     # 在网址中循环<br />        time.sleep(2)  # 每次爬取休息 2 秒,以免太过频繁的请求<br />        crawler(u, save_file)  # 进行爬取<br />
  5. 相关推文
  Note:产生如下推文列表的 Stata 命令为:
  lianxh 爬虫, m
  安装最新版 lianxh 命令:
  ssc install lianxh, replace
  专题:Python-R-Matlab
  
  连享会 ·
  
  
  New! Stata 搜索神器:lianxh 和 songbl
  搜: 推文、数据分享、期刊论文、重现代码 ……
  安装:
  . ssc install lianxh
  . ssc install songbl
  使用:
  . lianxh DID 倍分法
  . songbl all
  
  关于我们
  

SEO之网站快速被收录

网站优化优采云 发表了文章 • 0 个评论 • 30 次浏览 • 2022-06-04 10:19 • 来自相关话题

  SEO之网站快速被收录
  对前端而言,迎合搜索引擎的需求也是常有的。对于 Vue 技术栈而言,Nuxtjs 是不二之选。最近刚做完一个类似需求,在此记录一二。
  生成网站地图
  Nuxtjs 提供了相关的组件,我们直接使用即可。
  安装组件
  npm install @nuxtjs/sitemap --save
  配置
  在nuxt.config.js中添加组件的配置
  {<br />      ...<br />      modules: [<br />        '@nuxtjs/sitemap'<br />     ],<br />      ...<br />}
  配置网站地图
  {<br />      ...<br />      modules: [<br />        '@nuxtjs/sitemap'<br />      ],<br />      sitemap: {<br />        hostname: 'https://example.com',<br />        gzip: true,<br />        exclude: [<br />            '/login'<br />        ],<br />        routes: [<br />          '/'<br />        ]<br />     }<br />      ...<br />}
  以上为一个简单的例子,访问可以查看生成的网站地图
  <br />     <br />         https://example.com/<br />     <br />
  这种“写死”的用法肯定是无法满足项目需求的,根据数据动态生成才是我们想要的
  // 导入 axios,也可以是其他用着顺手的组件<br />import axios from 'axios'<br /><br />export default {<br />      ...<br />      sitemap: {<br />          hostname: 'https://example.com',<br />          gzip: true,<br />          exclude: [<br />              '/login'<br />         ],<br />          routes: async () => {<br />              const items = await axiox.get('https://example.com/api')<br />              const list = []<br />              items.forEach(item => {<br />                  list.push({<br />                      url: `/posts/${item.id}`,<br />                      changefred: 'weekly',<br />                      lastmod: new Date()<br />                  })<br />              })<br />              return list<br />          }<br />     }<br />     ...<br />}
  以上即可根据接口的数据动态生成网站地图。
  但是实际项目中,一个正在运营的网站,数据是巨大的,生成网站地图体积也是巨大的,所以我们需要对网站地图进行分类和压缩。另外,如果单个网站地图文件超过 50M,建议再进行一次切割。
  import axios from 'axios'<br /><br />export default {<br />      ...<br />      sitemap: {<br />          hostname: 'https://example.com',<br />         gzip: true,<br />          exclude: [<br />              '/login'<br />           ],<br />           sitemaps: [<br />               {<br />                    path: '/sitemap_cate.xml',<br />                    gzip: true,<br />                    routes: async () => {<br />                          const items = await axiox.get('https://example.com/cate')<br />                          const list = []<br />                          items.forEach(item => {<br />                              list.push({<br />                                  url: `/posts/${item.id}`,<br />                                  changefred: 'weekly',<br />                                  lastmod: new Date()<br />                               })<br />                           })<br />                          return list<br />                    }<br />                 },<br />                  ...<br />            ]<br />      }<br />      ...<br />}
  以上即可生成不同的网站地图文件(,)
  拓展
  每个项目的情况不一样,如果你不喜欢这种网站地图生成的方式,你也可以选择通过其他方式(脚本构建等)生成网站地图,然后将文件放到static目录中。
  robots.txt 文件
  想要网站更好的被搜索引擎抓取,而避免收到过多请求,则需要robots.txt文件配合。
  创建文件
  直接在static目录中创建robots.txt文件即可。
  注意事项:
  配置
  robots.txt需要包含以下内容:
  示例:
  User-agent: *<br />disabllow: <br />allow: /<br />sitemap: https://example.com/sitemap.xml
  一般而言,以上示例就能满足大多数网站,实际情况还得是根据项目自己决断。
  测试
  如果你完成了robots.txt文件,不确定是否有问题,可以测试一下。robots.txt在线测试()
  上传网站地图
  当我们完成以上配置,网站开发完成,并发布上线,如果是一个新项目的话,可能在很长的一段时间都没被搜索引擎收录,从而耽误发家致富。那我们要怎么快速的让搜索引擎收录呢?搜索引擎都支持上传网站地图,只要我们主动提交网站地图,就会第一时间被抓取。
  谷歌站长
  谷歌站长地址()
  添加网站
  输入需要提交网站地图的域名
  
  验证网站所有权
  验证网站的所有权,有三种方式:dns,html 标记,html 文件。
  当然首选是dns解析,如果你可以操作或者有同事能很快可以配合去验证的话。因为 html 标记跟 html 文件验证都需要重新发版,发版是一件比较“麻烦”的事。你懂的!
  
  我这里是使用 html 文件验证,直接把文件下载下来,放到static目录中,然后再重新发版。再回到后台,点一下验证,就会看到验证成功的提示。
  
  提交网站地图
  当网站验证完了之后就在后台提交网站地图了。
  
  百度站长
  注册百度站长 百度站长地址
  添加网站
  注册百度站长后,登陆到后台,点网站管理
  
  再点添加网站
   查看全部

  SEO之网站快速被收录
  对前端而言,迎合搜索引擎的需求也是常有的。对于 Vue 技术栈而言,Nuxtjs 是不二之选。最近刚做完一个类似需求,在此记录一二。
  生成网站地图
  Nuxtjs 提供了相关的组件,我们直接使用即可。
  安装组件
  npm install @nuxtjs/sitemap --save
  配置
  在nuxt.config.js中添加组件的配置
  {<br />      ...<br />      modules: [<br />        '@nuxtjs/sitemap'<br />     ],<br />      ...<br />}
  配置网站地图
  {<br />      ...<br />      modules: [<br />        '@nuxtjs/sitemap'<br />      ],<br />      sitemap: {<br />        hostname: 'https://example.com',<br />        gzip: true,<br />        exclude: [<br />            '/login'<br />        ],<br />        routes: [<br />          '/'<br />        ]<br />     }<br />      ...<br />}
  以上为一个简单的例子,访问可以查看生成的网站地图
  <br />     <br />         https://example.com/<br />     <br />
  这种“写死”的用法肯定是无法满足项目需求的,根据数据动态生成才是我们想要的
  // 导入 axios,也可以是其他用着顺手的组件<br />import axios from 'axios'<br /><br />export default {<br />      ...<br />      sitemap: {<br />          hostname: 'https://example.com',<br />          gzip: true,<br />          exclude: [<br />              '/login'<br />         ],<br />          routes: async () => {<br />              const items = await axiox.get('https://example.com/api')<br />              const list = []<br />              items.forEach(item => {<br />                  list.push({<br />                      url: `/posts/${item.id}`,<br />                      changefred: 'weekly',<br />                      lastmod: new Date()<br />                  })<br />              })<br />              return list<br />          }<br />     }<br />     ...<br />}
  以上即可根据接口的数据动态生成网站地图。
  但是实际项目中,一个正在运营的网站,数据是巨大的,生成网站地图体积也是巨大的,所以我们需要对网站地图进行分类和压缩。另外,如果单个网站地图文件超过 50M,建议再进行一次切割。
  import axios from 'axios'<br /><br />export default {<br />      ...<br />      sitemap: {<br />          hostname: 'https://example.com',<br />         gzip: true,<br />          exclude: [<br />              '/login'<br />           ],<br />           sitemaps: [<br />               {<br />                    path: '/sitemap_cate.xml',<br />                    gzip: true,<br />                    routes: async () => {<br />                          const items = await axiox.get('https://example.com/cate')<br />                          const list = []<br />                          items.forEach(item => {<br />                              list.push({<br />                                  url: `/posts/${item.id}`,<br />                                  changefred: 'weekly',<br />                                  lastmod: new Date()<br />                               })<br />                           })<br />                          return list<br />                    }<br />                 },<br />                  ...<br />            ]<br />      }<br />      ...<br />}
  以上即可生成不同的网站地图文件(,)
  拓展
  每个项目的情况不一样,如果你不喜欢这种网站地图生成的方式,你也可以选择通过其他方式(脚本构建等)生成网站地图,然后将文件放到static目录中。
  robots.txt 文件
  想要网站更好的被搜索引擎抓取,而避免收到过多请求,则需要robots.txt文件配合。
  创建文件
  直接在static目录中创建robots.txt文件即可。
  注意事项:
  配置
  robots.txt需要包含以下内容:
  示例:
  User-agent: *<br />disabllow: <br />allow: /<br />sitemap: https://example.com/sitemap.xml
  一般而言,以上示例就能满足大多数网站,实际情况还得是根据项目自己决断。
  测试
  如果你完成了robots.txt文件,不确定是否有问题,可以测试一下。robots.txt在线测试()
  上传网站地图
  当我们完成以上配置,网站开发完成,并发布上线,如果是一个新项目的话,可能在很长的一段时间都没被搜索引擎收录,从而耽误发家致富。那我们要怎么快速的让搜索引擎收录呢?搜索引擎都支持上传网站地图,只要我们主动提交网站地图,就会第一时间被抓取。
  谷歌站长
  谷歌站长地址()
  添加网站
  输入需要提交网站地图的域名
  
  验证网站所有权
  验证网站的所有权,有三种方式:dns,html 标记,html 文件。
  当然首选是dns解析,如果你可以操作或者有同事能很快可以配合去验证的话。因为 html 标记跟 html 文件验证都需要重新发版,发版是一件比较“麻烦”的事。你懂的!
  
  我这里是使用 html 文件验证,直接把文件下载下来,放到static目录中,然后再重新发版。再回到后台,点一下验证,就会看到验证成功的提示。
  
  提交网站地图
  当网站验证完了之后就在后台提交网站地图了。
  
  百度站长
  注册百度站长 百度站长地址
  添加网站
  注册百度站长后,登陆到后台,点网站管理
  
  再点添加网站
  

Web网页自动化实战《4.获取所有酒店的名字、价格、评分信息,并写入文件》上篇

网站优化优采云 发表了文章 • 0 个评论 • 31 次浏览 • 2022-06-04 00:41 • 来自相关话题

  Web网页自动化实战《4.获取所有酒店的名字、价格、评分信息,并写入文件》上篇
  目录二、分别拿到每家的价格、评分、酒店名并写入文件三、代码四、总结与扩展一、find_elements()的作用1.获取当前页面中所有酒店名称的元素
  
  通过元素的class属性获取酒店名,获取到了20个
  这20个酒店展示的格式都是一样的。每个div都是独立的。每个div都是个酒店的信息。
  
  这20个酒店名称都有同一个爸爸div1)find_element(By.XPATH,)
  find_element的意思是查找一个元素。 //span[@class="name"]这个表达式可能匹配到一个或多个元素,有多少个由页面来决定。
  find_element(By.XPATH,)只匹配找到的元素中的一个,而且是页面中第一个出现的元素。
  页面中按先后顺序,从最顶端的html开始从上往下加载。如果页面中有一个以上的,那么它匹配到的是第一个元素。
  2)find_elements(By.XPATH,)
  要获取找到的这20个元素的文本内容,它们的文本内容是酒店名称。
  find_elements(By.XPATH,) ----获取匹配到表达式的所有元素。
  
  Elements里面呈现的html中的元素呈现的顺序和页面中的顺序是一样的。2.获取当前页面中所有酒店价格的元素
  
  这个表达式匹配到20个元素3.获取当前页面中所有酒店评分的元素
  
  这个表达式匹配到20个元素二、分别拿到每家的价格、评分、酒店名并写入文件
  这20个元素,每个这样的元素里面都有价格、评分、酒店名称。
  1.分别拿到每家的价格、评分、酒店名
  
  这几行代码会一直反复执行,这是个遍历的过程。等到最后一个值全部取完了,它才会执行下面的部分。这几行全部缩进了,表示每取一个值,大家都会去做的事情。
  
  这个换行的效果是print()搞定的2.将拿到的数据写入文件
  fs = open("我的酒店数据.txt", "w",encoding='UTF-8') UTF-8支持中英文。
  读:比如读本地某个数据表格,本地必须有才能读,没有就读不到。
  w可写入模式:文件不存在,就创建文件并写入。文件存在,直接写入。
  w 这种模式写的时候是直接覆盖文件中的内容的。
  三、代码
  from selenium.webdriver.common.by import By<br /><br />from selenium import webdriver<br />import time<br /><br /># 打开谷歌浏览器,与浏览器建立了会话。<br /># driver变量=会话。<br />driver = webdriver.Chrome()<br />driver.get("https://www.elong.com/")  # 这行代码执行后,会等到页面加载得差不多了再去执行下一行代码。<br /># get()这个功能是会等到页面加载完成的。<br /># 有的时候页面加载出来了,但是渲染的方式有些慢。<br /># 所以我还想等1秒也是可以的。<br />time.sleep(1)<br /><br /># 查找元素通过xpath定位方式。<br />ele = driver.find_element(By.XPATH, '//input[@data-bindid="city"]')  # 定位到目的地的输入框,将刚才在写好的表达式复制过来。<br /># ele= 我找到的元素<br /># 点击操作 -- 点击目的地输入框,弹出城市选择框。<br />ele.click()<br />time.sleep(2)  # 运行这行代码后会停留2秒,然后再去运行下一行代码。<br /># 因为接下来要操作的元素,是动态出现的(不是一开始访问网站就有的,而是你做了一个动作让人家动态的出现了)。<br /># 它是需要时间呈现在页面上的。这个时间就需要你来等一等了。等一等网页,再去找这个元素去操作。<br /><br /><br /># 输入操作 --ele.send_keys("输入操作")<br /># 获取它的属性-- ele.get_attribute("属性名称")<br /># 获取它的文本内容-- ele.text<br /><br /><br /># 选择热门城市当中的广州<br />driver.find_element(By.XPATH, '//li[@data="0|15"]').click()<br />time.sleep(1)  # 加上等待时间。sleep时间不宜太长,7秒8秒,这个时间就太长了。<br /># 没加等待时间的时候运行代码,会发现操作太快了,且没有选择到对应的日期。<br /><br /># 选择入住日期<br />ele = driver.find_element(By.XPATH, '//input[@data-bindid="checkIn"]')<br />ele.clear()  # 输入日期前,先清空输入框的内容。<br />ele.send_keys("2022-05-27")<br /><br />time.sleep(1)  # 每个操作间都加了等待时间。<br /><br />'''<br />输入日期后,日期框没有消失,得让日期框消失。点击除了它以外的其它元素<br />(选一个页面固定的元素,那就点击目的地这个元素),<br />日期框就能消失了。再去处理下一个元素。不然日期框会挡住别的元素。<br />接下来点击搜索,搜索按钮被这个日期框遮住了。就会影响你的操作效果。<br />所以我是根据页面的特征习性来处理的。<br />'''<br /><br /># 把弹出的日期选择框关掉。<br />driver.find_element(By.XPATH, '//div[@id="domesticDiv"]//dt[text()="目的地"]').click()<br /><br /># 选择退房日期<br />b = driver.find_element(By.XPATH, '//input[@data-bindid="checkOut"]')<br />b.clear()<br />b.send_keys("2022-05-30")  # 输入日期<br />time.sleep(1)<br />driver.find_element(By.XPATH, '//div[@id="domesticDiv"]//dt[text()="目的地"]').click()<br />time.sleep(1)<br /><br /># a=driver.find_element(By.XPATH,'//input[@data-bindid="allInOne"]')<br /># a.clear()<br /># a.send_keys("喜悦门酒店(广州融创文旅城店)")<br /># time.sleep(1)<br /># driver.find_element(By.XPATH,'//div[@id="domesticDiv"]//dt[text()="目的地"]').click()<br /><br /># ========2、点击搜索按钮=========<br /># time.sleep(0.5)<br />driver.find_element(By.XPATH, '//span[@data-bindid="search"]').click()<br /><br /># ==========3、跳转到新的页面了,等待新的页面内容加载=========<br />time.sleep(7)  # 等待新的内容加载出来,用的是比较长的时间。<br /><br /># ================4、获取酒店的名字、酒店的价格、酒店的评价===============<br /># 拿到第一家酒店的信息<br /># hotel_name=driver.find_element(By.XPATH,'//span[@class="name"]').text<br /># hotel_price=driver.find_element(By.XPATH,'//p[@class="loginToSee"]').text<br /># hotel_review=driver.find_element(By.XPATH,'//p[@class="score mb5"]').text<br /># print("酒店信息:",hotel_name,hotel_review,hotel_price)<br /><br /><br /># ======================5、获取当前页面的所有酒店的价格、评分、名字<br /># find_elements(By.XPATH,) --- 获取匹配到表达式的所有元素。names是个列表。列表里面放的是元素对象。<br /># 所有酒店的名称元素<br />total_names = driver.find_elements(By.XPATH, '//span[@class="name"]')  # 20个同类型的元素。<br />time.sleep(1)<br /><br /># python中用来存放多个数据的是:list/字典/元组/集合这几种方式。<br /><br /><br /># 所有酒店的价格元素<br />total_prices = driver.find_elements(By.XPATH, '//p[@class="loginToSee"]')<br />time.sleep(1)<br /># 所有酒店的评分元素<br />total_previews = driver.find_elements(By.XPATH, '//p[@class="score mb5"]')<br /><br /># 从3个列表当中,每个值都要取出来。<br /># 店子里有20件衣服。从第1件开始到第20件都要去看一眼。把看一眼叫做访问。<br /># 这个叫做遍历/循环。从头到尾,每一个成员,你都要去访问。20个集合。<br /># 20个酒店。每一个酒店,都要去获取名字、价格、评分------遍历。<br />'''<br />for 变量 in 列表:# 在列表当中,取每一个成员,给到变量。<br />    取到的每一个成员,会去做的事情。<br />    取到的每个酒店,都要去拿酒店的名字、价格和评分。<br /><br />遍历的是:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]<br />'''<br /><br /><br /># 文件操作 -- 我的酒店数据.txt<br /># 读写操作。创建一个文件,写入数据,然后关闭。<br /># open -- 文件操作。<br /># 打开文件的时候,指明写入方式,以及编码格式为utf-8<br />fs = open("我的酒店数据.txt", "w",encoding='UTF-8')  # write -- w  可写入的模式。文件不存在会创建文件并写入。文件存在,直接写入。<br /># 这里只有文件名称,没有写路径,这就是告诉python,我就在当前路径下生成文件。<br />#w 这种模式是直接覆盖文件中的内容的。<br /># write写的时候,不会自动换行。  换行:\n<br /><br /><br /># for index in [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]:<br />for index in range(20):<br />    print(total_names[index].text, total_prices[index].text, total_previews[index].text)  # 拿到了每家酒店的名字价格和评分。<br />    fs.write(total_names[index].text + "  ")  # 在我没有关闭这个文件之前,是可以持续写入的。<br />    fs.write(total_prices[index].text + "  ")<br />    # fs.write(total_prices[index].get_attribute("属性名称")+"    ")#获取属性值<br />    # fs.write(total_prices[index].get_attribute('class') + "    ")<br />    fs.write(total_previews[index].text + "\n")<br /><br /># 关闭文件<br />fs.close()<br /><br /># for 后面的变量可以随便取名,in后面可以跟列表,当然除了列表以外,很多都可以的。<br />time.sleep(10)<br /><br />#########6.更多的事情:先选价格,再去看评分。###################<br />jiage=driver.find_element(By.XPATH,'//li[@class="radio fl"]//span[text()="150元以下"]').click()<br />try:<br />    pingfens = driver.find_elements(By.XPATH, '//p[@class="score mb5"]')<br />    fn = open("150元以下的评分数据.txt", "w",encoding='UTF-8')<br />    for score in range(20):<br />        print(pingfens[score].text)<br />        fn.write(pingfens[score].text+ "\n")<br />    fn.close()<br />except:<br />    pingfens = driver.find_elements(By.XPATH, '//p[@class="score mb5"]')<br />    fn = open("150元以下的评分数据.txt", "w",encoding='UTF-8')<br />    for score in range(20):<br />        print(pingfens[score].text)<br />        fn.write(pingfens[score].text+ "\n")<br />    fn.close()<br />#用捕获异常的方法规避当前遇到的异常了。否则代码是没问题,但多次运行后会报错。<br /><br /># ========7、关闭浏览器,关闭本次会话========<br />time.sleep(10)<br />driver.quit()  # 退出相关驱动,关闭所有窗口。<br /><br />
  
  运行成功四、总结与扩展1.总结
  1.find_elements()用来查找所有的元素,而且它的结果是个列表。
  2.列表的处理方式 -- 遍历取值,创建文件。
  3.遍历列表 -- for循环。
  4.数据写入文件。
  2.扩展
  根据列表的长度去遍历:再掌握range函数的用法。参考链接:
  运行这个fs.write(total_prices[index].get_attribute("属性名称")+" ")#获取属性值
  和fs.write(total_prices[index].text + " ")运行出来的结果都是一样的。
  
  第一种方式的运行结果
  
  第二种方式的运行结果
  以上所学,比如领导要看下平台的一些数据,可以利用这个脚本去访问公司的系统把数据拿下来。有些时候领导就想要个报告。学的这些不是没用,要在对应的时机用上来。
  爬虫有的时候会用到这么点自动化知识,但不是完全用的自动化知识。爬虫要学得好,真的要学得很深入。
  文章中的链接的版权归原作者所有,除标明“图片来自网络”的图片,皆为小编本人所画所截图。欢迎关注“清菡软件测试”,进群加v:qhtester,感谢点赞与分享! 查看全部

  Web网页自动化实战《4.获取所有酒店的名字、价格、评分信息,并写入文件》上篇
  目录二、分别拿到每家的价格、评分、酒店名并写入文件三、代码四、总结与扩展一、find_elements()的作用1.获取当前页面中所有酒店名称的元素
  
  通过元素的class属性获取酒店名,获取到了20个
  这20个酒店展示的格式都是一样的。每个div都是独立的。每个div都是个酒店的信息。
  
  这20个酒店名称都有同一个爸爸div1)find_element(By.XPATH,)
  find_element的意思是查找一个元素。 //span[@class="name"]这个表达式可能匹配到一个或多个元素,有多少个由页面来决定。
  find_element(By.XPATH,)只匹配找到的元素中的一个,而且是页面中第一个出现的元素。
  页面中按先后顺序,从最顶端的html开始从上往下加载。如果页面中有一个以上的,那么它匹配到的是第一个元素。
  2)find_elements(By.XPATH,)
  要获取找到的这20个元素的文本内容,它们的文本内容是酒店名称。
  find_elements(By.XPATH,) ----获取匹配到表达式的所有元素。
  
  Elements里面呈现的html中的元素呈现的顺序和页面中的顺序是一样的。2.获取当前页面中所有酒店价格的元素
  
  这个表达式匹配到20个元素3.获取当前页面中所有酒店评分的元素
  
  这个表达式匹配到20个元素二、分别拿到每家的价格、评分、酒店名并写入文件
  这20个元素,每个这样的元素里面都有价格、评分、酒店名称。
  1.分别拿到每家的价格、评分、酒店名
  
  这几行代码会一直反复执行,这是个遍历的过程。等到最后一个值全部取完了,它才会执行下面的部分。这几行全部缩进了,表示每取一个值,大家都会去做的事情。
  
  这个换行的效果是print()搞定的2.将拿到的数据写入文件
  fs = open("我的酒店数据.txt", "w",encoding='UTF-8') UTF-8支持中英文。
  读:比如读本地某个数据表格,本地必须有才能读,没有就读不到。
  w可写入模式:文件不存在,就创建文件并写入。文件存在,直接写入。
  w 这种模式写的时候是直接覆盖文件中的内容的。
  三、代码
  from selenium.webdriver.common.by import By<br /><br />from selenium import webdriver<br />import time<br /><br /># 打开谷歌浏览器,与浏览器建立了会话。<br /># driver变量=会话。<br />driver = webdriver.Chrome()<br />driver.get("https://www.elong.com/";)  # 这行代码执行后,会等到页面加载得差不多了再去执行下一行代码。<br /># get()这个功能是会等到页面加载完成的。<br /># 有的时候页面加载出来了,但是渲染的方式有些慢。<br /># 所以我还想等1秒也是可以的。<br />time.sleep(1)<br /><br /># 查找元素通过xpath定位方式。<br />ele = driver.find_element(By.XPATH, '//input[@data-bindid="city"]')  # 定位到目的地的输入框,将刚才在写好的表达式复制过来。<br /># ele= 我找到的元素<br /># 点击操作 -- 点击目的地输入框,弹出城市选择框。<br />ele.click()<br />time.sleep(2)  # 运行这行代码后会停留2秒,然后再去运行下一行代码。<br /># 因为接下来要操作的元素,是动态出现的(不是一开始访问网站就有的,而是你做了一个动作让人家动态的出现了)。<br /># 它是需要时间呈现在页面上的。这个时间就需要你来等一等了。等一等网页,再去找这个元素去操作。<br /><br /><br /># 输入操作 --ele.send_keys("输入操作")<br /># 获取它的属性-- ele.get_attribute("属性名称")<br /># 获取它的文本内容-- ele.text<br /><br /><br /># 选择热门城市当中的广州<br />driver.find_element(By.XPATH, '//li[@data="0|15"]').click()<br />time.sleep(1)  # 加上等待时间。sleep时间不宜太长,7秒8秒,这个时间就太长了。<br /># 没加等待时间的时候运行代码,会发现操作太快了,且没有选择到对应的日期。<br /><br /># 选择入住日期<br />ele = driver.find_element(By.XPATH, '//input[@data-bindid="checkIn"]')<br />ele.clear()  # 输入日期前,先清空输入框的内容。<br />ele.send_keys("2022-05-27")<br /><br />time.sleep(1)  # 每个操作间都加了等待时间。<br /><br />'''<br />输入日期后,日期框没有消失,得让日期框消失。点击除了它以外的其它元素<br />(选一个页面固定的元素,那就点击目的地这个元素),<br />日期框就能消失了。再去处理下一个元素。不然日期框会挡住别的元素。<br />接下来点击搜索,搜索按钮被这个日期框遮住了。就会影响你的操作效果。<br />所以我是根据页面的特征习性来处理的。<br />'''<br /><br /># 把弹出的日期选择框关掉。<br />driver.find_element(By.XPATH, '//div[@id="domesticDiv"]//dt[text()="目的地"]').click()<br /><br /># 选择退房日期<br />b = driver.find_element(By.XPATH, '//input[@data-bindid="checkOut"]')<br />b.clear()<br />b.send_keys("2022-05-30")  # 输入日期<br />time.sleep(1)<br />driver.find_element(By.XPATH, '//div[@id="domesticDiv"]//dt[text()="目的地"]').click()<br />time.sleep(1)<br /><br /># a=driver.find_element(By.XPATH,'//input[@data-bindid="allInOne"]')<br /># a.clear()<br /># a.send_keys("喜悦门酒店(广州融创文旅城店)")<br /># time.sleep(1)<br /># driver.find_element(By.XPATH,'//div[@id="domesticDiv"]//dt[text()="目的地"]').click()<br /><br /># ========2、点击搜索按钮=========<br /># time.sleep(0.5)<br />driver.find_element(By.XPATH, '//span[@data-bindid="search"]').click()<br /><br /># ==========3、跳转到新的页面了,等待新的页面内容加载=========<br />time.sleep(7)  # 等待新的内容加载出来,用的是比较长的时间。<br /><br /># ================4、获取酒店的名字、酒店的价格、酒店的评价===============<br /># 拿到第一家酒店的信息<br /># hotel_name=driver.find_element(By.XPATH,'//span[@class="name"]').text<br /># hotel_price=driver.find_element(By.XPATH,'//p[@class="loginToSee"]').text<br /># hotel_review=driver.find_element(By.XPATH,'//p[@class="score mb5"]').text<br /># print("酒店信息:",hotel_name,hotel_review,hotel_price)<br /><br /><br /># ======================5、获取当前页面的所有酒店的价格、评分、名字<br /># find_elements(By.XPATH,) --- 获取匹配到表达式的所有元素。names是个列表。列表里面放的是元素对象。<br /># 所有酒店的名称元素<br />total_names = driver.find_elements(By.XPATH, '//span[@class="name"]')  # 20个同类型的元素。<br />time.sleep(1)<br /><br /># python中用来存放多个数据的是:list/字典/元组/集合这几种方式。<br /><br /><br /># 所有酒店的价格元素<br />total_prices = driver.find_elements(By.XPATH, '//p[@class="loginToSee"]')<br />time.sleep(1)<br /># 所有酒店的评分元素<br />total_previews = driver.find_elements(By.XPATH, '//p[@class="score mb5"]')<br /><br /># 从3个列表当中,每个值都要取出来。<br /># 店子里有20件衣服。从第1件开始到第20件都要去看一眼。把看一眼叫做访问。<br /># 这个叫做遍历/循环。从头到尾,每一个成员,你都要去访问。20个集合。<br /># 20个酒店。每一个酒店,都要去获取名字、价格、评分------遍历。<br />'''<br />for 变量 in 列表:# 在列表当中,取每一个成员,给到变量。<br />    取到的每一个成员,会去做的事情。<br />    取到的每个酒店,都要去拿酒店的名字、价格和评分。<br /><br />遍历的是:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]<br />'''<br /><br /><br /># 文件操作 -- 我的酒店数据.txt<br /># 读写操作。创建一个文件,写入数据,然后关闭。<br /># open -- 文件操作。<br /># 打开文件的时候,指明写入方式,以及编码格式为utf-8<br />fs = open("我的酒店数据.txt", "w",encoding='UTF-8')  # write -- w  可写入的模式。文件不存在会创建文件并写入。文件存在,直接写入。<br /># 这里只有文件名称,没有写路径,这就是告诉python,我就在当前路径下生成文件。<br />#w 这种模式是直接覆盖文件中的内容的。<br /># write写的时候,不会自动换行。  换行:\n<br /><br /><br /># for index in [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]:<br />for index in range(20):<br />    print(total_names[index].text, total_prices[index].text, total_previews[index].text)  # 拿到了每家酒店的名字价格和评分。<br />    fs.write(total_names[index].text + "  ")  # 在我没有关闭这个文件之前,是可以持续写入的。<br />    fs.write(total_prices[index].text + "  ")<br />    # fs.write(total_prices[index].get_attribute("属性名称")+"    ")#获取属性值<br />    # fs.write(total_prices[index].get_attribute('class') + "    ")<br />    fs.write(total_previews[index].text + "\n")<br /><br /># 关闭文件<br />fs.close()<br /><br /># for 后面的变量可以随便取名,in后面可以跟列表,当然除了列表以外,很多都可以的。<br />time.sleep(10)<br /><br />#########6.更多的事情:先选价格,再去看评分。###################<br />jiage=driver.find_element(By.XPATH,'//li[@class="radio fl"]//span[text()="150元以下"]').click()<br />try:<br />    pingfens = driver.find_elements(By.XPATH, '//p[@class="score mb5"]')<br />    fn = open("150元以下的评分数据.txt", "w",encoding='UTF-8')<br />    for score in range(20):<br />        print(pingfens[score].text)<br />        fn.write(pingfens[score].text+ "\n")<br />    fn.close()<br />except:<br />    pingfens = driver.find_elements(By.XPATH, '//p[@class="score mb5"]')<br />    fn = open("150元以下的评分数据.txt", "w",encoding='UTF-8')<br />    for score in range(20):<br />        print(pingfens[score].text)<br />        fn.write(pingfens[score].text+ "\n")<br />    fn.close()<br />#用捕获异常的方法规避当前遇到的异常了。否则代码是没问题,但多次运行后会报错。<br /><br /># ========7、关闭浏览器,关闭本次会话========<br />time.sleep(10)<br />driver.quit()  # 退出相关驱动,关闭所有窗口。<br /><br />
  
  运行成功四、总结与扩展1.总结
  1.find_elements()用来查找所有的元素,而且它的结果是个列表。
  2.列表的处理方式 -- 遍历取值,创建文件。
  3.遍历列表 -- for循环。
  4.数据写入文件。
  2.扩展
  根据列表的长度去遍历:再掌握range函数的用法。参考链接:
  运行这个fs.write(total_prices[index].get_attribute("属性名称")+" ")#获取属性值
  和fs.write(total_prices[index].text + " ")运行出来的结果都是一样的。
  
  第一种方式的运行结果
  
  第二种方式的运行结果
  以上所学,比如领导要看下平台的一些数据,可以利用这个脚本去访问公司的系统把数据拿下来。有些时候领导就想要个报告。学的这些不是没用,要在对应的时机用上来。
  爬虫有的时候会用到这么点自动化知识,但不是完全用的自动化知识。爬虫要学得好,真的要学得很深入。
  文章中的链接的版权归原作者所有,除标明“图片来自网络”的图片,皆为小编本人所画所截图。欢迎关注“清菡软件测试”,进群加v:qhtester,感谢点赞与分享!

杭州seo整站优化:网站设计不合理怎么办?

网站优化优采云 发表了文章 • 0 个评论 • 41 次浏览 • 2022-05-29 14:50 • 来自相关话题

  杭州seo整站优化:网站设计不合理怎么办?
  很多seo优化进入一家公司后,在杭州seo整站优化时常常会遇到网站设计不合理的情况,很多经验丰富的seo都知道该如何处理,但是对于一些新手seo来说,就需要花费很长的时间去思考,去搜集资料,才能做好。今天seo知识网小编就为大家介绍一下杭州seo整站优化:网站设计不合理怎么办?
  
  杭州seo整站优化:网站设计不合理怎么办?只需要做好以下几点即可。
  一、对网站结构重新进行调整
  当遇到网站设计不合理的情况时,自然需要重新调整,这样网站才能恍然一新,不会给人一种杂乱无章的感觉。网站结构尽量简单明了,让人一目了然,让用户能够清楚的知道自己所要了解的内容在哪里,不会在网站中迷路。
  
  二、网站内链的调整
  seo优化人员虽然不需要你精通代码,但是一些基础性的东西还是要知道怎么改的,比如网站的相关推荐、面包屑、导航栏目位置的调整等等,做好这些工作,将网站内链做好布局,从而提升蜘蛛抓取效率,提升页面收录量,提升网站排名。
  三、网站层级不要超过三级,做好伪静态
  网站层级过深会导致网站蜘蛛爬行困难,我们需要做好网站的层级结构调整,让蜘蛛抓取网站更加有效率。同时动态链接蜘蛛抓取速度慢,建议修改成伪静态链接,网站页面收录速度更快。
  
  以上就是【杭州seo整站优化:网站设计不合理怎么办?】的介绍,希望对大家有所帮助。如果大家还想要了解更多seo优化知识,可以关注和收藏我们seo知识网,seo知识网会不定期更新网站建设、seo优化、网站优化方案、seo工具、seo外包、网络推广等方面知识,供大家参考、了解。
  期待你的 查看全部

  杭州seo整站优化:网站设计不合理怎么办?
  很多seo优化进入一家公司后,在杭州seo整站优化时常常会遇到网站设计不合理的情况,很多经验丰富的seo都知道该如何处理,但是对于一些新手seo来说,就需要花费很长的时间去思考,去搜集资料,才能做好。今天seo知识网小编就为大家介绍一下杭州seo整站优化:网站设计不合理怎么办?
  
  杭州seo整站优化:网站设计不合理怎么办?只需要做好以下几点即可。
  一、对网站结构重新进行调整
  当遇到网站设计不合理的情况时,自然需要重新调整,这样网站才能恍然一新,不会给人一种杂乱无章的感觉。网站结构尽量简单明了,让人一目了然,让用户能够清楚的知道自己所要了解的内容在哪里,不会在网站中迷路。
  
  二、网站内链的调整
  seo优化人员虽然不需要你精通代码,但是一些基础性的东西还是要知道怎么改的,比如网站的相关推荐、面包屑、导航栏目位置的调整等等,做好这些工作,将网站内链做好布局,从而提升蜘蛛抓取效率,提升页面收录量,提升网站排名。
  三、网站层级不要超过三级,做好伪静态
  网站层级过深会导致网站蜘蛛爬行困难,我们需要做好网站的层级结构调整,让蜘蛛抓取网站更加有效率。同时动态链接蜘蛛抓取速度慢,建议修改成伪静态链接,网站页面收录速度更快。
  
  以上就是【杭州seo整站优化:网站设计不合理怎么办?】的介绍,希望对大家有所帮助。如果大家还想要了解更多seo优化知识,可以关注和收藏我们seo知识网,seo知识网会不定期更新网站建设、seo优化、网站优化方案、seo工具、seo外包、网络推广等方面知识,供大家参考、了解。
  期待你的

抓取动态网页 【干货】PMO和项目经理必备的常用技术术语及解释—非技术项目经理必读

网站优化优采云 发表了文章 • 0 个评论 • 32 次浏览 • 2022-05-29 14:37 • 来自相关话题

  抓取动态网页 【干货】PMO和项目经理必备的常用技术术语及解释—非技术项目经理必读
  
  点击关注 不迷路--PMO前沿一个只分享干货的公号
  前一段时间,咱们整理了一份项目经理必备的术语表非常受欢迎
  很多非技术相关的项目经理希望咱们整理一份技术类常用的技术名词和术语解释,这不就来了嘛,希望对大家有帮助!
  
  AJAX:部分页面刷新的技术
  主要解决的是不用刷新网页,就能和后台交互获取数据,并应用于当前网页的问题。PMO前沿整理,禁止搬运!
  AJAX两项能力:
  1、发起网络请求、发起网络请求的能力由浏览器的内置能力提供,所有的浏览器都提供了XmlHttpRequest对象,它可以由网页调用,用来连接一个特定的地址。PMO前沿整理,禁止搬运!
  2、无须刷新,可动态操作网页。
  静态网页与动态网页
  用途:
  两者都是网页,都是再浏览器上用HTML展示出来的页面,HTML是网页的基础结构,网页如何排版,每个元素在什么位置,都是由它来描述的。
  区别:PMO前沿整理,禁止搬运!
  1、两者的核心区别是后台是否有数据库的支撑,也可以简单的描述为网页上展示的内容是否要变化,是因人而异显示不同内容,还是根据时间线呈现内容的变化,或者是保持不变。
  2、静态网页无须经过后台程序的处理,而动态网页要经过后后台处理程序。
  PMO前沿整理,禁止搬运!
  网页基础知识-表单
  用途:PMO前沿整理,禁止搬运!表单在很早的HTML版本中就已经存在,它是用户输入和网页之间数据交互的一个界面,在HTML中用标签标记。
  H5应用程序缓存
  提高服务器性能除了扩容外,还可通过Application Cache技术进行解决。
  1、该技术是HTML5中定义的一种离线存储技术标准,这种技术可以让开发者明确的指定页面中哪些静态资源可以在第一次访问网页的同时缓存到本地,并且在下次访问该网页时向服务器询问本地缓存的资源是否需要更新,PMO前沿。
  2、当浏览器打开适用了该技术得网页时,会尝试先从Cache中加载数据,并同时向服务器询问本地资源是否已经国企,如果本地资源过期,浏览器会自动从服务器上更新资源到cache中
  3、需要说明的时,如果Cache中的数据可用,浏览器就会对其进行加载,即使他们已经过期,页面可以用过注册监听器的方式获得Cache更新成功的时间,主动刷新下页面,将最新的内容及时展示给用户。
  优点:
  1、该技术通过缓存资源到本地,避免了每次打开网页都会从服务器拉取大量数据的过程,取而代之的只是一个轻量级的更新检查请求,这样开发者的服务器带宽就被大大的释放出来。
  2、由于网页的资源都是通过本地资源读取的,用户再次打开同一网页时,内容展示时间会大大缩短,甚至达到Native应用的水平,从而进一步优化用户体验,如果页面的所有资源都被缓存到了本地,那么页面就可以在离线的情况下被完整的加载了。
  。
  爬虫
  用途:
  抓取某个指定网页的数据并存储在本地。
  运行原理:
  首先给爬虫几个初始的URL链接,PMO前沿,爬虫把这些链接的网页抓取回来,经过对网页进行分析,得到两部分数据。
  1、一部分时网页的有效内容,可以用来建立搜索关键词的索引,这部分数据先存储起来。
  2、另一部分就是网页中的URL链接,可以作为下一轮爬虫抓取的目标网页,如此反复操作。
  
  客户端推送实现方式
  实现一个推送系统需要服务端和客户端的配合。1、一种方法时轮询,也就是不停的向服务器发起请求。2、另一种则是建立一条长时间链接服务器和APP的通道,通过这条捅到,不仅APP可以向服务器请求数据,服务器也可以向APP发送数据。
  缓存系统
  缓存的概念:缓存即临时,存即存储,故缓存即临时存储。刷圈的现象:1、刷了几页之后回到顶部,会发现看过的图片依旧在显示,并没有出现先显示占位符,再显示图片内容的情况,这表明图片一直在内存中,随时可被直接展示。2、点击一条新内容的图片时,会展示一张缩略图,然后出现loading图标旋转的动画,过一会儿一张清晰大图展现出来,表明这张图片是刚刚从网络拉取的。3、当用户翻到几天前的内容时,再次点击PMO前沿的图片,有时还需要从网络拉取,有时却瞬间打开,这是为什么呢?因为有可能高清图片已经被缓存系统删除,所以需要从网络重新拉取,也有可能高清图片还在缓存系统中,可以被快速加载,从而“瞬间打开”。缓存的分级:1、一级缓存也称内存缓存一级缓存存取速度最快,会多占一些内存,这是非常合理的一种以空间换取时间的程序设计,数据随着程序退出而消失,进入朋友圈,图片占用的内存空间不断增加,如果用户往回滑动,会发现刚才的图片都还在,因为这时一级缓存还没满,所有被缓存的图片都能正常满足业务需求,如果我们持续刷新朋友圈的内容,直至一级缓存的空间被完全占用,就必然要对缓存的图片进行淘汰,目前业界主要采用LRU(Least Recently Used)算法进行淘汰,也就是近期最少被使用的图片被淘汰,这里的“淘汰”,也仅仅是将图片从一级缓存迁移到二级缓存,并没有完全丢弃2、二级缓存也称磁盘缓存(SD卡或硬盘上的缓存)二级缓存容量更大,存取速度要慢一些,程序下次启动时,依然可以使用缓存内容。PMO前沿整理,禁止搬运!
  应用的生命周期
  PMO前沿整理,禁止搬运!
  概念:PMO前沿整理,禁止搬运!
  应用的生命周期是对应用在宿主的环境中从创建、运行到消亡的一种过程描述。
  图解:PMO前沿整理,禁止搬运!
  
  
  空指针是什么?
  空指针,顾名思义,就是指向空的指针。但是“空”是一种极度抽象的概念,管理员立一块箭头牌子,总得把它指向某个具体的地址。既然没法指向真正的“空”,那就在内存中模拟出一个地址来代表“空”。
  开发动画需要多少工作量?
  位移动画:PMO前沿整理,禁止搬运!
  让控件在一段时间内不断改变位置。程序员在实现这个功能时,只需要创建一个“TranslateAnimation”的对象,可以把它理解成位移动画的“配置清单”。
  缩放动画:PMO前沿整理,禁止搬运!
  缩放动画就是让控件在一段时间内不断改变自身大小。与位移动画类似,这种动画也有一个“配置清单”。
  渐隐渐现动画:PMO前沿整理,禁止搬运!
  就是在一定的时间内持续改变控件的透明度。
  旋转动画:PMO前沿整理,禁止搬运!
  就是让一个控件在一段时间内围绕一个固定点旋转指定的角度。
  代码重构
  代码重构是软件开发过程中提高开发效率和质量的重要手段。在软件开发过程中,每一款软件一开始都是经过精心设计的,具有良好的结构。但随着需求不断变更,之前的结构开始慢慢变得不适应。PMO前沿整理,禁止搬运!重构就是在保留现有功能的基础上,重新梳理软件中的代码结构,让原本杂乱无章的代码重新具有可读性、结构性和扩展性,增加软件的开发效率,优化程序的性能。重构的范围可大可小,大到涉及整个产品的各个模块,小到一个函数。
  PMO前沿整理,禁止搬运!
  多线程是什么?
  多线程是有效提升程序运行效率的方式之一。它还在提升优化算法、提高硬件配置、分布式计算、网格计算的效率方面起着重要作用。PMO前沿整理,禁止搬运!
  反向代理代码
  反向代理代码的意义
  首先,它可以实现负载均衡。有多台服务器可以为同一个 Web 服务提供服务,但是每台服务器的负荷不太一样,如果请求被发送到负荷较高的服务器,它的处理时间可能较长,但是客户端并不知道哪一台服务器比较空闲,所以将请求发送到反向代理服务器。反向代理服务器知道每台服务器的负载量,会将请求转发到相对空闲的服务器,以便更快地响应客户端。反向服务器还可以减轻后端服务器的一些压力,例如很多静态资源或者缓存数据,可以直接放在反向代理服务器上,不用将这些请求传递到后端服务器,这样就减轻了相同的请求对后端服务器产生的压力。PMO前沿整理,禁止搬运!它还可以对请求做进一步的封装和解封。如果我们想把所有请求升级到SSL加密连接,却不想改造后端服务器,那么可以只在客户端-反向代理服务器之间使用SSL加密连接,而代理服务器-后端服务器之间仍旧使用普通的HTTP连接,这样就事半功倍了。同时,反向代理服务器还可以为后端服务器阻挡一些网络攻击,提升后台服务器的安全性。总之,反向代理服务器对于后端服务器,就是一个接口人的角色,它接洽了所有客户端的请求,并进行简单的处理,然后分发到后端服务器。
  CDN是什么?
  CDN是什么?CDN(Content Delivery Network,内容分发网络。PMO前沿整理,禁止搬运!
  CDN专注于“内容”,也就是CDN的“C”所代表的“Content”,这里的“内容”是指静态的资源,比如一张图片、一个文本文件、一段视频、一个CSS、一个JavaScript,等等。任何以文件形式存储的“内容”都可以部署在CDN上。
  CDN的作用:
  它是一个基于互联网的数量巨大的服务器集群,专注于内容和资源分发,为用户提供快速访问资源的能力,进而提升内容访问的体验。
  PMO前沿整理,禁止搬运!
  VPN是什么?
  VPN是什么是虚拟专用网络。专用网络很好理解,就像上面的一根网线,只属于特定的人群,直达服务器。
  如何判断当前的流量达到极限呢?
  如何判断当前的流量达到极限呢?
  漏铜算法:我们把用户请求看作水,这些水会流进一个底部有洞的水桶,而我们的服务真正处理的是从底部洞里流出的水。当流量突然暴涨,桶中注满水后,再流入的水就会直接溢出,而对应的就是拒绝服务。令牌桶算法:PMO前沿整理,禁止搬运!系统以固定的速度(如每秒产生 r个令牌)产生令牌(token),产生的令牌都扔进一个桶里,如果令牌把桶塞满了(最多能装b个令牌),就会被扔掉。当用户请求到达服务的时候,去桶里取一个令牌,如果取到了,就给后面的模块继续处理;如果这个时候桶里一个令牌都没有了,就拒绝服务该请求。
  
  
  近期热文:
  应广大粉丝要求,我们建立了一个【PMO前沿交流群】,小伙伴们热情踊跃,目前人数已经上万人了,不能直接进群啦,想要进群的添加小编微信,拉你进群。两个添加其一即可!
  
  
  欢迎加入中国最大的PMO&PM社区 查看全部

  抓取动态网页 【干货】PMO和项目经理必备的常用技术术语及解释—非技术项目经理必读
  
  点击关注 不迷路--PMO前沿一个只分享干货的公号
  前一段时间,咱们整理了一份项目经理必备的术语表非常受欢迎
  很多非技术相关的项目经理希望咱们整理一份技术类常用的技术名词和术语解释,这不就来了嘛,希望对大家有帮助!
  
  AJAX:部分页面刷新的技术
  主要解决的是不用刷新网页,就能和后台交互获取数据,并应用于当前网页的问题。PMO前沿整理,禁止搬运!
  AJAX两项能力:
  1、发起网络请求、发起网络请求的能力由浏览器的内置能力提供,所有的浏览器都提供了XmlHttpRequest对象,它可以由网页调用,用来连接一个特定的地址。PMO前沿整理,禁止搬运!
  2、无须刷新,可动态操作网页。
  静态网页与动态网页
  用途:
  两者都是网页,都是再浏览器上用HTML展示出来的页面,HTML是网页的基础结构,网页如何排版,每个元素在什么位置,都是由它来描述的。
  区别:PMO前沿整理,禁止搬运!
  1、两者的核心区别是后台是否有数据库的支撑,也可以简单的描述为网页上展示的内容是否要变化,是因人而异显示不同内容,还是根据时间线呈现内容的变化,或者是保持不变。
  2、静态网页无须经过后台程序的处理,而动态网页要经过后后台处理程序。
  PMO前沿整理,禁止搬运!
  网页基础知识-表单
  用途:PMO前沿整理,禁止搬运!表单在很早的HTML版本中就已经存在,它是用户输入和网页之间数据交互的一个界面,在HTML中用标签标记。
  H5应用程序缓存
  提高服务器性能除了扩容外,还可通过Application Cache技术进行解决。
  1、该技术是HTML5中定义的一种离线存储技术标准,这种技术可以让开发者明确的指定页面中哪些静态资源可以在第一次访问网页的同时缓存到本地,并且在下次访问该网页时向服务器询问本地缓存的资源是否需要更新,PMO前沿。
  2、当浏览器打开适用了该技术得网页时,会尝试先从Cache中加载数据,并同时向服务器询问本地资源是否已经国企,如果本地资源过期,浏览器会自动从服务器上更新资源到cache中
  3、需要说明的时,如果Cache中的数据可用,浏览器就会对其进行加载,即使他们已经过期,页面可以用过注册监听器的方式获得Cache更新成功的时间,主动刷新下页面,将最新的内容及时展示给用户。
  优点:
  1、该技术通过缓存资源到本地,避免了每次打开网页都会从服务器拉取大量数据的过程,取而代之的只是一个轻量级的更新检查请求,这样开发者的服务器带宽就被大大的释放出来。
  2、由于网页的资源都是通过本地资源读取的,用户再次打开同一网页时,内容展示时间会大大缩短,甚至达到Native应用的水平,从而进一步优化用户体验,如果页面的所有资源都被缓存到了本地,那么页面就可以在离线的情况下被完整的加载了。
  。
  爬虫
  用途:
  抓取某个指定网页的数据并存储在本地。
  运行原理:
  首先给爬虫几个初始的URL链接,PMO前沿,爬虫把这些链接的网页抓取回来,经过对网页进行分析,得到两部分数据。
  1、一部分时网页的有效内容,可以用来建立搜索关键词的索引,这部分数据先存储起来。
  2、另一部分就是网页中的URL链接,可以作为下一轮爬虫抓取的目标网页,如此反复操作。
  
  客户端推送实现方式
  实现一个推送系统需要服务端和客户端的配合。1、一种方法时轮询,也就是不停的向服务器发起请求。2、另一种则是建立一条长时间链接服务器和APP的通道,通过这条捅到,不仅APP可以向服务器请求数据,服务器也可以向APP发送数据。
  缓存系统
  缓存的概念:缓存即临时,存即存储,故缓存即临时存储。刷圈的现象:1、刷了几页之后回到顶部,会发现看过的图片依旧在显示,并没有出现先显示占位符,再显示图片内容的情况,这表明图片一直在内存中,随时可被直接展示。2、点击一条新内容的图片时,会展示一张缩略图,然后出现loading图标旋转的动画,过一会儿一张清晰大图展现出来,表明这张图片是刚刚从网络拉取的。3、当用户翻到几天前的内容时,再次点击PMO前沿的图片,有时还需要从网络拉取,有时却瞬间打开,这是为什么呢?因为有可能高清图片已经被缓存系统删除,所以需要从网络重新拉取,也有可能高清图片还在缓存系统中,可以被快速加载,从而“瞬间打开”。缓存的分级:1、一级缓存也称内存缓存一级缓存存取速度最快,会多占一些内存,这是非常合理的一种以空间换取时间的程序设计,数据随着程序退出而消失,进入朋友圈,图片占用的内存空间不断增加,如果用户往回滑动,会发现刚才的图片都还在,因为这时一级缓存还没满,所有被缓存的图片都能正常满足业务需求,如果我们持续刷新朋友圈的内容,直至一级缓存的空间被完全占用,就必然要对缓存的图片进行淘汰,目前业界主要采用LRU(Least Recently Used)算法进行淘汰,也就是近期最少被使用的图片被淘汰,这里的“淘汰”,也仅仅是将图片从一级缓存迁移到二级缓存,并没有完全丢弃2、二级缓存也称磁盘缓存(SD卡或硬盘上的缓存)二级缓存容量更大,存取速度要慢一些,程序下次启动时,依然可以使用缓存内容。PMO前沿整理,禁止搬运!
  应用的生命周期
  PMO前沿整理,禁止搬运!
  概念:PMO前沿整理,禁止搬运!
  应用的生命周期是对应用在宿主的环境中从创建、运行到消亡的一种过程描述。
  图解:PMO前沿整理,禁止搬运!
  
  
  空指针是什么?
  空指针,顾名思义,就是指向空的指针。但是“空”是一种极度抽象的概念,管理员立一块箭头牌子,总得把它指向某个具体的地址。既然没法指向真正的“空”,那就在内存中模拟出一个地址来代表“空”。
  开发动画需要多少工作量?
  位移动画:PMO前沿整理,禁止搬运!
  让控件在一段时间内不断改变位置。程序员在实现这个功能时,只需要创建一个“TranslateAnimation”的对象,可以把它理解成位移动画的“配置清单”。
  缩放动画:PMO前沿整理,禁止搬运!
  缩放动画就是让控件在一段时间内不断改变自身大小。与位移动画类似,这种动画也有一个“配置清单”。
  渐隐渐现动画:PMO前沿整理,禁止搬运!
  就是在一定的时间内持续改变控件的透明度。
  旋转动画:PMO前沿整理,禁止搬运!
  就是让一个控件在一段时间内围绕一个固定点旋转指定的角度。
  代码重构
  代码重构是软件开发过程中提高开发效率和质量的重要手段。在软件开发过程中,每一款软件一开始都是经过精心设计的,具有良好的结构。但随着需求不断变更,之前的结构开始慢慢变得不适应。PMO前沿整理,禁止搬运!重构就是在保留现有功能的基础上,重新梳理软件中的代码结构,让原本杂乱无章的代码重新具有可读性、结构性和扩展性,增加软件的开发效率,优化程序的性能。重构的范围可大可小,大到涉及整个产品的各个模块,小到一个函数。
  PMO前沿整理,禁止搬运!
  多线程是什么?
  多线程是有效提升程序运行效率的方式之一。它还在提升优化算法、提高硬件配置、分布式计算、网格计算的效率方面起着重要作用。PMO前沿整理,禁止搬运!
  反向代理代码
  反向代理代码的意义
  首先,它可以实现负载均衡。有多台服务器可以为同一个 Web 服务提供服务,但是每台服务器的负荷不太一样,如果请求被发送到负荷较高的服务器,它的处理时间可能较长,但是客户端并不知道哪一台服务器比较空闲,所以将请求发送到反向代理服务器。反向代理服务器知道每台服务器的负载量,会将请求转发到相对空闲的服务器,以便更快地响应客户端。反向服务器还可以减轻后端服务器的一些压力,例如很多静态资源或者缓存数据,可以直接放在反向代理服务器上,不用将这些请求传递到后端服务器,这样就减轻了相同的请求对后端服务器产生的压力。PMO前沿整理,禁止搬运!它还可以对请求做进一步的封装和解封。如果我们想把所有请求升级到SSL加密连接,却不想改造后端服务器,那么可以只在客户端-反向代理服务器之间使用SSL加密连接,而代理服务器-后端服务器之间仍旧使用普通的HTTP连接,这样就事半功倍了。同时,反向代理服务器还可以为后端服务器阻挡一些网络攻击,提升后台服务器的安全性。总之,反向代理服务器对于后端服务器,就是一个接口人的角色,它接洽了所有客户端的请求,并进行简单的处理,然后分发到后端服务器。
  CDN是什么?
  CDN是什么?CDN(Content Delivery Network,内容分发网络。PMO前沿整理,禁止搬运!
  CDN专注于“内容”,也就是CDN的“C”所代表的“Content”,这里的“内容”是指静态的资源,比如一张图片、一个文本文件、一段视频、一个CSS、一个JavaScript,等等。任何以文件形式存储的“内容”都可以部署在CDN上。
  CDN的作用:
  它是一个基于互联网的数量巨大的服务器集群,专注于内容和资源分发,为用户提供快速访问资源的能力,进而提升内容访问的体验。
  PMO前沿整理,禁止搬运!
  VPN是什么?
  VPN是什么是虚拟专用网络。专用网络很好理解,就像上面的一根网线,只属于特定的人群,直达服务器。
  如何判断当前的流量达到极限呢?
  如何判断当前的流量达到极限呢?
  漏铜算法:我们把用户请求看作水,这些水会流进一个底部有洞的水桶,而我们的服务真正处理的是从底部洞里流出的水。当流量突然暴涨,桶中注满水后,再流入的水就会直接溢出,而对应的就是拒绝服务。令牌桶算法:PMO前沿整理,禁止搬运!系统以固定的速度(如每秒产生 r个令牌)产生令牌(token),产生的令牌都扔进一个桶里,如果令牌把桶塞满了(最多能装b个令牌),就会被扔掉。当用户请求到达服务的时候,去桶里取一个令牌,如果取到了,就给后面的模块继续处理;如果这个时候桶里一个令牌都没有了,就拒绝服务该请求。
  
  
  近期热文:
  应广大粉丝要求,我们建立了一个【PMO前沿交流群】,小伙伴们热情踊跃,目前人数已经上万人了,不能直接进群啦,想要进群的添加小编微信,拉你进群。两个添加其一即可!
  
  
  欢迎加入中国最大的PMO&PM社区

抓取动态网页怎么能能不用chrome插件呢,我第一次搞

网站优化优采云 发表了文章 • 0 个评论 • 36 次浏览 • 2022-05-26 02:01 • 来自相关话题

  抓取动态网页怎么能能不用chrome插件呢,我第一次搞
  抓取动态网页怎么能不用chrome插件呢,我第一次搞,用了很多天,
  一、chromepc官网:,该网站跟百度、谷歌是类似的,是一个提供动态网页爬虫的技术交流平台,每天提供最新最全的网页爬虫,跟新的技术博客,包括国内和国外的优秀爬虫系列,可以跟动态网页打交道。该网站访问很麻烦,也容易翻车。特别是问我一些技术或者网站发展问题,如果没有老鸟助手,基本上连到自己的数据库都不知道怎么操作的。
  这里总结一下该网站问题:1.没有历史记录。(网站只提供了百度、谷歌的动态网页下载,其它的不提供。)2.普通资源没有解析通道,只提供文章的正文插入,只提供示例和源码地址,比如搜索一个叫「性别转换」的回答,要翻一页才能看到源码地址,网站说没有考虑到数据结构的实际实现。3.该网站没有提供真正意义上的spider爬虫方面的技术。
  4.搜索结果格式不支持。5.只提供完整的列表页面,没有页面尾部、所在网站、回答等功能。6.该网站内容技术输出普遍比较原始,和官网的ui风格很不符合。看完以上6个问题,估计大家也觉得跟动态网页打交道的话很无力,很有可能就开始刷各种「不建议浏览器」下载的网站导航页面去了。来试试另外一个插件吧:小虫人工翻译。
  这个插件具体功能如下:1.输入字母就可以翻译英文2.与真正的人工翻译一样,直接输入中文,翻译也是真正的中文翻译,非软件翻译,能自动完成cnzz、idcnn等多种第三方网站代码对比。3.任意文本间可以重复翻译。跟人工翻译一样,直接输入中文或字母就可以翻译。4.可以查看全网cnzz、idcnn等多种第三方网站代码对比。5.时效性要求比较高的话,只要能识别出关键词,就可以自动抓取出真正的动态网页。
  二、chromeos浏览器官网:、桌面书签支持截图这里可以插入4张截图来看看截图。这是一个比较棒的功能,可以直接支持chromeos+windows/mac版本的书签,以及其它平台,如果能使用邮件,将很方便,如果是在「百度文库」等网站直接提取,不仅要转换网页,还要读取密码,对于一般的页面很麻烦。特别是抓取论文和说明书等文档很麻烦。
  三、chromeos浏览器官网:,google前端progresshud提供了分享google博客地址及其文章的功能,这个功能在chromeososchrome浏览器内部实现。除了可以批量导出,还能下载论文、博客、docs等文件,整个页面以及引用的网站这里我就不演示截图了,这些博客和docs在我们业内很多都是很。 查看全部

  抓取动态网页怎么能能不用chrome插件呢,我第一次搞
  抓取动态网页怎么能不用chrome插件呢,我第一次搞,用了很多天,
  一、chromepc官网:,该网站跟百度、谷歌是类似的,是一个提供动态网页爬虫的技术交流平台,每天提供最新最全的网页爬虫,跟新的技术博客,包括国内和国外的优秀爬虫系列,可以跟动态网页打交道。该网站访问很麻烦,也容易翻车。特别是问我一些技术或者网站发展问题,如果没有老鸟助手,基本上连到自己的数据库都不知道怎么操作的。
  这里总结一下该网站问题:1.没有历史记录。(网站只提供了百度、谷歌的动态网页下载,其它的不提供。)2.普通资源没有解析通道,只提供文章的正文插入,只提供示例和源码地址,比如搜索一个叫「性别转换」的回答,要翻一页才能看到源码地址,网站说没有考虑到数据结构的实际实现。3.该网站没有提供真正意义上的spider爬虫方面的技术。
  4.搜索结果格式不支持。5.只提供完整的列表页面,没有页面尾部、所在网站、回答等功能。6.该网站内容技术输出普遍比较原始,和官网的ui风格很不符合。看完以上6个问题,估计大家也觉得跟动态网页打交道的话很无力,很有可能就开始刷各种「不建议浏览器」下载的网站导航页面去了。来试试另外一个插件吧:小虫人工翻译。
  这个插件具体功能如下:1.输入字母就可以翻译英文2.与真正的人工翻译一样,直接输入中文,翻译也是真正的中文翻译,非软件翻译,能自动完成cnzz、idcnn等多种第三方网站代码对比。3.任意文本间可以重复翻译。跟人工翻译一样,直接输入中文或字母就可以翻译。4.可以查看全网cnzz、idcnn等多种第三方网站代码对比。5.时效性要求比较高的话,只要能识别出关键词,就可以自动抓取出真正的动态网页。
  二、chromeos浏览器官网:、桌面书签支持截图这里可以插入4张截图来看看截图。这是一个比较棒的功能,可以直接支持chromeos+windows/mac版本的书签,以及其它平台,如果能使用邮件,将很方便,如果是在「百度文库」等网站直接提取,不仅要转换网页,还要读取密码,对于一般的页面很麻烦。特别是抓取论文和说明书等文档很麻烦。
  三、chromeos浏览器官网:,google前端progresshud提供了分享google博客地址及其文章的功能,这个功能在chromeososchrome浏览器内部实现。除了可以批量导出,还能下载论文、博客、docs等文件,整个页面以及引用的网站这里我就不演示截图了,这些博客和docs在我们业内很多都是很。

页面加载时间过长?检测、优化、改善一站解决!

网站优化优采云 发表了文章 • 0 个评论 • 51 次浏览 • 2022-05-23 21:48 • 来自相关话题

  页面加载时间过长?检测、优化、改善一站解决!
  
  对于网站的加载速度,我们通常是专注与前端性能的优化来提高页面加载速度,但是,从运维网站的服务器着手进行优化也是不可忽视的。
  
  对于外贸企业来说,减少客户不必要的等待时间也是提高转化率的重要因素。那怎样才是更好的优化改善加载响应时间解决方案呢?
  了解什么是Waiting(TTFB)时间?…
  TTFB是Time to First Byte 的缩写,指的是浏览器开始收到服务器响应数据的时间(后台处理时间+重定向时间),是反映服务端响应速度的重要指标。
  打个比方:A问B一个问题,B思考了一会儿才给A答案,B思考的时间就相当于TTFB,对服务器来说,TTFB时间越短,说明服务器的响应越快。
  如何检测网站的TTFB时间? …
  检测网站TTFB时间的方法有很多种,但是建议简单并固定地使用一种工具并把它作为基准,这对测试结果的准确性是很重要的,本文主要介绍一下Google Chrome浏览器中的开发者工具来检测TTFB时间。
  操作步骤:·打开你要测试的网站·点击鼠标右键>点击检查(或者之间按F12)·切换到Network标签,点选你的网站首页在图片上所示位置即可查看每一个资源的载入时间和网站的Waiting(TTFB)时间。
  
  TTFB时长多长为优?…
  当你的TTFB 越少时,用户访问你网站的速度就会越快。通常,任何小于100毫秒的情况都是不错的TTFB。Google PageSpeed Insights建议服务器响应时间不超过200毫秒。如果您处于300-500毫秒范围内,这是十分标准的。
  导致TTFB时间过长的原因…
  先来看看网页加载的原理:对于需要读取数据库来生成的动态网页来说,服务器收到用户发送的请求时,首先要从数据库中读取该页面需要的数据,然后把这些数据传入到网站程序中,网站程序执行命令并渲染后,再返回给浏览器端用户。
  由于查询数据和执行命令都需要花费时间,在这个过程没有完成之前,浏览器就会一直处在等待接收服务器响应的状态。
  
  Waiting TTFB 统计的花费时间涉及3步交互过程,也就是影响 TTFB 的三大因素:
  请求服务器:访问者传送请求到服务器的时间服务器处理:服务器接收请求抓取资料的时间对访客回应:服务器回传资料给访问者的时间
  比如你的主机服务器在国外,国外客户访问你的网站页面,网页加载时可以直接在国外发送请求位于当地的服务器,服务器接收并处理完请求后,再传送数据并展示给位于国外客户,这样的服务器就可以明显减少 Waiting TTFB 时间。
  如何优化减少网站的TTFB时间? …
  - 方法1:选择好的服务器 -选择适合的服务器,能够直接帮助你改善网站的TTFB 时间。
  
  - 方法2:网站缓存 -许多人只认为缓存可以帮助减少加载时间,但实际上,它还可以减少TTFB,因为它可以减少服务器处理时间。
  - 方法3:使用CDN加速 -CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,可以使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
  
  - 方法4:选择好的DNS 服务 -你所使用的DNS 主机效能过于缓慢,那么就会导致使用者造访网站时,网域名称转换IP 地址的这一段时间拉长,进而影响整体TTFB 的时间。
  在致力于打造外贸营销型网站的过程中,全球搜融入了109种语言、全球CDN加速、美国服务器、大数据智能分析系统等种种优势,不仅让海外独立站在保证安全的情况下,实现极速访问,还让企业在建设私域流量,并形成转化等方面,拥有了领先同行的优势!
  
  你想要的干货知识都在这里
  点它!精彩不错过!
  往期推荐
  全球搜——外贸营销一站式解决方案:
  通过109种多语言建站系统、领先的搜索引擎SEO技术、多渠道营销推广技术、AI智能获客系统、社交营销和自动化营销系统,为企业提供多元、高效、高转化的外贸营销解决方案,帮助企业快速获取大量海外精准询盘,转化更多订单。 查看全部

  页面加载时间过长?检测、优化、改善一站解决!
  
  对于网站的加载速度,我们通常是专注与前端性能的优化来提高页面加载速度,但是,从运维网站的服务器着手进行优化也是不可忽视的。
  
  对于外贸企业来说,减少客户不必要的等待时间也是提高转化率的重要因素。那怎样才是更好的优化改善加载响应时间解决方案呢?
  了解什么是Waiting(TTFB)时间?…
  TTFB是Time to First Byte 的缩写,指的是浏览器开始收到服务器响应数据的时间(后台处理时间+重定向时间),是反映服务端响应速度的重要指标。
  打个比方:A问B一个问题,B思考了一会儿才给A答案,B思考的时间就相当于TTFB,对服务器来说,TTFB时间越短,说明服务器的响应越快。
  如何检测网站的TTFB时间? …
  检测网站TTFB时间的方法有很多种,但是建议简单并固定地使用一种工具并把它作为基准,这对测试结果的准确性是很重要的,本文主要介绍一下Google Chrome浏览器中的开发者工具来检测TTFB时间。
  操作步骤:·打开你要测试的网站·点击鼠标右键>点击检查(或者之间按F12)·切换到Network标签,点选你的网站首页在图片上所示位置即可查看每一个资源的载入时间和网站的Waiting(TTFB)时间。
  
  TTFB时长多长为优?…
  当你的TTFB 越少时,用户访问你网站的速度就会越快。通常,任何小于100毫秒的情况都是不错的TTFB。Google PageSpeed Insights建议服务器响应时间不超过200毫秒。如果您处于300-500毫秒范围内,这是十分标准的。
  导致TTFB时间过长的原因…
  先来看看网页加载的原理:对于需要读取数据库来生成的动态网页来说,服务器收到用户发送的请求时,首先要从数据库中读取该页面需要的数据,然后把这些数据传入到网站程序中,网站程序执行命令并渲染后,再返回给浏览器端用户。
  由于查询数据和执行命令都需要花费时间,在这个过程没有完成之前,浏览器就会一直处在等待接收服务器响应的状态。
  
  Waiting TTFB 统计的花费时间涉及3步交互过程,也就是影响 TTFB 的三大因素:
  请求服务器:访问者传送请求到服务器的时间服务器处理:服务器接收请求抓取资料的时间对访客回应:服务器回传资料给访问者的时间
  比如你的主机服务器在国外,国外客户访问你的网站页面,网页加载时可以直接在国外发送请求位于当地的服务器,服务器接收并处理完请求后,再传送数据并展示给位于国外客户,这样的服务器就可以明显减少 Waiting TTFB 时间。
  如何优化减少网站的TTFB时间? …
  - 方法1:选择好的服务器 -选择适合的服务器,能够直接帮助你改善网站的TTFB 时间。
  
  - 方法2:网站缓存 -许多人只认为缓存可以帮助减少加载时间,但实际上,它还可以减少TTFB,因为它可以减少服务器处理时间。
  - 方法3:使用CDN加速 -CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,可以使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
  
  - 方法4:选择好的DNS 服务 -你所使用的DNS 主机效能过于缓慢,那么就会导致使用者造访网站时,网域名称转换IP 地址的这一段时间拉长,进而影响整体TTFB 的时间。
  在致力于打造外贸营销型网站的过程中,全球搜融入了109种语言、全球CDN加速、美国服务器、大数据智能分析系统等种种优势,不仅让海外独立站在保证安全的情况下,实现极速访问,还让企业在建设私域流量,并形成转化等方面,拥有了领先同行的优势!
  
  你想要的干货知识都在这里
  点它!精彩不错过!
  往期推荐
  全球搜——外贸营销一站式解决方案:
  通过109种多语言建站系统、领先的搜索引擎SEO技术、多渠道营销推广技术、AI智能获客系统、社交营销和自动化营销系统,为企业提供多元、高效、高转化的外贸营销解决方案,帮助企业快速获取大量海外精准询盘,转化更多订单。

官方客服QQ群

微信人工客服

QQ人工客服


线