抓取ajax动态网页java

抓取ajax动态网页java

抓取ajax动态网页java(小编来一起如何用python来页面中的JS动态加载 )

网站优化优采云 发表了文章 • 0 个评论 • 90 次浏览 • 2021-11-02 07:20 • 来自相关话题

  抓取ajax动态网页java(小编来一起如何用python来页面中的JS动态加载
)
  本文文章主要介绍了如何使用python捕捉网页中的动态数据。文章通过示例代码详细介绍,对大家的学习或工作有一定的参考学习价值,有需要的朋友和小编一起学习吧
  我们经常会发现,网页中的很多数据并不是用HTML硬编码的,而是通过js动态加载的。所以也引出了动态数据的概念。这里的动态数据是指网页中通过Javascript动态生成的页面内容,是页面加载到浏览器后动态生成的,以前没有的。
  在编写爬虫抓取网页数据的时候,经常会遇到这种需要动态加载数据的HTML网页。如果还是直接从网页爬取,将无法获取任何数据。
  今天,我们就在这里简单说说如何使用python抓取页面中JS动态加载的数据。
  给定一个网页:豆瓣电影排行榜,里面的所有电影信息都是动态加载的。我们无法直接从页面中获取每部电影的信息。
  如下图所示,我们在HTML中找不到对应的电影信息。
  
  
  在Chrome浏览器中,点击F12打开Network中的XHR,我们抓取对应的js文件进行分析。如下所示:
  
  在豆瓣页面向下拖动,可以将更多的电影信息加载到页面中,以便我们抓取相应的消息。
  我们可以看到它使用了 AJAX 异步请求。通过在后台与服务器交换少量数据,AJAX 可以使网页异步更新。因此,可以在不重新加载整个网页的情况下更新网页的某个部分,从而实现数据的动态加载。
  
  我们可以看到,通过GET,我们得到的响应中收录了对应的电影相关信息,以JSON格式存储在一起。
  
  查看RequestURL信息,可以发现action参数后面有“start”和“limit”两个参数。显然他们的意思是:“从某个位置返回的电影数量”。
  如果你想快速获取相关电影信息,可以直接把这个URL复制到地址栏,修改你需要的start和limit参数值,得到相应的抓取结果。
  但这不是很自动,很多其他的网站 RequestURL 也不是那么直接,所以我们将使用python 进行进一步的操作来获取返回的消息信息。
   #coding:utf-8 import urllib import requests post_param = {'action':'','start':'0','limit':'1'} return_data = requests.get("https://movie.douban.com/j/cha ... ot%3B,data =post_param, verify = False) print return_data.text 查看全部

  抓取ajax动态网页java(小编来一起如何用python来页面中的JS动态加载
)
  本文文章主要介绍了如何使用python捕捉网页中的动态数据。文章通过示例代码详细介绍,对大家的学习或工作有一定的参考学习价值,有需要的朋友和小编一起学习吧
  我们经常会发现,网页中的很多数据并不是用HTML硬编码的,而是通过js动态加载的。所以也引出了动态数据的概念。这里的动态数据是指网页中通过Javascript动态生成的页面内容,是页面加载到浏览器后动态生成的,以前没有的。
  在编写爬虫抓取网页数据的时候,经常会遇到这种需要动态加载数据的HTML网页。如果还是直接从网页爬取,将无法获取任何数据。
  今天,我们就在这里简单说说如何使用python抓取页面中JS动态加载的数据。
  给定一个网页:豆瓣电影排行榜,里面的所有电影信息都是动态加载的。我们无法直接从页面中获取每部电影的信息。
  如下图所示,我们在HTML中找不到对应的电影信息。
  
  
  在Chrome浏览器中,点击F12打开Network中的XHR,我们抓取对应的js文件进行分析。如下所示:
  
  在豆瓣页面向下拖动,可以将更多的电影信息加载到页面中,以便我们抓取相应的消息。
  我们可以看到它使用了 AJAX 异步请求。通过在后台与服务器交换少量数据,AJAX 可以使网页异步更新。因此,可以在不重新加载整个网页的情况下更新网页的某个部分,从而实现数据的动态加载。
  
  我们可以看到,通过GET,我们得到的响应中收录了对应的电影相关信息,以JSON格式存储在一起。
  
  查看RequestURL信息,可以发现action参数后面有“start”和“limit”两个参数。显然他们的意思是:“从某个位置返回的电影数量”。
  如果你想快速获取相关电影信息,可以直接把这个URL复制到地址栏,修改你需要的start和limit参数值,得到相应的抓取结果。
  但这不是很自动,很多其他的网站 RequestURL 也不是那么直接,所以我们将使用python 进行进一步的操作来获取返回的消息信息。
   #coding:utf-8 import urllib import requests post_param = {'action':'','start':'0','limit':'1'} return_data = requests.get("https://movie.douban.com/j/cha ... ot%3B,data =post_param, verify = False) print return_data.text

抓取ajax动态网页java(基于浏览器内核来开发的动态页面渲染处理服务器(组图))

网站优化优采云 发表了文章 • 0 个评论 • 74 次浏览 • 2021-10-25 20:16 • 来自相关话题

  抓取ajax动态网页java(基于浏览器内核来开发的动态页面渲染处理服务器(组图))
  前言
  曾几何时,动态页面的信息抽取(ajax、内部js二次渲染等)一直是爬虫开发者的心病。总之,真的没有合适的工具。尤其是在Java中,像htmlunit这样的工具可以看作是解析动态页面的神器,但还不够完善,无法达到浏览器级别的解析效果,遇到稍微复杂一点的页面时,也起不到作用。在经历了各种痛苦和仇恨之后,作者决定开发一个动态页面渲染处理服务器,专门用于抓取、监控和测试此类场景。要达到浏览器级别的效果,必须基于浏览器内核进行开发。幸运的是,我们有一个开源的 webkit。幸运的是,我们有 QtWebkit,它对开发人员更加友好。
  SeimiAgent 简介
  SeimiAgent 是基于 QtWebkit 开发的 webkit 服务,可以在服务器端后台运行。它可以通过SeimiAgent提供的http接口向SeimiAgent发送加载请求(要加载的URL和该页面接受的渲染时间或使用什么代理等参数),通过SeimiAgent加载并渲染动态页面要处理,然后直接将渲染好的页面返回给调用者进行后续处理,所以运行的SeimiAgent服务是语言无关的,任何语言或框架都可以通过SeimiAgent提供标准的http接口来获取服务。SeimiAgent 的加载和渲染环境都是通用浏览器级别的,所以不用担心他处理动态页面的能力。目前,SeimiAgent 只支持返回渲染的 HTML 文档。未来将增加图片快照和PDF支持,以方便更多样化的使用需求。
  使用演示
  
  SeimiCrawler 简介
  SeimiCrawler 是一个敏捷、独立部署、支持分布式Java 爬虫框架。希望最大限度地降低新手开发高可用低性能爬虫系统的门槛,提高爬虫系统的开发效率。在 SeimiCrawler 的世界里,大部分人只需要关心编写爬行的业务逻辑,剩下的 Seimi 会为你做。在设计上,SeimiCrawler 极大的受到了 Python 的爬虫框架 Scrapy 的启发,同时结合了 Java 语言的特性和 Spring 的特性,希望在国内使用更高效的 XPath 来更方便、更通用地解析 HTML,所以SeimiCrawler默认为HTML解析处理器为JsoupXpath(独立扩展项目,不收录在jsoup中),
  集成和部署 SeimiAgent
  下载和解压不会显示。上面的动态图片中也有演示。下载地址可以在 SeimiAgent 主页上找到。进入SeimiAgent的bin目录,执行:
  ./SeimiAgent -p 8000
  这就是启动SeimiAgent服务,监听8000端口。接下来其实可以用任何语言通过http请求发送加载页面的请求,然后得到渲染结果。当然,我们这里介绍的是SeimiCrawler是如何集成和使用SeimiAgent的。
  SeimiCrawler 配置
  SeimiCrawler 在 v0.3.0 版本中内置了对 SeimiAgent 的支持。开发者只需要配置SeimiAgent的地址和端口,然后在生成具体的Request时选择是否提交给SeimiAgent,并指定如何提交。让我们直接在评论中解释最后一个完整的例子:
  package cn.wanghaomiao.crawlers;
import cn.wanghaomiao.seimi.annotation.Crawler;
import cn.wanghaomiao.seimi.def.BaseSeimiCrawler;
import cn.wanghaomiao.seimi.struct.Request;
import cn.wanghaomiao.seimi.struct.Response;
import cn.wanghaomiao.xpath.model.JXDocument;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
/**
* 这个例子演示如何使用SeimiAgent进行复杂动态页面信息抓取
* @author 汪浩淼 et.tw@163.com
* @since 2016/4/14.
*/
@Crawler(name = "seimiagent")
public class SeimiAgentDemo extends BaseSeimiCrawler{
/**
* 在resource/config/seimi.properties中配置方便更换,当然也可以自行根据情况使用自己的统一配置中心等服务。这里配置SeimiAgent服务所在地址。
*/
@Value("${seimiAgentHost}")
private String seimiAgentHost;
//SeimiAgent监听的端口好,如上文中的8000
@Value("${seimiAgentPort}")
private int seimiAgentPort;
@Override
public String[] startUrls() {
return new String[]{"https://www.baidu.com"};
}
@Override
public String seimiAgentHost() {
return this.seimiAgentHost;
}
@Override
public int seimiAgentPort() {
return this.seimiAgentPort;
}
@Override
public void start(Response response) {
Request seimiAgentReq = Request.build("https://www.souyidai.com","getTotalTransactions")
.useSeimiAgent()
// 告诉SeimiAgent针对这个请求是否使用cookie,如果没有设置使用当前Crawler关于cookie使用条件作为默认值。
//.setSeimiAgentUseCookie(true)
// 设置全部load完成后给SeimiAgent多少时间用于执行js并渲染页面,单位为毫秒
.setSeimiAgentRenderTime(5000);
push(seimiAgentReq);
}
/**
* 获取搜易贷首页总成交额
* @param response
*/
public void getTotalTransactions(Response response){
JXDocument doc = response.document();
try {
String trans = StringUtils.join(doc.sel("//div[@class='homepage-amount']/div[@class='number font-arial']/div/span/text()"),"");
logger.info("Final Res:{}",trans);
} catch (Exception e) {
e.printStackTrace();
}
}
}
  配置文件seimi.properties
  seimiAgentHost=127.0.0.1
seimiAgentPort=8000
  启动
  public class Boot {
public static void main(String[] args){
Seimi s = new Seimi();
s.start("seimiagent");
}
}
  SeimiCrawler 启动后,您可以看到您想要的搜一贷交易总额。
  完整演示地址
  演示 查看全部

  抓取ajax动态网页java(基于浏览器内核来开发的动态页面渲染处理服务器(组图))
  前言
  曾几何时,动态页面的信息抽取(ajax、内部js二次渲染等)一直是爬虫开发者的心病。总之,真的没有合适的工具。尤其是在Java中,像htmlunit这样的工具可以看作是解析动态页面的神器,但还不够完善,无法达到浏览器级别的解析效果,遇到稍微复杂一点的页面时,也起不到作用。在经历了各种痛苦和仇恨之后,作者决定开发一个动态页面渲染处理服务器,专门用于抓取、监控和测试此类场景。要达到浏览器级别的效果,必须基于浏览器内核进行开发。幸运的是,我们有一个开源的 webkit。幸运的是,我们有 QtWebkit,它对开发人员更加友好。
  SeimiAgent 简介
  SeimiAgent 是基于 QtWebkit 开发的 webkit 服务,可以在服务器端后台运行。它可以通过SeimiAgent提供的http接口向SeimiAgent发送加载请求(要加载的URL和该页面接受的渲染时间或使用什么代理等参数),通过SeimiAgent加载并渲染动态页面要处理,然后直接将渲染好的页面返回给调用者进行后续处理,所以运行的SeimiAgent服务是语言无关的,任何语言或框架都可以通过SeimiAgent提供标准的http接口来获取服务。SeimiAgent 的加载和渲染环境都是通用浏览器级别的,所以不用担心他处理动态页面的能力。目前,SeimiAgent 只支持返回渲染的 HTML 文档。未来将增加图片快照和PDF支持,以方便更多样化的使用需求。
  使用演示
  
  SeimiCrawler 简介
  SeimiCrawler 是一个敏捷、独立部署、支持分布式Java 爬虫框架。希望最大限度地降低新手开发高可用低性能爬虫系统的门槛,提高爬虫系统的开发效率。在 SeimiCrawler 的世界里,大部分人只需要关心编写爬行的业务逻辑,剩下的 Seimi 会为你做。在设计上,SeimiCrawler 极大的受到了 Python 的爬虫框架 Scrapy 的启发,同时结合了 Java 语言的特性和 Spring 的特性,希望在国内使用更高效的 XPath 来更方便、更通用地解析 HTML,所以SeimiCrawler默认为HTML解析处理器为JsoupXpath(独立扩展项目,不收录在jsoup中),
  集成和部署 SeimiAgent
  下载和解压不会显示。上面的动态图片中也有演示。下载地址可以在 SeimiAgent 主页上找到。进入SeimiAgent的bin目录,执行:
  ./SeimiAgent -p 8000
  这就是启动SeimiAgent服务,监听8000端口。接下来其实可以用任何语言通过http请求发送加载页面的请求,然后得到渲染结果。当然,我们这里介绍的是SeimiCrawler是如何集成和使用SeimiAgent的。
  SeimiCrawler 配置
  SeimiCrawler 在 v0.3.0 版本中内置了对 SeimiAgent 的支持。开发者只需要配置SeimiAgent的地址和端口,然后在生成具体的Request时选择是否提交给SeimiAgent,并指定如何提交。让我们直接在评论中解释最后一个完整的例子:
  package cn.wanghaomiao.crawlers;
import cn.wanghaomiao.seimi.annotation.Crawler;
import cn.wanghaomiao.seimi.def.BaseSeimiCrawler;
import cn.wanghaomiao.seimi.struct.Request;
import cn.wanghaomiao.seimi.struct.Response;
import cn.wanghaomiao.xpath.model.JXDocument;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
/**
* 这个例子演示如何使用SeimiAgent进行复杂动态页面信息抓取
* @author 汪浩淼 et.tw@163.com
* @since 2016/4/14.
*/
@Crawler(name = "seimiagent")
public class SeimiAgentDemo extends BaseSeimiCrawler{
/**
* 在resource/config/seimi.properties中配置方便更换,当然也可以自行根据情况使用自己的统一配置中心等服务。这里配置SeimiAgent服务所在地址。
*/
@Value("${seimiAgentHost}")
private String seimiAgentHost;
//SeimiAgent监听的端口好,如上文中的8000
@Value("${seimiAgentPort}")
private int seimiAgentPort;
@Override
public String[] startUrls() {
return new String[]{"https://www.baidu.com"};
}
@Override
public String seimiAgentHost() {
return this.seimiAgentHost;
}
@Override
public int seimiAgentPort() {
return this.seimiAgentPort;
}
@Override
public void start(Response response) {
Request seimiAgentReq = Request.build("https://www.souyidai.com","getTotalTransactions")
.useSeimiAgent()
// 告诉SeimiAgent针对这个请求是否使用cookie,如果没有设置使用当前Crawler关于cookie使用条件作为默认值。
//.setSeimiAgentUseCookie(true)
// 设置全部load完成后给SeimiAgent多少时间用于执行js并渲染页面,单位为毫秒
.setSeimiAgentRenderTime(5000);
push(seimiAgentReq);
}
/**
* 获取搜易贷首页总成交额
* @param response
*/
public void getTotalTransactions(Response response){
JXDocument doc = response.document();
try {
String trans = StringUtils.join(doc.sel("//div[@class='homepage-amount']/div[@class='number font-arial']/div/span/text()"),"");
logger.info("Final Res:{}",trans);
} catch (Exception e) {
e.printStackTrace();
}
}
}
  配置文件seimi.properties
  seimiAgentHost=127.0.0.1
seimiAgentPort=8000
  启动
  public class Boot {
public static void main(String[] args){
Seimi s = new Seimi();
s.start("seimiagent");
}
}
  SeimiCrawler 启动后,您可以看到您想要的搜一贷交易总额。
  完整演示地址
  演示

抓取ajax动态网页java(基于浏览器内核来开发的动态页面渲染处理服务器(组图))

网站优化优采云 发表了文章 • 0 个评论 • 142 次浏览 • 2021-10-25 20:01 • 来自相关话题

  抓取ajax动态网页java(基于浏览器内核来开发的动态页面渲染处理服务器(组图))
  前言
  曾几何时,动态页面的信息抽取(ajax、内部js二次渲染等)一直是爬虫开发者的心病。总之,真的没有合适的工具。尤其是在Java中,像htmlunit这样的工具可以看作是解析动态页面的神器,但还不够完善,无法达到浏览器级别的解析效果,遇到稍微复杂一点的页面时,也起不到作用。在经历了各种痛苦和仇恨之后,作者决定开发一个动态页面渲染处理服务器,专门用于抓取、监控和测试此类场景。要达到浏览器级别的效果,必须基于浏览器内核进行开发。幸运的是,我们有一个开源的 webkit。幸运的是,我们有 QtWebkit,它对开发人员更加友好。
  SeimiAgent 简介
  SeimiAgent 是基于 QtWebkit 开发的 webkit 服务,可以在服务器端后台运行。它可以通过SeimiAgent提供的http接口向SeimiAgent发送加载请求(要加载的URL和该页面接受的渲染时间或使用什么代理等参数),通过SeimiAgent加载并渲染动态页面要处理,然后直接将渲染好的页面返回给调用者进行后续处理,所以运行的SeimiAgent服务是语言无关的,任何语言或框架都可以通过SeimiAgent提供标准的http接口来获取服务。SeimiAgent 的加载和渲染环境都是通用浏览器级别的,所以不用担心他处理动态页面的能力。目前,SeimiAgent 只支持返回渲染的 HTML 文档。未来将增加图片快照和PDF支持,以方便更多样化的使用需求。
  使用演示
  
  SeimiCrawler 简介
  SeimiCrawler 是一个敏捷、独立部署、支持分布式Java 爬虫框架。希望最大限度地降低新手开发高可用低性能爬虫系统的门槛,提高爬虫系统的开发效率。在 SeimiCrawler 的世界里,大部分人只需要关心编写爬行的业务逻辑,剩下的 Seimi 会为你做。在设计上,SeimiCrawler 极大的受到了 Python 的爬虫框架 Scrapy 的启发,同时结合了 Java 语言的特性和 Spring 的特性,希望在国内使用更高效的 XPath 来更方便、更通用地解析 HTML,所以SeimiCrawler默认为HTML解析处理器为JsoupXpath(独立扩展项目,不收录在jsoup中),
  集成和部署 SeimiAgent
  下载和解压不会显示。上面的动态图片中也有演示。下载地址可以在 SeimiAgent 主页上找到。进入SeimiAgent的bin目录,执行:
  ./SeimiAgent -p 8000
  这就是启动SeimiAgent服务,监听8000端口。接下来其实可以用任何语言通过http请求发送加载页面的请求,然后得到渲染结果。当然,我们这里介绍的是SeimiCrawler是如何集成和使用SeimiAgent的。
  SeimiCrawler 配置
  SeimiCrawler 在 v0.3.0 版本中内置了对 SeimiAgent 的支持。开发者只需要配置SeimiAgent的地址和端口,然后在生成具体的Request时选择是否提交给SeimiAgent,并指定如何提交。让我们直接在评论中解释最后一个完整的例子:
  package cn.wanghaomiao.crawlers;
import cn.wanghaomiao.seimi.annotation.Crawler;
import cn.wanghaomiao.seimi.def.BaseSeimiCrawler;
import cn.wanghaomiao.seimi.struct.Request;
import cn.wanghaomiao.seimi.struct.Response;
import cn.wanghaomiao.xpath.model.JXDocument;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
/**
* 这个例子演示如何使用SeimiAgent进行复杂动态页面信息抓取
* @author 汪浩淼 et.tw@163.com
* @since 2016/4/14.
*/
@Crawler(name = "seimiagent")
public class SeimiAgentDemo extends BaseSeimiCrawler{
/**
* 在resource/config/seimi.properties中配置方便更换,当然也可以自行根据情况使用自己的统一配置中心等服务。这里配置SeimiAgent服务所在地址。
*/
@Value("${seimiAgentHost}")
private String seimiAgentHost;
//SeimiAgent监听的端口好,如上文中的8000
@Value("${seimiAgentPort}")
private int seimiAgentPort;
@Override
public String[] startUrls() {
return new String[]{"https://www.baidu.com"};
}
@Override
public String seimiAgentHost() {
return this.seimiAgentHost;
}
@Override
public int seimiAgentPort() {
return this.seimiAgentPort;
}
@Override
public void start(Response response) {
Request seimiAgentReq = Request.build("https://www.souyidai.com","getTotalTransactions")
.useSeimiAgent()
// 告诉SeimiAgent针对这个请求是否使用cookie,如果没有设置使用当前Crawler关于cookie使用条件作为默认值。
//.setSeimiAgentUseCookie(true)
// 设置全部load完成后给SeimiAgent多少时间用于执行js并渲染页面,单位为毫秒
.setSeimiAgentRenderTime(5000);
push(seimiAgentReq);
}
/**
* 获取搜易贷首页总成交额
* @param response
*/
public void getTotalTransactions(Response response){
JXDocument doc = response.document();
try {
String trans = StringUtils.join(doc.sel("//div[@class='homepage-amount']/div[@class='number font-arial']/div/span/text()"),"");
logger.info("Final Res:{}",trans);
} catch (Exception e) {
e.printStackTrace();
}
}
}
  配置文件seimi.properties
  seimiAgentHost=127.0.0.1
seimiAgentPort=8000
  启动
  public class Boot {
public static void main(String[] args){
Seimi s = new Seimi();
s.start("seimiagent");
}
}
  SeimiCrawler 启动后,您可以看到您想要的搜一贷交易总额。
  完整演示地址
  演示 查看全部

  抓取ajax动态网页java(基于浏览器内核来开发的动态页面渲染处理服务器(组图))
  前言
  曾几何时,动态页面的信息抽取(ajax、内部js二次渲染等)一直是爬虫开发者的心病。总之,真的没有合适的工具。尤其是在Java中,像htmlunit这样的工具可以看作是解析动态页面的神器,但还不够完善,无法达到浏览器级别的解析效果,遇到稍微复杂一点的页面时,也起不到作用。在经历了各种痛苦和仇恨之后,作者决定开发一个动态页面渲染处理服务器,专门用于抓取、监控和测试此类场景。要达到浏览器级别的效果,必须基于浏览器内核进行开发。幸运的是,我们有一个开源的 webkit。幸运的是,我们有 QtWebkit,它对开发人员更加友好。
  SeimiAgent 简介
  SeimiAgent 是基于 QtWebkit 开发的 webkit 服务,可以在服务器端后台运行。它可以通过SeimiAgent提供的http接口向SeimiAgent发送加载请求(要加载的URL和该页面接受的渲染时间或使用什么代理等参数),通过SeimiAgent加载并渲染动态页面要处理,然后直接将渲染好的页面返回给调用者进行后续处理,所以运行的SeimiAgent服务是语言无关的,任何语言或框架都可以通过SeimiAgent提供标准的http接口来获取服务。SeimiAgent 的加载和渲染环境都是通用浏览器级别的,所以不用担心他处理动态页面的能力。目前,SeimiAgent 只支持返回渲染的 HTML 文档。未来将增加图片快照和PDF支持,以方便更多样化的使用需求。
  使用演示
  
  SeimiCrawler 简介
  SeimiCrawler 是一个敏捷、独立部署、支持分布式Java 爬虫框架。希望最大限度地降低新手开发高可用低性能爬虫系统的门槛,提高爬虫系统的开发效率。在 SeimiCrawler 的世界里,大部分人只需要关心编写爬行的业务逻辑,剩下的 Seimi 会为你做。在设计上,SeimiCrawler 极大的受到了 Python 的爬虫框架 Scrapy 的启发,同时结合了 Java 语言的特性和 Spring 的特性,希望在国内使用更高效的 XPath 来更方便、更通用地解析 HTML,所以SeimiCrawler默认为HTML解析处理器为JsoupXpath(独立扩展项目,不收录在jsoup中),
  集成和部署 SeimiAgent
  下载和解压不会显示。上面的动态图片中也有演示。下载地址可以在 SeimiAgent 主页上找到。进入SeimiAgent的bin目录,执行:
  ./SeimiAgent -p 8000
  这就是启动SeimiAgent服务,监听8000端口。接下来其实可以用任何语言通过http请求发送加载页面的请求,然后得到渲染结果。当然,我们这里介绍的是SeimiCrawler是如何集成和使用SeimiAgent的。
  SeimiCrawler 配置
  SeimiCrawler 在 v0.3.0 版本中内置了对 SeimiAgent 的支持。开发者只需要配置SeimiAgent的地址和端口,然后在生成具体的Request时选择是否提交给SeimiAgent,并指定如何提交。让我们直接在评论中解释最后一个完整的例子:
  package cn.wanghaomiao.crawlers;
import cn.wanghaomiao.seimi.annotation.Crawler;
import cn.wanghaomiao.seimi.def.BaseSeimiCrawler;
import cn.wanghaomiao.seimi.struct.Request;
import cn.wanghaomiao.seimi.struct.Response;
import cn.wanghaomiao.xpath.model.JXDocument;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
/**
* 这个例子演示如何使用SeimiAgent进行复杂动态页面信息抓取
* @author 汪浩淼 et.tw@163.com
* @since 2016/4/14.
*/
@Crawler(name = "seimiagent")
public class SeimiAgentDemo extends BaseSeimiCrawler{
/**
* 在resource/config/seimi.properties中配置方便更换,当然也可以自行根据情况使用自己的统一配置中心等服务。这里配置SeimiAgent服务所在地址。
*/
@Value("${seimiAgentHost}")
private String seimiAgentHost;
//SeimiAgent监听的端口好,如上文中的8000
@Value("${seimiAgentPort}")
private int seimiAgentPort;
@Override
public String[] startUrls() {
return new String[]{"https://www.baidu.com"};
}
@Override
public String seimiAgentHost() {
return this.seimiAgentHost;
}
@Override
public int seimiAgentPort() {
return this.seimiAgentPort;
}
@Override
public void start(Response response) {
Request seimiAgentReq = Request.build("https://www.souyidai.com","getTotalTransactions")
.useSeimiAgent()
// 告诉SeimiAgent针对这个请求是否使用cookie,如果没有设置使用当前Crawler关于cookie使用条件作为默认值。
//.setSeimiAgentUseCookie(true)
// 设置全部load完成后给SeimiAgent多少时间用于执行js并渲染页面,单位为毫秒
.setSeimiAgentRenderTime(5000);
push(seimiAgentReq);
}
/**
* 获取搜易贷首页总成交额
* @param response
*/
public void getTotalTransactions(Response response){
JXDocument doc = response.document();
try {
String trans = StringUtils.join(doc.sel("//div[@class='homepage-amount']/div[@class='number font-arial']/div/span/text()"),"");
logger.info("Final Res:{}",trans);
} catch (Exception e) {
e.printStackTrace();
}
}
}
  配置文件seimi.properties
  seimiAgentHost=127.0.0.1
seimiAgentPort=8000
  启动
  public class Boot {
public static void main(String[] args){
Seimi s = new Seimi();
s.start("seimiagent");
}
}
  SeimiCrawler 启动后,您可以看到您想要的搜一贷交易总额。
  完整演示地址
  演示

抓取ajax动态网页java( 就是网站的概念与具体讲解网页的构成的区别?)

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

  抓取ajax动态网页java(
就是网站的概念与具体讲解网页的构成的区别?)
  网页的基本组成和抓取原理
  网页是可以被浏览器等客户端解析的文件。与我们通常遇到的文件不同的是,网页是植根于互联网的。也就是说,我们通过浏览器浏览的大部分网页文件都不是本地的,它可能在世界上任何一台联网的电脑上。而且,通过互联网上的超链接,我们可以浏览世界任何一个角落的网络文件。这就是我们平时所说的网上冲浪,足不出户就可以融入整个世界。
  爬虫爬取的是数据,其实就是网页上的内容。我们将在本节中讨论具体的爬取原理。我们先来看看网站的概念:
  1. 网站 的概念
  在详细解释网页的组成之前。我们需要先了解网站的概念。
  网站 是向外界提供服务的多个网页的集合。主要分为静态网站和动态网站。
  1.1 静态网站
  静态网站表示网站下的所有页面都由HTML 网站组成。所谓静态并不是说网页是静态的,网页中还可以有动画、视频等信息。这里的静态是指无法与服务器交互。它只是被动地分析和显示服务器端响应返回的信息。
  静态网站的优点:
  易做搜索引擎收录,方便SEO优化。内容是独立的,不依赖于数据库。
  静态网站的缺点:
  维护成本比较大,大部分内容需要手动更新。页面不能交互,用户体验差。
  1.2 新闻网站
  动态网站相比静态网站,可以提供更多的交互体验。比如用户注册登录、实时推荐等功能。动态 网站 不仅收录静态 HTML 文件,还收录服务器端脚本,如 Jsp、Asp 等。
  动态网站的优点:
  用户体验好,可以实现更个性化的设置。服务端可以与客户端有更多的交互,方便服务端管理和分析数据。
  动态网站的缺点:
  需要和数据库一起处理,访问速度大大降低。对搜索引擎不友好。
  无论是网站中的静态网页,还是网站中的动态网页,它们都有一些共同的基本内容。让我们来看看网页的三个基本元素:
  2. 网页的三个基本元素:
  在接下来的章节中,我们将具体介绍网页的三个基本元素,这里只是简单介绍一些基本概念和用途。
  2.1 个 HTML
  HTML 是一种标记语言。标记语言不是编程语言,不能使用逻辑编程进行编程。它只是就一种文件呈现方式达成了一致。通过对不同标签所代表的不同含义达成一致,就可以在浏览器端呈现出丰富多彩的网页。它主要包括头部和主体两部分。HTML 主要负责页面的结构。
  2.2 CSS
  级联样式表,有时称为样式表。需要配合HTML使用才能提供丰富的渲染效果。
  2.3 Javascript
  它是一种脚本语言,广泛用于前端逻辑实现。很多自定义效果都可以通过javascript实现,是前端使用最广泛的编程语言。
  综上所述,HTML、CSS 和 Javascript 共同构成了丰富的网页样式。三者缺一不可。没有HTML、CSS、Javascript就是被动水,毫无意义;没有CSS,网页会失去颜色和样式,最终HTML也会一样;没有Javascript,我们就看不到动态网页。,不过是一潭死水。
  3. 爬取原理
  爬虫爬取的数据其实就是网页上的内容。我们需要通过一个特定的工具来分析网页,比如Beautiful Soup。然后提取HTML中特定标签下的数据。然后,数据被持久化存储,以方便日后的数据分析。
  简单来说,我们使用爬虫最根本的目的就是爬取网络上对我们有价值的信息和数据。因此,我们大部分的爬取工作都是过滤我们有用的信息,剔除无用的信息。这是爬虫的核心。
  4. 总结
  通过本节,我们了解了网页的基本元素。在使用爬虫的过程中,我们需要随时随地分析网页的组成元素。因此,熟练掌握的网页基本元素的构成,将用于我们后面的网页。分析很有帮助。 查看全部

  抓取ajax动态网页java(
就是网站的概念与具体讲解网页的构成的区别?)
  网页的基本组成和抓取原理
  网页是可以被浏览器等客户端解析的文件。与我们通常遇到的文件不同的是,网页是植根于互联网的。也就是说,我们通过浏览器浏览的大部分网页文件都不是本地的,它可能在世界上任何一台联网的电脑上。而且,通过互联网上的超链接,我们可以浏览世界任何一个角落的网络文件。这就是我们平时所说的网上冲浪,足不出户就可以融入整个世界。
  爬虫爬取的是数据,其实就是网页上的内容。我们将在本节中讨论具体的爬取原理。我们先来看看网站的概念:
  1. 网站 的概念
  在详细解释网页的组成之前。我们需要先了解网站的概念。
  网站 是向外界提供服务的多个网页的集合。主要分为静态网站和动态网站。
  1.1 静态网站
  静态网站表示网站下的所有页面都由HTML 网站组成。所谓静态并不是说网页是静态的,网页中还可以有动画、视频等信息。这里的静态是指无法与服务器交互。它只是被动地分析和显示服务器端响应返回的信息。
  静态网站的优点:
  易做搜索引擎收录,方便SEO优化。内容是独立的,不依赖于数据库。
  静态网站的缺点:
  维护成本比较大,大部分内容需要手动更新。页面不能交互,用户体验差。
  1.2 新闻网站
  动态网站相比静态网站,可以提供更多的交互体验。比如用户注册登录、实时推荐等功能。动态 网站 不仅收录静态 HTML 文件,还收录服务器端脚本,如 Jsp、Asp 等。
  动态网站的优点:
  用户体验好,可以实现更个性化的设置。服务端可以与客户端有更多的交互,方便服务端管理和分析数据。
  动态网站的缺点:
  需要和数据库一起处理,访问速度大大降低。对搜索引擎不友好。
  无论是网站中的静态网页,还是网站中的动态网页,它们都有一些共同的基本内容。让我们来看看网页的三个基本元素:
  2. 网页的三个基本元素:
  在接下来的章节中,我们将具体介绍网页的三个基本元素,这里只是简单介绍一些基本概念和用途。
  2.1 个 HTML
  HTML 是一种标记语言。标记语言不是编程语言,不能使用逻辑编程进行编程。它只是就一种文件呈现方式达成了一致。通过对不同标签所代表的不同含义达成一致,就可以在浏览器端呈现出丰富多彩的网页。它主要包括头部和主体两部分。HTML 主要负责页面的结构。
  2.2 CSS
  级联样式表,有时称为样式表。需要配合HTML使用才能提供丰富的渲染效果。
  2.3 Javascript
  它是一种脚本语言,广泛用于前端逻辑实现。很多自定义效果都可以通过javascript实现,是前端使用最广泛的编程语言。
  综上所述,HTML、CSS 和 Javascript 共同构成了丰富的网页样式。三者缺一不可。没有HTML、CSS、Javascript就是被动水,毫无意义;没有CSS,网页会失去颜色和样式,最终HTML也会一样;没有Javascript,我们就看不到动态网页。,不过是一潭死水。
  3. 爬取原理
  爬虫爬取的数据其实就是网页上的内容。我们需要通过一个特定的工具来分析网页,比如Beautiful Soup。然后提取HTML中特定标签下的数据。然后,数据被持久化存储,以方便日后的数据分析。
  简单来说,我们使用爬虫最根本的目的就是爬取网络上对我们有价值的信息和数据。因此,我们大部分的爬取工作都是过滤我们有用的信息,剔除无用的信息。这是爬虫的核心。
  4. 总结
  通过本节,我们了解了网页的基本元素。在使用爬虫的过程中,我们需要随时随地分析网页的组成元素。因此,熟练掌握的网页基本元素的构成,将用于我们后面的网页。分析很有帮助。

抓取ajax动态网页java(谷歌爬虫是如何抓取和收录什么类型的抓取JavaScript?)

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

  抓取ajax动态网页java(谷歌爬虫是如何抓取和收录什么类型的抓取JavaScript?)
  身体的一部分
  我们测试了 Google 爬虫如何抓取 JavaScript,这是我们从中学到的东西。
  认为 Google 无法处理 JavaScript?再想想。Audette Audette 分享了一系列测试结果。他和他的同事测试了 Google 和 收录 会抓取哪些类型的 JavaScript 函数。
  
  ​
  长话短说
  1. 我们进行了一系列测试,并确认谷歌可以以多种方式执行和收录 JavaScript。我们还确认了 Google 可以渲染整个页面并读取 DOM,从而可以收录 动态生成内容。
  2. DOM 中的 SEO 信号(页面标题、元描述、规范标签、元机器人标签等)都受到关注。动态插入到DOM中的内容也可以被爬取和收录。此外,在某些情况下,DOM 甚至可能优先于 HTML 源代码语句。虽然这需要更多的工作,但这是我们的几个测试之一。
  简介:Google 执行 JavaScript 并读取 DOM
  早在 2008 年,Google 就成功抓取了 JavaScript,但很可能仅限于某种方式。
  今天,很明显,Google 不仅可以制定自己的抓取和 收录 JavaScript 类型,而且在渲染整个网页方面也取得了重大进展(尤其是最近 12 到 18 个月)。
  在 Merkle,我们的 SEO 技术团队希望更好地了解 Google 爬虫可以抓取哪些类型的 JavaScript 事件和 收录。经过研究,我们发现了惊人的结果,并确认 Google 不仅可以执行各种 JavaScript 事件,还可以动态生成收录 内容。怎么做?Google 可以读取 DOM。
  什么是DOM?
  很多从事SEO的人不了解什么是文档对象模型(DOM)。
  
  ​
  当浏览器请求一个页面时会发生什么,DOM 是如何参与的?
  在 Web 浏览器中使用时,DOM 本质上是一个应用程序接口或 API,用于标记和构建数据(例如 HTML 和 XML)。该界面允许 Web 浏览器将它们组合成一个文档。
  DOM 还定义了如何获取和操作结构。尽管 DOM 是一种独立于语言的 API(不依赖于特定的编程语言或库),但它通常用于 Web 应用程序中的 JavaScript 和动态内容。
  DOM 代表接口或“桥”,将网页与编程语言连接起来。解析 HTML 并执行 JavaScript 的结果就是 DOM。网页的内容不仅(不仅)是源代码,而且是 DOM。这使它变得非常重要。
  
  ​
  JavaScript 如何通过 DOM 接口工作。
  我们很高兴地发现 Google 可以读取 DOM,并且可以解析信号和动态插入的内容,例如标题标签、页面文本、标题标签和元注释(例如:rel = canonical)。您可以阅读完整的详细信息。
  这一系列的测试和结果
  因为想知道会爬取哪些JavaScript特性和收录,所以分别在谷歌爬虫上创建了一系列测试。通过创建控件,确保可以独立理解 URL 活动。下面,让我们详细介绍一些有趣的测试结果。它们分为5类:
  JavaScript 重定向
  JavaScript 链接
  动态插入内容
  动态插入元数据和页面元素
  rel = "nofollow" 的一个重要例子
  
  ​
  示例:用于测试 Google 抓取工具理解 JavaScript 能力的页面。
  1. JavaScript 重定向
  我们首先测试了常见的 JavaScript 重定向。URL 以不同方式表达的结果是什么?我们为两个测试选择了 window.location 对象:测试 A 使用绝对路径 URL 调用 window.location,测试 B 使用它。相对路径。
  结果:重定向很快就被谷歌跟踪了。从收录的角度来看,它们被解释为301——最终状态URL,而不是谷歌收录中的重定向URL。
  在随后的测试中,我们在权威网页上使用完全相同的内容来完成使用 JavaScript 重定向到同一站点的新页面。原创网址在 Google 热门查询的主页上排名。
  结果:果然,重定向被谷歌跟踪了,但是原创页面不是收录。新的URL是收录,它立即在同一个查询页面的同一个位置上排名。这让我们感到惊讶。从排名的角度来看,JavaScript 重定向行为(有时)似乎与永久性 301 重定向非常相似。
  下次,您的客户想要为他们的 网站 完成 JavaScript 重定向动作,您可能不需要回答,或者回答:“请不要”。因为这好像有转职排名信号的关系。引用谷歌指南支持这一结论:
  使用 JavaScript 重定向用户可能是一种合法的做法。例如,如果您将登录用户重定向到内部页面,则可以使用 JavaScript 来完成此操作。在仔细检查 JavaScript 或其他重定向方法时,请确保您的网站遵循我们的指南并考虑其意图。请记住,将 301 重定向重定向到您的 网站 是最好的,但如果您没有访问您的 网站 服务器的权限,您可以为此使用 JavaScript 重定向。
  2. JavaScript 链接
  我们使用多种编码方法测试了不同类型的 JS 链接。
  我们测试下拉菜单的链接。历史搜索引擎一直无法跟踪这种类型的链接。我们要确定是否会跟踪 onchange 事件处理程序。重要的是,这只是一种特定的执行类型,而我们需要的是:其他变化的影响,而不是像上面JavaScript重定向的强制操作。
  
  ​
  示例:Google Work 页面上的语言选择下拉菜单。
  结果:链接被完全抓取和跟踪。
  我们还测试了常见的 JavaScript 链接。以下是最常见的 JavaScript 链接类型,而传统 SEO 推荐纯文本。这些测试包括 JavaScript 链接代码:
  作用于外部 href 键值对 (AVP),但在标签内(“onClick”)
  使用 href 内部 AVP("javascript: window.location")
  在 a 标签之外执行,但在 href 中调用 AVP("javascript: openlink()")
  还有很多
  结果:链接被完全抓取和跟踪。
  我们接下来的测试是进一步测试事件处理程序,比如上面的onchange测试。具体来说,我们要使用鼠标移动的事件处理程序,然后隐藏 URL 变量,该变量仅在事件处理程序函数(在本例中为 onmousedown 和 onmouseout)被触发时执行。
  结果:链接被完全抓取和跟踪。
  构造链接:我们知道谷歌可以执行JavaScript,但我们想确认他们是否可以读取代码中的变量。所以在这个测试中,我们连接可以构造 URL 字符串的字符。
  结果:链接被完全抓取和跟踪。
  3. 动态插入内容
  显然,这些是要点:动态插入文本、图像、链接和导航。高质量的文本内容对于搜索引擎理解网页的主题和内容至关重要。在这个充满活力的网站时代,它的重要性毋庸置疑。
  这些测试旨在检查在两种不同场景中动态插入文本的结果。
  1)。测试搜索引擎是否可以统计动态插入的文本,文本来自页面的HTML源代码。
  2)。测试搜索引擎是否可以统计动态插入的文本,并且文本来自页面的HTML源代码之外(在外部JavaScript文件中)。
  结果:两种情况下都可以抓取文本和收录,页面根据内容排名。凉爽的!
  为了深入了解,我们测试了一个用JavaScript编写的客户端全局导航,导航中的链接是通过document.writeIn函数插入的,确认可以完全爬取和跟踪。需要指出的是,Google 可以解释网站 使用AngularJS 框架和HTML5 History API (pushState) 构建,可以渲染和收录 它,并且可以像传统静态网页一样进行排名。这就是不禁止 Google 爬虫获取外部文件和 JavaScript 的重要性,这可能也是 Google 将其从 Ajax Supporting SEO Guide 中删除的原因。当您可以简单地呈现整个页面时,谁需要 HTML 快照?
  经过测试,发现无论是什么类型的内容,结果都是一样的。例如,在加载到 DOM 后将获取图像并收录。我们甚至做了这样的测试:通过动态生成结构数据来制作面包屑(breadcrumb navigation),并插入到DOM中。结果?成功插入后的面包屑出现在搜索结果中(搜索引擎结果页面)。
  值得注意的是,Google 现在推荐使用 JSON-LD 标签来形成结构化数据。我相信未来会有更多基于此的东西。
  4. 动态插入元数据和页面元素
  我们动态地将各种对 SEO 至关重要的标签插入到 DOM 中:
  标题元素
  元描述
  元机器人
  规范标签
  结果:在所有情况下,标签都可以被抓取并表现得像 HTML 源代码中的元素。
  一个有趣的补充实验可以帮助我们理解优先级的顺序。当出现相互矛盾的信号时,哪一个会获胜?如果源代码中没有index,nofollow标签,DOM中没有index,follow标签,会发生什么?在这个协议中,HTTP x-robots 响应头如何作为另一个变量使用行为?这将是未来全面测试的一部分。但是,我们的测试表明,当发生冲突时,Google 会忽略源代码中的标签并支持 DOM。
  5. rel="nofollow" 的一个重要例子
  我们想测试谷歌如何响应出现在源代码和 DOM 链接级别的 nofollow 属性。我们还创建了一个没有 nofollow 的控件。
  
  ​
  对于nofollow,我们分别测试了源代码和DOM生成的注解。
  源代码中的 nofollow 按预期工作(不跟踪链接)。但是DOM中的nofollow无效(链接被跟踪,页面为收录)。为什么?因为修改 DOM 中的 href 元素的操作发生得太晚了:Google 在执行添加 rel="nofollow" 的 JavaScript 函数之前,已准备好抓取链接并排队等待 URL。但是,如果将带有 href="nofollow" 的 a 元素插入到 DOM 中,nofollow 和链接将被跟踪,因为它们是同时插入的。
  结果
  从历史的角度来看,各种 SEO 建议都尽可能关注“纯文本”内容。动态生成的内容、AJAX 和 JavaScript 链接会损害主流搜索引擎的 SEO。显然,这对谷歌来说不再是问题。JavaScript 链接的操作方式类似于普通的 HTML 链接(这只是表面,我们不知道程序在幕后做了什么)。
  JavaScript 重定向的处理方式与 301 重定向类似。
  动态插入内容,甚至元标记,例如rel规范注释,无论是在HTML源代码中还是在解析初始HTML后触发JavaScript生成DOM都以相同的方式处理。
  Google 依赖于完全呈现页面和理解 DOM,而不仅仅是源代码。太不可思议了!(请记住允许 Google 爬虫获取这些外部文件和 JavaScript。)
  谷歌已经以惊人的速度在创新方面将其他搜索引擎甩在了后面。我们希望在其他搜索引擎中看到相同类型的创新。如果他们要在新的网络时代保持竞争力并取得实质性进展,就意味着他们需要更好地支持 HTML5、JavaScript 和动态网站。
  对于SEO来说,不了解上述基本概念和谷歌技术的人应该学习学习,以赶上当前的技术。如果你不考虑 DOM,你可能会失去一半的份额。
  并非本文所表达的所有观点均由 Search Engine Land(搜索引擎 网站)提供,部分观点由客座作者提供。所有作者的名单。 查看全部

  抓取ajax动态网页java(谷歌爬虫是如何抓取和收录什么类型的抓取JavaScript?)
  身体的一部分
  我们测试了 Google 爬虫如何抓取 JavaScript,这是我们从中学到的东西。
  认为 Google 无法处理 JavaScript?再想想。Audette Audette 分享了一系列测试结果。他和他的同事测试了 Google 和 收录 会抓取哪些类型的 JavaScript 函数。
  
  ​
  长话短说
  1. 我们进行了一系列测试,并确认谷歌可以以多种方式执行和收录 JavaScript。我们还确认了 Google 可以渲染整个页面并读取 DOM,从而可以收录 动态生成内容。
  2. DOM 中的 SEO 信号(页面标题、元描述、规范标签、元机器人标签等)都受到关注。动态插入到DOM中的内容也可以被爬取和收录。此外,在某些情况下,DOM 甚至可能优先于 HTML 源代码语句。虽然这需要更多的工作,但这是我们的几个测试之一。
  简介:Google 执行 JavaScript 并读取 DOM
  早在 2008 年,Google 就成功抓取了 JavaScript,但很可能仅限于某种方式。
  今天,很明显,Google 不仅可以制定自己的抓取和 收录 JavaScript 类型,而且在渲染整个网页方面也取得了重大进展(尤其是最近 12 到 18 个月)。
  在 Merkle,我们的 SEO 技术团队希望更好地了解 Google 爬虫可以抓取哪些类型的 JavaScript 事件和 收录。经过研究,我们发现了惊人的结果,并确认 Google 不仅可以执行各种 JavaScript 事件,还可以动态生成收录 内容。怎么做?Google 可以读取 DOM。
  什么是DOM?
  很多从事SEO的人不了解什么是文档对象模型(DOM)。
  
  ​
  当浏览器请求一个页面时会发生什么,DOM 是如何参与的?
  在 Web 浏览器中使用时,DOM 本质上是一个应用程序接口或 API,用于标记和构建数据(例如 HTML 和 XML)。该界面允许 Web 浏览器将它们组合成一个文档。
  DOM 还定义了如何获取和操作结构。尽管 DOM 是一种独立于语言的 API(不依赖于特定的编程语言或库),但它通常用于 Web 应用程序中的 JavaScript 和动态内容。
  DOM 代表接口或“桥”,将网页与编程语言连接起来。解析 HTML 并执行 JavaScript 的结果就是 DOM。网页的内容不仅(不仅)是源代码,而且是 DOM。这使它变得非常重要。
  
  ​
  JavaScript 如何通过 DOM 接口工作。
  我们很高兴地发现 Google 可以读取 DOM,并且可以解析信号和动态插入的内容,例如标题标签、页面文本、标题标签和元注释(例如:rel = canonical)。您可以阅读完整的详细信息。
  这一系列的测试和结果
  因为想知道会爬取哪些JavaScript特性和收录,所以分别在谷歌爬虫上创建了一系列测试。通过创建控件,确保可以独立理解 URL 活动。下面,让我们详细介绍一些有趣的测试结果。它们分为5类:
  JavaScript 重定向
  JavaScript 链接
  动态插入内容
  动态插入元数据和页面元素
  rel = "nofollow" 的一个重要例子
  
  ​
  示例:用于测试 Google 抓取工具理解 JavaScript 能力的页面。
  1. JavaScript 重定向
  我们首先测试了常见的 JavaScript 重定向。URL 以不同方式表达的结果是什么?我们为两个测试选择了 window.location 对象:测试 A 使用绝对路径 URL 调用 window.location,测试 B 使用它。相对路径。
  结果:重定向很快就被谷歌跟踪了。从收录的角度来看,它们被解释为301——最终状态URL,而不是谷歌收录中的重定向URL。
  在随后的测试中,我们在权威网页上使用完全相同的内容来完成使用 JavaScript 重定向到同一站点的新页面。原创网址在 Google 热门查询的主页上排名。
  结果:果然,重定向被谷歌跟踪了,但是原创页面不是收录。新的URL是收录,它立即在同一个查询页面的同一个位置上排名。这让我们感到惊讶。从排名的角度来看,JavaScript 重定向行为(有时)似乎与永久性 301 重定向非常相似。
  下次,您的客户想要为他们的 网站 完成 JavaScript 重定向动作,您可能不需要回答,或者回答:“请不要”。因为这好像有转职排名信号的关系。引用谷歌指南支持这一结论:
  使用 JavaScript 重定向用户可能是一种合法的做法。例如,如果您将登录用户重定向到内部页面,则可以使用 JavaScript 来完成此操作。在仔细检查 JavaScript 或其他重定向方法时,请确保您的网站遵循我们的指南并考虑其意图。请记住,将 301 重定向重定向到您的 网站 是最好的,但如果您没有访问您的 网站 服务器的权限,您可以为此使用 JavaScript 重定向。
  2. JavaScript 链接
  我们使用多种编码方法测试了不同类型的 JS 链接。
  我们测试下拉菜单的链接。历史搜索引擎一直无法跟踪这种类型的链接。我们要确定是否会跟踪 onchange 事件处理程序。重要的是,这只是一种特定的执行类型,而我们需要的是:其他变化的影响,而不是像上面JavaScript重定向的强制操作。
  
  ​
  示例:Google Work 页面上的语言选择下拉菜单。
  结果:链接被完全抓取和跟踪。
  我们还测试了常见的 JavaScript 链接。以下是最常见的 JavaScript 链接类型,而传统 SEO 推荐纯文本。这些测试包括 JavaScript 链接代码:
  作用于外部 href 键值对 (AVP),但在标签内(“onClick”)
  使用 href 内部 AVP("javascript: window.location")
  在 a 标签之外执行,但在 href 中调用 AVP("javascript: openlink()")
  还有很多
  结果:链接被完全抓取和跟踪。
  我们接下来的测试是进一步测试事件处理程序,比如上面的onchange测试。具体来说,我们要使用鼠标移动的事件处理程序,然后隐藏 URL 变量,该变量仅在事件处理程序函数(在本例中为 onmousedown 和 onmouseout)被触发时执行。
  结果:链接被完全抓取和跟踪。
  构造链接:我们知道谷歌可以执行JavaScript,但我们想确认他们是否可以读取代码中的变量。所以在这个测试中,我们连接可以构造 URL 字符串的字符。
  结果:链接被完全抓取和跟踪。
  3. 动态插入内容
  显然,这些是要点:动态插入文本、图像、链接和导航。高质量的文本内容对于搜索引擎理解网页的主题和内容至关重要。在这个充满活力的网站时代,它的重要性毋庸置疑。
  这些测试旨在检查在两种不同场景中动态插入文本的结果。
  1)。测试搜索引擎是否可以统计动态插入的文本,文本来自页面的HTML源代码。
  2)。测试搜索引擎是否可以统计动态插入的文本,并且文本来自页面的HTML源代码之外(在外部JavaScript文件中)。
  结果:两种情况下都可以抓取文本和收录,页面根据内容排名。凉爽的!
  为了深入了解,我们测试了一个用JavaScript编写的客户端全局导航,导航中的链接是通过document.writeIn函数插入的,确认可以完全爬取和跟踪。需要指出的是,Google 可以解释网站 使用AngularJS 框架和HTML5 History API (pushState) 构建,可以渲染和收录 它,并且可以像传统静态网页一样进行排名。这就是不禁止 Google 爬虫获取外部文件和 JavaScript 的重要性,这可能也是 Google 将其从 Ajax Supporting SEO Guide 中删除的原因。当您可以简单地呈现整个页面时,谁需要 HTML 快照?
  经过测试,发现无论是什么类型的内容,结果都是一样的。例如,在加载到 DOM 后将获取图像并收录。我们甚至做了这样的测试:通过动态生成结构数据来制作面包屑(breadcrumb navigation),并插入到DOM中。结果?成功插入后的面包屑出现在搜索结果中(搜索引擎结果页面)。
  值得注意的是,Google 现在推荐使用 JSON-LD 标签来形成结构化数据。我相信未来会有更多基于此的东西。
  4. 动态插入元数据和页面元素
  我们动态地将各种对 SEO 至关重要的标签插入到 DOM 中:
  标题元素
  元描述
  元机器人
  规范标签
  结果:在所有情况下,标签都可以被抓取并表现得像 HTML 源代码中的元素。
  一个有趣的补充实验可以帮助我们理解优先级的顺序。当出现相互矛盾的信号时,哪一个会获胜?如果源代码中没有index,nofollow标签,DOM中没有index,follow标签,会发生什么?在这个协议中,HTTP x-robots 响应头如何作为另一个变量使用行为?这将是未来全面测试的一部分。但是,我们的测试表明,当发生冲突时,Google 会忽略源代码中的标签并支持 DOM。
  5. rel="nofollow" 的一个重要例子
  我们想测试谷歌如何响应出现在源代码和 DOM 链接级别的 nofollow 属性。我们还创建了一个没有 nofollow 的控件。
  
  ​
  对于nofollow,我们分别测试了源代码和DOM生成的注解。
  源代码中的 nofollow 按预期工作(不跟踪链接)。但是DOM中的nofollow无效(链接被跟踪,页面为收录)。为什么?因为修改 DOM 中的 href 元素的操作发生得太晚了:Google 在执行添加 rel="nofollow" 的 JavaScript 函数之前,已准备好抓取链接并排队等待 URL。但是,如果将带有 href="nofollow" 的 a 元素插入到 DOM 中,nofollow 和链接将被跟踪,因为它们是同时插入的。
  结果
  从历史的角度来看,各种 SEO 建议都尽可能关注“纯文本”内容。动态生成的内容、AJAX 和 JavaScript 链接会损害主流搜索引擎的 SEO。显然,这对谷歌来说不再是问题。JavaScript 链接的操作方式类似于普通的 HTML 链接(这只是表面,我们不知道程序在幕后做了什么)。
  JavaScript 重定向的处理方式与 301 重定向类似。
  动态插入内容,甚至元标记,例如rel规范注释,无论是在HTML源代码中还是在解析初始HTML后触发JavaScript生成DOM都以相同的方式处理。
  Google 依赖于完全呈现页面和理解 DOM,而不仅仅是源代码。太不可思议了!(请记住允许 Google 爬虫获取这些外部文件和 JavaScript。)
  谷歌已经以惊人的速度在创新方面将其他搜索引擎甩在了后面。我们希望在其他搜索引擎中看到相同类型的创新。如果他们要在新的网络时代保持竞争力并取得实质性进展,就意味着他们需要更好地支持 HTML5、JavaScript 和动态网站。
  对于SEO来说,不了解上述基本概念和谷歌技术的人应该学习学习,以赶上当前的技术。如果你不考虑 DOM,你可能会失去一半的份额。
  并非本文所表达的所有观点均由 Search Engine Land(搜索引擎 网站)提供,部分观点由客座作者提供。所有作者的名单。

抓取ajax动态网页java(NutchNutchX版本实现请访问:基于ApacheNutch1.8和Htmlunit组件)

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

  抓取ajax动态网页java(NutchNutchX版本实现请访问:基于ApacheNutch1.8和Htmlunit组件)
  -------------------------------------------------- -------------------------------------------------- ------温馨提示:项目当前版本不会更新,最新Apache Nutch 2.X版本实现,请访问:-------------- ------- ------------------------------------------- -----------------------------------------------Nutch Htmlunit Plugin 项目介绍
  基于Apache Nutch1.8和Htmlunit组件,实现了AJAX加载类型页面的完整页面内容爬取分析。
  根据Apache Nutch 1.8 的实现,我们无法从收录AJAX 请求的fetch 页面中获取动态HTML 信息,因为它会忽略所有AJAX 请求。
  这个插件将使用 Htmlunit 来获取具有必要动态 AJAX 请求的整个页面内容。它是使用 Apache Nutch 1.8 开发和测试的,您可以在其他 Nutch 版本上试用它或将源代码重构为您的设计。
  主要特点 跑步体验
  由于Nutch基于Unix/Linux环境运行,请自行准备Unix/Linux系统或Cygwin运行环境。
  git clone 整个项目代码后,进入到本地的git下载目录:
  cd nutch-htmlunit/运行时/本地
  bin/crawl urls crawl false 1
  //urls参数为爬虫存放url文件目录;crawl 是爬虫输出目录;false应该是solr索引url参数,这里设置为false不做solr索引处理;1是爬虫执行次数
  操作结束后,可以看到天猫商品页面的价格/描述/滚动加载图片等信息已经全部获取完毕。
  运行日志输入示例参考:
  扩展插件说明源码项目说明
  整个项目基于Apache Nutch 1.8 源代码项目扩展插件实现。插件的定义和配置与官方插件处理方式一致。详情请参考Apache Nutch 1.8 官方文档。具体实现原理和代码请导入Eclipse项目查看。
  开源许可说明
  本项目所有代码完整开源,可自由使用:开源、非开源、商业和非商业,前提是保留本项目的源码信息,未经授权销售本项目项目保证不执行。
  如果您想提供基于Apache Nutch/Solr/Lucene等系列技术的定制化扩展实现/技术咨询服务/毕业设计指导/二次开发项目指导,可以联系E-Mail:或(加Q请注明:nutch/ solr/lucene) 议价服务。【以上联系方式不直接提供免费技术咨询查询。如果您对项目有任何技术问题或issue反馈,请直接提交到项目站点提问或在Git平台上Issue]
  参考
  欢迎关注作者的其他项目: 查看全部

  抓取ajax动态网页java(NutchNutchX版本实现请访问:基于ApacheNutch1.8和Htmlunit组件)
  -------------------------------------------------- -------------------------------------------------- ------温馨提示:项目当前版本不会更新,最新Apache Nutch 2.X版本实现,请访问:-------------- ------- ------------------------------------------- -----------------------------------------------Nutch Htmlunit Plugin 项目介绍
  基于Apache Nutch1.8和Htmlunit组件,实现了AJAX加载类型页面的完整页面内容爬取分析。
  根据Apache Nutch 1.8 的实现,我们无法从收录AJAX 请求的fetch 页面中获取动态HTML 信息,因为它会忽略所有AJAX 请求。
  这个插件将使用 Htmlunit 来获取具有必要动态 AJAX 请求的整个页面内容。它是使用 Apache Nutch 1.8 开发和测试的,您可以在其他 Nutch 版本上试用它或将源代码重构为您的设计。
  主要特点 跑步体验
  由于Nutch基于Unix/Linux环境运行,请自行准备Unix/Linux系统或Cygwin运行环境。
  git clone 整个项目代码后,进入到本地的git下载目录:
  cd nutch-htmlunit/运行时/本地
  bin/crawl urls crawl false 1
  //urls参数为爬虫存放url文件目录;crawl 是爬虫输出目录;false应该是solr索引url参数,这里设置为false不做solr索引处理;1是爬虫执行次数
  操作结束后,可以看到天猫商品页面的价格/描述/滚动加载图片等信息已经全部获取完毕。
  运行日志输入示例参考:
  扩展插件说明源码项目说明
  整个项目基于Apache Nutch 1.8 源代码项目扩展插件实现。插件的定义和配置与官方插件处理方式一致。详情请参考Apache Nutch 1.8 官方文档。具体实现原理和代码请导入Eclipse项目查看。
  开源许可说明
  本项目所有代码完整开源,可自由使用:开源、非开源、商业和非商业,前提是保留本项目的源码信息,未经授权销售本项目项目保证不执行。
  如果您想提供基于Apache Nutch/Solr/Lucene等系列技术的定制化扩展实现/技术咨询服务/毕业设计指导/二次开发项目指导,可以联系E-Mail:或(加Q请注明:nutch/ solr/lucene) 议价服务。【以上联系方式不直接提供免费技术咨询查询。如果您对项目有任何技术问题或issue反馈,请直接提交到项目站点提问或在Git平台上Issue]
  参考
  欢迎关注作者的其他项目:

抓取ajax动态网页java(什么是Ajax:Ajax(AsynchronouseJavaScript)异步JavaScript和XML)

网站优化优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2021-10-16 05:09 • 来自相关话题

  抓取ajax动态网页java(什么是Ajax:Ajax(AsynchronouseJavaScript)异步JavaScript和XML)
  什么是阿贾克斯:
  Ajax (Asynchronouse JavaScript And XML) 异步 JavaScript 和 XML。通过在后台与服务器交换少量数据,Ajax 可以使网页异步更新。这意味着可以在不重新加载整个网页的情况下更新网页的某些部分。如果内容需要更新,传统网页(不使用 Ajax)必须重新加载整个网页。因为传统的数据传输格式是XML语法。所以它被称为 AJAX。其实现在数据交互基本都是用JSON。使用AJAX加载的数据,即使使用JS将数据渲染到浏览器中,右击->查看网页源码也看不到ajax加载的数据,只能看到使用这个加载的html代码网址。
  ajax数据的获取方式:直接分析ajax调用的接口。然后通过代码请求这个接口。使用Selenium+chromedriver模拟浏览器行为获取数据。方式优缺点
  分析界面
  可以直接请求数据。无需做一些解析工作。代码量小,性能高。
  解析接口比较复杂,尤其是一些被js混淆的接口,必须有一定的js基础。很容易被发现为爬虫。
  硒
  直接模拟浏览器的行为。浏览器可以请求的内容也可以使用 selenium 请求。爬虫更稳定。
  很多代码。低性能。
  Selenium+chromedriver 获取动态数据:
  Selenium 相当于一个机器人。可以在浏览器上模拟一些人类的行为,在浏览器上自动处理一些行为,比如点击、填充数据、删除cookies等。 chromedriver是一个驱动Chrome浏览器的驱动,可以用来驱动浏览器. 当然,不同的浏览器有不同的驱动程序。下面列出了不同的浏览器及其相应的驱动程序:
  Chrome: Firefox: Edge: Safari: 安装 Selenium 和 chromedriver:
  安装Selenium:Selenium 有多种语言版本,如java、ruby、python 等,我们可以下载python 版本。
  pip install selenium
  安装chromedriver:下载完成后,放在一个不需要权限的纯英文目录下。
  快速开始:
  下面我们就拿百度首页做个简单的例子来说一下如何快速上手Selenium和chromedriver:
  from selenium import webdriver
# chromedriver的绝对路径
driver_path = r'D:\ProgramApp\chromedriver\chromedriver.exe'
# 初始化一个driver,并且指定chromedriver的路径
driver = webdriver.Chrome(executable_path=driver_path)
# 请求网页
driver.get("https://www.baidu.com/")
# 通过page_source获取网页源代码
print(driver.page_source)
  Selenium 常见操作:
  更多教程请参考:
  关闭页面: driver.close():关闭当前页面。driver.quit():退出整个浏览器。定位元素:
  find_element_by_id:根据 id 查找元素。相当于:
   submitTag = driver.find_element_by_id('su')
submitTag1 = driver.find_element(By.ID,'su')
  find_element_by_class_name:根据类名查找元素。相当于:
   submitTag = driver.find_element_by_class_name('su')
submitTag1 = driver.find_element(By.CLASS_NAME,'su')
  find_element_by_name:根据name属性的值查找元素。相当于:
   submitTag = driver.find_element_by_name('email')
submitTag1 = driver.find_element(By.NAME,'email')
  find_element_by_tag_name:根据标签名称查找元素。相当于:
   submitTag = driver.find_element_by_tag_name('div')
submitTag1 = driver.find_element(By.TAG_NAME,'div')
  find_element_by_xpath:根据 xpath 语法获取元素。相当于:
   submitTag = driver.find_element_by_xpath('//div')
submitTag1 = driver.find_element(By.XPATH,'//div')
  find_element_by_css_selector:根据css选择器选择元素。相当于:
   submitTag = driver.find_element_by_css_selector('//div')
submitTag1 = driver.find_element(By.CSS_SELECTOR,'//div')
  需要注意的是 find_element 是获取第一个满足条件的元素。find_elements 是获取所有满足条件的元素。
  操作表单元素:
  操作输入框:分为两步。第一步:找到这个元素。第二步:使用send_keys(value)填写数据。示例代码如下:
   inputTag = driver.find_element_by_id('kw')
inputTag.send_keys('python')
  使用clear方法清除输入框的内容。示例代码如下:
  inputTag.clear()
  操作复选框:因为要选中复选框标签,所以在网页上用鼠标点击它。因此,如果要选中复选框标签,请先选中此标签,然后再执行点击事件。示例代码如下:
   rememberTag = driver.find_element_by_name("rememberMe")
rememberTag.click()
  选择选择:不能直接点击选择元素。因为元素需要点击后被选中。这时,selenium 专门为 select 标签提供了一个类 selenium.webdriver.support.ui.Select。将获取的元素作为参数传递给该类以创建该对象。您可以在将来使用此对象进行选择。示例代码如下:
   from selenium.webdriver.support.ui import Select
# 选中这个标签,然后使用Select创建对象
selectTag = Select(driver.find_element_by_name("jumpMenu"))
# 根据索引选择
selectTag.select_by_index(1)
# 根据值选择
selectTag.select_by_value("http://www.95yueba.com")
# 根据可视的文本选择
selectTag.select_by_visible_text("95秀客户端")
# 取消选中所有选项
selectTag.deselect_all()
  操作按钮:操作按钮的方式有很多种。比如单击、右键、双击等,这里是最常用的一种。只需点击。直接调用click函数就行了。示例代码如下:
   inputTag = driver.find_element_by_id('su')
inputTag.click()
  行为链:
  有时页面上的操作可能会有很多步骤,这时可以使用鼠标行为链类ActionChains来完成。例如,现在您想将鼠标移动到一个元素并执行一个点击事件。那么示例代码如下:
  inputTag = driver.find_element_by_id('kw')
submitTag = driver.find_element_by_id('su')
actions = ActionChains(driver)
actions.move_to_element(inputTag)
actions.send_keys_to_element(inputTag,'python')
actions.move_to_element(submitTag)
actions.click(submitTag)
actions.perform()
  还有更多与鼠标相关的操作。
  饼干操作:
  获取所有 cookie:
   for cookie in driver.get_cookies():
print(cookie)
  根据cookie的key获取value:
  value = driver.get_cookie(key)
  删除所有 cookie:
   driver.delete_all_cookies()
  删除一个cookie:
   driver.delete_cookie(key)
  页面等待:
  现在越来越多的网页使用 Ajax 技术,因此程序无法确定元素何时完全加载。如果实际页面等待时间过长,某个dom元素没有出来,而你的代码直接使用了这个WebElement,那么就会抛出NullPointer异常。为了解决这个问题。所以Selenium提供了两种等待方式:一种是隐式等待,另一种是显式等待。
  隐式等待:调用 driver.implicitly_wait。然后,在获取不可用元素之前,它会等待 10 秒。示例代码如下:
  driver = webdriver.Chrome(executable_path=driver_path)
driver.implicitly_wait(10)
# 请求网页
driver.get("https://www.douban.com/")
  显示等待:显示等待是在满足一定条件后执行获取元素的操作。也可以指定等待的最长时间,超过这个时间就会抛出异常。显示等待应在 selenium.webdriver.support.excepted_conditions 和 selenium.webdriver.support.ui.WebDriverWait 的预期条件下完成。示例代码如下:
   from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
  其他一些等待条件:
  切换页面:
  有时窗口中有很多子标签页。这个时候必须切换。Selenium 提供了一个 switch_to_window 来切换。要切换到的特定页面可以在 driver.window_handles 中找到。示例代码如下:
  # 打开一个新的页面
# 切换到这个新的页面中
self.driver.switch_to_window(self.driver.window_handles[1])
  设置代理ip:
  有时会频繁抓取一些网页。服务器发现你是爬虫后会屏蔽你的ip地址。这时候我们就可以更改代理ip了。更改代理ip,不同浏览器实现方式不同。以下是 Chrome 浏览器的示例:
  from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://110.73.2.248:8123")
driver_path = r"D:\ProgramApp\chromedriver\chromedriver.exe"
driver = webdriver.Chrome(executable_path=driver_path,chrome_options=options)
driver.get('http://httpbin.org/ip')
  WebElement 元素:
  from selenium.webdriver.remote.webelement import WebElement类是每个获取出来的元素的所属类。
  有一些常用的属性:
  get_attribute:此标签的属性值。screentshot:获取当前页面的截图。此方法只能在驱动程序上使用。
  驱动程序的对象类也继承自 WebElement。
  更多内容请阅读相关源码。 查看全部

  抓取ajax动态网页java(什么是Ajax:Ajax(AsynchronouseJavaScript)异步JavaScript和XML)
  什么是阿贾克斯:
  Ajax (Asynchronouse JavaScript And XML) 异步 JavaScript 和 XML。通过在后台与服务器交换少量数据,Ajax 可以使网页异步更新。这意味着可以在不重新加载整个网页的情况下更新网页的某些部分。如果内容需要更新,传统网页(不使用 Ajax)必须重新加载整个网页。因为传统的数据传输格式是XML语法。所以它被称为 AJAX。其实现在数据交互基本都是用JSON。使用AJAX加载的数据,即使使用JS将数据渲染到浏览器中,右击->查看网页源码也看不到ajax加载的数据,只能看到使用这个加载的html代码网址。
  ajax数据的获取方式:直接分析ajax调用的接口。然后通过代码请求这个接口。使用Selenium+chromedriver模拟浏览器行为获取数据。方式优缺点
  分析界面
  可以直接请求数据。无需做一些解析工作。代码量小,性能高。
  解析接口比较复杂,尤其是一些被js混淆的接口,必须有一定的js基础。很容易被发现为爬虫。
  硒
  直接模拟浏览器的行为。浏览器可以请求的内容也可以使用 selenium 请求。爬虫更稳定。
  很多代码。低性能。
  Selenium+chromedriver 获取动态数据:
  Selenium 相当于一个机器人。可以在浏览器上模拟一些人类的行为,在浏览器上自动处理一些行为,比如点击、填充数据、删除cookies等。 chromedriver是一个驱动Chrome浏览器的驱动,可以用来驱动浏览器. 当然,不同的浏览器有不同的驱动程序。下面列出了不同的浏览器及其相应的驱动程序:
  Chrome: Firefox: Edge: Safari: 安装 Selenium 和 chromedriver:
  安装Selenium:Selenium 有多种语言版本,如java、ruby、python 等,我们可以下载python 版本。
  pip install selenium
  安装chromedriver:下载完成后,放在一个不需要权限的纯英文目录下。
  快速开始:
  下面我们就拿百度首页做个简单的例子来说一下如何快速上手Selenium和chromedriver:
  from selenium import webdriver
# chromedriver的绝对路径
driver_path = r'D:\ProgramApp\chromedriver\chromedriver.exe'
# 初始化一个driver,并且指定chromedriver的路径
driver = webdriver.Chrome(executable_path=driver_path)
# 请求网页
driver.get("https://www.baidu.com/";)
# 通过page_source获取网页源代码
print(driver.page_source)
  Selenium 常见操作:
  更多教程请参考:
  关闭页面: driver.close():关闭当前页面。driver.quit():退出整个浏览器。定位元素:
  find_element_by_id:根据 id 查找元素。相当于:
   submitTag = driver.find_element_by_id('su')
submitTag1 = driver.find_element(By.ID,'su')
  find_element_by_class_name:根据类名查找元素。相当于:
   submitTag = driver.find_element_by_class_name('su')
submitTag1 = driver.find_element(By.CLASS_NAME,'su')
  find_element_by_name:根据name属性的值查找元素。相当于:
   submitTag = driver.find_element_by_name('email')
submitTag1 = driver.find_element(By.NAME,'email')
  find_element_by_tag_name:根据标签名称查找元素。相当于:
   submitTag = driver.find_element_by_tag_name('div')
submitTag1 = driver.find_element(By.TAG_NAME,'div')
  find_element_by_xpath:根据 xpath 语法获取元素。相当于:
   submitTag = driver.find_element_by_xpath('//div')
submitTag1 = driver.find_element(By.XPATH,'//div')
  find_element_by_css_selector:根据css选择器选择元素。相当于:
   submitTag = driver.find_element_by_css_selector('//div')
submitTag1 = driver.find_element(By.CSS_SELECTOR,'//div')
  需要注意的是 find_element 是获取第一个满足条件的元素。find_elements 是获取所有满足条件的元素。
  操作表单元素:
  操作输入框:分为两步。第一步:找到这个元素。第二步:使用send_keys(value)填写数据。示例代码如下:
   inputTag = driver.find_element_by_id('kw')
inputTag.send_keys('python')
  使用clear方法清除输入框的内容。示例代码如下:
  inputTag.clear()
  操作复选框:因为要选中复选框标签,所以在网页上用鼠标点击它。因此,如果要选中复选框标签,请先选中此标签,然后再执行点击事件。示例代码如下:
   rememberTag = driver.find_element_by_name("rememberMe")
rememberTag.click()
  选择选择:不能直接点击选择元素。因为元素需要点击后被选中。这时,selenium 专门为 select 标签提供了一个类 selenium.webdriver.support.ui.Select。将获取的元素作为参数传递给该类以创建该对象。您可以在将来使用此对象进行选择。示例代码如下:
   from selenium.webdriver.support.ui import Select
# 选中这个标签,然后使用Select创建对象
selectTag = Select(driver.find_element_by_name("jumpMenu"))
# 根据索引选择
selectTag.select_by_index(1)
# 根据值选择
selectTag.select_by_value("http://www.95yueba.com";)
# 根据可视的文本选择
selectTag.select_by_visible_text("95秀客户端")
# 取消选中所有选项
selectTag.deselect_all()
  操作按钮:操作按钮的方式有很多种。比如单击、右键、双击等,这里是最常用的一种。只需点击。直接调用click函数就行了。示例代码如下:
   inputTag = driver.find_element_by_id('su')
inputTag.click()
  行为链:
  有时页面上的操作可能会有很多步骤,这时可以使用鼠标行为链类ActionChains来完成。例如,现在您想将鼠标移动到一个元素并执行一个点击事件。那么示例代码如下:
  inputTag = driver.find_element_by_id('kw')
submitTag = driver.find_element_by_id('su')
actions = ActionChains(driver)
actions.move_to_element(inputTag)
actions.send_keys_to_element(inputTag,'python')
actions.move_to_element(submitTag)
actions.click(submitTag)
actions.perform()
  还有更多与鼠标相关的操作。
  饼干操作:
  获取所有 cookie:
   for cookie in driver.get_cookies():
print(cookie)
  根据cookie的key获取value:
  value = driver.get_cookie(key)
  删除所有 cookie:
   driver.delete_all_cookies()
  删除一个cookie:
   driver.delete_cookie(key)
  页面等待:
  现在越来越多的网页使用 Ajax 技术,因此程序无法确定元素何时完全加载。如果实际页面等待时间过长,某个dom元素没有出来,而你的代码直接使用了这个WebElement,那么就会抛出NullPointer异常。为了解决这个问题。所以Selenium提供了两种等待方式:一种是隐式等待,另一种是显式等待。
  隐式等待:调用 driver.implicitly_wait。然后,在获取不可用元素之前,它会等待 10 秒。示例代码如下:
  driver = webdriver.Chrome(executable_path=driver_path)
driver.implicitly_wait(10)
# 请求网页
driver.get("https://www.douban.com/";)
  显示等待:显示等待是在满足一定条件后执行获取元素的操作。也可以指定等待的最长时间,超过这个时间就会抛出异常。显示等待应在 selenium.webdriver.support.excepted_conditions 和 selenium.webdriver.support.ui.WebDriverWait 的预期条件下完成。示例代码如下:
   from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading";)
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
  其他一些等待条件:
  切换页面:
  有时窗口中有很多子标签页。这个时候必须切换。Selenium 提供了一个 switch_to_window 来切换。要切换到的特定页面可以在 driver.window_handles 中找到。示例代码如下:
  # 打开一个新的页面
# 切换到这个新的页面中
self.driver.switch_to_window(self.driver.window_handles[1])
  设置代理ip:
  有时会频繁抓取一些网页。服务器发现你是爬虫后会屏蔽你的ip地址。这时候我们就可以更改代理ip了。更改代理ip,不同浏览器实现方式不同。以下是 Chrome 浏览器的示例:
  from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://110.73.2.248:8123";)
driver_path = r"D:\ProgramApp\chromedriver\chromedriver.exe"
driver = webdriver.Chrome(executable_path=driver_path,chrome_options=options)
driver.get('http://httpbin.org/ip')
  WebElement 元素:
  from selenium.webdriver.remote.webelement import WebElement类是每个获取出来的元素的所属类。
  有一些常用的属性:
  get_attribute:此标签的属性值。screentshot:获取当前页面的截图。此方法只能在驱动程序上使用。
  驱动程序的对象类也继承自 WebElement。
  更多内容请阅读相关源码。

抓取ajax动态网页java(越来越多的网站将Ajax用于精美的用户体验,简化它)

网站优化优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2021-10-14 11:26 • 来自相关话题

  抓取ajax动态网页java(越来越多的网站将Ajax用于精美的用户体验,简化它)
  如今,越来越多的 网站 使用 Ajax 来获得精美的用户体验、动态网页和许多其他很好的理由。
  搜索繁琐的 Ajax网站 可能既棘手又痛苦,我们将看到一些简化它的技巧。
  先决条件
  开始之前请先阅读我写的前几篇文章,了解如何搭建Java环境,对HtmlUnit Java for Web爬取和认证有一个基本的了解。
  阅读本文后,您应该对网页抓取更加熟悉。
  设置
  我们将看到的第一种使用 Java 抓取 Ajax 的方法网站 是将 PhantomJS 与 Selenium 和 GhostDriver 结合使用。
  PhantomJS 是一个基于 WebKit(在 Chrome 和 Safari 中使用)的无头 Web 浏览器。它非常快,可以像普通 Web 浏览器一样渲染 Dom。
  
com.github.detro
phantomjsdriver
1.2.0
  还有这个:
  
org.seleniumhq.selenium
selenium-java
2.53.1
  PhantomJS 和 Selenium
  现在,我们将使用 Selenium 和 GhostDriver 来“试用”PhantomJS。
  我们将要看到的示例是新闻网站上的一个简单的“查看更多”按钮,它执行 ajax 调用以加载更多新闻。
  所以你可能会认为打开 PhantomJS 点击一个简单的按钮是浪费时间和大量时间?当然!
  新闻网站是:简而言之
  
  与往常一样,我们必须打开 Chrome Dev 工具或您最喜欢的检查器才能查看如何选择“加载更多”按钮并点击它。
  
  现在让我们看一些代码:
  private static String USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" ;
private static DesiredCapabilities desiredCaps ;
private static WebDriver driver ;
public static void initPhantomJS (){

desiredCaps = new DesiredCapabilities ();
desiredCaps . setJavascriptEnabled ( true );
desiredCaps . setCapability ( "takesScreenshot" , false );
desiredCaps . setCapability ( PhantomJSDriverService . PHANTOMJS_EXECUTABLE_PATH_PROPERTY , "/usr/local/bin/phantomjs" );
desiredCaps . setCapability ( PhantomJSDriverService . PHANTOMJS_PAGE_CUSTOMHEADERS_PREFIX + "User-Agent" , USER_AGENT );
ArrayList cliArgsCap = new ArrayList ();
cliArgsCap . add ( "--web-security=false" );
cliArgsCap . add ( "--ssl-protocol=any" );
cliArgsCap . add ( "--ignore-ssl-errors=true" );
cliArgsCap . add ( "--webdriver-loglevel=ERROR" );
desiredCaps . setCapability ( PhantomJSDriverService . PHANTOMJS_CLI_ARGS , cliArgsCap );
driver = new PhantomJSDriver ( desiredCaps );
driver . manage (). window (). setSize ( new Dimension ( 1920 , 1080 ));
}
  设置phantomJs和Selenium有很多代码!
  建议您阅读文档以了解可以传递给 PhantomJS 的许多参数。
  请注意,您必须将 /usr/local/bin/phantomjs 替换为您自己的 phantomJs 可执行路径
  然后在main方法中:
   System . setProperty ( "phantomjs.page.settings.userAgent" , USER_AGENT );
String baseUrl = "https://www.inshorts.com/en/read" ;
initPhantomJS ();
driver . get ( baseUrl ) ;
int nbArticlesBefore = driver . findElements ( By . xpath ( "//div[@class='card-stack']/div" )). size ();
driver . findElement ( By . id ( "load-more-btn" )). click ();
// We wait for the ajax call to fire and to load the response into the page
Thread . sleep ( 800 );
int nbArticlesAfter = driver . findElements ( By . xpath ( "//div[@class='card-stack']/div" )). size ();
System . out . println ( String . format ( "Initial articles : %s Articles after clicking : %s" , nbArticlesBefore , nbArticlesAfter ));
  这里,我们调用 initPhantomJs() 方法来设置所有内容,然后选择带有其 ID 的按钮并单击它。
  代码的另一部分计算页面上已经存在的文章的数量并打印出来以显示我们加载的内容。
  我们也可以使用driver.getPageSource()来打印整个dom并在真实浏览器中打开查看点击前后的差异。
  我建议你看看 Selenium Webdriver 文档,有很多很酷的方法来操作 DOM。
  我使用了 Thread.sleep(800) 的脏解决方案来等待 Ajax 调用完成。
  它很脏,因为它是一个任意数字。如果我们只等待执行那个 ajax 调用所需的时间,那么爬虫可以运行得更快。
  还有其他方法可以解决这个问题:
  public static void waitForAjax ( WebDriver driver ) {

new WebDriverWait ( driver , 180 ). until ( new ExpectedCondition () {

public Boolean apply ( WebDriver driver ) {

JavascriptExecutor js = ( JavascriptExecutor ) driver ;
return ( Boolean ) js . executeScript ( "return jQuery.active == 0" );
}
});
}
  如果您查看单击按钮时正在执行的函数,您会看到它使用的是 jQuery:
  
  这段代码会一直等到变量jQuery.active等于0(这个好像是jQuery的内部变量,用来统计正在进行的ajax调用次数)
  如果我们知道哪些DOM元素应该被Ajax调用渲染,我们可以使用WebDriverWait条件下的id/class/xpath:
  wait . until ( ExpectedConditions . elementToBeClickable ( By . xpath ( xpathExpression )))
  结论
  所以,我们已经学会了如何在 Java 中使用 PhantomJS。
  我举的例子很简单,很容易模拟一个请求。
  但有时,当您有几十个 Ajax 调用并执行大量 Javascript 以正确呈现页面时,很难抓取所需的数据。 PhantomJS/Selenium 为您提供了帮助 :)
  下一次,我们将通过分析 AJAX 调用和自己发出请求来了解如何做到这一点。
  一如既往,您可以在我的 Github 存储库中找到所有代码
  大规模渲染JS确实是非常困难和昂贵的。这正是我们构建 ScrapingBee 的原因。 ScrapingBee 是一个网页抓取 API,可以为您解决这个问题。
  它还会使用代理和验证码,不要犹豫,前 1000 个 API 调用即将到来。
  来自: 查看全部

  抓取ajax动态网页java(越来越多的网站将Ajax用于精美的用户体验,简化它)
  如今,越来越多的 网站 使用 Ajax 来获得精美的用户体验、动态网页和许多其他很好的理由。
  搜索繁琐的 Ajax网站 可能既棘手又痛苦,我们将看到一些简化它的技巧。
  先决条件
  开始之前请先阅读我写的前几篇文章,了解如何搭建Java环境,对HtmlUnit Java for Web爬取和认证有一个基本的了解。
  阅读本文后,您应该对网页抓取更加熟悉。
  设置
  我们将看到的第一种使用 Java 抓取 Ajax 的方法网站 是将 PhantomJS 与 Selenium 和 GhostDriver 结合使用。
  PhantomJS 是一个基于 WebKit(在 Chrome 和 Safari 中使用)的无头 Web 浏览器。它非常快,可以像普通 Web 浏览器一样渲染 Dom。
  
com.github.detro
phantomjsdriver
1.2.0
  还有这个:
  
org.seleniumhq.selenium
selenium-java
2.53.1
  PhantomJS 和 Selenium
  现在,我们将使用 Selenium 和 GhostDriver 来“试用”PhantomJS。
  我们将要看到的示例是新闻网站上的一个简单的“查看更多”按钮,它执行 ajax 调用以加载更多新闻。
  所以你可能会认为打开 PhantomJS 点击一个简单的按钮是浪费时间和大量时间?当然!
  新闻网站是:简而言之
  
  与往常一样,我们必须打开 Chrome Dev 工具或您最喜欢的检查器才能查看如何选择“加载更多”按钮并点击它。
  
  现在让我们看一些代码:
  private static String USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" ;
private static DesiredCapabilities desiredCaps ;
private static WebDriver driver ;
public static void initPhantomJS (){

desiredCaps = new DesiredCapabilities ();
desiredCaps . setJavascriptEnabled ( true );
desiredCaps . setCapability ( "takesScreenshot" , false );
desiredCaps . setCapability ( PhantomJSDriverService . PHANTOMJS_EXECUTABLE_PATH_PROPERTY , "/usr/local/bin/phantomjs" );
desiredCaps . setCapability ( PhantomJSDriverService . PHANTOMJS_PAGE_CUSTOMHEADERS_PREFIX + "User-Agent" , USER_AGENT );
ArrayList cliArgsCap = new ArrayList ();
cliArgsCap . add ( "--web-security=false" );
cliArgsCap . add ( "--ssl-protocol=any" );
cliArgsCap . add ( "--ignore-ssl-errors=true" );
cliArgsCap . add ( "--webdriver-loglevel=ERROR" );
desiredCaps . setCapability ( PhantomJSDriverService . PHANTOMJS_CLI_ARGS , cliArgsCap );
driver = new PhantomJSDriver ( desiredCaps );
driver . manage (). window (). setSize ( new Dimension ( 1920 , 1080 ));
}
  设置phantomJs和Selenium有很多代码!
  建议您阅读文档以了解可以传递给 PhantomJS 的许多参数。
  请注意,您必须将 /usr/local/bin/phantomjs 替换为您自己的 phantomJs 可执行路径
  然后在main方法中:
   System . setProperty ( "phantomjs.page.settings.userAgent" , USER_AGENT );
String baseUrl = "https://www.inshorts.com/en/read" ;
initPhantomJS ();
driver . get ( baseUrl ) ;
int nbArticlesBefore = driver . findElements ( By . xpath ( "//div[@class='card-stack']/div" )). size ();
driver . findElement ( By . id ( "load-more-btn" )). click ();
// We wait for the ajax call to fire and to load the response into the page
Thread . sleep ( 800 );
int nbArticlesAfter = driver . findElements ( By . xpath ( "//div[@class='card-stack']/div" )). size ();
System . out . println ( String . format ( "Initial articles : %s Articles after clicking : %s" , nbArticlesBefore , nbArticlesAfter ));
  这里,我们调用 initPhantomJs() 方法来设置所有内容,然后选择带有其 ID 的按钮并单击它。
  代码的另一部分计算页面上已经存在的文章的数量并打印出来以显示我们加载的内容。
  我们也可以使用driver.getPageSource()来打印整个dom并在真实浏览器中打开查看点击前后的差异。
  我建议你看看 Selenium Webdriver 文档,有很多很酷的方法来操作 DOM。
  我使用了 Thread.sleep(800) 的脏解决方案来等待 Ajax 调用完成。
  它很脏,因为它是一个任意数字。如果我们只等待执行那个 ajax 调用所需的时间,那么爬虫可以运行得更快。
  还有其他方法可以解决这个问题:
  public static void waitForAjax ( WebDriver driver ) {

new WebDriverWait ( driver , 180 ). until ( new ExpectedCondition () {

public Boolean apply ( WebDriver driver ) {

JavascriptExecutor js = ( JavascriptExecutor ) driver ;
return ( Boolean ) js . executeScript ( "return jQuery.active == 0" );
}
});
}
  如果您查看单击按钮时正在执行的函数,您会看到它使用的是 jQuery:
  
  这段代码会一直等到变量jQuery.active等于0(这个好像是jQuery的内部变量,用来统计正在进行的ajax调用次数)
  如果我们知道哪些DOM元素应该被Ajax调用渲染,我们可以使用WebDriverWait条件下的id/class/xpath:
  wait . until ( ExpectedConditions . elementToBeClickable ( By . xpath ( xpathExpression )))
  结论
  所以,我们已经学会了如何在 Java 中使用 PhantomJS。
  我举的例子很简单,很容易模拟一个请求。
  但有时,当您有几十个 Ajax 调用并执行大量 Javascript 以正确呈现页面时,很难抓取所需的数据。 PhantomJS/Selenium 为您提供了帮助 :)
  下一次,我们将通过分析 AJAX 调用和自己发出请求来了解如何做到这一点。
  一如既往,您可以在我的 Github 存储库中找到所有代码
  大规模渲染JS确实是非常困难和昂贵的。这正是我们构建 ScrapingBee 的原因。 ScrapingBee 是一个网页抓取 API,可以为您解决这个问题。
  它还会使用代理和验证码,不要犹豫,前 1000 个 API 调用即将到来。
  来自:

抓取ajax动态网页java( Python即时网络爬虫GitHub源7,文档修改历史(组图))

网站优化优采云 发表了文章 • 0 个评论 • 89 次浏览 • 2021-10-14 11:23 • 来自相关话题

  抓取ajax动态网页java(
Python即时网络爬虫GitHub源7,文档修改历史(组图))
  
  1 简介
  本文介绍了如何使用 Java 和 JavaScript 中的 GooSeeker API 接口下载内容提取器。这是一个示例程序。什么是内容提取器?为什么要使用这种方法?源自Python即时网络爬虫开源项目:通过生成内容提取器,大大节省了程序员的时间。详情请参考“内容提取器的定义”。
  2.用Java下载内容提取器
  这是一系列示例程序之一。从目前的编程语言发展来看,Java实现网页内容提取并不合适。除了语言不够灵活方便,整个生态不够活跃,可选库增长缓慢。另外,从JavaScript动态网页中提取内容,Java也很不方便,需要JavaScript引擎。使用 JavaScript 下载内容提取器可以直接跳转到第 3 部分的内容。
  执行
  注解:
  源代码如下:
   public static void main(String[] args)
{
InputStream xslt = null;
try
{
String grabUrl = "http://m.58.com/cs/qiuzu/22613 ... 3B%3B // 抓取网址
String resultPath = "F:/temp/xslt/result.xml"; // 抓取结果文件的存放路径
// 通过GooSeeker API接口获得xslt
xslt = getGsExtractor();
// 抓取网页内容转换结果文件
convertXml(grabUrl, xslt, resultPath);
} catch (Exception e)
{
e.printStackTrace();
} finally
{
try
{
if (xslt != null)
xslt.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
/**
* @description dom转换
*/
public static void convertXml(String grabUrl, InputStream xslt, String resultPath) throws Exception
{
// 这里的doc对象指的是jsoup里的Document对象
org.jsoup.nodes.Document doc = Jsoup.parse(new URL(grabUrl).openStream(), "UTF-8", grabUrl);
W3CDom w3cDom = new W3CDom();
// 这里的w3cDoc对象指的是w3c里的Document对象
org.w3c.dom.Document w3cDoc = w3cDom.fromJsoup(doc);
Source srcSource = new DOMSource(w3cDoc);
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer(new StreamSource(xslt));
transformer.transform(srcSource, new StreamResult(new FileOutputStream(resultPath)));
}
/**
* @description 获取API返回结果
*/
public static InputStream getGsExtractor()
{
// api接口
String apiUrl = "http://www.gooseeker.com/api/getextractor";
// 请求参数
Map params = new HashMap();
params.put("key", "xxx"); // Gooseeker会员中心申请的API KEY
params.put("theme", "xxx"); // 提取器名,就是用MS谋数台定义的规则名
params.put("middle", "xxx"); // 规则编号,如果相同规则名下定义了多个规则,需填写
params.put("bname", "xxx"); // 整理箱名,如果规则含有多个整理箱,需填写
String httpArg = urlparam(params);
apiUrl = apiUrl + "?" + httpArg;
InputStream is = null;
try
{
URL url = new URL(apiUrl);
HttpURLConnection urlCon = (HttpURLConnection) url.openConnection();
urlCon.setRequestMethod("GET");
is = urlCon.getInputStream();
} catch (ProtocolException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
return is;
}
/**
* @description 请求参数
*/
public static String urlparam(Map data)
{
StringBuilder sb = new StringBuilder();
for (Map.Entry entry : data.entrySet())
{
try
{
sb.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue() + "", "UTF-8")).append("&");
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
}
return sb.toString();
}
  返回结果如下:
  
  3. 使用 JavaScript 下载内容提取器
  请注意,如果本示例中的 JavaScript 代码运行在网页上,由于跨域问题,无法抓取非站点网页的内容。因此,运行在有特权的 JavaScript 引擎上,例如浏览器扩展、自研浏览器以及自己程序中的 JavaScript 引擎。
  为方便实验,本示例仍在网页上运行。为了避免跨域问题,目标网页被保存和修改,并在其中插入JavaScript。这么多手动操作只是为了实验,正式使用时还需要考虑其他方法。
  执行
  注解:
  这是源代码:
  // 目标网页网址为http://m.58.com/cs/qiuzu/22613961050143x.shtml,预先保存成本地html文件,并插入下述代码
$(document).ready(function(){
$.ajax({
type: "get",
url: "http://www.gooseeker.com/api/getextractor?key=申请的appKey&theme=规则主题名",
dataType: "xml",
success: function(xslt)
{
var result = convertXml(xslt, window.document);
alert("result:" + result);
}
});
});
/* 用xslt将dom转换为xml对象 */
function convertXml(xslt, dom)
{
// 定义XSLTProcessor对象
var xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xslt);
// transformToDocument方式
var result = xsltProcessor.transformToDocument(dom);
return result;
}
  返回结果截图如下
  
  4. 展望
  您也可以使用 Python 来获取指定网页的内容。感觉Python的语法更简洁。我们将在未来添加 Python 语言的示例。有兴趣的朋友可以加入一起学习。
  五、相关文件
  1、Python即时网络爬虫:API说明
  6、采集GooSeeker开源代码下载
  1. GooSeeker开源Python网络爬虫GitHub源码
  7. 文档修改历史
  1, 2016-06-24: V1.0 查看全部

  抓取ajax动态网页java(
Python即时网络爬虫GitHub源7,文档修改历史(组图))
  
  1 简介
  本文介绍了如何使用 Java 和 JavaScript 中的 GooSeeker API 接口下载内容提取器。这是一个示例程序。什么是内容提取器?为什么要使用这种方法?源自Python即时网络爬虫开源项目:通过生成内容提取器,大大节省了程序员的时间。详情请参考“内容提取器的定义”。
  2.用Java下载内容提取器
  这是一系列示例程序之一。从目前的编程语言发展来看,Java实现网页内容提取并不合适。除了语言不够灵活方便,整个生态不够活跃,可选库增长缓慢。另外,从JavaScript动态网页中提取内容,Java也很不方便,需要JavaScript引擎。使用 JavaScript 下载内容提取器可以直接跳转到第 3 部分的内容。
  执行
  注解:
  源代码如下:
   public static void main(String[] args)
{
InputStream xslt = null;
try
{
String grabUrl = "http://m.58.com/cs/qiuzu/22613 ... 3B%3B // 抓取网址
String resultPath = "F:/temp/xslt/result.xml"; // 抓取结果文件的存放路径
// 通过GooSeeker API接口获得xslt
xslt = getGsExtractor();
// 抓取网页内容转换结果文件
convertXml(grabUrl, xslt, resultPath);
} catch (Exception e)
{
e.printStackTrace();
} finally
{
try
{
if (xslt != null)
xslt.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
/**
* @description dom转换
*/
public static void convertXml(String grabUrl, InputStream xslt, String resultPath) throws Exception
{
// 这里的doc对象指的是jsoup里的Document对象
org.jsoup.nodes.Document doc = Jsoup.parse(new URL(grabUrl).openStream(), "UTF-8", grabUrl);
W3CDom w3cDom = new W3CDom();
// 这里的w3cDoc对象指的是w3c里的Document对象
org.w3c.dom.Document w3cDoc = w3cDom.fromJsoup(doc);
Source srcSource = new DOMSource(w3cDoc);
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer(new StreamSource(xslt));
transformer.transform(srcSource, new StreamResult(new FileOutputStream(resultPath)));
}
/**
* @description 获取API返回结果
*/
public static InputStream getGsExtractor()
{
// api接口
String apiUrl = "http://www.gooseeker.com/api/getextractor";
// 请求参数
Map params = new HashMap();
params.put("key", "xxx"); // Gooseeker会员中心申请的API KEY
params.put("theme", "xxx"); // 提取器名,就是用MS谋数台定义的规则名
params.put("middle", "xxx"); // 规则编号,如果相同规则名下定义了多个规则,需填写
params.put("bname", "xxx"); // 整理箱名,如果规则含有多个整理箱,需填写
String httpArg = urlparam(params);
apiUrl = apiUrl + "?" + httpArg;
InputStream is = null;
try
{
URL url = new URL(apiUrl);
HttpURLConnection urlCon = (HttpURLConnection) url.openConnection();
urlCon.setRequestMethod("GET");
is = urlCon.getInputStream();
} catch (ProtocolException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
return is;
}
/**
* @description 请求参数
*/
public static String urlparam(Map data)
{
StringBuilder sb = new StringBuilder();
for (Map.Entry entry : data.entrySet())
{
try
{
sb.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue() + "", "UTF-8")).append("&");
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
}
return sb.toString();
}
  返回结果如下:
  
  3. 使用 JavaScript 下载内容提取器
  请注意,如果本示例中的 JavaScript 代码运行在网页上,由于跨域问题,无法抓取非站点网页的内容。因此,运行在有特权的 JavaScript 引擎上,例如浏览器扩展、自研浏览器以及自己程序中的 JavaScript 引擎。
  为方便实验,本示例仍在网页上运行。为了避免跨域问题,目标网页被保存和修改,并在其中插入JavaScript。这么多手动操作只是为了实验,正式使用时还需要考虑其他方法。
  执行
  注解:
  这是源代码:
  // 目标网页网址为http://m.58.com/cs/qiuzu/22613961050143x.shtml,预先保存成本地html文件,并插入下述代码
$(document).ready(function(){
$.ajax({
type: "get",
url: "http://www.gooseeker.com/api/getextractor?key=申请的appKey&theme=规则主题名",
dataType: "xml",
success: function(xslt)
{
var result = convertXml(xslt, window.document);
alert("result:" + result);
}
});
});
/* 用xslt将dom转换为xml对象 */
function convertXml(xslt, dom)
{
// 定义XSLTProcessor对象
var xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xslt);
// transformToDocument方式
var result = xsltProcessor.transformToDocument(dom);
return result;
}
  返回结果截图如下
  
  4. 展望
  您也可以使用 Python 来获取指定网页的内容。感觉Python的语法更简洁。我们将在未来添加 Python 语言的示例。有兴趣的朋友可以加入一起学习。
  五、相关文件
  1、Python即时网络爬虫:API说明
  6、采集GooSeeker开源代码下载
  1. GooSeeker开源Python网络爬虫GitHub源码
  7. 文档修改历史
  1, 2016-06-24: V1.0

抓取ajax动态网页java(谷歌爬虫是如何抓取和收录什么类型的抓取JavaScript?)

网站优化优采云 发表了文章 • 0 个评论 • 118 次浏览 • 2021-10-14 09:20 • 来自相关话题

  抓取ajax动态网页java(谷歌爬虫是如何抓取和收录什么类型的抓取JavaScript?)
  身体的一部分
  我们测试了 Google 爬虫如何抓取 JavaScript,这是我们从中学到的东西。
  认为 Google 无法处理 JavaScript?再想想。Audette Audette 分享了一系列测试结果。他和他的同事测试了 Google 和 收录 会抓取哪些类型的 JavaScript 函数。
  
  ​
  长话短说
  1. 我们进行了一系列测试,并确认谷歌可以以多种方式执行和收录 JavaScript。我们还确认了 Google 可以渲染整个页面并读取 DOM,从而可以收录 动态生成内容。
  2. DOM 中的 SEO 信号(页面标题、元描述、规范标签、元机器人标签等)都受到关注。动态插入到DOM中的内容也可以被爬取和收录。此外,在某些情况下,DOM 甚至可能优先于 HTML 源代码语句。虽然这需要更多的工作,但这是我们的几个测试之一。
  简介:Google 执行 JavaScript 并读取 DOM
  早在 2008 年,Google 就成功抓取了 JavaScript,但很可能仅限于某种方式。
  今天,很明显,Google 不仅可以制定自己的抓取和 收录 JavaScript 类型,而且在渲染整个网页方面也取得了重大进展(尤其是最近 12 到 18 个月)。
  在 Merkle,我们的 SEO 技术团队希望更好地了解 Google 爬虫可以抓取哪些类型的 JavaScript 事件和 收录。经过研究,我们发现了惊人的结果,并确认 Google 不仅可以执行各种 JavaScript 事件,还可以动态生成收录 内容。怎么做?Google 可以读取 DOM。
  什么是DOM?
  很多从事SEO的人不了解什么是文档对象模型(DOM)。
  
  ​
  当浏览器请求一个页面时会发生什么,DOM 是如何参与的?
  在 Web 浏览器中使用时,DOM 本质上是一个应用程序接口或 API,用于标记和构建数据(例如 HTML 和 XML)。该界面允许 Web 浏览器将它们组合起来形成一个文档。
  DOM 还定义了如何获取和操作结构。尽管 DOM 是一种独立于语言的 API(不依赖于特定的编程语言或库),但它通常用于 Web 应用程序中的 JavaScript 和动态内容。
  DOM 代表接口或“桥”,将网页与编程语言连接起来。解析 HTML 并执行 JavaScript 的结果就是 DOM。网页的内容不仅(不仅)是源代码,而且是 DOM。这使它变得非常重要。
  
  ​
  JavaScript 如何通过 DOM 接口工作。
  我们很高兴地发现 Google 可以读取 DOM,并且可以解析信号和动态插入的内容,例如标题标签、页面文本、标题标签和元注释(例如:rel = canonical)。您可以阅读完整的详细信息。
  这一系列的测试和结果
  因为想知道会爬取哪些JavaScript特性和收录,所以分别在谷歌爬虫上创建了一系列测试。通过创建控件,确保可以独立理解 URL 活动。下面,让我们详细介绍一些有趣的测试结果。它们分为5类:
  JavaScript 重定向
  JavaScript 链接
  动态插入内容
  动态插入元数据和页面元素
  rel = "nofollow" 的一个重要例子
  
  ​
  示例:用于测试 Google 抓取工具理解 JavaScript 能力的页面。
  1. JavaScript 重定向
  我们首先测试了常见的 JavaScript 重定向。URL 以不同方式表达的结果是什么?我们为两个测试选择了 window.location 对象:测试 A 使用绝对路径 URL 调用 window.location,测试 B 使用它。相对路径。
  结果:重定向很快就被谷歌跟踪了。从收录的角度来看,它们被解释为301——最终状态URL,而不是谷歌收录中的重定向URL。
  在随后的测试中,我们在权威网页上使用完全相同的内容来完成使用 JavaScript 重定向到同一站点的新页面。原创网址在 Google 热门查询的主页上排名。
  结果:果然,重定向被谷歌跟踪了,但是原创页面不是收录。新的URL是收录,它立即在同一个查询页面的同一个位置上排名。这让我们感到惊讶。从排名的角度来看,JavaScript 重定向行为(有时)与永久性 301 重定向非常相似。
  下次,您的客户想要为他们的 网站 完成 JavaScript 重定向动作,您可能不需要回答,或者回答:“请不要”。因为这好像有转职排名信号的关系。引用谷歌指南支持这一结论:
  使用 JavaScript 重定向用户可能是一种合法的做法。例如,如果您将登录用户重定向到内部页面,则可以使用 JavaScript 来完成此操作。在仔细检查 JavaScript 或其他重定向方法时,请确保您的网站遵循我们的指南并考虑其意图。请记住,将 301 重定向重定向到您的 网站 是最好的,但是如果您没有访问您的 网站 服务器的权限,您可以为此使用 JavaScript 重定向。
  2. JavaScript 链接
  我们使用多种编码方法测试了不同类型的 JS 链接。
  我们测试下拉菜单的链接。历史搜索引擎一直无法跟踪这种类型的链接。我们要确定是否会跟踪 onchange 事件处理程序。重要的是,这只是一种特定的执行类型,而我们需要的是:其他变化的影响,而不是像上面JavaScript重定向的强制操作。
  
  ​
  示例:Google Work 页面上的语言选择下拉菜单。
  结果:链接被完全抓取和跟踪。
  我们还测试了常见的 JavaScript 链接。以下是最常见的 JavaScript 链接类型,而传统 SEO 推荐纯文本。这些测试包括 JavaScript 链接代码:
  作用于外部 href 键值对 (AVP),但在标签内(“onClick”)
  使用 href 内部 AVP("javascript: window.location")
  在 a 标签之外执行,但在 href 中调用 AVP("javascript: openlink()")
  还有很多
  结果:链接被完全抓取和跟踪。
  我们接下来的测试是进一步测试事件处理程序,比如上面的onchange测试。具体来说,我们要使用鼠标移动的事件处理程序,然后隐藏 URL 变量,该变量仅在事件处理程序函数(在本例中为 onmousedown 和 onmouseout)被触发时执行。
  结果:链接被完全抓取和跟踪。
  构造链接:我们知道谷歌可以执行JavaScript,但我们想确认他们是否可以读取代码中的变量。所以在这个测试中,我们连接可以构造 URL 字符串的字符。
  结果:链接被完全抓取和跟踪。
  3. 动态插入内容
  显然,这些是要点:动态插入文本、图像、链接和导航。高质量的文本内容对于搜索引擎理解网页的主题和内容至关重要。在这个充满活力的网站时代,它的重要性毋庸置疑。
  这些测试旨在检查在两种不同场景中动态插入文本的结果。
  1)。测试搜索引擎是否可以统计动态插入的文本,文本来自页面的HTML源代码。
  2)。测试搜索引擎是否可以统计动态插入的文本,并且文本来自页面的HTML源代码之外(在外部JavaScript文件中)。
  结果:两种情况下都可以抓取文本和收录,页面根据内容排名。凉爽的!
  为了深入了解,我们测试了一个用JavaScript编写的客户端全局导航,导航中的链接是通过document.writeIn函数插入的,确认可以完全爬取和跟踪。需要指出的是,Google 可以解释网站 使用AngularJS 框架和HTML5 History API (pushState) 构建,可以渲染和收录 它,并且可以像传统静态网页一样进行排名。这就是不禁止 Google 爬虫获取外部文件和 JavaScript 的重要性,这可能也是 Google 将其从 Ajax Supporting SEO Guide 中删除的原因。当您可以简单地呈现整个页面时,谁需要 HTML 快照?
  经过测试,发现无论是什么类型的内容,结果都是一样的。比如图片加载到DOM后,会被抓取并收录。我们甚至做了这样的测试:通过动态生成结构数据来制作面包屑(breadcrumb navigation),并插入到DOM中。结果?成功插入后的面包屑出现在搜索结果(搜索引擎结果页面)中。
  值得注意的是,Google 现在推荐使用 JSON-LD 标签来形成结构化数据。我相信未来会有更多基于此的东西。
  4. 动态插入元数据和页面元素
  我们动态地将各种对 SEO 至关重要的标签插入到 DOM 中:
  标题元素
  元描述
  元机器人
  规范标签
  结果:在所有情况下,标签都可以被抓取并表现得像 HTML 源代码中的元素。
  一个有趣的补充实验可以帮助我们理解优先级的顺序。当出现相互矛盾的信号时,哪一个会获胜?如果源代码中没有index,nofollow标签,DOM中没有index,follow标签,会发生什么?在这个协议中,HTTP x-robots 响应头如何作为另一个变量使用行为?这将是未来全面测试的一部分。但是,我们的测试表明,当发生冲突时,Google 会忽略源代码中的标签并支持 DOM。
  5. rel="nofollow" 的一个重要例子
  我们想测试谷歌如何响应出现在源代码和 DOM 链接级别的 nofollow 属性。我们还创建了一个没有 nofollow 的控件。
  
  ​
  对于nofollow,我们分别测试了源代码和DOM生成的注解。
  源代码中的 nofollow 按预期工作(不跟踪链接)。但是DOM中的nofollow无效(链接被跟踪,页面为收录)。为什么?因为修改 DOM 中的 href 元素的操作发生得太晚了:Google 在执行添加 rel="nofollow" 的 JavaScript 函数之前,已准备好抓取链接并排队等待 URL。但是,如果将带有 href="nofollow" 的 a 元素插入到 DOM 中,nofollow 和链接将被跟踪,因为它们是同时插入的。
  结果
  从历史的角度来看,各种 SEO 建议都尽可能关注“纯文本”内容。动态生成的内容、AJAX 和 JavaScript 链接会损害主流搜索引擎的 SEO。显然,这对谷歌来说不再是问题。JavaScript 链接的操作方式类似于普通的 HTML 链接(这只是表面,我们不知道程序在幕后做了什么)。
  JavaScript 重定向的处理方式与 301 重定向类似。
  动态插入内容,甚至元标记,例如rel规范注释,无论是在HTML源代码中还是在解析初始HTML后触发JavaScript生成DOM都以相同的方式处理。
  Google 依赖于完全呈现页面和理解 DOM,而不仅仅是源代码。太不可思议了!(请记住允许 Google 爬虫获取这些外部文件和 JavaScript。)
  谷歌已经以惊人的速度在创新方面将其他搜索引擎甩在了后面。我们希望在其他搜索引擎中看到相同类型的创新。如果他们要在新的网络时代保持竞争力并取得实质性进展,就意味着他们需要更好地支持 HTML5、JavaScript 和动态网站。
  对于SEO来说,不了解以上基本概念和谷歌技术的人应该学习学习,以赶上当前的技术。如果你不考虑 DOM,你可能会失去一半的份额。
  并非本文所表达的所有观点均由 Search Engine Land(搜索引擎 网站)提供,部分观点由客座作者提供。所有作者的名单。
  转载于: 查看全部

  抓取ajax动态网页java(谷歌爬虫是如何抓取和收录什么类型的抓取JavaScript?)
  身体的一部分
  我们测试了 Google 爬虫如何抓取 JavaScript,这是我们从中学到的东西。
  认为 Google 无法处理 JavaScript?再想想。Audette Audette 分享了一系列测试结果。他和他的同事测试了 Google 和 收录 会抓取哪些类型的 JavaScript 函数。
  
  ​
  长话短说
  1. 我们进行了一系列测试,并确认谷歌可以以多种方式执行和收录 JavaScript。我们还确认了 Google 可以渲染整个页面并读取 DOM,从而可以收录 动态生成内容。
  2. DOM 中的 SEO 信号(页面标题、元描述、规范标签、元机器人标签等)都受到关注。动态插入到DOM中的内容也可以被爬取和收录。此外,在某些情况下,DOM 甚至可能优先于 HTML 源代码语句。虽然这需要更多的工作,但这是我们的几个测试之一。
  简介:Google 执行 JavaScript 并读取 DOM
  早在 2008 年,Google 就成功抓取了 JavaScript,但很可能仅限于某种方式。
  今天,很明显,Google 不仅可以制定自己的抓取和 收录 JavaScript 类型,而且在渲染整个网页方面也取得了重大进展(尤其是最近 12 到 18 个月)。
  在 Merkle,我们的 SEO 技术团队希望更好地了解 Google 爬虫可以抓取哪些类型的 JavaScript 事件和 收录。经过研究,我们发现了惊人的结果,并确认 Google 不仅可以执行各种 JavaScript 事件,还可以动态生成收录 内容。怎么做?Google 可以读取 DOM。
  什么是DOM?
  很多从事SEO的人不了解什么是文档对象模型(DOM)。
  
  ​
  当浏览器请求一个页面时会发生什么,DOM 是如何参与的?
  在 Web 浏览器中使用时,DOM 本质上是一个应用程序接口或 API,用于标记和构建数据(例如 HTML 和 XML)。该界面允许 Web 浏览器将它们组合起来形成一个文档。
  DOM 还定义了如何获取和操作结构。尽管 DOM 是一种独立于语言的 API(不依赖于特定的编程语言或库),但它通常用于 Web 应用程序中的 JavaScript 和动态内容。
  DOM 代表接口或“桥”,将网页与编程语言连接起来。解析 HTML 并执行 JavaScript 的结果就是 DOM。网页的内容不仅(不仅)是源代码,而且是 DOM。这使它变得非常重要。
  
  ​
  JavaScript 如何通过 DOM 接口工作。
  我们很高兴地发现 Google 可以读取 DOM,并且可以解析信号和动态插入的内容,例如标题标签、页面文本、标题标签和元注释(例如:rel = canonical)。您可以阅读完整的详细信息。
  这一系列的测试和结果
  因为想知道会爬取哪些JavaScript特性和收录,所以分别在谷歌爬虫上创建了一系列测试。通过创建控件,确保可以独立理解 URL 活动。下面,让我们详细介绍一些有趣的测试结果。它们分为5类:
  JavaScript 重定向
  JavaScript 链接
  动态插入内容
  动态插入元数据和页面元素
  rel = "nofollow" 的一个重要例子
  
  ​
  示例:用于测试 Google 抓取工具理解 JavaScript 能力的页面。
  1. JavaScript 重定向
  我们首先测试了常见的 JavaScript 重定向。URL 以不同方式表达的结果是什么?我们为两个测试选择了 window.location 对象:测试 A 使用绝对路径 URL 调用 window.location,测试 B 使用它。相对路径。
  结果:重定向很快就被谷歌跟踪了。从收录的角度来看,它们被解释为301——最终状态URL,而不是谷歌收录中的重定向URL。
  在随后的测试中,我们在权威网页上使用完全相同的内容来完成使用 JavaScript 重定向到同一站点的新页面。原创网址在 Google 热门查询的主页上排名。
  结果:果然,重定向被谷歌跟踪了,但是原创页面不是收录。新的URL是收录,它立即在同一个查询页面的同一个位置上排名。这让我们感到惊讶。从排名的角度来看,JavaScript 重定向行为(有时)与永久性 301 重定向非常相似。
  下次,您的客户想要为他们的 网站 完成 JavaScript 重定向动作,您可能不需要回答,或者回答:“请不要”。因为这好像有转职排名信号的关系。引用谷歌指南支持这一结论:
  使用 JavaScript 重定向用户可能是一种合法的做法。例如,如果您将登录用户重定向到内部页面,则可以使用 JavaScript 来完成此操作。在仔细检查 JavaScript 或其他重定向方法时,请确保您的网站遵循我们的指南并考虑其意图。请记住,将 301 重定向重定向到您的 网站 是最好的,但是如果您没有访问您的 网站 服务器的权限,您可以为此使用 JavaScript 重定向。
  2. JavaScript 链接
  我们使用多种编码方法测试了不同类型的 JS 链接。
  我们测试下拉菜单的链接。历史搜索引擎一直无法跟踪这种类型的链接。我们要确定是否会跟踪 onchange 事件处理程序。重要的是,这只是一种特定的执行类型,而我们需要的是:其他变化的影响,而不是像上面JavaScript重定向的强制操作。
  
  ​
  示例:Google Work 页面上的语言选择下拉菜单。
  结果:链接被完全抓取和跟踪。
  我们还测试了常见的 JavaScript 链接。以下是最常见的 JavaScript 链接类型,而传统 SEO 推荐纯文本。这些测试包括 JavaScript 链接代码:
  作用于外部 href 键值对 (AVP),但在标签内(“onClick”)
  使用 href 内部 AVP("javascript: window.location")
  在 a 标签之外执行,但在 href 中调用 AVP("javascript: openlink()")
  还有很多
  结果:链接被完全抓取和跟踪。
  我们接下来的测试是进一步测试事件处理程序,比如上面的onchange测试。具体来说,我们要使用鼠标移动的事件处理程序,然后隐藏 URL 变量,该变量仅在事件处理程序函数(在本例中为 onmousedown 和 onmouseout)被触发时执行。
  结果:链接被完全抓取和跟踪。
  构造链接:我们知道谷歌可以执行JavaScript,但我们想确认他们是否可以读取代码中的变量。所以在这个测试中,我们连接可以构造 URL 字符串的字符。
  结果:链接被完全抓取和跟踪。
  3. 动态插入内容
  显然,这些是要点:动态插入文本、图像、链接和导航。高质量的文本内容对于搜索引擎理解网页的主题和内容至关重要。在这个充满活力的网站时代,它的重要性毋庸置疑。
  这些测试旨在检查在两种不同场景中动态插入文本的结果。
  1)。测试搜索引擎是否可以统计动态插入的文本,文本来自页面的HTML源代码。
  2)。测试搜索引擎是否可以统计动态插入的文本,并且文本来自页面的HTML源代码之外(在外部JavaScript文件中)。
  结果:两种情况下都可以抓取文本和收录,页面根据内容排名。凉爽的!
  为了深入了解,我们测试了一个用JavaScript编写的客户端全局导航,导航中的链接是通过document.writeIn函数插入的,确认可以完全爬取和跟踪。需要指出的是,Google 可以解释网站 使用AngularJS 框架和HTML5 History API (pushState) 构建,可以渲染和收录 它,并且可以像传统静态网页一样进行排名。这就是不禁止 Google 爬虫获取外部文件和 JavaScript 的重要性,这可能也是 Google 将其从 Ajax Supporting SEO Guide 中删除的原因。当您可以简单地呈现整个页面时,谁需要 HTML 快照?
  经过测试,发现无论是什么类型的内容,结果都是一样的。比如图片加载到DOM后,会被抓取并收录。我们甚至做了这样的测试:通过动态生成结构数据来制作面包屑(breadcrumb navigation),并插入到DOM中。结果?成功插入后的面包屑出现在搜索结果(搜索引擎结果页面)中。
  值得注意的是,Google 现在推荐使用 JSON-LD 标签来形成结构化数据。我相信未来会有更多基于此的东西。
  4. 动态插入元数据和页面元素
  我们动态地将各种对 SEO 至关重要的标签插入到 DOM 中:
  标题元素
  元描述
  元机器人
  规范标签
  结果:在所有情况下,标签都可以被抓取并表现得像 HTML 源代码中的元素。
  一个有趣的补充实验可以帮助我们理解优先级的顺序。当出现相互矛盾的信号时,哪一个会获胜?如果源代码中没有index,nofollow标签,DOM中没有index,follow标签,会发生什么?在这个协议中,HTTP x-robots 响应头如何作为另一个变量使用行为?这将是未来全面测试的一部分。但是,我们的测试表明,当发生冲突时,Google 会忽略源代码中的标签并支持 DOM。
  5. rel="nofollow" 的一个重要例子
  我们想测试谷歌如何响应出现在源代码和 DOM 链接级别的 nofollow 属性。我们还创建了一个没有 nofollow 的控件。
  
  ​
  对于nofollow,我们分别测试了源代码和DOM生成的注解。
  源代码中的 nofollow 按预期工作(不跟踪链接)。但是DOM中的nofollow无效(链接被跟踪,页面为收录)。为什么?因为修改 DOM 中的 href 元素的操作发生得太晚了:Google 在执行添加 rel="nofollow" 的 JavaScript 函数之前,已准备好抓取链接并排队等待 URL。但是,如果将带有 href="nofollow" 的 a 元素插入到 DOM 中,nofollow 和链接将被跟踪,因为它们是同时插入的。
  结果
  从历史的角度来看,各种 SEO 建议都尽可能关注“纯文本”内容。动态生成的内容、AJAX 和 JavaScript 链接会损害主流搜索引擎的 SEO。显然,这对谷歌来说不再是问题。JavaScript 链接的操作方式类似于普通的 HTML 链接(这只是表面,我们不知道程序在幕后做了什么)。
  JavaScript 重定向的处理方式与 301 重定向类似。
  动态插入内容,甚至元标记,例如rel规范注释,无论是在HTML源代码中还是在解析初始HTML后触发JavaScript生成DOM都以相同的方式处理。
  Google 依赖于完全呈现页面和理解 DOM,而不仅仅是源代码。太不可思议了!(请记住允许 Google 爬虫获取这些外部文件和 JavaScript。)
  谷歌已经以惊人的速度在创新方面将其他搜索引擎甩在了后面。我们希望在其他搜索引擎中看到相同类型的创新。如果他们要在新的网络时代保持竞争力并取得实质性进展,就意味着他们需要更好地支持 HTML5、JavaScript 和动态网站。
  对于SEO来说,不了解以上基本概念和谷歌技术的人应该学习学习,以赶上当前的技术。如果你不考虑 DOM,你可能会失去一半的份额。
  并非本文所表达的所有观点均由 Search Engine Land(搜索引擎 网站)提供,部分观点由客座作者提供。所有作者的名单。
  转载于:

抓取ajax动态网页java(遇到一个网页数据抓取的任务,给大家分享下!)

网站优化优采云 发表了文章 • 0 个评论 • 120 次浏览 • 2021-10-14 09:19 • 来自相关话题

  抓取ajax动态网页java(遇到一个网页数据抓取的任务,给大家分享下!)
  遇到一个爬取网页数据的任务,分享给大家。
  说到网页信息抓取,相信Jsoup基本上是首选工具。完整的类似JQuery的操作让人感觉很舒服。不过,今天我们要说说Jsoup的缺点。
  这是某网站的搜索栏,填写一些格式化数据进行经纬度转换,初始化是这样的,然后用jsoup捕获的代码如下:
  
  
  当我们添加数据时,抓取的页面信息是不变的。这就是Jsoup的缺点。如果Jsoup抓取页面,页面加载后的所有数据,Ajax加载的异步数据都没有抓取。到达的。
  
  
  这里再给大家介绍一个开源项目:HttpUnit,这个名字是用来测试的,但是爬取数据也不错,是一个完美的解决方案。HttpUnit其实相当于一个没有UI的浏览器,可以让页面上的js执行完成后,再次抓取信息。
  有时我们使用requests抓取页面时,得到的结果可能与浏览器中看到的不同:在浏览器中可以看到正常显示的页面数据,但是使用requests获取的结果却看不到。这是因为获取的请求都是原创的 HTML 文档,浏览器中的页面是 JavaScript 处理数据后生成的结果。这些数据的来源有很多,可能是通过Ajax加载的,可能是收录在HTML中的,也可能是通过JavaScript和特定算法计算后生成的文档中的文档。
  在第一种情况下,数据加载是一种异步加载方法。原创页面最初不会收录一些数据。原创页面加载完毕后,会向服务器请求一个接口来获取数据,然后对数据进行处理呈现。在网页上,这实际上是一个 Ajax 请求。
  根据Web发展的趋势,这种形式的页面越来越多。网页的原创 HTML 文档不收录任何数据。数据通过Ajax统一加载后呈现,从而在Web开发中实现前后端分离,减少服务器直接渲染页面带来的压力。
  因此,如果遇到这样的页面,可以直接使用requests等库来抓取原创页面,无法获取有效数据。这时候就需要从网页后台分析发送到界面的Ajax请求。如果可以使用requests来模拟ajax请求,那么就可以成功爬取。
  但是我没有使用这个测试框架:我解决问题的想法是
  总结:ajax数据的爬取过程:
  
  分析网页信息,抓取网页
  1. 提交我们的搜索时,会加载这部分内容,并且会有表单数据生成,
  
  反映在程序中:
  
  2. 服务器加载这个页面,我们输入表单信息,这个表单信息就是我们的搜索条件,例如:
  
  反映在程序中:
  
  3.js返回加载的页面,并在该页面添加信息
  jsoup 可以解析页面。
  4.模拟登录部分:
  
  
  静态网页:jsoup
  ajax 网页:webdriver+selenium+jsoup 查看全部

  抓取ajax动态网页java(遇到一个网页数据抓取的任务,给大家分享下!)
  遇到一个爬取网页数据的任务,分享给大家。
  说到网页信息抓取,相信Jsoup基本上是首选工具。完整的类似JQuery的操作让人感觉很舒服。不过,今天我们要说说Jsoup的缺点。
  这是某网站的搜索栏,填写一些格式化数据进行经纬度转换,初始化是这样的,然后用jsoup捕获的代码如下:
  
  
  当我们添加数据时,抓取的页面信息是不变的。这就是Jsoup的缺点。如果Jsoup抓取页面,页面加载后的所有数据,Ajax加载的异步数据都没有抓取。到达的。
  
  
  这里再给大家介绍一个开源项目:HttpUnit,这个名字是用来测试的,但是爬取数据也不错,是一个完美的解决方案。HttpUnit其实相当于一个没有UI的浏览器,可以让页面上的js执行完成后,再次抓取信息。
  有时我们使用requests抓取页面时,得到的结果可能与浏览器中看到的不同:在浏览器中可以看到正常显示的页面数据,但是使用requests获取的结果却看不到。这是因为获取的请求都是原创的 HTML 文档,浏览器中的页面是 JavaScript 处理数据后生成的结果。这些数据的来源有很多,可能是通过Ajax加载的,可能是收录在HTML中的,也可能是通过JavaScript和特定算法计算后生成的文档中的文档。
  在第一种情况下,数据加载是一种异步加载方法。原创页面最初不会收录一些数据。原创页面加载完毕后,会向服务器请求一个接口来获取数据,然后对数据进行处理呈现。在网页上,这实际上是一个 Ajax 请求。
  根据Web发展的趋势,这种形式的页面越来越多。网页的原创 HTML 文档不收录任何数据。数据通过Ajax统一加载后呈现,从而在Web开发中实现前后端分离,减少服务器直接渲染页面带来的压力。
  因此,如果遇到这样的页面,可以直接使用requests等库来抓取原创页面,无法获取有效数据。这时候就需要从网页后台分析发送到界面的Ajax请求。如果可以使用requests来模拟ajax请求,那么就可以成功爬取。
  但是我没有使用这个测试框架:我解决问题的想法是
  总结:ajax数据的爬取过程:
  
  分析网页信息,抓取网页
  1. 提交我们的搜索时,会加载这部分内容,并且会有表单数据生成,
  
  反映在程序中:
  
  2. 服务器加载这个页面,我们输入表单信息,这个表单信息就是我们的搜索条件,例如:
  
  反映在程序中:
  
  3.js返回加载的页面,并在该页面添加信息
  jsoup 可以解析页面。
  4.模拟登录部分:
  
  
  静态网页:jsoup
  ajax 网页:webdriver+selenium+jsoup

抓取ajax动态网页java(Python网络爬虫内容提取器内容)

网站优化优采云 发表了文章 • 0 个评论 • 60 次浏览 • 2021-10-14 03:16 • 来自相关话题

  抓取ajax动态网页java(Python网络爬虫内容提取器内容)
  本文文章将详细讲解Python爬虫如何使用Selenium+PhantomJS抓取Ajax和动态HTML内容。小编觉得很实用,分享给大家作为参考。希望大家看完这篇文章以后可以有所收获。
  1、简介
  在Python网络爬虫内容提取器一文中,我们详细讲解了核心组件:可插拔内容提取器类gsExtractor。本文记录了在确定gsExtractor技术路线过程中所做的编程实验。这是第二部分。第一部分是使用xslt一次性提取静态网页内容并转换成xml格式的实验。
  2、提取动态内容的技术组件
  上一篇Python使用xslt提取网页数据,提取的内容直接从网页源码中获取。但是有些Ajax动态内容在源码中是找不到的,所以需要找一个合适的库来加载异步或者动态加载的内容,交给本项目的提取器进行提取。
  Python可以使用selenium来执行javascript,selenium可以让浏览器自动加载页面,获取需要的数据。Selenium本身没有浏览器,可以使用Firefox、Chrome等第三方浏览器,也可以使用PhantomJS等无头浏览器在后台执行。
  3、源码和实验过程
  假设我们要抓取京东手机页面的手机名称和价格(网页源码中没有找到价格),如下图:
  
  第一步:利用采集和搜索客户的直观标记功能,可以很快自动生成一个调试好的抓包规则,其实就是一个标准的xslt程序,如下图,将生成的xslt程序复制到下面可以在程序中。注:本文仅记录实验过程。在实际系统中,xslt 程序会以多种方式注入到内容提取器中。
  第二步:执行如下代码(windows10下测试,python3.2,源码下载地址可在文章末尾的GitHub找到),请注意:xslt是比较长的字符串,如果删除这个字符串,代码不是几行,足以展示Python的强大
  #/usr/bin/python 
from urllib import request 
from lxml import etree 
from selenium import webdriver 
import time 
 
# 京东手机商品页面 
url = "http://item.jd.com/1312640.html" 
 
# 下面的xslt是通过集搜客的谋数台图形界面自动生成的 
xslt_root = etree.XML("""\ 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
""") 
 
# 使用webdriver.PhantomJS 
browser = webdriver.PhantomJS(executable_path='C:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe') 
browser.get(url) 
time.sleep(3) 
 
transform = etree.XSLT(xslt_root) 
 
# 执行js得到整个dom 
html = browser.execute_script("return document.documentElement.outerHTML") 
doc = etree.HTML(html) 
# 用xslt从dom中提取需要的字段 
result_tree = transform(doc) 
print(result_tree)
  第三步:如下图所示,网页上手机的名称和价格已被正确抓取
  
  关于《Python爬虫如何使用Selenium+PhantomJS抓取Ajax和动态HTML内容》,我在这里分享了文章文章。希望以上内容能够对大家有所帮助,让大家了解更多。如果你觉得文章不错,请分享出去让更多人看到。 查看全部

  抓取ajax动态网页java(Python网络爬虫内容提取器内容)
  本文文章将详细讲解Python爬虫如何使用Selenium+PhantomJS抓取Ajax和动态HTML内容。小编觉得很实用,分享给大家作为参考。希望大家看完这篇文章以后可以有所收获。
  1、简介
  在Python网络爬虫内容提取器一文中,我们详细讲解了核心组件:可插拔内容提取器类gsExtractor。本文记录了在确定gsExtractor技术路线过程中所做的编程实验。这是第二部分。第一部分是使用xslt一次性提取静态网页内容并转换成xml格式的实验。
  2、提取动态内容的技术组件
  上一篇Python使用xslt提取网页数据,提取的内容直接从网页源码中获取。但是有些Ajax动态内容在源码中是找不到的,所以需要找一个合适的库来加载异步或者动态加载的内容,交给本项目的提取器进行提取。
  Python可以使用selenium来执行javascript,selenium可以让浏览器自动加载页面,获取需要的数据。Selenium本身没有浏览器,可以使用Firefox、Chrome等第三方浏览器,也可以使用PhantomJS等无头浏览器在后台执行。
  3、源码和实验过程
  假设我们要抓取京东手机页面的手机名称和价格(网页源码中没有找到价格),如下图:
  
  第一步:利用采集和搜索客户的直观标记功能,可以很快自动生成一个调试好的抓包规则,其实就是一个标准的xslt程序,如下图,将生成的xslt程序复制到下面可以在程序中。注:本文仅记录实验过程。在实际系统中,xslt 程序会以多种方式注入到内容提取器中。
  第二步:执行如下代码(windows10下测试,python3.2,源码下载地址可在文章末尾的GitHub找到),请注意:xslt是比较长的字符串,如果删除这个字符串,代码不是几行,足以展示Python的强大
  #/usr/bin/python 
from urllib import request 
from lxml import etree 
from selenium import webdriver 
import time 
 
# 京东手机商品页面 
url = "http://item.jd.com/1312640.html" 
 
# 下面的xslt是通过集搜客的谋数台图形界面自动生成的 
xslt_root = etree.XML("""\ 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
""") 
 
# 使用webdriver.PhantomJS 
browser = webdriver.PhantomJS(executable_path='C:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe') 
browser.get(url) 
time.sleep(3) 
 
transform = etree.XSLT(xslt_root) 
 
# 执行js得到整个dom 
html = browser.execute_script("return document.documentElement.outerHTML") 
doc = etree.HTML(html) 
# 用xslt从dom中提取需要的字段 
result_tree = transform(doc) 
print(result_tree)
  第三步:如下图所示,网页上手机的名称和价格已被正确抓取
  
  关于《Python爬虫如何使用Selenium+PhantomJS抓取Ajax和动态HTML内容》,我在这里分享了文章文章。希望以上内容能够对大家有所帮助,让大家了解更多。如果你觉得文章不错,请分享出去让更多人看到。

抓取ajax动态网页java(windows10系统、Lenovo小新Air14电脑教程操作环境:网站是什么)

网站优化优采云 发表了文章 • 0 个评论 • 124 次浏览 • 2021-10-09 07:20 • 来自相关话题

  抓取ajax动态网页java(windows10系统、Lenovo小新Air14电脑教程操作环境:网站是什么)
  与动态网页相比,静态网页的内容相对安全稳定,静态网页速度更快,不需要从数据库中提取数据。速度快的同时,对服务器没有压力;但是因为没有数据库支持,静态网页页面在网站的制作和维护上有很多工作要做。
  
  本教程运行环境:windows10系统,联想小新Air14电脑。
  网站什么是
  我们在使用电脑的时候经常访问一些网站。如果我们遇到一些精彩的内容网站,我们会分享给朋友。那么“网站”究竟是什么?
  网站(网站)是指在互联网上按照一定的规则,使用HTML(超文本标记语言)等工具制作的用于显示特定内容的网页的集合。简单的说,网站是一个交流工具。人们可以使用网站发布自己想要公开的信息,或者使用网站提供相关的网络服务。人们可以通过网络浏览器访问网站,获取所需信息或享受网络服务。
  网站 主要有独立的域名和空间。网页是构成网站的基本元素,但不一定有很多页面,即使只有一个页面,也叫网站。网页分为静态网页和动态网页。
  静态页面
  静态网页通常是指纯 HTML 格式的网页。它们的文件扩展名为.htm、html、shtml等,包括文本、图像、声音、FLASH动画、客户端脚本、ActiveX控件和Java小程序等。
  因此,静态网页并不意味着该页面是静态的。还可以实现GIF格式动画、FLASH、滚动字幕等“动态”显示效果。
  静态网页的“静态”是指静态网页一旦制作完成,内容就不会改变。写一次,放在服务器上浏览。如果要改,必须在页面上修改,然后上传服务器覆盖原来的,这样才能更新信息。对于静态网页,用户可以直接双击打开,看到的效果和访问服务器是一样的,即服务器是否参与对页面内容没有影响。这是因为在用户访问网页之前,网页的内容已经确定。无论谁访问,何时访问,显示的内容都是一样的。无论用户是否访问,每个静态网页的内容都存储在网站服务器上。
  静态网页的工作流程可以分为以下4个步骤。
  1、写一个静态文件发布到Web服务器上;
  2、 用户在浏览器地址栏中输入静态网页的URL(Uniform Resource Locator)并按下回车键,浏览器向Web服务器发送请求;
  3、Web 服务器找到这个静态文件的位置,将其转​​换为 HTML 流并传输到用户的浏览器;
  4、浏览器接收到HTML流并显示该网页的内容。
  工作原理图如下:
  
  动态网页
  即使动态网页的代码不变,页面上显示的内容也会随着时间、环境或数据库操作的结果而变化。动态网页可以与后端数据库交互并传输数据。文件扩展名后缀为.aspx、.asp、.jsp、.php等形式,使用HTML+ASP或HTML+PHP或HTML+JSP等网站动态语言,实现高效、 网站 的动态内容和风格以及互动管理。
  因此,动态网页并不是指网页上的各种动画、滚动字幕等视觉动态效果。动态网页也可以使用纯文本内容,无论网页是否有动态效果,只要是使用动态网站技术生成的网页都可以称为动态网页。常见的留言板、论坛、聊天室、用户注册、用户登录、在线调查、用户管理、订单管理等都是通过动态网页实现的。
  动态网页比较复杂,不能直接双击打开。动态网页的工作流程分为以下4个步骤。
  1、编写动态网页文件,包括程序代码,发布到网页服务器上;
  2、用户在浏览器地址栏中输入动态网页的URL并按下回车键(Enter),浏览器向web服务器发送访问请求;
  3、web服务器找到这个动态网页的位置,并根据其中的程序代码动态构建一个HTML流传输到用户浏览器;
  4、浏览器接收HTML流并显示该网页的内容;
  工作原理图如下:
  
  静态和动态的优缺点对比
  与动态网页相比,静态网页的内容相对安全稳定,静态网页速度更快,不需要从数据库中提取数据。速度快的同时,对服务器没有压力;但是由于目前的网页,大量使用JS导致浏览器打开页面,会占用大量内存。服务端的压力降低了,但是压力转移到了客户端,而且由于没有数据库支持,网站生产和维护的工作量比较大,所以当网站 信息量很大,很难完全依赖静态网页制作方法。
  一般来说,网站构建的基础是静态网页,静态网页和动态网页并不是互不兼容的。动态网站也可以采用动静结合的原理,为了提高网站内的搜索速度,就是利用了动态网页技术网站,也可以把内容将网页转成静态网页运行,将网页转成静态是网站的一个很好的开发方法,可以提高网页打开的速度。在同一个网站上,动态网页内容和静态网页内容同时存在是很常见的。
  以上就是动态网页和静态网页区别的详细内容。更多详情请关注其他相关html中文网站文章! 查看全部

  抓取ajax动态网页java(windows10系统、Lenovo小新Air14电脑教程操作环境:网站是什么)
  与动态网页相比,静态网页的内容相对安全稳定,静态网页速度更快,不需要从数据库中提取数据。速度快的同时,对服务器没有压力;但是因为没有数据库支持,静态网页页面在网站的制作和维护上有很多工作要做。
  
  本教程运行环境:windows10系统,联想小新Air14电脑。
  网站什么是
  我们在使用电脑的时候经常访问一些网站。如果我们遇到一些精彩的内容网站,我们会分享给朋友。那么“网站”究竟是什么?
  网站(网站)是指在互联网上按照一定的规则,使用HTML(超文本标记语言)等工具制作的用于显示特定内容的网页的集合。简单的说,网站是一个交流工具。人们可以使用网站发布自己想要公开的信息,或者使用网站提供相关的网络服务。人们可以通过网络浏览器访问网站,获取所需信息或享受网络服务。
  网站 主要有独立的域名和空间。网页是构成网站的基本元素,但不一定有很多页面,即使只有一个页面,也叫网站。网页分为静态网页和动态网页。
  静态页面
  静态网页通常是指纯 HTML 格式的网页。它们的文件扩展名为.htm、html、shtml等,包括文本、图像、声音、FLASH动画、客户端脚本、ActiveX控件和Java小程序等。
  因此,静态网页并不意味着该页面是静态的。还可以实现GIF格式动画、FLASH、滚动字幕等“动态”显示效果。
  静态网页的“静态”是指静态网页一旦制作完成,内容就不会改变。写一次,放在服务器上浏览。如果要改,必须在页面上修改,然后上传服务器覆盖原来的,这样才能更新信息。对于静态网页,用户可以直接双击打开,看到的效果和访问服务器是一样的,即服务器是否参与对页面内容没有影响。这是因为在用户访问网页之前,网页的内容已经确定。无论谁访问,何时访问,显示的内容都是一样的。无论用户是否访问,每个静态网页的内容都存储在网站服务器上。
  静态网页的工作流程可以分为以下4个步骤。
  1、写一个静态文件发布到Web服务器上;
  2、 用户在浏览器地址栏中输入静态网页的URL(Uniform Resource Locator)并按下回车键,浏览器向Web服务器发送请求;
  3、Web 服务器找到这个静态文件的位置,将其转​​换为 HTML 流并传输到用户的浏览器;
  4、浏览器接收到HTML流并显示该网页的内容。
  工作原理图如下:
  
  动态网页
  即使动态网页的代码不变,页面上显示的内容也会随着时间、环境或数据库操作的结果而变化。动态网页可以与后端数据库交互并传输数据。文件扩展名后缀为.aspx、.asp、.jsp、.php等形式,使用HTML+ASP或HTML+PHP或HTML+JSP等网站动态语言,实现高效、 网站 的动态内容和风格以及互动管理。
  因此,动态网页并不是指网页上的各种动画、滚动字幕等视觉动态效果。动态网页也可以使用纯文本内容,无论网页是否有动态效果,只要是使用动态网站技术生成的网页都可以称为动态网页。常见的留言板、论坛、聊天室、用户注册、用户登录、在线调查、用户管理、订单管理等都是通过动态网页实现的。
  动态网页比较复杂,不能直接双击打开。动态网页的工作流程分为以下4个步骤。
  1、编写动态网页文件,包括程序代码,发布到网页服务器上;
  2、用户在浏览器地址栏中输入动态网页的URL并按下回车键(Enter),浏览器向web服务器发送访问请求;
  3、web服务器找到这个动态网页的位置,并根据其中的程序代码动态构建一个HTML流传输到用户浏览器;
  4、浏览器接收HTML流并显示该网页的内容;
  工作原理图如下:
  
  静态和动态的优缺点对比
  与动态网页相比,静态网页的内容相对安全稳定,静态网页速度更快,不需要从数据库中提取数据。速度快的同时,对服务器没有压力;但是由于目前的网页,大量使用JS导致浏览器打开页面,会占用大量内存。服务端的压力降低了,但是压力转移到了客户端,而且由于没有数据库支持,网站生产和维护的工作量比较大,所以当网站 信息量很大,很难完全依赖静态网页制作方法。
  一般来说,网站构建的基础是静态网页,静态网页和动态网页并不是互不兼容的。动态网站也可以采用动静结合的原理,为了提高网站内的搜索速度,就是利用了动态网页技术网站,也可以把内容将网页转成静态网页运行,将网页转成静态是网站的一个很好的开发方法,可以提高网页打开的速度。在同一个网站上,动态网页内容和静态网页内容同时存在是很常见的。
  以上就是动态网页和静态网页区别的详细内容。更多详情请关注其他相关html中文网站文章!

抓取ajax动态网页java(李凯旋创建快速动态网页的技术分析索引页下Ajax)

网站优化优采云 发表了文章 • 0 个评论 • 203 次浏览 • 2021-10-04 09:13 • 来自相关话题

  抓取ajax动态网页java(李凯旋创建快速动态网页的技术分析索引页下Ajax)
  1043-蟒蛇群:李凯旋
  工具:先解释Ajax
  Ajax 是一种用于创建快速动态网页的技术。通过在后台与服务器交换少量数据,Ajax 可以使网页异步更新。就像打开一个网页,向下拖动鼠标,就添加了网页的一部分。在这个过程中,只加载了多余的部分内容,并没有重新加载整个页面内容。这样的技术是 Ajax 创造的快速动态。网络技术。
  例如:
  
  鼠标下拉时,本次显示的加载方式为Ajax异步加载。
  目标站点分析
  输入网址网址是/search/?keyword="街拍"
  我们的目标是抓取街景图集,返回图集的标题,并将每个图集的每个子图保存到项目根目录:
  索引页
  
  详情页面
  单击图库后,将出现详细信息页面。这是我们想要得到的图片之一
  
  分析index页面下的页面源码(按F12)
  首先动态加载肯定不在Doc目录下,所以应该在XHR(异步)下搜索
  
  根据观察和向下滚动网页,我们会发现有一个?offset 标签,一直在刷新,每次增加20。然后我们找到Preview找到响应的代码,包括data标签下的图片和标题。
  图中的标题是我们需要的图集的标题,url是我们需要的图集的链接。
  
  分析详情页源码(按F12)
  
  这组图片下有8张图片,每张图片的链接都收录gallery的变量字典。
  在下一节中,我们开始获取索引页并解析索引页。
  . 查看全部

  抓取ajax动态网页java(李凯旋创建快速动态网页的技术分析索引页下Ajax)
  1043-蟒蛇群:李凯旋
  工具:先解释Ajax
  Ajax 是一种用于创建快速动态网页的技术。通过在后台与服务器交换少量数据,Ajax 可以使网页异步更新。就像打开一个网页,向下拖动鼠标,就添加了网页的一部分。在这个过程中,只加载了多余的部分内容,并没有重新加载整个页面内容。这样的技术是 Ajax 创造的快速动态。网络技术。
  例如:
  
  鼠标下拉时,本次显示的加载方式为Ajax异步加载。
  目标站点分析
  输入网址网址是/search/?keyword="街拍"
  我们的目标是抓取街景图集,返回图集的标题,并将每个图集的每个子图保存到项目根目录:
  索引页
  
  详情页面
  单击图库后,将出现详细信息页面。这是我们想要得到的图片之一
  
  分析index页面下的页面源码(按F12)
  首先动态加载肯定不在Doc目录下,所以应该在XHR(异步)下搜索
  
  根据观察和向下滚动网页,我们会发现有一个?offset 标签,一直在刷新,每次增加20。然后我们找到Preview找到响应的代码,包括data标签下的图片和标题。
  图中的标题是我们需要的图集的标题,url是我们需要的图集的链接。
  
  分析详情页源码(按F12)
  
  这组图片下有8张图片,每张图片的链接都收录gallery的变量字典。
  在下一节中,我们开始获取索引页并解析索引页。
  .

抓取ajax动态网页java(一个爬虫动态生成的网页是什么?一般来说怎么办 )

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

  抓取ajax动态网页java(一个爬虫动态生成的网页是什么?一般来说怎么办
)
  最近,该公司想写一个爬虫项目。当它遇到一些由JS或Ajax动态生成的页面时,它发现webdriver是可靠的。至于htmlunit,它直接测试了一些网站异常,这对于JS支持可能不是特别好
  Webdriver通常有两种模式:本地潜水员和远程潜水员。由于爬虫程序最终将部署到Linux服务器上,并且只能在命令行上运行,因此浏览器似乎无法安装,因此本地驱动程序的进程无法完成,因此我们只能尝试远程驱动程序。幸运的是,我们发现了一个phantomjs的web驱动程序,它可以在没有Linux接口的情况下运行,因此我们选择它作为解决方案来处理JS动态生成web页面的问题
  下载到官网:,找到相应版本下载。提取并安装。输入bin目录并执行phantomjs。您需要带上启动参数并执行远程驱动程序的地址和端口。phantomjs——webdriver 127.0.0.1:10025
  Java连接:
  WebDriver driver = new RemoteWebDriver("http://127.0.0.1:10025", DesiredCapabilities.phantomjs());
driver.get("http://www.iteye.com"); 查看全部

  抓取ajax动态网页java(一个爬虫动态生成的网页是什么?一般来说怎么办
)
  最近,该公司想写一个爬虫项目。当它遇到一些由JS或Ajax动态生成的页面时,它发现webdriver是可靠的。至于htmlunit,它直接测试了一些网站异常,这对于JS支持可能不是特别好
  Webdriver通常有两种模式:本地潜水员和远程潜水员。由于爬虫程序最终将部署到Linux服务器上,并且只能在命令行上运行,因此浏览器似乎无法安装,因此本地驱动程序的进程无法完成,因此我们只能尝试远程驱动程序。幸运的是,我们发现了一个phantomjs的web驱动程序,它可以在没有Linux接口的情况下运行,因此我们选择它作为解决方案来处理JS动态生成web页面的问题
  下载到官网:,找到相应版本下载。提取并安装。输入bin目录并执行phantomjs。您需要带上启动参数并执行远程驱动程序的地址和端口。phantomjs——webdriver 127.0.0.1:10025
  Java连接:
  WebDriver driver = new RemoteWebDriver("http://127.0.0.1:10025", DesiredCapabilities.phantomjs());
driver.get("http://www.iteye.com";);

抓取ajax动态网页java(大多数网页数据都是通过动态渲染加载的,即常说的Ajax方式 )

网站优化优采云 发表了文章 • 0 个评论 • 234 次浏览 • 2021-09-29 20:19 • 来自相关话题

  抓取ajax动态网页java(大多数网页数据都是通过动态渲染加载的,即常说的Ajax方式
)
  目前的网页数据大部分是通过动态渲染加载的,也就是通常所说的Ajax方式。在这种类型的网站 爬取数据中通常是没有网页加载数据的。一般是找到动态加载页面然后获取数据,本文分析今日头条网站,搜索关键词获取搜索页面的图片和标题,最后通过简单的多线程保存到本地下载。
  1:打开今日头条主页,网址:今日头条主页
  
  页面右上角有一个搜索框,搜索关键词加载关键词信息。
  2:分析页面
  点击搜索后,页面重新加载并返回关键字信息界面。此页面未找到具体内容信息。由此可以判断它是一个Ajax加载页面。我们可以通过网络上的XHR查看加载信息。
  
  这里可以看到加载信息的url,也可以看到下面的请求头信息。
  我们在响应中观察返回网页的源代码,可以发现所有的数据都在这里。
  
  页面信息的数据中是具体的信息,如标题、图片列表等,我们可以通过这里获取信息来获取数据。
  3:多页面数据分析
  当页面向下滑动到最后时,会自动加载新的一页数据。这里我们观察后续链接的参数。我们可以发现唯一改变的参数是offset。第一次请求时偏移量为0,第二次请求时偏移值是20,第三次是40,第四次是60,所以我们可以找到规则,这个偏移值就是反向页偏移,然后我们可以推断count参数就是一次获取的数据个数,所以我们可以使用offset参数来控制数据分页。这样我们就可以通过接口批量获取数据,然后解析数据下载图片。
  其实通过传入URL关键词,还可以进一步实现关键词下载头条图片。
  4:程序实现
  只下载第一页
  import requests
from urllib.parse import urlencode #用 urlencode() 方法构造请求的 GET 参数
import os
from hashlib import md5
headers = {
'Host': 'www.toutiao.com',
'Referer': 'https://www.toutiao.com/search/?keyword=香港',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
'Cookie': 'tt_webid=6704808321848215043; WEATHER_CITY=武汉; UM_distinctid=16b77e85ac24d7-006d237c790a88-4a5568-1fa400-16b77e85ac344b; CNZZDATA1259612802=1104480020-1561079689-%7C1561079689; __tasessionId=n39mykl9q1561084844772; tt_webid=6704808321848215043; csrftoken=dcd1d465bc7441c32e8f77a18e4dcb62; s_v_web_id=bfc941bbb6430551a71c9f370afd2c71TE: Trailers'
}
def get_page(offset):
params={
'aid':24,
'app_name':'web_search',
'format':'json',
'keyword':'香港',
'autoload':'true',
'count':20,
'en_qc':1,
'from':'search_tab',
'pd':'synthesis',
'timestamp':'1561085020266',
'offset':offset
}
url='https://www.toutiao.com/api/se ... ncode(params)
response=requests.get(url,headers=headers)
if response.status_code==200:
return response.json()
return None
def get_image(page):
if page.get('data'):
for item in page.get('data'):
title=item.get('title',None)
image_list=item.get('image_list',[])
if title:
yield { #生成器,返回标题和图像url列表
'title':title,
'image_list':image_list
}
def save_image(item):
if not os.path.exists('E:\\toutiao\\'+item.get('title')): #如果不存在就创建
os.mkdir('E:\\toutiao\\'+item.get('title'))
for img in item.get('image_list'):
print(img.get('url'))
response=requests.get(img.get('url'))
if response.status_code==200:
file_path='E:\\toutiao\\{0}\\{1}.{2}'.format(item.get('title'),
md5(response.content).hexdigest(),
'jpg') #使用MD5编码,防止命名重复
if not os.path.exists(file_path):
with open(file_path,'wb') as f:
f.write(response.content) #下载二进制数据
else:
print('已经下载了')
else:
print(response.reason)
if __name__ == '__main__':
x=get_page(0)
for y in get_image(x):
save_image(y)
  多线程下载多个页面
  在上述程序的基础上增加一个新的main函数main
  from multiprocessing.pool import Pool
def main(offset):
json = get_page(offset)
for item in get_images(json):
print(item)
save_image(item)
GROUP_START = 1 #其实页面
GROUP_END = 20 #终止页面
if __name__ == '__main__':
pool = Pool() #创建多线程
groups = ([x * 20 for x in range(GROUP_START, GROUP_END + 1)]) #构造多个参数
pool.map(main, groups) #传入多个参数,多个函数同时运行
pool.close()
pool.join() 查看全部

  抓取ajax动态网页java(大多数网页数据都是通过动态渲染加载的,即常说的Ajax方式
)
  目前的网页数据大部分是通过动态渲染加载的,也就是通常所说的Ajax方式。在这种类型的网站 爬取数据中通常是没有网页加载数据的。一般是找到动态加载页面然后获取数据,本文分析今日头条网站,搜索关键词获取搜索页面的图片和标题,最后通过简单的多线程保存到本地下载。
  1:打开今日头条主页,网址:今日头条主页
  
  页面右上角有一个搜索框,搜索关键词加载关键词信息。
  2:分析页面
  点击搜索后,页面重新加载并返回关键字信息界面。此页面未找到具体内容信息。由此可以判断它是一个Ajax加载页面。我们可以通过网络上的XHR查看加载信息。
  
  这里可以看到加载信息的url,也可以看到下面的请求头信息。
  我们在响应中观察返回网页的源代码,可以发现所有的数据都在这里。
  
  页面信息的数据中是具体的信息,如标题、图片列表等,我们可以通过这里获取信息来获取数据。
  3:多页面数据分析
  当页面向下滑动到最后时,会自动加载新的一页数据。这里我们观察后续链接的参数。我们可以发现唯一改变的参数是offset。第一次请求时偏移量为0,第二次请求时偏移值是20,第三次是40,第四次是60,所以我们可以找到规则,这个偏移值就是反向页偏移,然后我们可以推断count参数就是一次获取的数据个数,所以我们可以使用offset参数来控制数据分页。这样我们就可以通过接口批量获取数据,然后解析数据下载图片。
  其实通过传入URL关键词,还可以进一步实现关键词下载头条图片。
  4:程序实现
  只下载第一页
  import requests
from urllib.parse import urlencode #用 urlencode() 方法构造请求的 GET 参数
import os
from hashlib import md5
headers = {
'Host': 'www.toutiao.com',
'Referer': 'https://www.toutiao.com/search/?keyword=香港',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
'Cookie': 'tt_webid=6704808321848215043; WEATHER_CITY=武汉; UM_distinctid=16b77e85ac24d7-006d237c790a88-4a5568-1fa400-16b77e85ac344b; CNZZDATA1259612802=1104480020-1561079689-%7C1561079689; __tasessionId=n39mykl9q1561084844772; tt_webid=6704808321848215043; csrftoken=dcd1d465bc7441c32e8f77a18e4dcb62; s_v_web_id=bfc941bbb6430551a71c9f370afd2c71TE: Trailers'
}
def get_page(offset):
params={
'aid':24,
'app_name':'web_search',
'format':'json',
'keyword':'香港',
'autoload':'true',
'count':20,
'en_qc':1,
'from':'search_tab',
'pd':'synthesis',
'timestamp':'1561085020266',
'offset':offset
}
url='https://www.toutiao.com/api/se ... ncode(params)
response=requests.get(url,headers=headers)
if response.status_code==200:
return response.json()
return None
def get_image(page):
if page.get('data'):
for item in page.get('data'):
title=item.get('title',None)
image_list=item.get('image_list',[])
if title:
yield { #生成器,返回标题和图像url列表
'title':title,
'image_list':image_list
}
def save_image(item):
if not os.path.exists('E:\\toutiao\\'+item.get('title')): #如果不存在就创建
os.mkdir('E:\\toutiao\\'+item.get('title'))
for img in item.get('image_list'):
print(img.get('url'))
response=requests.get(img.get('url'))
if response.status_code==200:
file_path='E:\\toutiao\\{0}\\{1}.{2}'.format(item.get('title'),
md5(response.content).hexdigest(),
'jpg') #使用MD5编码,防止命名重复
if not os.path.exists(file_path):
with open(file_path,'wb') as f:
f.write(response.content) #下载二进制数据
else:
print('已经下载了')
else:
print(response.reason)
if __name__ == '__main__':
x=get_page(0)
for y in get_image(x):
save_image(y)
  多线程下载多个页面
  在上述程序的基础上增加一个新的main函数main
  from multiprocessing.pool import Pool
def main(offset):
json = get_page(offset)
for item in get_images(json):
print(item)
save_image(item)
GROUP_START = 1 #其实页面
GROUP_END = 20 #终止页面
if __name__ == '__main__':
pool = Pool() #创建多线程
groups = ([x * 20 for x in range(GROUP_START, GROUP_END + 1)]) #构造多个参数
pool.map(main, groups) #传入多个参数,多个函数同时运行
pool.close()
pool.join()

抓取ajax动态网页java(一下如何判断网页的编码:网上很多网页编码格式都不一样)

网站优化优采云 发表了文章 • 0 个评论 • 130 次浏览 • 2021-09-26 08:11 • 来自相关话题

  抓取ajax动态网页java(一下如何判断网页的编码:网上很多网页编码格式都不一样)
  在web开发中,我们经常会遇到网页的爬取和分析,可以用各种语言来完成。我喜欢用python来实现,因为python提供了很多成熟的模块,可以轻松实现网络爬虫。
  但是在爬取的过程中会遇到编码问题。今天我们就来看看如何判断一个网页的编码:
  互联网上很多网页都有不同的编码格式,一般是GBK、GB2312、UTF-8等。
  我们在获取到网页的数据后,首先要判断网页的编码,然后才能将抓取到的内容的编码统一转换为我们可以处理的编码,避免出现乱码问题。
  使用 chardet 模块
   1 #如果你的python没有安装chardet模块,你需要首先安装一下chardet判断编码的模块哦
2 #author:pythontab.com
3 import chardet
4 import urllib
5 #先获取网页内容
6 data1 = urllib.urlopen('http://www.baidu.com').read()
7 #用chardet进行内容分析
8 chardit1 = chardet.detect(data1)
9
10 print chardit1['encoding'] # baidu
  实施结果如下:
  gb2312
  这个结果是正确的,你可以自己验证一下~~ 查看全部

  抓取ajax动态网页java(一下如何判断网页的编码:网上很多网页编码格式都不一样)
  在web开发中,我们经常会遇到网页的爬取和分析,可以用各种语言来完成。我喜欢用python来实现,因为python提供了很多成熟的模块,可以轻松实现网络爬虫。
  但是在爬取的过程中会遇到编码问题。今天我们就来看看如何判断一个网页的编码:
  互联网上很多网页都有不同的编码格式,一般是GBK、GB2312、UTF-8等。
  我们在获取到网页的数据后,首先要判断网页的编码,然后才能将抓取到的内容的编码统一转换为我们可以处理的编码,避免出现乱码问题。
  使用 chardet 模块
   1 #如果你的python没有安装chardet模块,你需要首先安装一下chardet判断编码的模块哦
2 #author:pythontab.com
3 import chardet
4 import urllib
5 #先获取网页内容
6 data1 = urllib.urlopen('http://www.baidu.com').read()
7 #用chardet进行内容分析
8 chardit1 = chardet.detect(data1)
9
10 print chardit1['encoding'] # baidu
  实施结果如下:
  gb2312
  这个结果是正确的,你可以自己验证一下~~

抓取ajax动态网页java(之前第一篇教程.js爬虫入门(一)爬取静态页面)

网站优化优采云 发表了文章 • 0 个评论 • 65 次浏览 • 2021-09-25 10:12 • 来自相关话题

  抓取ajax动态网页java(之前第一篇教程.js爬虫入门(一)爬取静态页面)
  第一篇爬虫教程node.js爬虫介绍(一)爬取静态页面讲解了静态网页的爬取,很简单,但是如果遇到少量的动态网页(ajax),直接发送请求使用前面的方法无法获取到我们想要的数据,这时候需要爬取动态网页,selenium和puppeteer都不错。
  这里推荐Puppeteer,不是为了别的,只是因为它是谷歌自己的,一直在维护和升级。以下是翻译的官方文档详情
  Puppeteer 是一个 Node 库,通过 DevTools(开发者工具)协议提供了一系列高级接口来控制 Chrome 或 Chromium(谷歌开源)。默认运行headless模式(无浏览器UI界面),也可以通过配置运行在普通模式。
  它可用于:
  首先,我们必须先安装它,然后才能使用它。最新的Chromium会默认安装下载,大小约300M。
  npm install puppeteer
  如果你的机器上已经有较新版本的chrome,可以只安装core版本,但是启动puppeteer时需要配置本地chrome的路径。
  npm install puppeteer-core // 核心版本
  假设我们要爬取拉勾的前台招聘信息。这是一个动态页面。使用此示例尝试抓取。
  由于chrome操作都是异步操作,为了避免回调地狱,推荐使用es7的async await。这种语法具有很高的可读性,官方文档也是如此。
  首先使用puppeteer启动浏览器,打开动态页面
  需要注意的是,如果使用的是本地浏览器,则需要在启动浏览器配置中传入本地chrome路径
  const browser = await puppeteer.launch({ executablePath: 'C:/Users/Administrator/AppData/Local/Google/Chrome/Application/chrome.exe'})
  在chrome环境中执行函数,获取需要的数据,然后返回到node的执行环境
  
  上图可以看到我们需要的数据的dom位置。在chrome环境执行的函数中,我们需要获取和整理需要的数据。
  let list = document.querySelectorAll('.s_position_list .item_con_list li')let res = []for (let i = 0; i < list.length; i++) { res.push({ name: list[i].getAttribute('data-positionname'), company: list[i].getAttribute('data-company'), salary: list[i].getAttribute('data-salary'), require: list[i].querySelector('.li_b_l').childNodes[4].textContent.replace(/ |\n/g, ''), })}return res
  这里有一个调试技巧,我们可以在chrome控制台中直接编写获取数据的函数,方便调试
  最后附上完整代码
  const puppeteer = require('puppeteer');(async () => { // 启动浏览器 const browser = await puppeteer.launch({ headless: false, // 默认是无头模式,这里为了示范所以使用正常模式 }) // 控制浏览器打开新标签页面 const page = await browser.newPage() // 在新标签中打开要爬取的网页 await page.goto('https://www.lagou.com/jobs/list_web%E5%89%8D%E7%AB%AF?px=new&city=%E5%B9%BF%E5%B7%9E') // 使用evaluate方法在浏览器中执行传入函数(完全的浏览器环境,所以函数内可以直接使用window、document等所有对象和方法) let data = await page.evaluate(() => { let list = document.querySelectorAll('.s_position_list .item_con_list li') let res = [] for (let i = 0; i < list.length; i++) { res.push({ name: list[i].getAttribute('data-positionname'), company: list[i].getAttribute('data-company'), salary: list[i].getAttribute('data-salary'), require: list[i].querySelector('.li_b_l').childNodes[4].textContent.replace(/ |\n/g, ''), }) } return res }) console.log(data)})()
  操作结果
  
  成功
  到这里,动态网页的爬取也已经完成了,但是puppeteer的功能远不止这些。它还具有许多可以使用的强大 API。您可以移至官方文档。
  第三期会讲​​如何定时执行爬虫并存入数据库。 查看全部

  抓取ajax动态网页java(之前第一篇教程.js爬虫入门(一)爬取静态页面)
  第一篇爬虫教程node.js爬虫介绍(一)爬取静态页面讲解了静态网页的爬取,很简单,但是如果遇到少量的动态网页(ajax),直接发送请求使用前面的方法无法获取到我们想要的数据,这时候需要爬取动态网页,selenium和puppeteer都不错。
  这里推荐Puppeteer,不是为了别的,只是因为它是谷歌自己的,一直在维护和升级。以下是翻译的官方文档详情
  Puppeteer 是一个 Node 库,通过 DevTools(开发者工具)协议提供了一系列高级接口来控制 Chrome 或 Chromium(谷歌开源)。默认运行headless模式(无浏览器UI界面),也可以通过配置运行在普通模式。
  它可用于:
  首先,我们必须先安装它,然后才能使用它。最新的Chromium会默认安装下载,大小约300M。
  npm install puppeteer
  如果你的机器上已经有较新版本的chrome,可以只安装core版本,但是启动puppeteer时需要配置本地chrome的路径。
  npm install puppeteer-core // 核心版本
  假设我们要爬取拉勾的前台招聘信息。这是一个动态页面。使用此示例尝试抓取。
  由于chrome操作都是异步操作,为了避免回调地狱,推荐使用es7的async await。这种语法具有很高的可读性,官方文档也是如此。
  首先使用puppeteer启动浏览器,打开动态页面
  需要注意的是,如果使用的是本地浏览器,则需要在启动浏览器配置中传入本地chrome路径
  const browser = await puppeteer.launch({ executablePath: 'C:/Users/Administrator/AppData/Local/Google/Chrome/Application/chrome.exe'})
  在chrome环境中执行函数,获取需要的数据,然后返回到node的执行环境
  
  上图可以看到我们需要的数据的dom位置。在chrome环境执行的函数中,我们需要获取和整理需要的数据。
  let list = document.querySelectorAll('.s_position_list .item_con_list li')let res = []for (let i = 0; i < list.length; i++) { res.push({ name: list[i].getAttribute('data-positionname'), company: list[i].getAttribute('data-company'), salary: list[i].getAttribute('data-salary'), require: list[i].querySelector('.li_b_l').childNodes[4].textContent.replace(/ |\n/g, ''), })}return res
  这里有一个调试技巧,我们可以在chrome控制台中直接编写获取数据的函数,方便调试
  最后附上完整代码
  const puppeteer = require('puppeteer');(async () => { // 启动浏览器 const browser = await puppeteer.launch({ headless: false, // 默认是无头模式,这里为了示范所以使用正常模式 }) // 控制浏览器打开新标签页面 const page = await browser.newPage() // 在新标签中打开要爬取的网页 await page.goto('https://www.lagou.com/jobs/list_web%E5%89%8D%E7%AB%AF?px=new&city=%E5%B9%BF%E5%B7%9E') // 使用evaluate方法在浏览器中执行传入函数(完全的浏览器环境,所以函数内可以直接使用window、document等所有对象和方法) let data = await page.evaluate(() => { let list = document.querySelectorAll('.s_position_list .item_con_list li') let res = [] for (let i = 0; i < list.length; i++) { res.push({ name: list[i].getAttribute('data-positionname'), company: list[i].getAttribute('data-company'), salary: list[i].getAttribute('data-salary'), require: list[i].querySelector('.li_b_l').childNodes[4].textContent.replace(/ |\n/g, ''), }) } return res }) console.log(data)})()
  操作结果
  
  成功
  到这里,动态网页的爬取也已经完成了,但是puppeteer的功能远不止这些。它还具有许多可以使用的强大 API。您可以移至官方文档。
  第三期会讲​​如何定时执行爬虫并存入数据库。

抓取ajax动态网页java(一个爬虫动态生成的网页是什么?一般来说怎么办 )

网站优化优采云 发表了文章 • 0 个评论 • 73 次浏览 • 2021-09-24 12:06 • 来自相关话题

  抓取ajax动态网页java(一个爬虫动态生成的网页是什么?一般来说怎么办
)
  最近,该公司想写一个爬虫项目。当它遇到一些由JS或Ajax动态生成的页面时,它发现webdriver是可靠的。至于htmlunit,它直接测试了一些网站异常,这对于JS支持可能不是特别好
  Webdriver通常有两种模式:本地潜水员和远程潜水员。由于爬虫程序最终将部署到Linux服务器上,并且只能在命令行上运行,因此浏览器似乎无法安装,因此本地驱动程序的进程无法完成,因此我们只能尝试远程驱动程序。幸运的是,我们发现了一个phantomjs的web驱动程序,它可以在没有Linux接口的情况下运行,因此我们选择它作为解决方案来处理JS动态生成web页面的问题
  下载到官网:,找到相应版本下载。提取并安装。输入bin目录并执行phantomjs。您需要带上启动参数并执行远程驱动程序的地址和端口。phantomjs——webdriver 127.0.0.1:10025
  Java连接:
  WebDriver driver = new RemoteWebDriver("http://127.0.0.1:10025", DesiredCapabilities.phantomjs());
driver.get("http://www.iteye.com"); 查看全部

  抓取ajax动态网页java(一个爬虫动态生成的网页是什么?一般来说怎么办
)
  最近,该公司想写一个爬虫项目。当它遇到一些由JS或Ajax动态生成的页面时,它发现webdriver是可靠的。至于htmlunit,它直接测试了一些网站异常,这对于JS支持可能不是特别好
  Webdriver通常有两种模式:本地潜水员和远程潜水员。由于爬虫程序最终将部署到Linux服务器上,并且只能在命令行上运行,因此浏览器似乎无法安装,因此本地驱动程序的进程无法完成,因此我们只能尝试远程驱动程序。幸运的是,我们发现了一个phantomjs的web驱动程序,它可以在没有Linux接口的情况下运行,因此我们选择它作为解决方案来处理JS动态生成web页面的问题
  下载到官网:,找到相应版本下载。提取并安装。输入bin目录并执行phantomjs。您需要带上启动参数并执行远程驱动程序的地址和端口。phantomjs——webdriver 127.0.0.1:10025
  Java连接:
  WebDriver driver = new RemoteWebDriver("http://127.0.0.1:10025", DesiredCapabilities.phantomjs());
driver.get("http://www.iteye.com";);

抓取ajax动态网页java(Ajax(AsynchronousJavaScriptandXML)是什么意思?购物车示例)

网站优化优采云 发表了文章 • 0 个评论 • 87 次浏览 • 2021-09-22 06:26 • 来自相关话题

  抓取ajax动态网页java(Ajax(AsynchronousJavaScriptandXML)是什么意思?购物车示例)
  ajax(异步JavaScript和XML)是一个编程技术,与Java技术,XML和JavaScript相结合,允许您构建基于Java技术的Web应用程序并打破页面过载的使用。
  ajax,异步JavaScript和XML,是使用客户端脚本和Web服务器的Web应用程序开发方法。通过这种方式,网页不必中断互动过程到REANFINE,您可以更新它。使用AJAX,您可以创建,直接,高度可用,更丰富,更紧密的Web用户界面接口,靠近本地桌面应用程序。
  ajax不是一种技术,它更像是一种模式 - 徽标,并描述了一种有用的设计技术的方法。对于刚理解它的许多开发人员来说,它是一种新的感觉,但是实现AJAX的所有组件都存在多年。
  目前的热闹是因为2004年和2005年有一些基于Ajax的非常动态的WebUI,特别是Google的Gmail和Maps应用程序,共享网站Flickr与照片。这些UI充分利用了一些由某些开发人员称为“Web 2. 0”的后台通道,这导致了Ajax应用程序的快速上升。
  更好的购物车
  您可以使用Ajax来增强传统的Web应用程序,通过消除页面加载来使交互更平滑。要演示它,我将使用一个简单的动态更新的项目购物车。结合在线商店,此方法不能等待可点击的页面过载,让我们继续浏览并选择商品到购物车。
  虽然本文中的代码用于购物车示例,但可以在其他Ajax应用程序中使用显示的技术。购物车示例中使用的HTML代码如清单1.在整篇文章文章,我将引用这些HTML代码。
  ajax处理过程
  Ajax交互从名为XMLHTTPREQUEST的JavaScript对象开始。与名称一样,它允许客户端脚本执行HTTP请求,并将以XML格式解析服务器响应。 Ajax进程的第一步是创建XMLHTTPRequest实例。使用HTTP方法(GET或POST)处理请求并将目标URL设置为XMLHTTPREQUES对象。
  现在请记住AJAX如何在异步处理状态中首先?发送HTTP请求时,您不希望浏览器挂起并等待服务器的响应,并且您希望继续响应用户的界面,并且确实达到服务器响应。
  要完成它,您可以将回调函数注册到XMLHTTPRequest并异步发送XMLHTTPRequest请求。控件立即返回到浏览器。当服务器响应时,将调用回调函数。
  在Java Web服务器上,到达请求与任何其他HttpservletRequest相同。解析请求参数后,servlet执行XML中所需的应用程序逻辑,序列并将其写回httpservletresponse。
  返回客户端,现在将调用xmlhttperquest上注册的回调函数来处理服务器返回的XML文档。最后,通过更新用户界面来响应服务器来传输数据,使用JavaScript来操作页面的HTML DOM。图1是Ajax处理过程的时序图。
  
  图1:ajax处理过程
  现在,您应该具有ajax处理过程的高级视图。我将进入他们的每一步,以查看更多细节。如果找不到您的位置,请回顾并查看图1,添加 - 因为Ajax方法的异步本质不前进。 查看全部

  抓取ajax动态网页java(Ajax(AsynchronousJavaScriptandXML)是什么意思?购物车示例)
  ajax(异步JavaScript和XML)是一个编程技术,与Java技术,XML和JavaScript相结合,允许您构建基于Java技术的Web应用程序并打破页面过载的使用。
  ajax,异步JavaScript和XML,是使用客户端脚本和Web服务器的Web应用程序开发方法。通过这种方式,网页不必中断互动过程到REANFINE,您可以更新它。使用AJAX,您可以创建,直接,高度可用,更丰富,更紧密的Web用户界面接口,靠近本地桌面应用程序。
  ajax不是一种技术,它更像是一种模式 - 徽标,并描述了一种有用的设计技术的方法。对于刚理解它的许多开发人员来说,它是一种新的感觉,但是实现AJAX的所有组件都存在多年。
  目前的热闹是因为2004年和2005年有一些基于Ajax的非常动态的WebUI,特别是Google的Gmail和Maps应用程序,共享网站Flickr与照片。这些UI充分利用了一些由某些开发人员称为“Web 2. 0”的后台通道,这导致了Ajax应用程序的快速上升。
  更好的购物车
  您可以使用Ajax来增强传统的Web应用程序,通过消除页面加载来使交互更平滑。要演示它,我将使用一个简单的动态更新的项目购物车。结合在线商店,此方法不能等待可点击的页面过载,让我们继续浏览并选择商品到购物车。
  虽然本文中的代码用于购物车示例,但可以在其他Ajax应用程序中使用显示的技术。购物车示例中使用的HTML代码如清单1.在整篇文章文章,我将引用这些HTML代码。
  ajax处理过程
  Ajax交互从名为XMLHTTPREQUEST的JavaScript对象开始。与名称一样,它允许客户端脚本执行HTTP请求,并将以XML格式解析服务器响应。 Ajax进程的第一步是创建XMLHTTPRequest实例。使用HTTP方法(GET或POST)处理请求并将目标URL设置为XMLHTTPREQUES对象。
  现在请记住AJAX如何在异步处理状态中首先?发送HTTP请求时,您不希望浏览器挂起并等待服务器的响应,并且您希望继续响应用户的界面,并且确实达到服务器响应。
  要完成它,您可以将回调函数注册到XMLHTTPRequest并异步发送XMLHTTPRequest请求。控件立即返回到浏览器。当服务器响应时,将调用回调函数。
  在Java Web服务器上,到达请求与任何其他HttpservletRequest相同。解析请求参数后,servlet执行XML中所需的应用程序逻辑,序列并将其写回httpservletresponse。
  返回客户端,现在将调用xmlhttperquest上注册的回调函数来处理服务器返回的XML文档。最后,通过更新用户界面来响应服务器来传输数据,使用JavaScript来操作页面的HTML DOM。图1是Ajax处理过程的时序图。
  
  图1:ajax处理过程
  现在,您应该具有ajax处理过程的高级视图。我将进入他们的每一步,以查看更多细节。如果找不到您的位置,请回顾并查看图1,添加 - 因为Ajax方法的异步本质不前进。

抓取ajax动态网页java(小编来一起如何用python来页面中的JS动态加载 )

网站优化优采云 发表了文章 • 0 个评论 • 90 次浏览 • 2021-11-02 07:20 • 来自相关话题

  抓取ajax动态网页java(小编来一起如何用python来页面中的JS动态加载
)
  本文文章主要介绍了如何使用python捕捉网页中的动态数据。文章通过示例代码详细介绍,对大家的学习或工作有一定的参考学习价值,有需要的朋友和小编一起学习吧
  我们经常会发现,网页中的很多数据并不是用HTML硬编码的,而是通过js动态加载的。所以也引出了动态数据的概念。这里的动态数据是指网页中通过Javascript动态生成的页面内容,是页面加载到浏览器后动态生成的,以前没有的。
  在编写爬虫抓取网页数据的时候,经常会遇到这种需要动态加载数据的HTML网页。如果还是直接从网页爬取,将无法获取任何数据。
  今天,我们就在这里简单说说如何使用python抓取页面中JS动态加载的数据。
  给定一个网页:豆瓣电影排行榜,里面的所有电影信息都是动态加载的。我们无法直接从页面中获取每部电影的信息。
  如下图所示,我们在HTML中找不到对应的电影信息。
  
  
  在Chrome浏览器中,点击F12打开Network中的XHR,我们抓取对应的js文件进行分析。如下所示:
  
  在豆瓣页面向下拖动,可以将更多的电影信息加载到页面中,以便我们抓取相应的消息。
  我们可以看到它使用了 AJAX 异步请求。通过在后台与服务器交换少量数据,AJAX 可以使网页异步更新。因此,可以在不重新加载整个网页的情况下更新网页的某个部分,从而实现数据的动态加载。
  
  我们可以看到,通过GET,我们得到的响应中收录了对应的电影相关信息,以JSON格式存储在一起。
  
  查看RequestURL信息,可以发现action参数后面有“start”和“limit”两个参数。显然他们的意思是:“从某个位置返回的电影数量”。
  如果你想快速获取相关电影信息,可以直接把这个URL复制到地址栏,修改你需要的start和limit参数值,得到相应的抓取结果。
  但这不是很自动,很多其他的网站 RequestURL 也不是那么直接,所以我们将使用python 进行进一步的操作来获取返回的消息信息。
   #coding:utf-8 import urllib import requests post_param = {'action':'','start':'0','limit':'1'} return_data = requests.get("https://movie.douban.com/j/cha ... ot%3B,data =post_param, verify = False) print return_data.text 查看全部

  抓取ajax动态网页java(小编来一起如何用python来页面中的JS动态加载
)
  本文文章主要介绍了如何使用python捕捉网页中的动态数据。文章通过示例代码详细介绍,对大家的学习或工作有一定的参考学习价值,有需要的朋友和小编一起学习吧
  我们经常会发现,网页中的很多数据并不是用HTML硬编码的,而是通过js动态加载的。所以也引出了动态数据的概念。这里的动态数据是指网页中通过Javascript动态生成的页面内容,是页面加载到浏览器后动态生成的,以前没有的。
  在编写爬虫抓取网页数据的时候,经常会遇到这种需要动态加载数据的HTML网页。如果还是直接从网页爬取,将无法获取任何数据。
  今天,我们就在这里简单说说如何使用python抓取页面中JS动态加载的数据。
  给定一个网页:豆瓣电影排行榜,里面的所有电影信息都是动态加载的。我们无法直接从页面中获取每部电影的信息。
  如下图所示,我们在HTML中找不到对应的电影信息。
  
  
  在Chrome浏览器中,点击F12打开Network中的XHR,我们抓取对应的js文件进行分析。如下所示:
  
  在豆瓣页面向下拖动,可以将更多的电影信息加载到页面中,以便我们抓取相应的消息。
  我们可以看到它使用了 AJAX 异步请求。通过在后台与服务器交换少量数据,AJAX 可以使网页异步更新。因此,可以在不重新加载整个网页的情况下更新网页的某个部分,从而实现数据的动态加载。
  
  我们可以看到,通过GET,我们得到的响应中收录了对应的电影相关信息,以JSON格式存储在一起。
  
  查看RequestURL信息,可以发现action参数后面有“start”和“limit”两个参数。显然他们的意思是:“从某个位置返回的电影数量”。
  如果你想快速获取相关电影信息,可以直接把这个URL复制到地址栏,修改你需要的start和limit参数值,得到相应的抓取结果。
  但这不是很自动,很多其他的网站 RequestURL 也不是那么直接,所以我们将使用python 进行进一步的操作来获取返回的消息信息。
   #coding:utf-8 import urllib import requests post_param = {'action':'','start':'0','limit':'1'} return_data = requests.get("https://movie.douban.com/j/cha ... ot%3B,data =post_param, verify = False) print return_data.text

抓取ajax动态网页java(基于浏览器内核来开发的动态页面渲染处理服务器(组图))

网站优化优采云 发表了文章 • 0 个评论 • 74 次浏览 • 2021-10-25 20:16 • 来自相关话题

  抓取ajax动态网页java(基于浏览器内核来开发的动态页面渲染处理服务器(组图))
  前言
  曾几何时,动态页面的信息抽取(ajax、内部js二次渲染等)一直是爬虫开发者的心病。总之,真的没有合适的工具。尤其是在Java中,像htmlunit这样的工具可以看作是解析动态页面的神器,但还不够完善,无法达到浏览器级别的解析效果,遇到稍微复杂一点的页面时,也起不到作用。在经历了各种痛苦和仇恨之后,作者决定开发一个动态页面渲染处理服务器,专门用于抓取、监控和测试此类场景。要达到浏览器级别的效果,必须基于浏览器内核进行开发。幸运的是,我们有一个开源的 webkit。幸运的是,我们有 QtWebkit,它对开发人员更加友好。
  SeimiAgent 简介
  SeimiAgent 是基于 QtWebkit 开发的 webkit 服务,可以在服务器端后台运行。它可以通过SeimiAgent提供的http接口向SeimiAgent发送加载请求(要加载的URL和该页面接受的渲染时间或使用什么代理等参数),通过SeimiAgent加载并渲染动态页面要处理,然后直接将渲染好的页面返回给调用者进行后续处理,所以运行的SeimiAgent服务是语言无关的,任何语言或框架都可以通过SeimiAgent提供标准的http接口来获取服务。SeimiAgent 的加载和渲染环境都是通用浏览器级别的,所以不用担心他处理动态页面的能力。目前,SeimiAgent 只支持返回渲染的 HTML 文档。未来将增加图片快照和PDF支持,以方便更多样化的使用需求。
  使用演示
  
  SeimiCrawler 简介
  SeimiCrawler 是一个敏捷、独立部署、支持分布式Java 爬虫框架。希望最大限度地降低新手开发高可用低性能爬虫系统的门槛,提高爬虫系统的开发效率。在 SeimiCrawler 的世界里,大部分人只需要关心编写爬行的业务逻辑,剩下的 Seimi 会为你做。在设计上,SeimiCrawler 极大的受到了 Python 的爬虫框架 Scrapy 的启发,同时结合了 Java 语言的特性和 Spring 的特性,希望在国内使用更高效的 XPath 来更方便、更通用地解析 HTML,所以SeimiCrawler默认为HTML解析处理器为JsoupXpath(独立扩展项目,不收录在jsoup中),
  集成和部署 SeimiAgent
  下载和解压不会显示。上面的动态图片中也有演示。下载地址可以在 SeimiAgent 主页上找到。进入SeimiAgent的bin目录,执行:
  ./SeimiAgent -p 8000
  这就是启动SeimiAgent服务,监听8000端口。接下来其实可以用任何语言通过http请求发送加载页面的请求,然后得到渲染结果。当然,我们这里介绍的是SeimiCrawler是如何集成和使用SeimiAgent的。
  SeimiCrawler 配置
  SeimiCrawler 在 v0.3.0 版本中内置了对 SeimiAgent 的支持。开发者只需要配置SeimiAgent的地址和端口,然后在生成具体的Request时选择是否提交给SeimiAgent,并指定如何提交。让我们直接在评论中解释最后一个完整的例子:
  package cn.wanghaomiao.crawlers;
import cn.wanghaomiao.seimi.annotation.Crawler;
import cn.wanghaomiao.seimi.def.BaseSeimiCrawler;
import cn.wanghaomiao.seimi.struct.Request;
import cn.wanghaomiao.seimi.struct.Response;
import cn.wanghaomiao.xpath.model.JXDocument;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
/**
* 这个例子演示如何使用SeimiAgent进行复杂动态页面信息抓取
* @author 汪浩淼 et.tw@163.com
* @since 2016/4/14.
*/
@Crawler(name = "seimiagent")
public class SeimiAgentDemo extends BaseSeimiCrawler{
/**
* 在resource/config/seimi.properties中配置方便更换,当然也可以自行根据情况使用自己的统一配置中心等服务。这里配置SeimiAgent服务所在地址。
*/
@Value("${seimiAgentHost}")
private String seimiAgentHost;
//SeimiAgent监听的端口好,如上文中的8000
@Value("${seimiAgentPort}")
private int seimiAgentPort;
@Override
public String[] startUrls() {
return new String[]{"https://www.baidu.com"};
}
@Override
public String seimiAgentHost() {
return this.seimiAgentHost;
}
@Override
public int seimiAgentPort() {
return this.seimiAgentPort;
}
@Override
public void start(Response response) {
Request seimiAgentReq = Request.build("https://www.souyidai.com","getTotalTransactions")
.useSeimiAgent()
// 告诉SeimiAgent针对这个请求是否使用cookie,如果没有设置使用当前Crawler关于cookie使用条件作为默认值。
//.setSeimiAgentUseCookie(true)
// 设置全部load完成后给SeimiAgent多少时间用于执行js并渲染页面,单位为毫秒
.setSeimiAgentRenderTime(5000);
push(seimiAgentReq);
}
/**
* 获取搜易贷首页总成交额
* @param response
*/
public void getTotalTransactions(Response response){
JXDocument doc = response.document();
try {
String trans = StringUtils.join(doc.sel("//div[@class='homepage-amount']/div[@class='number font-arial']/div/span/text()"),"");
logger.info("Final Res:{}",trans);
} catch (Exception e) {
e.printStackTrace();
}
}
}
  配置文件seimi.properties
  seimiAgentHost=127.0.0.1
seimiAgentPort=8000
  启动
  public class Boot {
public static void main(String[] args){
Seimi s = new Seimi();
s.start("seimiagent");
}
}
  SeimiCrawler 启动后,您可以看到您想要的搜一贷交易总额。
  完整演示地址
  演示 查看全部

  抓取ajax动态网页java(基于浏览器内核来开发的动态页面渲染处理服务器(组图))
  前言
  曾几何时,动态页面的信息抽取(ajax、内部js二次渲染等)一直是爬虫开发者的心病。总之,真的没有合适的工具。尤其是在Java中,像htmlunit这样的工具可以看作是解析动态页面的神器,但还不够完善,无法达到浏览器级别的解析效果,遇到稍微复杂一点的页面时,也起不到作用。在经历了各种痛苦和仇恨之后,作者决定开发一个动态页面渲染处理服务器,专门用于抓取、监控和测试此类场景。要达到浏览器级别的效果,必须基于浏览器内核进行开发。幸运的是,我们有一个开源的 webkit。幸运的是,我们有 QtWebkit,它对开发人员更加友好。
  SeimiAgent 简介
  SeimiAgent 是基于 QtWebkit 开发的 webkit 服务,可以在服务器端后台运行。它可以通过SeimiAgent提供的http接口向SeimiAgent发送加载请求(要加载的URL和该页面接受的渲染时间或使用什么代理等参数),通过SeimiAgent加载并渲染动态页面要处理,然后直接将渲染好的页面返回给调用者进行后续处理,所以运行的SeimiAgent服务是语言无关的,任何语言或框架都可以通过SeimiAgent提供标准的http接口来获取服务。SeimiAgent 的加载和渲染环境都是通用浏览器级别的,所以不用担心他处理动态页面的能力。目前,SeimiAgent 只支持返回渲染的 HTML 文档。未来将增加图片快照和PDF支持,以方便更多样化的使用需求。
  使用演示
  
  SeimiCrawler 简介
  SeimiCrawler 是一个敏捷、独立部署、支持分布式Java 爬虫框架。希望最大限度地降低新手开发高可用低性能爬虫系统的门槛,提高爬虫系统的开发效率。在 SeimiCrawler 的世界里,大部分人只需要关心编写爬行的业务逻辑,剩下的 Seimi 会为你做。在设计上,SeimiCrawler 极大的受到了 Python 的爬虫框架 Scrapy 的启发,同时结合了 Java 语言的特性和 Spring 的特性,希望在国内使用更高效的 XPath 来更方便、更通用地解析 HTML,所以SeimiCrawler默认为HTML解析处理器为JsoupXpath(独立扩展项目,不收录在jsoup中),
  集成和部署 SeimiAgent
  下载和解压不会显示。上面的动态图片中也有演示。下载地址可以在 SeimiAgent 主页上找到。进入SeimiAgent的bin目录,执行:
  ./SeimiAgent -p 8000
  这就是启动SeimiAgent服务,监听8000端口。接下来其实可以用任何语言通过http请求发送加载页面的请求,然后得到渲染结果。当然,我们这里介绍的是SeimiCrawler是如何集成和使用SeimiAgent的。
  SeimiCrawler 配置
  SeimiCrawler 在 v0.3.0 版本中内置了对 SeimiAgent 的支持。开发者只需要配置SeimiAgent的地址和端口,然后在生成具体的Request时选择是否提交给SeimiAgent,并指定如何提交。让我们直接在评论中解释最后一个完整的例子:
  package cn.wanghaomiao.crawlers;
import cn.wanghaomiao.seimi.annotation.Crawler;
import cn.wanghaomiao.seimi.def.BaseSeimiCrawler;
import cn.wanghaomiao.seimi.struct.Request;
import cn.wanghaomiao.seimi.struct.Response;
import cn.wanghaomiao.xpath.model.JXDocument;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
/**
* 这个例子演示如何使用SeimiAgent进行复杂动态页面信息抓取
* @author 汪浩淼 et.tw@163.com
* @since 2016/4/14.
*/
@Crawler(name = "seimiagent")
public class SeimiAgentDemo extends BaseSeimiCrawler{
/**
* 在resource/config/seimi.properties中配置方便更换,当然也可以自行根据情况使用自己的统一配置中心等服务。这里配置SeimiAgent服务所在地址。
*/
@Value("${seimiAgentHost}")
private String seimiAgentHost;
//SeimiAgent监听的端口好,如上文中的8000
@Value("${seimiAgentPort}")
private int seimiAgentPort;
@Override
public String[] startUrls() {
return new String[]{"https://www.baidu.com"};
}
@Override
public String seimiAgentHost() {
return this.seimiAgentHost;
}
@Override
public int seimiAgentPort() {
return this.seimiAgentPort;
}
@Override
public void start(Response response) {
Request seimiAgentReq = Request.build("https://www.souyidai.com","getTotalTransactions")
.useSeimiAgent()
// 告诉SeimiAgent针对这个请求是否使用cookie,如果没有设置使用当前Crawler关于cookie使用条件作为默认值。
//.setSeimiAgentUseCookie(true)
// 设置全部load完成后给SeimiAgent多少时间用于执行js并渲染页面,单位为毫秒
.setSeimiAgentRenderTime(5000);
push(seimiAgentReq);
}
/**
* 获取搜易贷首页总成交额
* @param response
*/
public void getTotalTransactions(Response response){
JXDocument doc = response.document();
try {
String trans = StringUtils.join(doc.sel("//div[@class='homepage-amount']/div[@class='number font-arial']/div/span/text()"),"");
logger.info("Final Res:{}",trans);
} catch (Exception e) {
e.printStackTrace();
}
}
}
  配置文件seimi.properties
  seimiAgentHost=127.0.0.1
seimiAgentPort=8000
  启动
  public class Boot {
public static void main(String[] args){
Seimi s = new Seimi();
s.start("seimiagent");
}
}
  SeimiCrawler 启动后,您可以看到您想要的搜一贷交易总额。
  完整演示地址
  演示

抓取ajax动态网页java(基于浏览器内核来开发的动态页面渲染处理服务器(组图))

网站优化优采云 发表了文章 • 0 个评论 • 142 次浏览 • 2021-10-25 20:01 • 来自相关话题

  抓取ajax动态网页java(基于浏览器内核来开发的动态页面渲染处理服务器(组图))
  前言
  曾几何时,动态页面的信息抽取(ajax、内部js二次渲染等)一直是爬虫开发者的心病。总之,真的没有合适的工具。尤其是在Java中,像htmlunit这样的工具可以看作是解析动态页面的神器,但还不够完善,无法达到浏览器级别的解析效果,遇到稍微复杂一点的页面时,也起不到作用。在经历了各种痛苦和仇恨之后,作者决定开发一个动态页面渲染处理服务器,专门用于抓取、监控和测试此类场景。要达到浏览器级别的效果,必须基于浏览器内核进行开发。幸运的是,我们有一个开源的 webkit。幸运的是,我们有 QtWebkit,它对开发人员更加友好。
  SeimiAgent 简介
  SeimiAgent 是基于 QtWebkit 开发的 webkit 服务,可以在服务器端后台运行。它可以通过SeimiAgent提供的http接口向SeimiAgent发送加载请求(要加载的URL和该页面接受的渲染时间或使用什么代理等参数),通过SeimiAgent加载并渲染动态页面要处理,然后直接将渲染好的页面返回给调用者进行后续处理,所以运行的SeimiAgent服务是语言无关的,任何语言或框架都可以通过SeimiAgent提供标准的http接口来获取服务。SeimiAgent 的加载和渲染环境都是通用浏览器级别的,所以不用担心他处理动态页面的能力。目前,SeimiAgent 只支持返回渲染的 HTML 文档。未来将增加图片快照和PDF支持,以方便更多样化的使用需求。
  使用演示
  
  SeimiCrawler 简介
  SeimiCrawler 是一个敏捷、独立部署、支持分布式Java 爬虫框架。希望最大限度地降低新手开发高可用低性能爬虫系统的门槛,提高爬虫系统的开发效率。在 SeimiCrawler 的世界里,大部分人只需要关心编写爬行的业务逻辑,剩下的 Seimi 会为你做。在设计上,SeimiCrawler 极大的受到了 Python 的爬虫框架 Scrapy 的启发,同时结合了 Java 语言的特性和 Spring 的特性,希望在国内使用更高效的 XPath 来更方便、更通用地解析 HTML,所以SeimiCrawler默认为HTML解析处理器为JsoupXpath(独立扩展项目,不收录在jsoup中),
  集成和部署 SeimiAgent
  下载和解压不会显示。上面的动态图片中也有演示。下载地址可以在 SeimiAgent 主页上找到。进入SeimiAgent的bin目录,执行:
  ./SeimiAgent -p 8000
  这就是启动SeimiAgent服务,监听8000端口。接下来其实可以用任何语言通过http请求发送加载页面的请求,然后得到渲染结果。当然,我们这里介绍的是SeimiCrawler是如何集成和使用SeimiAgent的。
  SeimiCrawler 配置
  SeimiCrawler 在 v0.3.0 版本中内置了对 SeimiAgent 的支持。开发者只需要配置SeimiAgent的地址和端口,然后在生成具体的Request时选择是否提交给SeimiAgent,并指定如何提交。让我们直接在评论中解释最后一个完整的例子:
  package cn.wanghaomiao.crawlers;
import cn.wanghaomiao.seimi.annotation.Crawler;
import cn.wanghaomiao.seimi.def.BaseSeimiCrawler;
import cn.wanghaomiao.seimi.struct.Request;
import cn.wanghaomiao.seimi.struct.Response;
import cn.wanghaomiao.xpath.model.JXDocument;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
/**
* 这个例子演示如何使用SeimiAgent进行复杂动态页面信息抓取
* @author 汪浩淼 et.tw@163.com
* @since 2016/4/14.
*/
@Crawler(name = "seimiagent")
public class SeimiAgentDemo extends BaseSeimiCrawler{
/**
* 在resource/config/seimi.properties中配置方便更换,当然也可以自行根据情况使用自己的统一配置中心等服务。这里配置SeimiAgent服务所在地址。
*/
@Value("${seimiAgentHost}")
private String seimiAgentHost;
//SeimiAgent监听的端口好,如上文中的8000
@Value("${seimiAgentPort}")
private int seimiAgentPort;
@Override
public String[] startUrls() {
return new String[]{"https://www.baidu.com"};
}
@Override
public String seimiAgentHost() {
return this.seimiAgentHost;
}
@Override
public int seimiAgentPort() {
return this.seimiAgentPort;
}
@Override
public void start(Response response) {
Request seimiAgentReq = Request.build("https://www.souyidai.com","getTotalTransactions")
.useSeimiAgent()
// 告诉SeimiAgent针对这个请求是否使用cookie,如果没有设置使用当前Crawler关于cookie使用条件作为默认值。
//.setSeimiAgentUseCookie(true)
// 设置全部load完成后给SeimiAgent多少时间用于执行js并渲染页面,单位为毫秒
.setSeimiAgentRenderTime(5000);
push(seimiAgentReq);
}
/**
* 获取搜易贷首页总成交额
* @param response
*/
public void getTotalTransactions(Response response){
JXDocument doc = response.document();
try {
String trans = StringUtils.join(doc.sel("//div[@class='homepage-amount']/div[@class='number font-arial']/div/span/text()"),"");
logger.info("Final Res:{}",trans);
} catch (Exception e) {
e.printStackTrace();
}
}
}
  配置文件seimi.properties
  seimiAgentHost=127.0.0.1
seimiAgentPort=8000
  启动
  public class Boot {
public static void main(String[] args){
Seimi s = new Seimi();
s.start("seimiagent");
}
}
  SeimiCrawler 启动后,您可以看到您想要的搜一贷交易总额。
  完整演示地址
  演示 查看全部

  抓取ajax动态网页java(基于浏览器内核来开发的动态页面渲染处理服务器(组图))
  前言
  曾几何时,动态页面的信息抽取(ajax、内部js二次渲染等)一直是爬虫开发者的心病。总之,真的没有合适的工具。尤其是在Java中,像htmlunit这样的工具可以看作是解析动态页面的神器,但还不够完善,无法达到浏览器级别的解析效果,遇到稍微复杂一点的页面时,也起不到作用。在经历了各种痛苦和仇恨之后,作者决定开发一个动态页面渲染处理服务器,专门用于抓取、监控和测试此类场景。要达到浏览器级别的效果,必须基于浏览器内核进行开发。幸运的是,我们有一个开源的 webkit。幸运的是,我们有 QtWebkit,它对开发人员更加友好。
  SeimiAgent 简介
  SeimiAgent 是基于 QtWebkit 开发的 webkit 服务,可以在服务器端后台运行。它可以通过SeimiAgent提供的http接口向SeimiAgent发送加载请求(要加载的URL和该页面接受的渲染时间或使用什么代理等参数),通过SeimiAgent加载并渲染动态页面要处理,然后直接将渲染好的页面返回给调用者进行后续处理,所以运行的SeimiAgent服务是语言无关的,任何语言或框架都可以通过SeimiAgent提供标准的http接口来获取服务。SeimiAgent 的加载和渲染环境都是通用浏览器级别的,所以不用担心他处理动态页面的能力。目前,SeimiAgent 只支持返回渲染的 HTML 文档。未来将增加图片快照和PDF支持,以方便更多样化的使用需求。
  使用演示
  
  SeimiCrawler 简介
  SeimiCrawler 是一个敏捷、独立部署、支持分布式Java 爬虫框架。希望最大限度地降低新手开发高可用低性能爬虫系统的门槛,提高爬虫系统的开发效率。在 SeimiCrawler 的世界里,大部分人只需要关心编写爬行的业务逻辑,剩下的 Seimi 会为你做。在设计上,SeimiCrawler 极大的受到了 Python 的爬虫框架 Scrapy 的启发,同时结合了 Java 语言的特性和 Spring 的特性,希望在国内使用更高效的 XPath 来更方便、更通用地解析 HTML,所以SeimiCrawler默认为HTML解析处理器为JsoupXpath(独立扩展项目,不收录在jsoup中),
  集成和部署 SeimiAgent
  下载和解压不会显示。上面的动态图片中也有演示。下载地址可以在 SeimiAgent 主页上找到。进入SeimiAgent的bin目录,执行:
  ./SeimiAgent -p 8000
  这就是启动SeimiAgent服务,监听8000端口。接下来其实可以用任何语言通过http请求发送加载页面的请求,然后得到渲染结果。当然,我们这里介绍的是SeimiCrawler是如何集成和使用SeimiAgent的。
  SeimiCrawler 配置
  SeimiCrawler 在 v0.3.0 版本中内置了对 SeimiAgent 的支持。开发者只需要配置SeimiAgent的地址和端口,然后在生成具体的Request时选择是否提交给SeimiAgent,并指定如何提交。让我们直接在评论中解释最后一个完整的例子:
  package cn.wanghaomiao.crawlers;
import cn.wanghaomiao.seimi.annotation.Crawler;
import cn.wanghaomiao.seimi.def.BaseSeimiCrawler;
import cn.wanghaomiao.seimi.struct.Request;
import cn.wanghaomiao.seimi.struct.Response;
import cn.wanghaomiao.xpath.model.JXDocument;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
/**
* 这个例子演示如何使用SeimiAgent进行复杂动态页面信息抓取
* @author 汪浩淼 et.tw@163.com
* @since 2016/4/14.
*/
@Crawler(name = "seimiagent")
public class SeimiAgentDemo extends BaseSeimiCrawler{
/**
* 在resource/config/seimi.properties中配置方便更换,当然也可以自行根据情况使用自己的统一配置中心等服务。这里配置SeimiAgent服务所在地址。
*/
@Value("${seimiAgentHost}")
private String seimiAgentHost;
//SeimiAgent监听的端口好,如上文中的8000
@Value("${seimiAgentPort}")
private int seimiAgentPort;
@Override
public String[] startUrls() {
return new String[]{"https://www.baidu.com"};
}
@Override
public String seimiAgentHost() {
return this.seimiAgentHost;
}
@Override
public int seimiAgentPort() {
return this.seimiAgentPort;
}
@Override
public void start(Response response) {
Request seimiAgentReq = Request.build("https://www.souyidai.com","getTotalTransactions")
.useSeimiAgent()
// 告诉SeimiAgent针对这个请求是否使用cookie,如果没有设置使用当前Crawler关于cookie使用条件作为默认值。
//.setSeimiAgentUseCookie(true)
// 设置全部load完成后给SeimiAgent多少时间用于执行js并渲染页面,单位为毫秒
.setSeimiAgentRenderTime(5000);
push(seimiAgentReq);
}
/**
* 获取搜易贷首页总成交额
* @param response
*/
public void getTotalTransactions(Response response){
JXDocument doc = response.document();
try {
String trans = StringUtils.join(doc.sel("//div[@class='homepage-amount']/div[@class='number font-arial']/div/span/text()"),"");
logger.info("Final Res:{}",trans);
} catch (Exception e) {
e.printStackTrace();
}
}
}
  配置文件seimi.properties
  seimiAgentHost=127.0.0.1
seimiAgentPort=8000
  启动
  public class Boot {
public static void main(String[] args){
Seimi s = new Seimi();
s.start("seimiagent");
}
}
  SeimiCrawler 启动后,您可以看到您想要的搜一贷交易总额。
  完整演示地址
  演示

抓取ajax动态网页java( 就是网站的概念与具体讲解网页的构成的区别?)

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

  抓取ajax动态网页java(
就是网站的概念与具体讲解网页的构成的区别?)
  网页的基本组成和抓取原理
  网页是可以被浏览器等客户端解析的文件。与我们通常遇到的文件不同的是,网页是植根于互联网的。也就是说,我们通过浏览器浏览的大部分网页文件都不是本地的,它可能在世界上任何一台联网的电脑上。而且,通过互联网上的超链接,我们可以浏览世界任何一个角落的网络文件。这就是我们平时所说的网上冲浪,足不出户就可以融入整个世界。
  爬虫爬取的是数据,其实就是网页上的内容。我们将在本节中讨论具体的爬取原理。我们先来看看网站的概念:
  1. 网站 的概念
  在详细解释网页的组成之前。我们需要先了解网站的概念。
  网站 是向外界提供服务的多个网页的集合。主要分为静态网站和动态网站。
  1.1 静态网站
  静态网站表示网站下的所有页面都由HTML 网站组成。所谓静态并不是说网页是静态的,网页中还可以有动画、视频等信息。这里的静态是指无法与服务器交互。它只是被动地分析和显示服务器端响应返回的信息。
  静态网站的优点:
  易做搜索引擎收录,方便SEO优化。内容是独立的,不依赖于数据库。
  静态网站的缺点:
  维护成本比较大,大部分内容需要手动更新。页面不能交互,用户体验差。
  1.2 新闻网站
  动态网站相比静态网站,可以提供更多的交互体验。比如用户注册登录、实时推荐等功能。动态 网站 不仅收录静态 HTML 文件,还收录服务器端脚本,如 Jsp、Asp 等。
  动态网站的优点:
  用户体验好,可以实现更个性化的设置。服务端可以与客户端有更多的交互,方便服务端管理和分析数据。
  动态网站的缺点:
  需要和数据库一起处理,访问速度大大降低。对搜索引擎不友好。
  无论是网站中的静态网页,还是网站中的动态网页,它们都有一些共同的基本内容。让我们来看看网页的三个基本元素:
  2. 网页的三个基本元素:
  在接下来的章节中,我们将具体介绍网页的三个基本元素,这里只是简单介绍一些基本概念和用途。
  2.1 个 HTML
  HTML 是一种标记语言。标记语言不是编程语言,不能使用逻辑编程进行编程。它只是就一种文件呈现方式达成了一致。通过对不同标签所代表的不同含义达成一致,就可以在浏览器端呈现出丰富多彩的网页。它主要包括头部和主体两部分。HTML 主要负责页面的结构。
  2.2 CSS
  级联样式表,有时称为样式表。需要配合HTML使用才能提供丰富的渲染效果。
  2.3 Javascript
  它是一种脚本语言,广泛用于前端逻辑实现。很多自定义效果都可以通过javascript实现,是前端使用最广泛的编程语言。
  综上所述,HTML、CSS 和 Javascript 共同构成了丰富的网页样式。三者缺一不可。没有HTML、CSS、Javascript就是被动水,毫无意义;没有CSS,网页会失去颜色和样式,最终HTML也会一样;没有Javascript,我们就看不到动态网页。,不过是一潭死水。
  3. 爬取原理
  爬虫爬取的数据其实就是网页上的内容。我们需要通过一个特定的工具来分析网页,比如Beautiful Soup。然后提取HTML中特定标签下的数据。然后,数据被持久化存储,以方便日后的数据分析。
  简单来说,我们使用爬虫最根本的目的就是爬取网络上对我们有价值的信息和数据。因此,我们大部分的爬取工作都是过滤我们有用的信息,剔除无用的信息。这是爬虫的核心。
  4. 总结
  通过本节,我们了解了网页的基本元素。在使用爬虫的过程中,我们需要随时随地分析网页的组成元素。因此,熟练掌握的网页基本元素的构成,将用于我们后面的网页。分析很有帮助。 查看全部

  抓取ajax动态网页java(
就是网站的概念与具体讲解网页的构成的区别?)
  网页的基本组成和抓取原理
  网页是可以被浏览器等客户端解析的文件。与我们通常遇到的文件不同的是,网页是植根于互联网的。也就是说,我们通过浏览器浏览的大部分网页文件都不是本地的,它可能在世界上任何一台联网的电脑上。而且,通过互联网上的超链接,我们可以浏览世界任何一个角落的网络文件。这就是我们平时所说的网上冲浪,足不出户就可以融入整个世界。
  爬虫爬取的是数据,其实就是网页上的内容。我们将在本节中讨论具体的爬取原理。我们先来看看网站的概念:
  1. 网站 的概念
  在详细解释网页的组成之前。我们需要先了解网站的概念。
  网站 是向外界提供服务的多个网页的集合。主要分为静态网站和动态网站。
  1.1 静态网站
  静态网站表示网站下的所有页面都由HTML 网站组成。所谓静态并不是说网页是静态的,网页中还可以有动画、视频等信息。这里的静态是指无法与服务器交互。它只是被动地分析和显示服务器端响应返回的信息。
  静态网站的优点:
  易做搜索引擎收录,方便SEO优化。内容是独立的,不依赖于数据库。
  静态网站的缺点:
  维护成本比较大,大部分内容需要手动更新。页面不能交互,用户体验差。
  1.2 新闻网站
  动态网站相比静态网站,可以提供更多的交互体验。比如用户注册登录、实时推荐等功能。动态 网站 不仅收录静态 HTML 文件,还收录服务器端脚本,如 Jsp、Asp 等。
  动态网站的优点:
  用户体验好,可以实现更个性化的设置。服务端可以与客户端有更多的交互,方便服务端管理和分析数据。
  动态网站的缺点:
  需要和数据库一起处理,访问速度大大降低。对搜索引擎不友好。
  无论是网站中的静态网页,还是网站中的动态网页,它们都有一些共同的基本内容。让我们来看看网页的三个基本元素:
  2. 网页的三个基本元素:
  在接下来的章节中,我们将具体介绍网页的三个基本元素,这里只是简单介绍一些基本概念和用途。
  2.1 个 HTML
  HTML 是一种标记语言。标记语言不是编程语言,不能使用逻辑编程进行编程。它只是就一种文件呈现方式达成了一致。通过对不同标签所代表的不同含义达成一致,就可以在浏览器端呈现出丰富多彩的网页。它主要包括头部和主体两部分。HTML 主要负责页面的结构。
  2.2 CSS
  级联样式表,有时称为样式表。需要配合HTML使用才能提供丰富的渲染效果。
  2.3 Javascript
  它是一种脚本语言,广泛用于前端逻辑实现。很多自定义效果都可以通过javascript实现,是前端使用最广泛的编程语言。
  综上所述,HTML、CSS 和 Javascript 共同构成了丰富的网页样式。三者缺一不可。没有HTML、CSS、Javascript就是被动水,毫无意义;没有CSS,网页会失去颜色和样式,最终HTML也会一样;没有Javascript,我们就看不到动态网页。,不过是一潭死水。
  3. 爬取原理
  爬虫爬取的数据其实就是网页上的内容。我们需要通过一个特定的工具来分析网页,比如Beautiful Soup。然后提取HTML中特定标签下的数据。然后,数据被持久化存储,以方便日后的数据分析。
  简单来说,我们使用爬虫最根本的目的就是爬取网络上对我们有价值的信息和数据。因此,我们大部分的爬取工作都是过滤我们有用的信息,剔除无用的信息。这是爬虫的核心。
  4. 总结
  通过本节,我们了解了网页的基本元素。在使用爬虫的过程中,我们需要随时随地分析网页的组成元素。因此,熟练掌握的网页基本元素的构成,将用于我们后面的网页。分析很有帮助。

抓取ajax动态网页java(谷歌爬虫是如何抓取和收录什么类型的抓取JavaScript?)

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

  抓取ajax动态网页java(谷歌爬虫是如何抓取和收录什么类型的抓取JavaScript?)
  身体的一部分
  我们测试了 Google 爬虫如何抓取 JavaScript,这是我们从中学到的东西。
  认为 Google 无法处理 JavaScript?再想想。Audette Audette 分享了一系列测试结果。他和他的同事测试了 Google 和 收录 会抓取哪些类型的 JavaScript 函数。
  
  ​
  长话短说
  1. 我们进行了一系列测试,并确认谷歌可以以多种方式执行和收录 JavaScript。我们还确认了 Google 可以渲染整个页面并读取 DOM,从而可以收录 动态生成内容。
  2. DOM 中的 SEO 信号(页面标题、元描述、规范标签、元机器人标签等)都受到关注。动态插入到DOM中的内容也可以被爬取和收录。此外,在某些情况下,DOM 甚至可能优先于 HTML 源代码语句。虽然这需要更多的工作,但这是我们的几个测试之一。
  简介:Google 执行 JavaScript 并读取 DOM
  早在 2008 年,Google 就成功抓取了 JavaScript,但很可能仅限于某种方式。
  今天,很明显,Google 不仅可以制定自己的抓取和 收录 JavaScript 类型,而且在渲染整个网页方面也取得了重大进展(尤其是最近 12 到 18 个月)。
  在 Merkle,我们的 SEO 技术团队希望更好地了解 Google 爬虫可以抓取哪些类型的 JavaScript 事件和 收录。经过研究,我们发现了惊人的结果,并确认 Google 不仅可以执行各种 JavaScript 事件,还可以动态生成收录 内容。怎么做?Google 可以读取 DOM。
  什么是DOM?
  很多从事SEO的人不了解什么是文档对象模型(DOM)。
  
  ​
  当浏览器请求一个页面时会发生什么,DOM 是如何参与的?
  在 Web 浏览器中使用时,DOM 本质上是一个应用程序接口或 API,用于标记和构建数据(例如 HTML 和 XML)。该界面允许 Web 浏览器将它们组合成一个文档。
  DOM 还定义了如何获取和操作结构。尽管 DOM 是一种独立于语言的 API(不依赖于特定的编程语言或库),但它通常用于 Web 应用程序中的 JavaScript 和动态内容。
  DOM 代表接口或“桥”,将网页与编程语言连接起来。解析 HTML 并执行 JavaScript 的结果就是 DOM。网页的内容不仅(不仅)是源代码,而且是 DOM。这使它变得非常重要。
  
  ​
  JavaScript 如何通过 DOM 接口工作。
  我们很高兴地发现 Google 可以读取 DOM,并且可以解析信号和动态插入的内容,例如标题标签、页面文本、标题标签和元注释(例如:rel = canonical)。您可以阅读完整的详细信息。
  这一系列的测试和结果
  因为想知道会爬取哪些JavaScript特性和收录,所以分别在谷歌爬虫上创建了一系列测试。通过创建控件,确保可以独立理解 URL 活动。下面,让我们详细介绍一些有趣的测试结果。它们分为5类:
  JavaScript 重定向
  JavaScript 链接
  动态插入内容
  动态插入元数据和页面元素
  rel = "nofollow" 的一个重要例子
  
  ​
  示例:用于测试 Google 抓取工具理解 JavaScript 能力的页面。
  1. JavaScript 重定向
  我们首先测试了常见的 JavaScript 重定向。URL 以不同方式表达的结果是什么?我们为两个测试选择了 window.location 对象:测试 A 使用绝对路径 URL 调用 window.location,测试 B 使用它。相对路径。
  结果:重定向很快就被谷歌跟踪了。从收录的角度来看,它们被解释为301——最终状态URL,而不是谷歌收录中的重定向URL。
  在随后的测试中,我们在权威网页上使用完全相同的内容来完成使用 JavaScript 重定向到同一站点的新页面。原创网址在 Google 热门查询的主页上排名。
  结果:果然,重定向被谷歌跟踪了,但是原创页面不是收录。新的URL是收录,它立即在同一个查询页面的同一个位置上排名。这让我们感到惊讶。从排名的角度来看,JavaScript 重定向行为(有时)似乎与永久性 301 重定向非常相似。
  下次,您的客户想要为他们的 网站 完成 JavaScript 重定向动作,您可能不需要回答,或者回答:“请不要”。因为这好像有转职排名信号的关系。引用谷歌指南支持这一结论:
  使用 JavaScript 重定向用户可能是一种合法的做法。例如,如果您将登录用户重定向到内部页面,则可以使用 JavaScript 来完成此操作。在仔细检查 JavaScript 或其他重定向方法时,请确保您的网站遵循我们的指南并考虑其意图。请记住,将 301 重定向重定向到您的 网站 是最好的,但如果您没有访问您的 网站 服务器的权限,您可以为此使用 JavaScript 重定向。
  2. JavaScript 链接
  我们使用多种编码方法测试了不同类型的 JS 链接。
  我们测试下拉菜单的链接。历史搜索引擎一直无法跟踪这种类型的链接。我们要确定是否会跟踪 onchange 事件处理程序。重要的是,这只是一种特定的执行类型,而我们需要的是:其他变化的影响,而不是像上面JavaScript重定向的强制操作。
  
  ​
  示例:Google Work 页面上的语言选择下拉菜单。
  结果:链接被完全抓取和跟踪。
  我们还测试了常见的 JavaScript 链接。以下是最常见的 JavaScript 链接类型,而传统 SEO 推荐纯文本。这些测试包括 JavaScript 链接代码:
  作用于外部 href 键值对 (AVP),但在标签内(“onClick”)
  使用 href 内部 AVP("javascript: window.location")
  在 a 标签之外执行,但在 href 中调用 AVP("javascript: openlink()")
  还有很多
  结果:链接被完全抓取和跟踪。
  我们接下来的测试是进一步测试事件处理程序,比如上面的onchange测试。具体来说,我们要使用鼠标移动的事件处理程序,然后隐藏 URL 变量,该变量仅在事件处理程序函数(在本例中为 onmousedown 和 onmouseout)被触发时执行。
  结果:链接被完全抓取和跟踪。
  构造链接:我们知道谷歌可以执行JavaScript,但我们想确认他们是否可以读取代码中的变量。所以在这个测试中,我们连接可以构造 URL 字符串的字符。
  结果:链接被完全抓取和跟踪。
  3. 动态插入内容
  显然,这些是要点:动态插入文本、图像、链接和导航。高质量的文本内容对于搜索引擎理解网页的主题和内容至关重要。在这个充满活力的网站时代,它的重要性毋庸置疑。
  这些测试旨在检查在两种不同场景中动态插入文本的结果。
  1)。测试搜索引擎是否可以统计动态插入的文本,文本来自页面的HTML源代码。
  2)。测试搜索引擎是否可以统计动态插入的文本,并且文本来自页面的HTML源代码之外(在外部JavaScript文件中)。
  结果:两种情况下都可以抓取文本和收录,页面根据内容排名。凉爽的!
  为了深入了解,我们测试了一个用JavaScript编写的客户端全局导航,导航中的链接是通过document.writeIn函数插入的,确认可以完全爬取和跟踪。需要指出的是,Google 可以解释网站 使用AngularJS 框架和HTML5 History API (pushState) 构建,可以渲染和收录 它,并且可以像传统静态网页一样进行排名。这就是不禁止 Google 爬虫获取外部文件和 JavaScript 的重要性,这可能也是 Google 将其从 Ajax Supporting SEO Guide 中删除的原因。当您可以简单地呈现整个页面时,谁需要 HTML 快照?
  经过测试,发现无论是什么类型的内容,结果都是一样的。例如,在加载到 DOM 后将获取图像并收录。我们甚至做了这样的测试:通过动态生成结构数据来制作面包屑(breadcrumb navigation),并插入到DOM中。结果?成功插入后的面包屑出现在搜索结果中(搜索引擎结果页面)。
  值得注意的是,Google 现在推荐使用 JSON-LD 标签来形成结构化数据。我相信未来会有更多基于此的东西。
  4. 动态插入元数据和页面元素
  我们动态地将各种对 SEO 至关重要的标签插入到 DOM 中:
  标题元素
  元描述
  元机器人
  规范标签
  结果:在所有情况下,标签都可以被抓取并表现得像 HTML 源代码中的元素。
  一个有趣的补充实验可以帮助我们理解优先级的顺序。当出现相互矛盾的信号时,哪一个会获胜?如果源代码中没有index,nofollow标签,DOM中没有index,follow标签,会发生什么?在这个协议中,HTTP x-robots 响应头如何作为另一个变量使用行为?这将是未来全面测试的一部分。但是,我们的测试表明,当发生冲突时,Google 会忽略源代码中的标签并支持 DOM。
  5. rel="nofollow" 的一个重要例子
  我们想测试谷歌如何响应出现在源代码和 DOM 链接级别的 nofollow 属性。我们还创建了一个没有 nofollow 的控件。
  
  ​
  对于nofollow,我们分别测试了源代码和DOM生成的注解。
  源代码中的 nofollow 按预期工作(不跟踪链接)。但是DOM中的nofollow无效(链接被跟踪,页面为收录)。为什么?因为修改 DOM 中的 href 元素的操作发生得太晚了:Google 在执行添加 rel="nofollow" 的 JavaScript 函数之前,已准备好抓取链接并排队等待 URL。但是,如果将带有 href="nofollow" 的 a 元素插入到 DOM 中,nofollow 和链接将被跟踪,因为它们是同时插入的。
  结果
  从历史的角度来看,各种 SEO 建议都尽可能关注“纯文本”内容。动态生成的内容、AJAX 和 JavaScript 链接会损害主流搜索引擎的 SEO。显然,这对谷歌来说不再是问题。JavaScript 链接的操作方式类似于普通的 HTML 链接(这只是表面,我们不知道程序在幕后做了什么)。
  JavaScript 重定向的处理方式与 301 重定向类似。
  动态插入内容,甚至元标记,例如rel规范注释,无论是在HTML源代码中还是在解析初始HTML后触发JavaScript生成DOM都以相同的方式处理。
  Google 依赖于完全呈现页面和理解 DOM,而不仅仅是源代码。太不可思议了!(请记住允许 Google 爬虫获取这些外部文件和 JavaScript。)
  谷歌已经以惊人的速度在创新方面将其他搜索引擎甩在了后面。我们希望在其他搜索引擎中看到相同类型的创新。如果他们要在新的网络时代保持竞争力并取得实质性进展,就意味着他们需要更好地支持 HTML5、JavaScript 和动态网站。
  对于SEO来说,不了解上述基本概念和谷歌技术的人应该学习学习,以赶上当前的技术。如果你不考虑 DOM,你可能会失去一半的份额。
  并非本文所表达的所有观点均由 Search Engine Land(搜索引擎 网站)提供,部分观点由客座作者提供。所有作者的名单。 查看全部

  抓取ajax动态网页java(谷歌爬虫是如何抓取和收录什么类型的抓取JavaScript?)
  身体的一部分
  我们测试了 Google 爬虫如何抓取 JavaScript,这是我们从中学到的东西。
  认为 Google 无法处理 JavaScript?再想想。Audette Audette 分享了一系列测试结果。他和他的同事测试了 Google 和 收录 会抓取哪些类型的 JavaScript 函数。
  
  ​
  长话短说
  1. 我们进行了一系列测试,并确认谷歌可以以多种方式执行和收录 JavaScript。我们还确认了 Google 可以渲染整个页面并读取 DOM,从而可以收录 动态生成内容。
  2. DOM 中的 SEO 信号(页面标题、元描述、规范标签、元机器人标签等)都受到关注。动态插入到DOM中的内容也可以被爬取和收录。此外,在某些情况下,DOM 甚至可能优先于 HTML 源代码语句。虽然这需要更多的工作,但这是我们的几个测试之一。
  简介:Google 执行 JavaScript 并读取 DOM
  早在 2008 年,Google 就成功抓取了 JavaScript,但很可能仅限于某种方式。
  今天,很明显,Google 不仅可以制定自己的抓取和 收录 JavaScript 类型,而且在渲染整个网页方面也取得了重大进展(尤其是最近 12 到 18 个月)。
  在 Merkle,我们的 SEO 技术团队希望更好地了解 Google 爬虫可以抓取哪些类型的 JavaScript 事件和 收录。经过研究,我们发现了惊人的结果,并确认 Google 不仅可以执行各种 JavaScript 事件,还可以动态生成收录 内容。怎么做?Google 可以读取 DOM。
  什么是DOM?
  很多从事SEO的人不了解什么是文档对象模型(DOM)。
  
  ​
  当浏览器请求一个页面时会发生什么,DOM 是如何参与的?
  在 Web 浏览器中使用时,DOM 本质上是一个应用程序接口或 API,用于标记和构建数据(例如 HTML 和 XML)。该界面允许 Web 浏览器将它们组合成一个文档。
  DOM 还定义了如何获取和操作结构。尽管 DOM 是一种独立于语言的 API(不依赖于特定的编程语言或库),但它通常用于 Web 应用程序中的 JavaScript 和动态内容。
  DOM 代表接口或“桥”,将网页与编程语言连接起来。解析 HTML 并执行 JavaScript 的结果就是 DOM。网页的内容不仅(不仅)是源代码,而且是 DOM。这使它变得非常重要。
  
  ​
  JavaScript 如何通过 DOM 接口工作。
  我们很高兴地发现 Google 可以读取 DOM,并且可以解析信号和动态插入的内容,例如标题标签、页面文本、标题标签和元注释(例如:rel = canonical)。您可以阅读完整的详细信息。
  这一系列的测试和结果
  因为想知道会爬取哪些JavaScript特性和收录,所以分别在谷歌爬虫上创建了一系列测试。通过创建控件,确保可以独立理解 URL 活动。下面,让我们详细介绍一些有趣的测试结果。它们分为5类:
  JavaScript 重定向
  JavaScript 链接
  动态插入内容
  动态插入元数据和页面元素
  rel = "nofollow" 的一个重要例子
  
  ​
  示例:用于测试 Google 抓取工具理解 JavaScript 能力的页面。
  1. JavaScript 重定向
  我们首先测试了常见的 JavaScript 重定向。URL 以不同方式表达的结果是什么?我们为两个测试选择了 window.location 对象:测试 A 使用绝对路径 URL 调用 window.location,测试 B 使用它。相对路径。
  结果:重定向很快就被谷歌跟踪了。从收录的角度来看,它们被解释为301——最终状态URL,而不是谷歌收录中的重定向URL。
  在随后的测试中,我们在权威网页上使用完全相同的内容来完成使用 JavaScript 重定向到同一站点的新页面。原创网址在 Google 热门查询的主页上排名。
  结果:果然,重定向被谷歌跟踪了,但是原创页面不是收录。新的URL是收录,它立即在同一个查询页面的同一个位置上排名。这让我们感到惊讶。从排名的角度来看,JavaScript 重定向行为(有时)似乎与永久性 301 重定向非常相似。
  下次,您的客户想要为他们的 网站 完成 JavaScript 重定向动作,您可能不需要回答,或者回答:“请不要”。因为这好像有转职排名信号的关系。引用谷歌指南支持这一结论:
  使用 JavaScript 重定向用户可能是一种合法的做法。例如,如果您将登录用户重定向到内部页面,则可以使用 JavaScript 来完成此操作。在仔细检查 JavaScript 或其他重定向方法时,请确保您的网站遵循我们的指南并考虑其意图。请记住,将 301 重定向重定向到您的 网站 是最好的,但如果您没有访问您的 网站 服务器的权限,您可以为此使用 JavaScript 重定向。
  2. JavaScript 链接
  我们使用多种编码方法测试了不同类型的 JS 链接。
  我们测试下拉菜单的链接。历史搜索引擎一直无法跟踪这种类型的链接。我们要确定是否会跟踪 onchange 事件处理程序。重要的是,这只是一种特定的执行类型,而我们需要的是:其他变化的影响,而不是像上面JavaScript重定向的强制操作。
  
  ​
  示例:Google Work 页面上的语言选择下拉菜单。
  结果:链接被完全抓取和跟踪。
  我们还测试了常见的 JavaScript 链接。以下是最常见的 JavaScript 链接类型,而传统 SEO 推荐纯文本。这些测试包括 JavaScript 链接代码:
  作用于外部 href 键值对 (AVP),但在标签内(“onClick”)
  使用 href 内部 AVP("javascript: window.location")
  在 a 标签之外执行,但在 href 中调用 AVP("javascript: openlink()")
  还有很多
  结果:链接被完全抓取和跟踪。
  我们接下来的测试是进一步测试事件处理程序,比如上面的onchange测试。具体来说,我们要使用鼠标移动的事件处理程序,然后隐藏 URL 变量,该变量仅在事件处理程序函数(在本例中为 onmousedown 和 onmouseout)被触发时执行。
  结果:链接被完全抓取和跟踪。
  构造链接:我们知道谷歌可以执行JavaScript,但我们想确认他们是否可以读取代码中的变量。所以在这个测试中,我们连接可以构造 URL 字符串的字符。
  结果:链接被完全抓取和跟踪。
  3. 动态插入内容
  显然,这些是要点:动态插入文本、图像、链接和导航。高质量的文本内容对于搜索引擎理解网页的主题和内容至关重要。在这个充满活力的网站时代,它的重要性毋庸置疑。
  这些测试旨在检查在两种不同场景中动态插入文本的结果。
  1)。测试搜索引擎是否可以统计动态插入的文本,文本来自页面的HTML源代码。
  2)。测试搜索引擎是否可以统计动态插入的文本,并且文本来自页面的HTML源代码之外(在外部JavaScript文件中)。
  结果:两种情况下都可以抓取文本和收录,页面根据内容排名。凉爽的!
  为了深入了解,我们测试了一个用JavaScript编写的客户端全局导航,导航中的链接是通过document.writeIn函数插入的,确认可以完全爬取和跟踪。需要指出的是,Google 可以解释网站 使用AngularJS 框架和HTML5 History API (pushState) 构建,可以渲染和收录 它,并且可以像传统静态网页一样进行排名。这就是不禁止 Google 爬虫获取外部文件和 JavaScript 的重要性,这可能也是 Google 将其从 Ajax Supporting SEO Guide 中删除的原因。当您可以简单地呈现整个页面时,谁需要 HTML 快照?
  经过测试,发现无论是什么类型的内容,结果都是一样的。例如,在加载到 DOM 后将获取图像并收录。我们甚至做了这样的测试:通过动态生成结构数据来制作面包屑(breadcrumb navigation),并插入到DOM中。结果?成功插入后的面包屑出现在搜索结果中(搜索引擎结果页面)。
  值得注意的是,Google 现在推荐使用 JSON-LD 标签来形成结构化数据。我相信未来会有更多基于此的东西。
  4. 动态插入元数据和页面元素
  我们动态地将各种对 SEO 至关重要的标签插入到 DOM 中:
  标题元素
  元描述
  元机器人
  规范标签
  结果:在所有情况下,标签都可以被抓取并表现得像 HTML 源代码中的元素。
  一个有趣的补充实验可以帮助我们理解优先级的顺序。当出现相互矛盾的信号时,哪一个会获胜?如果源代码中没有index,nofollow标签,DOM中没有index,follow标签,会发生什么?在这个协议中,HTTP x-robots 响应头如何作为另一个变量使用行为?这将是未来全面测试的一部分。但是,我们的测试表明,当发生冲突时,Google 会忽略源代码中的标签并支持 DOM。
  5. rel="nofollow" 的一个重要例子
  我们想测试谷歌如何响应出现在源代码和 DOM 链接级别的 nofollow 属性。我们还创建了一个没有 nofollow 的控件。
  
  ​
  对于nofollow,我们分别测试了源代码和DOM生成的注解。
  源代码中的 nofollow 按预期工作(不跟踪链接)。但是DOM中的nofollow无效(链接被跟踪,页面为收录)。为什么?因为修改 DOM 中的 href 元素的操作发生得太晚了:Google 在执行添加 rel="nofollow" 的 JavaScript 函数之前,已准备好抓取链接并排队等待 URL。但是,如果将带有 href="nofollow" 的 a 元素插入到 DOM 中,nofollow 和链接将被跟踪,因为它们是同时插入的。
  结果
  从历史的角度来看,各种 SEO 建议都尽可能关注“纯文本”内容。动态生成的内容、AJAX 和 JavaScript 链接会损害主流搜索引擎的 SEO。显然,这对谷歌来说不再是问题。JavaScript 链接的操作方式类似于普通的 HTML 链接(这只是表面,我们不知道程序在幕后做了什么)。
  JavaScript 重定向的处理方式与 301 重定向类似。
  动态插入内容,甚至元标记,例如rel规范注释,无论是在HTML源代码中还是在解析初始HTML后触发JavaScript生成DOM都以相同的方式处理。
  Google 依赖于完全呈现页面和理解 DOM,而不仅仅是源代码。太不可思议了!(请记住允许 Google 爬虫获取这些外部文件和 JavaScript。)
  谷歌已经以惊人的速度在创新方面将其他搜索引擎甩在了后面。我们希望在其他搜索引擎中看到相同类型的创新。如果他们要在新的网络时代保持竞争力并取得实质性进展,就意味着他们需要更好地支持 HTML5、JavaScript 和动态网站。
  对于SEO来说,不了解上述基本概念和谷歌技术的人应该学习学习,以赶上当前的技术。如果你不考虑 DOM,你可能会失去一半的份额。
  并非本文所表达的所有观点均由 Search Engine Land(搜索引擎 网站)提供,部分观点由客座作者提供。所有作者的名单。

抓取ajax动态网页java(NutchNutchX版本实现请访问:基于ApacheNutch1.8和Htmlunit组件)

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

  抓取ajax动态网页java(NutchNutchX版本实现请访问:基于ApacheNutch1.8和Htmlunit组件)
  -------------------------------------------------- -------------------------------------------------- ------温馨提示:项目当前版本不会更新,最新Apache Nutch 2.X版本实现,请访问:-------------- ------- ------------------------------------------- -----------------------------------------------Nutch Htmlunit Plugin 项目介绍
  基于Apache Nutch1.8和Htmlunit组件,实现了AJAX加载类型页面的完整页面内容爬取分析。
  根据Apache Nutch 1.8 的实现,我们无法从收录AJAX 请求的fetch 页面中获取动态HTML 信息,因为它会忽略所有AJAX 请求。
  这个插件将使用 Htmlunit 来获取具有必要动态 AJAX 请求的整个页面内容。它是使用 Apache Nutch 1.8 开发和测试的,您可以在其他 Nutch 版本上试用它或将源代码重构为您的设计。
  主要特点 跑步体验
  由于Nutch基于Unix/Linux环境运行,请自行准备Unix/Linux系统或Cygwin运行环境。
  git clone 整个项目代码后,进入到本地的git下载目录:
  cd nutch-htmlunit/运行时/本地
  bin/crawl urls crawl false 1
  //urls参数为爬虫存放url文件目录;crawl 是爬虫输出目录;false应该是solr索引url参数,这里设置为false不做solr索引处理;1是爬虫执行次数
  操作结束后,可以看到天猫商品页面的价格/描述/滚动加载图片等信息已经全部获取完毕。
  运行日志输入示例参考:
  扩展插件说明源码项目说明
  整个项目基于Apache Nutch 1.8 源代码项目扩展插件实现。插件的定义和配置与官方插件处理方式一致。详情请参考Apache Nutch 1.8 官方文档。具体实现原理和代码请导入Eclipse项目查看。
  开源许可说明
  本项目所有代码完整开源,可自由使用:开源、非开源、商业和非商业,前提是保留本项目的源码信息,未经授权销售本项目项目保证不执行。
  如果您想提供基于Apache Nutch/Solr/Lucene等系列技术的定制化扩展实现/技术咨询服务/毕业设计指导/二次开发项目指导,可以联系E-Mail:或(加Q请注明:nutch/ solr/lucene) 议价服务。【以上联系方式不直接提供免费技术咨询查询。如果您对项目有任何技术问题或issue反馈,请直接提交到项目站点提问或在Git平台上Issue]
  参考
  欢迎关注作者的其他项目: 查看全部

  抓取ajax动态网页java(NutchNutchX版本实现请访问:基于ApacheNutch1.8和Htmlunit组件)
  -------------------------------------------------- -------------------------------------------------- ------温馨提示:项目当前版本不会更新,最新Apache Nutch 2.X版本实现,请访问:-------------- ------- ------------------------------------------- -----------------------------------------------Nutch Htmlunit Plugin 项目介绍
  基于Apache Nutch1.8和Htmlunit组件,实现了AJAX加载类型页面的完整页面内容爬取分析。
  根据Apache Nutch 1.8 的实现,我们无法从收录AJAX 请求的fetch 页面中获取动态HTML 信息,因为它会忽略所有AJAX 请求。
  这个插件将使用 Htmlunit 来获取具有必要动态 AJAX 请求的整个页面内容。它是使用 Apache Nutch 1.8 开发和测试的,您可以在其他 Nutch 版本上试用它或将源代码重构为您的设计。
  主要特点 跑步体验
  由于Nutch基于Unix/Linux环境运行,请自行准备Unix/Linux系统或Cygwin运行环境。
  git clone 整个项目代码后,进入到本地的git下载目录:
  cd nutch-htmlunit/运行时/本地
  bin/crawl urls crawl false 1
  //urls参数为爬虫存放url文件目录;crawl 是爬虫输出目录;false应该是solr索引url参数,这里设置为false不做solr索引处理;1是爬虫执行次数
  操作结束后,可以看到天猫商品页面的价格/描述/滚动加载图片等信息已经全部获取完毕。
  运行日志输入示例参考:
  扩展插件说明源码项目说明
  整个项目基于Apache Nutch 1.8 源代码项目扩展插件实现。插件的定义和配置与官方插件处理方式一致。详情请参考Apache Nutch 1.8 官方文档。具体实现原理和代码请导入Eclipse项目查看。
  开源许可说明
  本项目所有代码完整开源,可自由使用:开源、非开源、商业和非商业,前提是保留本项目的源码信息,未经授权销售本项目项目保证不执行。
  如果您想提供基于Apache Nutch/Solr/Lucene等系列技术的定制化扩展实现/技术咨询服务/毕业设计指导/二次开发项目指导,可以联系E-Mail:或(加Q请注明:nutch/ solr/lucene) 议价服务。【以上联系方式不直接提供免费技术咨询查询。如果您对项目有任何技术问题或issue反馈,请直接提交到项目站点提问或在Git平台上Issue]
  参考
  欢迎关注作者的其他项目:

抓取ajax动态网页java(什么是Ajax:Ajax(AsynchronouseJavaScript)异步JavaScript和XML)

网站优化优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2021-10-16 05:09 • 来自相关话题

  抓取ajax动态网页java(什么是Ajax:Ajax(AsynchronouseJavaScript)异步JavaScript和XML)
  什么是阿贾克斯:
  Ajax (Asynchronouse JavaScript And XML) 异步 JavaScript 和 XML。通过在后台与服务器交换少量数据,Ajax 可以使网页异步更新。这意味着可以在不重新加载整个网页的情况下更新网页的某些部分。如果内容需要更新,传统网页(不使用 Ajax)必须重新加载整个网页。因为传统的数据传输格式是XML语法。所以它被称为 AJAX。其实现在数据交互基本都是用JSON。使用AJAX加载的数据,即使使用JS将数据渲染到浏览器中,右击-&gt;查看网页源码也看不到ajax加载的数据,只能看到使用这个加载的html代码网址。
  ajax数据的获取方式:直接分析ajax调用的接口。然后通过代码请求这个接口。使用Selenium+chromedriver模拟浏览器行为获取数据。方式优缺点
  分析界面
  可以直接请求数据。无需做一些解析工作。代码量小,性能高。
  解析接口比较复杂,尤其是一些被js混淆的接口,必须有一定的js基础。很容易被发现为爬虫。
  硒
  直接模拟浏览器的行为。浏览器可以请求的内容也可以使用 selenium 请求。爬虫更稳定。
  很多代码。低性能。
  Selenium+chromedriver 获取动态数据:
  Selenium 相当于一个机器人。可以在浏览器上模拟一些人类的行为,在浏览器上自动处理一些行为,比如点击、填充数据、删除cookies等。 chromedriver是一个驱动Chrome浏览器的驱动,可以用来驱动浏览器. 当然,不同的浏览器有不同的驱动程序。下面列出了不同的浏览器及其相应的驱动程序:
  Chrome: Firefox: Edge: Safari: 安装 Selenium 和 chromedriver:
  安装Selenium:Selenium 有多种语言版本,如java、ruby、python 等,我们可以下载python 版本。
  pip install selenium
  安装chromedriver:下载完成后,放在一个不需要权限的纯英文目录下。
  快速开始:
  下面我们就拿百度首页做个简单的例子来说一下如何快速上手Selenium和chromedriver:
  from selenium import webdriver
# chromedriver的绝对路径
driver_path = r'D:\ProgramApp\chromedriver\chromedriver.exe'
# 初始化一个driver,并且指定chromedriver的路径
driver = webdriver.Chrome(executable_path=driver_path)
# 请求网页
driver.get("https://www.baidu.com/")
# 通过page_source获取网页源代码
print(driver.page_source)
  Selenium 常见操作:
  更多教程请参考:
  关闭页面: driver.close():关闭当前页面。driver.quit():退出整个浏览器。定位元素:
  find_element_by_id:根据 id 查找元素。相当于:
   submitTag = driver.find_element_by_id('su')
submitTag1 = driver.find_element(By.ID,'su')
  find_element_by_class_name:根据类名查找元素。相当于:
   submitTag = driver.find_element_by_class_name('su')
submitTag1 = driver.find_element(By.CLASS_NAME,'su')
  find_element_by_name:根据name属性的值查找元素。相当于:
   submitTag = driver.find_element_by_name('email')
submitTag1 = driver.find_element(By.NAME,'email')
  find_element_by_tag_name:根据标签名称查找元素。相当于:
   submitTag = driver.find_element_by_tag_name('div')
submitTag1 = driver.find_element(By.TAG_NAME,'div')
  find_element_by_xpath:根据 xpath 语法获取元素。相当于:
   submitTag = driver.find_element_by_xpath('//div')
submitTag1 = driver.find_element(By.XPATH,'//div')
  find_element_by_css_selector:根据css选择器选择元素。相当于:
   submitTag = driver.find_element_by_css_selector('//div')
submitTag1 = driver.find_element(By.CSS_SELECTOR,'//div')
  需要注意的是 find_element 是获取第一个满足条件的元素。find_elements 是获取所有满足条件的元素。
  操作表单元素:
  操作输入框:分为两步。第一步:找到这个元素。第二步:使用send_keys(value)填写数据。示例代码如下:
   inputTag = driver.find_element_by_id('kw')
inputTag.send_keys('python')
  使用clear方法清除输入框的内容。示例代码如下:
  inputTag.clear()
  操作复选框:因为要选中复选框标签,所以在网页上用鼠标点击它。因此,如果要选中复选框标签,请先选中此标签,然后再执行点击事件。示例代码如下:
   rememberTag = driver.find_element_by_name("rememberMe")
rememberTag.click()
  选择选择:不能直接点击选择元素。因为元素需要点击后被选中。这时,selenium 专门为 select 标签提供了一个类 selenium.webdriver.support.ui.Select。将获取的元素作为参数传递给该类以创建该对象。您可以在将来使用此对象进行选择。示例代码如下:
   from selenium.webdriver.support.ui import Select
# 选中这个标签,然后使用Select创建对象
selectTag = Select(driver.find_element_by_name("jumpMenu"))
# 根据索引选择
selectTag.select_by_index(1)
# 根据值选择
selectTag.select_by_value("http://www.95yueba.com")
# 根据可视的文本选择
selectTag.select_by_visible_text("95秀客户端")
# 取消选中所有选项
selectTag.deselect_all()
  操作按钮:操作按钮的方式有很多种。比如单击、右键、双击等,这里是最常用的一种。只需点击。直接调用click函数就行了。示例代码如下:
   inputTag = driver.find_element_by_id('su')
inputTag.click()
  行为链:
  有时页面上的操作可能会有很多步骤,这时可以使用鼠标行为链类ActionChains来完成。例如,现在您想将鼠标移动到一个元素并执行一个点击事件。那么示例代码如下:
  inputTag = driver.find_element_by_id('kw')
submitTag = driver.find_element_by_id('su')
actions = ActionChains(driver)
actions.move_to_element(inputTag)
actions.send_keys_to_element(inputTag,'python')
actions.move_to_element(submitTag)
actions.click(submitTag)
actions.perform()
  还有更多与鼠标相关的操作。
  饼干操作:
  获取所有 cookie:
   for cookie in driver.get_cookies():
print(cookie)
  根据cookie的key获取value:
  value = driver.get_cookie(key)
  删除所有 cookie:
   driver.delete_all_cookies()
  删除一个cookie:
   driver.delete_cookie(key)
  页面等待:
  现在越来越多的网页使用 Ajax 技术,因此程序无法确定元素何时完全加载。如果实际页面等待时间过长,某个dom元素没有出来,而你的代码直接使用了这个WebElement,那么就会抛出NullPointer异常。为了解决这个问题。所以Selenium提供了两种等待方式:一种是隐式等待,另一种是显式等待。
  隐式等待:调用 driver.implicitly_wait。然后,在获取不可用元素之前,它会等待 10 秒。示例代码如下:
  driver = webdriver.Chrome(executable_path=driver_path)
driver.implicitly_wait(10)
# 请求网页
driver.get("https://www.douban.com/")
  显示等待:显示等待是在满足一定条件后执行获取元素的操作。也可以指定等待的最长时间,超过这个时间就会抛出异常。显示等待应在 selenium.webdriver.support.excepted_conditions 和 selenium.webdriver.support.ui.WebDriverWait 的预期条件下完成。示例代码如下:
   from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
  其他一些等待条件:
  切换页面:
  有时窗口中有很多子标签页。这个时候必须切换。Selenium 提供了一个 switch_to_window 来切换。要切换到的特定页面可以在 driver.window_handles 中找到。示例代码如下:
  # 打开一个新的页面
# 切换到这个新的页面中
self.driver.switch_to_window(self.driver.window_handles[1])
  设置代理ip:
  有时会频繁抓取一些网页。服务器发现你是爬虫后会屏蔽你的ip地址。这时候我们就可以更改代理ip了。更改代理ip,不同浏览器实现方式不同。以下是 Chrome 浏览器的示例:
  from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://110.73.2.248:8123")
driver_path = r"D:\ProgramApp\chromedriver\chromedriver.exe"
driver = webdriver.Chrome(executable_path=driver_path,chrome_options=options)
driver.get('http://httpbin.org/ip')
  WebElement 元素:
  from selenium.webdriver.remote.webelement import WebElement类是每个获取出来的元素的所属类。
  有一些常用的属性:
  get_attribute:此标签的属性值。screentshot:获取当前页面的截图。此方法只能在驱动程序上使用。
  驱动程序的对象类也继承自 WebElement。
  更多内容请阅读相关源码。 查看全部

  抓取ajax动态网页java(什么是Ajax:Ajax(AsynchronouseJavaScript)异步JavaScript和XML)
  什么是阿贾克斯:
  Ajax (Asynchronouse JavaScript And XML) 异步 JavaScript 和 XML。通过在后台与服务器交换少量数据,Ajax 可以使网页异步更新。这意味着可以在不重新加载整个网页的情况下更新网页的某些部分。如果内容需要更新,传统网页(不使用 Ajax)必须重新加载整个网页。因为传统的数据传输格式是XML语法。所以它被称为 AJAX。其实现在数据交互基本都是用JSON。使用AJAX加载的数据,即使使用JS将数据渲染到浏览器中,右击-&gt;查看网页源码也看不到ajax加载的数据,只能看到使用这个加载的html代码网址。
  ajax数据的获取方式:直接分析ajax调用的接口。然后通过代码请求这个接口。使用Selenium+chromedriver模拟浏览器行为获取数据。方式优缺点
  分析界面
  可以直接请求数据。无需做一些解析工作。代码量小,性能高。
  解析接口比较复杂,尤其是一些被js混淆的接口,必须有一定的js基础。很容易被发现为爬虫。
  硒
  直接模拟浏览器的行为。浏览器可以请求的内容也可以使用 selenium 请求。爬虫更稳定。
  很多代码。低性能。
  Selenium+chromedriver 获取动态数据:
  Selenium 相当于一个机器人。可以在浏览器上模拟一些人类的行为,在浏览器上自动处理一些行为,比如点击、填充数据、删除cookies等。 chromedriver是一个驱动Chrome浏览器的驱动,可以用来驱动浏览器. 当然,不同的浏览器有不同的驱动程序。下面列出了不同的浏览器及其相应的驱动程序:
  Chrome: Firefox: Edge: Safari: 安装 Selenium 和 chromedriver:
  安装Selenium:Selenium 有多种语言版本,如java、ruby、python 等,我们可以下载python 版本。
  pip install selenium
  安装chromedriver:下载完成后,放在一个不需要权限的纯英文目录下。
  快速开始:
  下面我们就拿百度首页做个简单的例子来说一下如何快速上手Selenium和chromedriver:
  from selenium import webdriver
# chromedriver的绝对路径
driver_path = r'D:\ProgramApp\chromedriver\chromedriver.exe'
# 初始化一个driver,并且指定chromedriver的路径
driver = webdriver.Chrome(executable_path=driver_path)
# 请求网页
driver.get("https://www.baidu.com/";)
# 通过page_source获取网页源代码
print(driver.page_source)
  Selenium 常见操作:
  更多教程请参考:
  关闭页面: driver.close():关闭当前页面。driver.quit():退出整个浏览器。定位元素:
  find_element_by_id:根据 id 查找元素。相当于:
   submitTag = driver.find_element_by_id('su')
submitTag1 = driver.find_element(By.ID,'su')
  find_element_by_class_name:根据类名查找元素。相当于:
   submitTag = driver.find_element_by_class_name('su')
submitTag1 = driver.find_element(By.CLASS_NAME,'su')
  find_element_by_name:根据name属性的值查找元素。相当于:
   submitTag = driver.find_element_by_name('email')
submitTag1 = driver.find_element(By.NAME,'email')
  find_element_by_tag_name:根据标签名称查找元素。相当于:
   submitTag = driver.find_element_by_tag_name('div')
submitTag1 = driver.find_element(By.TAG_NAME,'div')
  find_element_by_xpath:根据 xpath 语法获取元素。相当于:
   submitTag = driver.find_element_by_xpath('//div')
submitTag1 = driver.find_element(By.XPATH,'//div')
  find_element_by_css_selector:根据css选择器选择元素。相当于:
   submitTag = driver.find_element_by_css_selector('//div')
submitTag1 = driver.find_element(By.CSS_SELECTOR,'//div')
  需要注意的是 find_element 是获取第一个满足条件的元素。find_elements 是获取所有满足条件的元素。
  操作表单元素:
  操作输入框:分为两步。第一步:找到这个元素。第二步:使用send_keys(value)填写数据。示例代码如下:
   inputTag = driver.find_element_by_id('kw')
inputTag.send_keys('python')
  使用clear方法清除输入框的内容。示例代码如下:
  inputTag.clear()
  操作复选框:因为要选中复选框标签,所以在网页上用鼠标点击它。因此,如果要选中复选框标签,请先选中此标签,然后再执行点击事件。示例代码如下:
   rememberTag = driver.find_element_by_name("rememberMe")
rememberTag.click()
  选择选择:不能直接点击选择元素。因为元素需要点击后被选中。这时,selenium 专门为 select 标签提供了一个类 selenium.webdriver.support.ui.Select。将获取的元素作为参数传递给该类以创建该对象。您可以在将来使用此对象进行选择。示例代码如下:
   from selenium.webdriver.support.ui import Select
# 选中这个标签,然后使用Select创建对象
selectTag = Select(driver.find_element_by_name("jumpMenu"))
# 根据索引选择
selectTag.select_by_index(1)
# 根据值选择
selectTag.select_by_value("http://www.95yueba.com";)
# 根据可视的文本选择
selectTag.select_by_visible_text("95秀客户端")
# 取消选中所有选项
selectTag.deselect_all()
  操作按钮:操作按钮的方式有很多种。比如单击、右键、双击等,这里是最常用的一种。只需点击。直接调用click函数就行了。示例代码如下:
   inputTag = driver.find_element_by_id('su')
inputTag.click()
  行为链:
  有时页面上的操作可能会有很多步骤,这时可以使用鼠标行为链类ActionChains来完成。例如,现在您想将鼠标移动到一个元素并执行一个点击事件。那么示例代码如下:
  inputTag = driver.find_element_by_id('kw')
submitTag = driver.find_element_by_id('su')
actions = ActionChains(driver)
actions.move_to_element(inputTag)
actions.send_keys_to_element(inputTag,'python')
actions.move_to_element(submitTag)
actions.click(submitTag)
actions.perform()
  还有更多与鼠标相关的操作。
  饼干操作:
  获取所有 cookie:
   for cookie in driver.get_cookies():
print(cookie)
  根据cookie的key获取value:
  value = driver.get_cookie(key)
  删除所有 cookie:
   driver.delete_all_cookies()
  删除一个cookie:
   driver.delete_cookie(key)
  页面等待:
  现在越来越多的网页使用 Ajax 技术,因此程序无法确定元素何时完全加载。如果实际页面等待时间过长,某个dom元素没有出来,而你的代码直接使用了这个WebElement,那么就会抛出NullPointer异常。为了解决这个问题。所以Selenium提供了两种等待方式:一种是隐式等待,另一种是显式等待。
  隐式等待:调用 driver.implicitly_wait。然后,在获取不可用元素之前,它会等待 10 秒。示例代码如下:
  driver = webdriver.Chrome(executable_path=driver_path)
driver.implicitly_wait(10)
# 请求网页
driver.get("https://www.douban.com/";)
  显示等待:显示等待是在满足一定条件后执行获取元素的操作。也可以指定等待的最长时间,超过这个时间就会抛出异常。显示等待应在 selenium.webdriver.support.excepted_conditions 和 selenium.webdriver.support.ui.WebDriverWait 的预期条件下完成。示例代码如下:
   from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading";)
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
  其他一些等待条件:
  切换页面:
  有时窗口中有很多子标签页。这个时候必须切换。Selenium 提供了一个 switch_to_window 来切换。要切换到的特定页面可以在 driver.window_handles 中找到。示例代码如下:
  # 打开一个新的页面
# 切换到这个新的页面中
self.driver.switch_to_window(self.driver.window_handles[1])
  设置代理ip:
  有时会频繁抓取一些网页。服务器发现你是爬虫后会屏蔽你的ip地址。这时候我们就可以更改代理ip了。更改代理ip,不同浏览器实现方式不同。以下是 Chrome 浏览器的示例:
  from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://110.73.2.248:8123";)
driver_path = r"D:\ProgramApp\chromedriver\chromedriver.exe"
driver = webdriver.Chrome(executable_path=driver_path,chrome_options=options)
driver.get('http://httpbin.org/ip')
  WebElement 元素:
  from selenium.webdriver.remote.webelement import WebElement类是每个获取出来的元素的所属类。
  有一些常用的属性:
  get_attribute:此标签的属性值。screentshot:获取当前页面的截图。此方法只能在驱动程序上使用。
  驱动程序的对象类也继承自 WebElement。
  更多内容请阅读相关源码。

抓取ajax动态网页java(越来越多的网站将Ajax用于精美的用户体验,简化它)

网站优化优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2021-10-14 11:26 • 来自相关话题

  抓取ajax动态网页java(越来越多的网站将Ajax用于精美的用户体验,简化它)
  如今,越来越多的 网站 使用 Ajax 来获得精美的用户体验、动态网页和许多其他很好的理由。
  搜索繁琐的 Ajax网站 可能既棘手又痛苦,我们将看到一些简化它的技巧。
  先决条件
  开始之前请先阅读我写的前几篇文章,了解如何搭建Java环境,对HtmlUnit Java for Web爬取和认证有一个基本的了解。
  阅读本文后,您应该对网页抓取更加熟悉。
  设置
  我们将看到的第一种使用 Java 抓取 Ajax 的方法网站 是将 PhantomJS 与 Selenium 和 GhostDriver 结合使用。
  PhantomJS 是一个基于 WebKit(在 Chrome 和 Safari 中使用)的无头 Web 浏览器。它非常快,可以像普通 Web 浏览器一样渲染 Dom。
  
com.github.detro
phantomjsdriver
1.2.0
  还有这个:
  
org.seleniumhq.selenium
selenium-java
2.53.1
  PhantomJS 和 Selenium
  现在,我们将使用 Selenium 和 GhostDriver 来“试用”PhantomJS。
  我们将要看到的示例是新闻网站上的一个简单的“查看更多”按钮,它执行 ajax 调用以加载更多新闻。
  所以你可能会认为打开 PhantomJS 点击一个简单的按钮是浪费时间和大量时间?当然!
  新闻网站是:简而言之
  
  与往常一样,我们必须打开 Chrome Dev 工具或您最喜欢的检查器才能查看如何选择“加载更多”按钮并点击它。
  
  现在让我们看一些代码:
  private static String USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" ;
private static DesiredCapabilities desiredCaps ;
private static WebDriver driver ;
public static void initPhantomJS (){

desiredCaps = new DesiredCapabilities ();
desiredCaps . setJavascriptEnabled ( true );
desiredCaps . setCapability ( "takesScreenshot" , false );
desiredCaps . setCapability ( PhantomJSDriverService . PHANTOMJS_EXECUTABLE_PATH_PROPERTY , "/usr/local/bin/phantomjs" );
desiredCaps . setCapability ( PhantomJSDriverService . PHANTOMJS_PAGE_CUSTOMHEADERS_PREFIX + "User-Agent" , USER_AGENT );
ArrayList cliArgsCap = new ArrayList ();
cliArgsCap . add ( "--web-security=false" );
cliArgsCap . add ( "--ssl-protocol=any" );
cliArgsCap . add ( "--ignore-ssl-errors=true" );
cliArgsCap . add ( "--webdriver-loglevel=ERROR" );
desiredCaps . setCapability ( PhantomJSDriverService . PHANTOMJS_CLI_ARGS , cliArgsCap );
driver = new PhantomJSDriver ( desiredCaps );
driver . manage (). window (). setSize ( new Dimension ( 1920 , 1080 ));
}
  设置phantomJs和Selenium有很多代码!
  建议您阅读文档以了解可以传递给 PhantomJS 的许多参数。
  请注意,您必须将 /usr/local/bin/phantomjs 替换为您自己的 phantomJs 可执行路径
  然后在main方法中:
   System . setProperty ( "phantomjs.page.settings.userAgent" , USER_AGENT );
String baseUrl = "https://www.inshorts.com/en/read" ;
initPhantomJS ();
driver . get ( baseUrl ) ;
int nbArticlesBefore = driver . findElements ( By . xpath ( "//div[@class='card-stack']/div" )). size ();
driver . findElement ( By . id ( "load-more-btn" )). click ();
// We wait for the ajax call to fire and to load the response into the page
Thread . sleep ( 800 );
int nbArticlesAfter = driver . findElements ( By . xpath ( "//div[@class='card-stack']/div" )). size ();
System . out . println ( String . format ( "Initial articles : %s Articles after clicking : %s" , nbArticlesBefore , nbArticlesAfter ));
  这里,我们调用 initPhantomJs() 方法来设置所有内容,然后选择带有其 ID 的按钮并单击它。
  代码的另一部分计算页面上已经存在的文章的数量并打印出来以显示我们加载的内容。
  我们也可以使用driver.getPageSource()来打印整个dom并在真实浏览器中打开查看点击前后的差异。
  我建议你看看 Selenium Webdriver 文档,有很多很酷的方法来操作 DOM。
  我使用了 Thread.sleep(800) 的脏解决方案来等待 Ajax 调用完成。
  它很脏,因为它是一个任意数字。如果我们只等待执行那个 ajax 调用所需的时间,那么爬虫可以运行得更快。
  还有其他方法可以解决这个问题:
  public static void waitForAjax ( WebDriver driver ) {

new WebDriverWait ( driver , 180 ). until ( new ExpectedCondition () {

public Boolean apply ( WebDriver driver ) {

JavascriptExecutor js = ( JavascriptExecutor ) driver ;
return ( Boolean ) js . executeScript ( "return jQuery.active == 0" );
}
});
}
  如果您查看单击按钮时正在执行的函数,您会看到它使用的是 jQuery:
  
  这段代码会一直等到变量jQuery.active等于0(这个好像是jQuery的内部变量,用来统计正在进行的ajax调用次数)
  如果我们知道哪些DOM元素应该被Ajax调用渲染,我们可以使用WebDriverWait条件下的id/class/xpath:
  wait . until ( ExpectedConditions . elementToBeClickable ( By . xpath ( xpathExpression )))
  结论
  所以,我们已经学会了如何在 Java 中使用 PhantomJS。
  我举的例子很简单,很容易模拟一个请求。
  但有时,当您有几十个 Ajax 调用并执行大量 Javascript 以正确呈现页面时,很难抓取所需的数据。 PhantomJS/Selenium 为您提供了帮助 :)
  下一次,我们将通过分析 AJAX 调用和自己发出请求来了解如何做到这一点。
  一如既往,您可以在我的 Github 存储库中找到所有代码
  大规模渲染JS确实是非常困难和昂贵的。这正是我们构建 ScrapingBee 的原因。 ScrapingBee 是一个网页抓取 API,可以为您解决这个问题。
  它还会使用代理和验证码,不要犹豫,前 1000 个 API 调用即将到来。
  来自: 查看全部

  抓取ajax动态网页java(越来越多的网站将Ajax用于精美的用户体验,简化它)
  如今,越来越多的 网站 使用 Ajax 来获得精美的用户体验、动态网页和许多其他很好的理由。
  搜索繁琐的 Ajax网站 可能既棘手又痛苦,我们将看到一些简化它的技巧。
  先决条件
  开始之前请先阅读我写的前几篇文章,了解如何搭建Java环境,对HtmlUnit Java for Web爬取和认证有一个基本的了解。
  阅读本文后,您应该对网页抓取更加熟悉。
  设置
  我们将看到的第一种使用 Java 抓取 Ajax 的方法网站 是将 PhantomJS 与 Selenium 和 GhostDriver 结合使用。
  PhantomJS 是一个基于 WebKit(在 Chrome 和 Safari 中使用)的无头 Web 浏览器。它非常快,可以像普通 Web 浏览器一样渲染 Dom。
  
com.github.detro
phantomjsdriver
1.2.0
  还有这个:
  
org.seleniumhq.selenium
selenium-java
2.53.1
  PhantomJS 和 Selenium
  现在,我们将使用 Selenium 和 GhostDriver 来“试用”PhantomJS。
  我们将要看到的示例是新闻网站上的一个简单的“查看更多”按钮,它执行 ajax 调用以加载更多新闻。
  所以你可能会认为打开 PhantomJS 点击一个简单的按钮是浪费时间和大量时间?当然!
  新闻网站是:简而言之
  
  与往常一样,我们必须打开 Chrome Dev 工具或您最喜欢的检查器才能查看如何选择“加载更多”按钮并点击它。
  
  现在让我们看一些代码:
  private static String USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" ;
private static DesiredCapabilities desiredCaps ;
private static WebDriver driver ;
public static void initPhantomJS (){

desiredCaps = new DesiredCapabilities ();
desiredCaps . setJavascriptEnabled ( true );
desiredCaps . setCapability ( "takesScreenshot" , false );
desiredCaps . setCapability ( PhantomJSDriverService . PHANTOMJS_EXECUTABLE_PATH_PROPERTY , "/usr/local/bin/phantomjs" );
desiredCaps . setCapability ( PhantomJSDriverService . PHANTOMJS_PAGE_CUSTOMHEADERS_PREFIX + "User-Agent" , USER_AGENT );
ArrayList cliArgsCap = new ArrayList ();
cliArgsCap . add ( "--web-security=false" );
cliArgsCap . add ( "--ssl-protocol=any" );
cliArgsCap . add ( "--ignore-ssl-errors=true" );
cliArgsCap . add ( "--webdriver-loglevel=ERROR" );
desiredCaps . setCapability ( PhantomJSDriverService . PHANTOMJS_CLI_ARGS , cliArgsCap );
driver = new PhantomJSDriver ( desiredCaps );
driver . manage (). window (). setSize ( new Dimension ( 1920 , 1080 ));
}
  设置phantomJs和Selenium有很多代码!
  建议您阅读文档以了解可以传递给 PhantomJS 的许多参数。
  请注意,您必须将 /usr/local/bin/phantomjs 替换为您自己的 phantomJs 可执行路径
  然后在main方法中:
   System . setProperty ( "phantomjs.page.settings.userAgent" , USER_AGENT );
String baseUrl = "https://www.inshorts.com/en/read" ;
initPhantomJS ();
driver . get ( baseUrl ) ;
int nbArticlesBefore = driver . findElements ( By . xpath ( "//div[@class='card-stack']/div" )). size ();
driver . findElement ( By . id ( "load-more-btn" )). click ();
// We wait for the ajax call to fire and to load the response into the page
Thread . sleep ( 800 );
int nbArticlesAfter = driver . findElements ( By . xpath ( "//div[@class='card-stack']/div" )). size ();
System . out . println ( String . format ( "Initial articles : %s Articles after clicking : %s" , nbArticlesBefore , nbArticlesAfter ));
  这里,我们调用 initPhantomJs() 方法来设置所有内容,然后选择带有其 ID 的按钮并单击它。
  代码的另一部分计算页面上已经存在的文章的数量并打印出来以显示我们加载的内容。
  我们也可以使用driver.getPageSource()来打印整个dom并在真实浏览器中打开查看点击前后的差异。
  我建议你看看 Selenium Webdriver 文档,有很多很酷的方法来操作 DOM。
  我使用了 Thread.sleep(800) 的脏解决方案来等待 Ajax 调用完成。
  它很脏,因为它是一个任意数字。如果我们只等待执行那个 ajax 调用所需的时间,那么爬虫可以运行得更快。
  还有其他方法可以解决这个问题:
  public static void waitForAjax ( WebDriver driver ) {

new WebDriverWait ( driver , 180 ). until ( new ExpectedCondition () {

public Boolean apply ( WebDriver driver ) {

JavascriptExecutor js = ( JavascriptExecutor ) driver ;
return ( Boolean ) js . executeScript ( "return jQuery.active == 0" );
}
});
}
  如果您查看单击按钮时正在执行的函数,您会看到它使用的是 jQuery:
  
  这段代码会一直等到变量jQuery.active等于0(这个好像是jQuery的内部变量,用来统计正在进行的ajax调用次数)
  如果我们知道哪些DOM元素应该被Ajax调用渲染,我们可以使用WebDriverWait条件下的id/class/xpath:
  wait . until ( ExpectedConditions . elementToBeClickable ( By . xpath ( xpathExpression )))
  结论
  所以,我们已经学会了如何在 Java 中使用 PhantomJS。
  我举的例子很简单,很容易模拟一个请求。
  但有时,当您有几十个 Ajax 调用并执行大量 Javascript 以正确呈现页面时,很难抓取所需的数据。 PhantomJS/Selenium 为您提供了帮助 :)
  下一次,我们将通过分析 AJAX 调用和自己发出请求来了解如何做到这一点。
  一如既往,您可以在我的 Github 存储库中找到所有代码
  大规模渲染JS确实是非常困难和昂贵的。这正是我们构建 ScrapingBee 的原因。 ScrapingBee 是一个网页抓取 API,可以为您解决这个问题。
  它还会使用代理和验证码,不要犹豫,前 1000 个 API 调用即将到来。
  来自:

抓取ajax动态网页java( Python即时网络爬虫GitHub源7,文档修改历史(组图))

网站优化优采云 发表了文章 • 0 个评论 • 89 次浏览 • 2021-10-14 11:23 • 来自相关话题

  抓取ajax动态网页java(
Python即时网络爬虫GitHub源7,文档修改历史(组图))
  
  1 简介
  本文介绍了如何使用 Java 和 JavaScript 中的 GooSeeker API 接口下载内容提取器。这是一个示例程序。什么是内容提取器?为什么要使用这种方法?源自Python即时网络爬虫开源项目:通过生成内容提取器,大大节省了程序员的时间。详情请参考“内容提取器的定义”。
  2.用Java下载内容提取器
  这是一系列示例程序之一。从目前的编程语言发展来看,Java实现网页内容提取并不合适。除了语言不够灵活方便,整个生态不够活跃,可选库增长缓慢。另外,从JavaScript动态网页中提取内容,Java也很不方便,需要JavaScript引擎。使用 JavaScript 下载内容提取器可以直接跳转到第 3 部分的内容。
  执行
  注解:
  源代码如下:
   public static void main(String[] args)
{
InputStream xslt = null;
try
{
String grabUrl = "http://m.58.com/cs/qiuzu/22613 ... 3B%3B // 抓取网址
String resultPath = "F:/temp/xslt/result.xml"; // 抓取结果文件的存放路径
// 通过GooSeeker API接口获得xslt
xslt = getGsExtractor();
// 抓取网页内容转换结果文件
convertXml(grabUrl, xslt, resultPath);
} catch (Exception e)
{
e.printStackTrace();
} finally
{
try
{
if (xslt != null)
xslt.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
/**
* @description dom转换
*/
public static void convertXml(String grabUrl, InputStream xslt, String resultPath) throws Exception
{
// 这里的doc对象指的是jsoup里的Document对象
org.jsoup.nodes.Document doc = Jsoup.parse(new URL(grabUrl).openStream(), "UTF-8", grabUrl);
W3CDom w3cDom = new W3CDom();
// 这里的w3cDoc对象指的是w3c里的Document对象
org.w3c.dom.Document w3cDoc = w3cDom.fromJsoup(doc);
Source srcSource = new DOMSource(w3cDoc);
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer(new StreamSource(xslt));
transformer.transform(srcSource, new StreamResult(new FileOutputStream(resultPath)));
}
/**
* @description 获取API返回结果
*/
public static InputStream getGsExtractor()
{
// api接口
String apiUrl = "http://www.gooseeker.com/api/getextractor";
// 请求参数
Map params = new HashMap();
params.put("key", "xxx"); // Gooseeker会员中心申请的API KEY
params.put("theme", "xxx"); // 提取器名,就是用MS谋数台定义的规则名
params.put("middle", "xxx"); // 规则编号,如果相同规则名下定义了多个规则,需填写
params.put("bname", "xxx"); // 整理箱名,如果规则含有多个整理箱,需填写
String httpArg = urlparam(params);
apiUrl = apiUrl + "?" + httpArg;
InputStream is = null;
try
{
URL url = new URL(apiUrl);
HttpURLConnection urlCon = (HttpURLConnection) url.openConnection();
urlCon.setRequestMethod("GET");
is = urlCon.getInputStream();
} catch (ProtocolException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
return is;
}
/**
* @description 请求参数
*/
public static String urlparam(Map data)
{
StringBuilder sb = new StringBuilder();
for (Map.Entry entry : data.entrySet())
{
try
{
sb.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue() + "", "UTF-8")).append("&");
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
}
return sb.toString();
}
  返回结果如下:
  
  3. 使用 JavaScript 下载内容提取器
  请注意,如果本示例中的 JavaScript 代码运行在网页上,由于跨域问题,无法抓取非站点网页的内容。因此,运行在有特权的 JavaScript 引擎上,例如浏览器扩展、自研浏览器以及自己程序中的 JavaScript 引擎。
  为方便实验,本示例仍在网页上运行。为了避免跨域问题,目标网页被保存和修改,并在其中插入JavaScript。这么多手动操作只是为了实验,正式使用时还需要考虑其他方法。
  执行
  注解:
  这是源代码:
  // 目标网页网址为http://m.58.com/cs/qiuzu/22613961050143x.shtml,预先保存成本地html文件,并插入下述代码
$(document).ready(function(){
$.ajax({
type: "get",
url: "http://www.gooseeker.com/api/getextractor?key=申请的appKey&theme=规则主题名",
dataType: "xml",
success: function(xslt)
{
var result = convertXml(xslt, window.document);
alert("result:" + result);
}
});
});
/* 用xslt将dom转换为xml对象 */
function convertXml(xslt, dom)
{
// 定义XSLTProcessor对象
var xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xslt);
// transformToDocument方式
var result = xsltProcessor.transformToDocument(dom);
return result;
}
  返回结果截图如下
  
  4. 展望
  您也可以使用 Python 来获取指定网页的内容。感觉Python的语法更简洁。我们将在未来添加 Python 语言的示例。有兴趣的朋友可以加入一起学习。
  五、相关文件
  1、Python即时网络爬虫:API说明
  6、采集GooSeeker开源代码下载
  1. GooSeeker开源Python网络爬虫GitHub源码
  7. 文档修改历史
  1, 2016-06-24: V1.0 查看全部

  抓取ajax动态网页java(
Python即时网络爬虫GitHub源7,文档修改历史(组图))
  
  1 简介
  本文介绍了如何使用 Java 和 JavaScript 中的 GooSeeker API 接口下载内容提取器。这是一个示例程序。什么是内容提取器?为什么要使用这种方法?源自Python即时网络爬虫开源项目:通过生成内容提取器,大大节省了程序员的时间。详情请参考“内容提取器的定义”。
  2.用Java下载内容提取器
  这是一系列示例程序之一。从目前的编程语言发展来看,Java实现网页内容提取并不合适。除了语言不够灵活方便,整个生态不够活跃,可选库增长缓慢。另外,从JavaScript动态网页中提取内容,Java也很不方便,需要JavaScript引擎。使用 JavaScript 下载内容提取器可以直接跳转到第 3 部分的内容。
  执行
  注解:
  源代码如下:
   public static void main(String[] args)
{
InputStream xslt = null;
try
{
String grabUrl = "http://m.58.com/cs/qiuzu/22613 ... 3B%3B // 抓取网址
String resultPath = "F:/temp/xslt/result.xml"; // 抓取结果文件的存放路径
// 通过GooSeeker API接口获得xslt
xslt = getGsExtractor();
// 抓取网页内容转换结果文件
convertXml(grabUrl, xslt, resultPath);
} catch (Exception e)
{
e.printStackTrace();
} finally
{
try
{
if (xslt != null)
xslt.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
/**
* @description dom转换
*/
public static void convertXml(String grabUrl, InputStream xslt, String resultPath) throws Exception
{
// 这里的doc对象指的是jsoup里的Document对象
org.jsoup.nodes.Document doc = Jsoup.parse(new URL(grabUrl).openStream(), "UTF-8", grabUrl);
W3CDom w3cDom = new W3CDom();
// 这里的w3cDoc对象指的是w3c里的Document对象
org.w3c.dom.Document w3cDoc = w3cDom.fromJsoup(doc);
Source srcSource = new DOMSource(w3cDoc);
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer(new StreamSource(xslt));
transformer.transform(srcSource, new StreamResult(new FileOutputStream(resultPath)));
}
/**
* @description 获取API返回结果
*/
public static InputStream getGsExtractor()
{
// api接口
String apiUrl = "http://www.gooseeker.com/api/getextractor";
// 请求参数
Map params = new HashMap();
params.put("key", "xxx"); // Gooseeker会员中心申请的API KEY
params.put("theme", "xxx"); // 提取器名,就是用MS谋数台定义的规则名
params.put("middle", "xxx"); // 规则编号,如果相同规则名下定义了多个规则,需填写
params.put("bname", "xxx"); // 整理箱名,如果规则含有多个整理箱,需填写
String httpArg = urlparam(params);
apiUrl = apiUrl + "?" + httpArg;
InputStream is = null;
try
{
URL url = new URL(apiUrl);
HttpURLConnection urlCon = (HttpURLConnection) url.openConnection();
urlCon.setRequestMethod("GET");
is = urlCon.getInputStream();
} catch (ProtocolException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
return is;
}
/**
* @description 请求参数
*/
public static String urlparam(Map data)
{
StringBuilder sb = new StringBuilder();
for (Map.Entry entry : data.entrySet())
{
try
{
sb.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue() + "", "UTF-8")).append("&");
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
}
return sb.toString();
}
  返回结果如下:
  
  3. 使用 JavaScript 下载内容提取器
  请注意,如果本示例中的 JavaScript 代码运行在网页上,由于跨域问题,无法抓取非站点网页的内容。因此,运行在有特权的 JavaScript 引擎上,例如浏览器扩展、自研浏览器以及自己程序中的 JavaScript 引擎。
  为方便实验,本示例仍在网页上运行。为了避免跨域问题,目标网页被保存和修改,并在其中插入JavaScript。这么多手动操作只是为了实验,正式使用时还需要考虑其他方法。
  执行
  注解:
  这是源代码:
  // 目标网页网址为http://m.58.com/cs/qiuzu/22613961050143x.shtml,预先保存成本地html文件,并插入下述代码
$(document).ready(function(){
$.ajax({
type: "get",
url: "http://www.gooseeker.com/api/getextractor?key=申请的appKey&theme=规则主题名",
dataType: "xml",
success: function(xslt)
{
var result = convertXml(xslt, window.document);
alert("result:" + result);
}
});
});
/* 用xslt将dom转换为xml对象 */
function convertXml(xslt, dom)
{
// 定义XSLTProcessor对象
var xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xslt);
// transformToDocument方式
var result = xsltProcessor.transformToDocument(dom);
return result;
}
  返回结果截图如下
  
  4. 展望
  您也可以使用 Python 来获取指定网页的内容。感觉Python的语法更简洁。我们将在未来添加 Python 语言的示例。有兴趣的朋友可以加入一起学习。
  五、相关文件
  1、Python即时网络爬虫:API说明
  6、采集GooSeeker开源代码下载
  1. GooSeeker开源Python网络爬虫GitHub源码
  7. 文档修改历史
  1, 2016-06-24: V1.0

抓取ajax动态网页java(谷歌爬虫是如何抓取和收录什么类型的抓取JavaScript?)

网站优化优采云 发表了文章 • 0 个评论 • 118 次浏览 • 2021-10-14 09:20 • 来自相关话题

  抓取ajax动态网页java(谷歌爬虫是如何抓取和收录什么类型的抓取JavaScript?)
  身体的一部分
  我们测试了 Google 爬虫如何抓取 JavaScript,这是我们从中学到的东西。
  认为 Google 无法处理 JavaScript?再想想。Audette Audette 分享了一系列测试结果。他和他的同事测试了 Google 和 收录 会抓取哪些类型的 JavaScript 函数。
  
  ​
  长话短说
  1. 我们进行了一系列测试,并确认谷歌可以以多种方式执行和收录 JavaScript。我们还确认了 Google 可以渲染整个页面并读取 DOM,从而可以收录 动态生成内容。
  2. DOM 中的 SEO 信号(页面标题、元描述、规范标签、元机器人标签等)都受到关注。动态插入到DOM中的内容也可以被爬取和收录。此外,在某些情况下,DOM 甚至可能优先于 HTML 源代码语句。虽然这需要更多的工作,但这是我们的几个测试之一。
  简介:Google 执行 JavaScript 并读取 DOM
  早在 2008 年,Google 就成功抓取了 JavaScript,但很可能仅限于某种方式。
  今天,很明显,Google 不仅可以制定自己的抓取和 收录 JavaScript 类型,而且在渲染整个网页方面也取得了重大进展(尤其是最近 12 到 18 个月)。
  在 Merkle,我们的 SEO 技术团队希望更好地了解 Google 爬虫可以抓取哪些类型的 JavaScript 事件和 收录。经过研究,我们发现了惊人的结果,并确认 Google 不仅可以执行各种 JavaScript 事件,还可以动态生成收录 内容。怎么做?Google 可以读取 DOM。
  什么是DOM?
  很多从事SEO的人不了解什么是文档对象模型(DOM)。
  
  ​
  当浏览器请求一个页面时会发生什么,DOM 是如何参与的?
  在 Web 浏览器中使用时,DOM 本质上是一个应用程序接口或 API,用于标记和构建数据(例如 HTML 和 XML)。该界面允许 Web 浏览器将它们组合起来形成一个文档。
  DOM 还定义了如何获取和操作结构。尽管 DOM 是一种独立于语言的 API(不依赖于特定的编程语言或库),但它通常用于 Web 应用程序中的 JavaScript 和动态内容。
  DOM 代表接口或“桥”,将网页与编程语言连接起来。解析 HTML 并执行 JavaScript 的结果就是 DOM。网页的内容不仅(不仅)是源代码,而且是 DOM。这使它变得非常重要。
  
  ​
  JavaScript 如何通过 DOM 接口工作。
  我们很高兴地发现 Google 可以读取 DOM,并且可以解析信号和动态插入的内容,例如标题标签、页面文本、标题标签和元注释(例如:rel = canonical)。您可以阅读完整的详细信息。
  这一系列的测试和结果
  因为想知道会爬取哪些JavaScript特性和收录,所以分别在谷歌爬虫上创建了一系列测试。通过创建控件,确保可以独立理解 URL 活动。下面,让我们详细介绍一些有趣的测试结果。它们分为5类:
  JavaScript 重定向
  JavaScript 链接
  动态插入内容
  动态插入元数据和页面元素
  rel = "nofollow" 的一个重要例子
  
  ​
  示例:用于测试 Google 抓取工具理解 JavaScript 能力的页面。
  1. JavaScript 重定向
  我们首先测试了常见的 JavaScript 重定向。URL 以不同方式表达的结果是什么?我们为两个测试选择了 window.location 对象:测试 A 使用绝对路径 URL 调用 window.location,测试 B 使用它。相对路径。
  结果:重定向很快就被谷歌跟踪了。从收录的角度来看,它们被解释为301——最终状态URL,而不是谷歌收录中的重定向URL。
  在随后的测试中,我们在权威网页上使用完全相同的内容来完成使用 JavaScript 重定向到同一站点的新页面。原创网址在 Google 热门查询的主页上排名。
  结果:果然,重定向被谷歌跟踪了,但是原创页面不是收录。新的URL是收录,它立即在同一个查询页面的同一个位置上排名。这让我们感到惊讶。从排名的角度来看,JavaScript 重定向行为(有时)与永久性 301 重定向非常相似。
  下次,您的客户想要为他们的 网站 完成 JavaScript 重定向动作,您可能不需要回答,或者回答:“请不要”。因为这好像有转职排名信号的关系。引用谷歌指南支持这一结论:
  使用 JavaScript 重定向用户可能是一种合法的做法。例如,如果您将登录用户重定向到内部页面,则可以使用 JavaScript 来完成此操作。在仔细检查 JavaScript 或其他重定向方法时,请确保您的网站遵循我们的指南并考虑其意图。请记住,将 301 重定向重定向到您的 网站 是最好的,但是如果您没有访问您的 网站 服务器的权限,您可以为此使用 JavaScript 重定向。
  2. JavaScript 链接
  我们使用多种编码方法测试了不同类型的 JS 链接。
  我们测试下拉菜单的链接。历史搜索引擎一直无法跟踪这种类型的链接。我们要确定是否会跟踪 onchange 事件处理程序。重要的是,这只是一种特定的执行类型,而我们需要的是:其他变化的影响,而不是像上面JavaScript重定向的强制操作。
  
  ​
  示例:Google Work 页面上的语言选择下拉菜单。
  结果:链接被完全抓取和跟踪。
  我们还测试了常见的 JavaScript 链接。以下是最常见的 JavaScript 链接类型,而传统 SEO 推荐纯文本。这些测试包括 JavaScript 链接代码:
  作用于外部 href 键值对 (AVP),但在标签内(“onClick”)
  使用 href 内部 AVP("javascript: window.location")
  在 a 标签之外执行,但在 href 中调用 AVP("javascript: openlink()")
  还有很多
  结果:链接被完全抓取和跟踪。
  我们接下来的测试是进一步测试事件处理程序,比如上面的onchange测试。具体来说,我们要使用鼠标移动的事件处理程序,然后隐藏 URL 变量,该变量仅在事件处理程序函数(在本例中为 onmousedown 和 onmouseout)被触发时执行。
  结果:链接被完全抓取和跟踪。
  构造链接:我们知道谷歌可以执行JavaScript,但我们想确认他们是否可以读取代码中的变量。所以在这个测试中,我们连接可以构造 URL 字符串的字符。
  结果:链接被完全抓取和跟踪。
  3. 动态插入内容
  显然,这些是要点:动态插入文本、图像、链接和导航。高质量的文本内容对于搜索引擎理解网页的主题和内容至关重要。在这个充满活力的网站时代,它的重要性毋庸置疑。
  这些测试旨在检查在两种不同场景中动态插入文本的结果。
  1)。测试搜索引擎是否可以统计动态插入的文本,文本来自页面的HTML源代码。
  2)。测试搜索引擎是否可以统计动态插入的文本,并且文本来自页面的HTML源代码之外(在外部JavaScript文件中)。
  结果:两种情况下都可以抓取文本和收录,页面根据内容排名。凉爽的!
  为了深入了解,我们测试了一个用JavaScript编写的客户端全局导航,导航中的链接是通过document.writeIn函数插入的,确认可以完全爬取和跟踪。需要指出的是,Google 可以解释网站 使用AngularJS 框架和HTML5 History API (pushState) 构建,可以渲染和收录 它,并且可以像传统静态网页一样进行排名。这就是不禁止 Google 爬虫获取外部文件和 JavaScript 的重要性,这可能也是 Google 将其从 Ajax Supporting SEO Guide 中删除的原因。当您可以简单地呈现整个页面时,谁需要 HTML 快照?
  经过测试,发现无论是什么类型的内容,结果都是一样的。比如图片加载到DOM后,会被抓取并收录。我们甚至做了这样的测试:通过动态生成结构数据来制作面包屑(breadcrumb navigation),并插入到DOM中。结果?成功插入后的面包屑出现在搜索结果(搜索引擎结果页面)中。
  值得注意的是,Google 现在推荐使用 JSON-LD 标签来形成结构化数据。我相信未来会有更多基于此的东西。
  4. 动态插入元数据和页面元素
  我们动态地将各种对 SEO 至关重要的标签插入到 DOM 中:
  标题元素
  元描述
  元机器人
  规范标签
  结果:在所有情况下,标签都可以被抓取并表现得像 HTML 源代码中的元素。
  一个有趣的补充实验可以帮助我们理解优先级的顺序。当出现相互矛盾的信号时,哪一个会获胜?如果源代码中没有index,nofollow标签,DOM中没有index,follow标签,会发生什么?在这个协议中,HTTP x-robots 响应头如何作为另一个变量使用行为?这将是未来全面测试的一部分。但是,我们的测试表明,当发生冲突时,Google 会忽略源代码中的标签并支持 DOM。
  5. rel="nofollow" 的一个重要例子
  我们想测试谷歌如何响应出现在源代码和 DOM 链接级别的 nofollow 属性。我们还创建了一个没有 nofollow 的控件。
  
  ​
  对于nofollow,我们分别测试了源代码和DOM生成的注解。
  源代码中的 nofollow 按预期工作(不跟踪链接)。但是DOM中的nofollow无效(链接被跟踪,页面为收录)。为什么?因为修改 DOM 中的 href 元素的操作发生得太晚了:Google 在执行添加 rel="nofollow" 的 JavaScript 函数之前,已准备好抓取链接并排队等待 URL。但是,如果将带有 href="nofollow" 的 a 元素插入到 DOM 中,nofollow 和链接将被跟踪,因为它们是同时插入的。
  结果
  从历史的角度来看,各种 SEO 建议都尽可能关注“纯文本”内容。动态生成的内容、AJAX 和 JavaScript 链接会损害主流搜索引擎的 SEO。显然,这对谷歌来说不再是问题。JavaScript 链接的操作方式类似于普通的 HTML 链接(这只是表面,我们不知道程序在幕后做了什么)。
  JavaScript 重定向的处理方式与 301 重定向类似。
  动态插入内容,甚至元标记,例如rel规范注释,无论是在HTML源代码中还是在解析初始HTML后触发JavaScript生成DOM都以相同的方式处理。
  Google 依赖于完全呈现页面和理解 DOM,而不仅仅是源代码。太不可思议了!(请记住允许 Google 爬虫获取这些外部文件和 JavaScript。)
  谷歌已经以惊人的速度在创新方面将其他搜索引擎甩在了后面。我们希望在其他搜索引擎中看到相同类型的创新。如果他们要在新的网络时代保持竞争力并取得实质性进展,就意味着他们需要更好地支持 HTML5、JavaScript 和动态网站。
  对于SEO来说,不了解以上基本概念和谷歌技术的人应该学习学习,以赶上当前的技术。如果你不考虑 DOM,你可能会失去一半的份额。
  并非本文所表达的所有观点均由 Search Engine Land(搜索引擎 网站)提供,部分观点由客座作者提供。所有作者的名单。
  转载于: 查看全部

  抓取ajax动态网页java(谷歌爬虫是如何抓取和收录什么类型的抓取JavaScript?)
  身体的一部分
  我们测试了 Google 爬虫如何抓取 JavaScript,这是我们从中学到的东西。
  认为 Google 无法处理 JavaScript?再想想。Audette Audette 分享了一系列测试结果。他和他的同事测试了 Google 和 收录 会抓取哪些类型的 JavaScript 函数。
  
  ​
  长话短说
  1. 我们进行了一系列测试,并确认谷歌可以以多种方式执行和收录 JavaScript。我们还确认了 Google 可以渲染整个页面并读取 DOM,从而可以收录 动态生成内容。
  2. DOM 中的 SEO 信号(页面标题、元描述、规范标签、元机器人标签等)都受到关注。动态插入到DOM中的内容也可以被爬取和收录。此外,在某些情况下,DOM 甚至可能优先于 HTML 源代码语句。虽然这需要更多的工作,但这是我们的几个测试之一。
  简介:Google 执行 JavaScript 并读取 DOM
  早在 2008 年,Google 就成功抓取了 JavaScript,但很可能仅限于某种方式。
  今天,很明显,Google 不仅可以制定自己的抓取和 收录 JavaScript 类型,而且在渲染整个网页方面也取得了重大进展(尤其是最近 12 到 18 个月)。
  在 Merkle,我们的 SEO 技术团队希望更好地了解 Google 爬虫可以抓取哪些类型的 JavaScript 事件和 收录。经过研究,我们发现了惊人的结果,并确认 Google 不仅可以执行各种 JavaScript 事件,还可以动态生成收录 内容。怎么做?Google 可以读取 DOM。
  什么是DOM?
  很多从事SEO的人不了解什么是文档对象模型(DOM)。
  
  ​
  当浏览器请求一个页面时会发生什么,DOM 是如何参与的?
  在 Web 浏览器中使用时,DOM 本质上是一个应用程序接口或 API,用于标记和构建数据(例如 HTML 和 XML)。该界面允许 Web 浏览器将它们组合起来形成一个文档。
  DOM 还定义了如何获取和操作结构。尽管 DOM 是一种独立于语言的 API(不依赖于特定的编程语言或库),但它通常用于 Web 应用程序中的 JavaScript 和动态内容。
  DOM 代表接口或“桥”,将网页与编程语言连接起来。解析 HTML 并执行 JavaScript 的结果就是 DOM。网页的内容不仅(不仅)是源代码,而且是 DOM。这使它变得非常重要。
  
  ​
  JavaScript 如何通过 DOM 接口工作。
  我们很高兴地发现 Google 可以读取 DOM,并且可以解析信号和动态插入的内容,例如标题标签、页面文本、标题标签和元注释(例如:rel = canonical)。您可以阅读完整的详细信息。
  这一系列的测试和结果
  因为想知道会爬取哪些JavaScript特性和收录,所以分别在谷歌爬虫上创建了一系列测试。通过创建控件,确保可以独立理解 URL 活动。下面,让我们详细介绍一些有趣的测试结果。它们分为5类:
  JavaScript 重定向
  JavaScript 链接
  动态插入内容
  动态插入元数据和页面元素
  rel = "nofollow" 的一个重要例子
  
  ​
  示例:用于测试 Google 抓取工具理解 JavaScript 能力的页面。
  1. JavaScript 重定向
  我们首先测试了常见的 JavaScript 重定向。URL 以不同方式表达的结果是什么?我们为两个测试选择了 window.location 对象:测试 A 使用绝对路径 URL 调用 window.location,测试 B 使用它。相对路径。
  结果:重定向很快就被谷歌跟踪了。从收录的角度来看,它们被解释为301——最终状态URL,而不是谷歌收录中的重定向URL。
  在随后的测试中,我们在权威网页上使用完全相同的内容来完成使用 JavaScript 重定向到同一站点的新页面。原创网址在 Google 热门查询的主页上排名。
  结果:果然,重定向被谷歌跟踪了,但是原创页面不是收录。新的URL是收录,它立即在同一个查询页面的同一个位置上排名。这让我们感到惊讶。从排名的角度来看,JavaScript 重定向行为(有时)与永久性 301 重定向非常相似。
  下次,您的客户想要为他们的 网站 完成 JavaScript 重定向动作,您可能不需要回答,或者回答:“请不要”。因为这好像有转职排名信号的关系。引用谷歌指南支持这一结论:
  使用 JavaScript 重定向用户可能是一种合法的做法。例如,如果您将登录用户重定向到内部页面,则可以使用 JavaScript 来完成此操作。在仔细检查 JavaScript 或其他重定向方法时,请确保您的网站遵循我们的指南并考虑其意图。请记住,将 301 重定向重定向到您的 网站 是最好的,但是如果您没有访问您的 网站 服务器的权限,您可以为此使用 JavaScript 重定向。
  2. JavaScript 链接
  我们使用多种编码方法测试了不同类型的 JS 链接。
  我们测试下拉菜单的链接。历史搜索引擎一直无法跟踪这种类型的链接。我们要确定是否会跟踪 onchange 事件处理程序。重要的是,这只是一种特定的执行类型,而我们需要的是:其他变化的影响,而不是像上面JavaScript重定向的强制操作。
  
  ​
  示例:Google Work 页面上的语言选择下拉菜单。
  结果:链接被完全抓取和跟踪。
  我们还测试了常见的 JavaScript 链接。以下是最常见的 JavaScript 链接类型,而传统 SEO 推荐纯文本。这些测试包括 JavaScript 链接代码:
  作用于外部 href 键值对 (AVP),但在标签内(“onClick”)
  使用 href 内部 AVP("javascript: window.location")
  在 a 标签之外执行,但在 href 中调用 AVP("javascript: openlink()")
  还有很多
  结果:链接被完全抓取和跟踪。
  我们接下来的测试是进一步测试事件处理程序,比如上面的onchange测试。具体来说,我们要使用鼠标移动的事件处理程序,然后隐藏 URL 变量,该变量仅在事件处理程序函数(在本例中为 onmousedown 和 onmouseout)被触发时执行。
  结果:链接被完全抓取和跟踪。
  构造链接:我们知道谷歌可以执行JavaScript,但我们想确认他们是否可以读取代码中的变量。所以在这个测试中,我们连接可以构造 URL 字符串的字符。
  结果:链接被完全抓取和跟踪。
  3. 动态插入内容
  显然,这些是要点:动态插入文本、图像、链接和导航。高质量的文本内容对于搜索引擎理解网页的主题和内容至关重要。在这个充满活力的网站时代,它的重要性毋庸置疑。
  这些测试旨在检查在两种不同场景中动态插入文本的结果。
  1)。测试搜索引擎是否可以统计动态插入的文本,文本来自页面的HTML源代码。
  2)。测试搜索引擎是否可以统计动态插入的文本,并且文本来自页面的HTML源代码之外(在外部JavaScript文件中)。
  结果:两种情况下都可以抓取文本和收录,页面根据内容排名。凉爽的!
  为了深入了解,我们测试了一个用JavaScript编写的客户端全局导航,导航中的链接是通过document.writeIn函数插入的,确认可以完全爬取和跟踪。需要指出的是,Google 可以解释网站 使用AngularJS 框架和HTML5 History API (pushState) 构建,可以渲染和收录 它,并且可以像传统静态网页一样进行排名。这就是不禁止 Google 爬虫获取外部文件和 JavaScript 的重要性,这可能也是 Google 将其从 Ajax Supporting SEO Guide 中删除的原因。当您可以简单地呈现整个页面时,谁需要 HTML 快照?
  经过测试,发现无论是什么类型的内容,结果都是一样的。比如图片加载到DOM后,会被抓取并收录。我们甚至做了这样的测试:通过动态生成结构数据来制作面包屑(breadcrumb navigation),并插入到DOM中。结果?成功插入后的面包屑出现在搜索结果(搜索引擎结果页面)中。
  值得注意的是,Google 现在推荐使用 JSON-LD 标签来形成结构化数据。我相信未来会有更多基于此的东西。
  4. 动态插入元数据和页面元素
  我们动态地将各种对 SEO 至关重要的标签插入到 DOM 中:
  标题元素
  元描述
  元机器人
  规范标签
  结果:在所有情况下,标签都可以被抓取并表现得像 HTML 源代码中的元素。
  一个有趣的补充实验可以帮助我们理解优先级的顺序。当出现相互矛盾的信号时,哪一个会获胜?如果源代码中没有index,nofollow标签,DOM中没有index,follow标签,会发生什么?在这个协议中,HTTP x-robots 响应头如何作为另一个变量使用行为?这将是未来全面测试的一部分。但是,我们的测试表明,当发生冲突时,Google 会忽略源代码中的标签并支持 DOM。
  5. rel="nofollow" 的一个重要例子
  我们想测试谷歌如何响应出现在源代码和 DOM 链接级别的 nofollow 属性。我们还创建了一个没有 nofollow 的控件。
  
  ​
  对于nofollow,我们分别测试了源代码和DOM生成的注解。
  源代码中的 nofollow 按预期工作(不跟踪链接)。但是DOM中的nofollow无效(链接被跟踪,页面为收录)。为什么?因为修改 DOM 中的 href 元素的操作发生得太晚了:Google 在执行添加 rel="nofollow" 的 JavaScript 函数之前,已准备好抓取链接并排队等待 URL。但是,如果将带有 href="nofollow" 的 a 元素插入到 DOM 中,nofollow 和链接将被跟踪,因为它们是同时插入的。
  结果
  从历史的角度来看,各种 SEO 建议都尽可能关注“纯文本”内容。动态生成的内容、AJAX 和 JavaScript 链接会损害主流搜索引擎的 SEO。显然,这对谷歌来说不再是问题。JavaScript 链接的操作方式类似于普通的 HTML 链接(这只是表面,我们不知道程序在幕后做了什么)。
  JavaScript 重定向的处理方式与 301 重定向类似。
  动态插入内容,甚至元标记,例如rel规范注释,无论是在HTML源代码中还是在解析初始HTML后触发JavaScript生成DOM都以相同的方式处理。
  Google 依赖于完全呈现页面和理解 DOM,而不仅仅是源代码。太不可思议了!(请记住允许 Google 爬虫获取这些外部文件和 JavaScript。)
  谷歌已经以惊人的速度在创新方面将其他搜索引擎甩在了后面。我们希望在其他搜索引擎中看到相同类型的创新。如果他们要在新的网络时代保持竞争力并取得实质性进展,就意味着他们需要更好地支持 HTML5、JavaScript 和动态网站。
  对于SEO来说,不了解以上基本概念和谷歌技术的人应该学习学习,以赶上当前的技术。如果你不考虑 DOM,你可能会失去一半的份额。
  并非本文所表达的所有观点均由 Search Engine Land(搜索引擎 网站)提供,部分观点由客座作者提供。所有作者的名单。
  转载于:

抓取ajax动态网页java(遇到一个网页数据抓取的任务,给大家分享下!)

网站优化优采云 发表了文章 • 0 个评论 • 120 次浏览 • 2021-10-14 09:19 • 来自相关话题

  抓取ajax动态网页java(遇到一个网页数据抓取的任务,给大家分享下!)
  遇到一个爬取网页数据的任务,分享给大家。
  说到网页信息抓取,相信Jsoup基本上是首选工具。完整的类似JQuery的操作让人感觉很舒服。不过,今天我们要说说Jsoup的缺点。
  这是某网站的搜索栏,填写一些格式化数据进行经纬度转换,初始化是这样的,然后用jsoup捕获的代码如下:
  
  
  当我们添加数据时,抓取的页面信息是不变的。这就是Jsoup的缺点。如果Jsoup抓取页面,页面加载后的所有数据,Ajax加载的异步数据都没有抓取。到达的。
  
  
  这里再给大家介绍一个开源项目:HttpUnit,这个名字是用来测试的,但是爬取数据也不错,是一个完美的解决方案。HttpUnit其实相当于一个没有UI的浏览器,可以让页面上的js执行完成后,再次抓取信息。
  有时我们使用requests抓取页面时,得到的结果可能与浏览器中看到的不同:在浏览器中可以看到正常显示的页面数据,但是使用requests获取的结果却看不到。这是因为获取的请求都是原创的 HTML 文档,浏览器中的页面是 JavaScript 处理数据后生成的结果。这些数据的来源有很多,可能是通过Ajax加载的,可能是收录在HTML中的,也可能是通过JavaScript和特定算法计算后生成的文档中的文档。
  在第一种情况下,数据加载是一种异步加载方法。原创页面最初不会收录一些数据。原创页面加载完毕后,会向服务器请求一个接口来获取数据,然后对数据进行处理呈现。在网页上,这实际上是一个 Ajax 请求。
  根据Web发展的趋势,这种形式的页面越来越多。网页的原创 HTML 文档不收录任何数据。数据通过Ajax统一加载后呈现,从而在Web开发中实现前后端分离,减少服务器直接渲染页面带来的压力。
  因此,如果遇到这样的页面,可以直接使用requests等库来抓取原创页面,无法获取有效数据。这时候就需要从网页后台分析发送到界面的Ajax请求。如果可以使用requests来模拟ajax请求,那么就可以成功爬取。
  但是我没有使用这个测试框架:我解决问题的想法是
  总结:ajax数据的爬取过程:
  
  分析网页信息,抓取网页
  1. 提交我们的搜索时,会加载这部分内容,并且会有表单数据生成,
  
  反映在程序中:
  
  2. 服务器加载这个页面,我们输入表单信息,这个表单信息就是我们的搜索条件,例如:
  
  反映在程序中:
  
  3.js返回加载的页面,并在该页面添加信息
  jsoup 可以解析页面。
  4.模拟登录部分:
  
  
  静态网页:jsoup
  ajax 网页:webdriver+selenium+jsoup 查看全部

  抓取ajax动态网页java(遇到一个网页数据抓取的任务,给大家分享下!)
  遇到一个爬取网页数据的任务,分享给大家。
  说到网页信息抓取,相信Jsoup基本上是首选工具。完整的类似JQuery的操作让人感觉很舒服。不过,今天我们要说说Jsoup的缺点。
  这是某网站的搜索栏,填写一些格式化数据进行经纬度转换,初始化是这样的,然后用jsoup捕获的代码如下:
  
  
  当我们添加数据时,抓取的页面信息是不变的。这就是Jsoup的缺点。如果Jsoup抓取页面,页面加载后的所有数据,Ajax加载的异步数据都没有抓取。到达的。
  
  
  这里再给大家介绍一个开源项目:HttpUnit,这个名字是用来测试的,但是爬取数据也不错,是一个完美的解决方案。HttpUnit其实相当于一个没有UI的浏览器,可以让页面上的js执行完成后,再次抓取信息。
  有时我们使用requests抓取页面时,得到的结果可能与浏览器中看到的不同:在浏览器中可以看到正常显示的页面数据,但是使用requests获取的结果却看不到。这是因为获取的请求都是原创的 HTML 文档,浏览器中的页面是 JavaScript 处理数据后生成的结果。这些数据的来源有很多,可能是通过Ajax加载的,可能是收录在HTML中的,也可能是通过JavaScript和特定算法计算后生成的文档中的文档。
  在第一种情况下,数据加载是一种异步加载方法。原创页面最初不会收录一些数据。原创页面加载完毕后,会向服务器请求一个接口来获取数据,然后对数据进行处理呈现。在网页上,这实际上是一个 Ajax 请求。
  根据Web发展的趋势,这种形式的页面越来越多。网页的原创 HTML 文档不收录任何数据。数据通过Ajax统一加载后呈现,从而在Web开发中实现前后端分离,减少服务器直接渲染页面带来的压力。
  因此,如果遇到这样的页面,可以直接使用requests等库来抓取原创页面,无法获取有效数据。这时候就需要从网页后台分析发送到界面的Ajax请求。如果可以使用requests来模拟ajax请求,那么就可以成功爬取。
  但是我没有使用这个测试框架:我解决问题的想法是
  总结:ajax数据的爬取过程:
  
  分析网页信息,抓取网页
  1. 提交我们的搜索时,会加载这部分内容,并且会有表单数据生成,
  
  反映在程序中:
  
  2. 服务器加载这个页面,我们输入表单信息,这个表单信息就是我们的搜索条件,例如:
  
  反映在程序中:
  
  3.js返回加载的页面,并在该页面添加信息
  jsoup 可以解析页面。
  4.模拟登录部分:
  
  
  静态网页:jsoup
  ajax 网页:webdriver+selenium+jsoup

抓取ajax动态网页java(Python网络爬虫内容提取器内容)

网站优化优采云 发表了文章 • 0 个评论 • 60 次浏览 • 2021-10-14 03:16 • 来自相关话题

  抓取ajax动态网页java(Python网络爬虫内容提取器内容)
  本文文章将详细讲解Python爬虫如何使用Selenium+PhantomJS抓取Ajax和动态HTML内容。小编觉得很实用,分享给大家作为参考。希望大家看完这篇文章以后可以有所收获。
  1、简介
  在Python网络爬虫内容提取器一文中,我们详细讲解了核心组件:可插拔内容提取器类gsExtractor。本文记录了在确定gsExtractor技术路线过程中所做的编程实验。这是第二部分。第一部分是使用xslt一次性提取静态网页内容并转换成xml格式的实验。
  2、提取动态内容的技术组件
  上一篇Python使用xslt提取网页数据,提取的内容直接从网页源码中获取。但是有些Ajax动态内容在源码中是找不到的,所以需要找一个合适的库来加载异步或者动态加载的内容,交给本项目的提取器进行提取。
  Python可以使用selenium来执行javascript,selenium可以让浏览器自动加载页面,获取需要的数据。Selenium本身没有浏览器,可以使用Firefox、Chrome等第三方浏览器,也可以使用PhantomJS等无头浏览器在后台执行。
  3、源码和实验过程
  假设我们要抓取京东手机页面的手机名称和价格(网页源码中没有找到价格),如下图:
  
  第一步:利用采集和搜索客户的直观标记功能,可以很快自动生成一个调试好的抓包规则,其实就是一个标准的xslt程序,如下图,将生成的xslt程序复制到下面可以在程序中。注:本文仅记录实验过程。在实际系统中,xslt 程序会以多种方式注入到内容提取器中。
  第二步:执行如下代码(windows10下测试,python3.2,源码下载地址可在文章末尾的GitHub找到),请注意:xslt是比较长的字符串,如果删除这个字符串,代码不是几行,足以展示Python的强大
  #/usr/bin/python 
from urllib import request 
from lxml import etree 
from selenium import webdriver 
import time 
 
# 京东手机商品页面 
url = "http://item.jd.com/1312640.html" 
 
# 下面的xslt是通过集搜客的谋数台图形界面自动生成的 
xslt_root = etree.XML("""\ 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
""") 
 
# 使用webdriver.PhantomJS 
browser = webdriver.PhantomJS(executable_path=&#39;C:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe&#39;) 
browser.get(url) 
time.sleep(3) 
 
transform = etree.XSLT(xslt_root) 
 
# 执行js得到整个dom 
html = browser.execute_script("return document.documentElement.outerHTML") 
doc = etree.HTML(html) 
# 用xslt从dom中提取需要的字段 
result_tree = transform(doc) 
print(result_tree)
  第三步:如下图所示,网页上手机的名称和价格已被正确抓取
  
  关于《Python爬虫如何使用Selenium+PhantomJS抓取Ajax和动态HTML内容》,我在这里分享了文章文章。希望以上内容能够对大家有所帮助,让大家了解更多。如果你觉得文章不错,请分享出去让更多人看到。 查看全部

  抓取ajax动态网页java(Python网络爬虫内容提取器内容)
  本文文章将详细讲解Python爬虫如何使用Selenium+PhantomJS抓取Ajax和动态HTML内容。小编觉得很实用,分享给大家作为参考。希望大家看完这篇文章以后可以有所收获。
  1、简介
  在Python网络爬虫内容提取器一文中,我们详细讲解了核心组件:可插拔内容提取器类gsExtractor。本文记录了在确定gsExtractor技术路线过程中所做的编程实验。这是第二部分。第一部分是使用xslt一次性提取静态网页内容并转换成xml格式的实验。
  2、提取动态内容的技术组件
  上一篇Python使用xslt提取网页数据,提取的内容直接从网页源码中获取。但是有些Ajax动态内容在源码中是找不到的,所以需要找一个合适的库来加载异步或者动态加载的内容,交给本项目的提取器进行提取。
  Python可以使用selenium来执行javascript,selenium可以让浏览器自动加载页面,获取需要的数据。Selenium本身没有浏览器,可以使用Firefox、Chrome等第三方浏览器,也可以使用PhantomJS等无头浏览器在后台执行。
  3、源码和实验过程
  假设我们要抓取京东手机页面的手机名称和价格(网页源码中没有找到价格),如下图:
  
  第一步:利用采集和搜索客户的直观标记功能,可以很快自动生成一个调试好的抓包规则,其实就是一个标准的xslt程序,如下图,将生成的xslt程序复制到下面可以在程序中。注:本文仅记录实验过程。在实际系统中,xslt 程序会以多种方式注入到内容提取器中。
  第二步:执行如下代码(windows10下测试,python3.2,源码下载地址可在文章末尾的GitHub找到),请注意:xslt是比较长的字符串,如果删除这个字符串,代码不是几行,足以展示Python的强大
  #/usr/bin/python 
from urllib import request 
from lxml import etree 
from selenium import webdriver 
import time 
 
# 京东手机商品页面 
url = "http://item.jd.com/1312640.html" 
 
# 下面的xslt是通过集搜客的谋数台图形界面自动生成的 
xslt_root = etree.XML("""\ 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
""") 
 
# 使用webdriver.PhantomJS 
browser = webdriver.PhantomJS(executable_path=&#39;C:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe&#39;) 
browser.get(url) 
time.sleep(3) 
 
transform = etree.XSLT(xslt_root) 
 
# 执行js得到整个dom 
html = browser.execute_script("return document.documentElement.outerHTML") 
doc = etree.HTML(html) 
# 用xslt从dom中提取需要的字段 
result_tree = transform(doc) 
print(result_tree)
  第三步:如下图所示,网页上手机的名称和价格已被正确抓取
  
  关于《Python爬虫如何使用Selenium+PhantomJS抓取Ajax和动态HTML内容》,我在这里分享了文章文章。希望以上内容能够对大家有所帮助,让大家了解更多。如果你觉得文章不错,请分享出去让更多人看到。

抓取ajax动态网页java(windows10系统、Lenovo小新Air14电脑教程操作环境:网站是什么)

网站优化优采云 发表了文章 • 0 个评论 • 124 次浏览 • 2021-10-09 07:20 • 来自相关话题

  抓取ajax动态网页java(windows10系统、Lenovo小新Air14电脑教程操作环境:网站是什么)
  与动态网页相比,静态网页的内容相对安全稳定,静态网页速度更快,不需要从数据库中提取数据。速度快的同时,对服务器没有压力;但是因为没有数据库支持,静态网页页面在网站的制作和维护上有很多工作要做。
  
  本教程运行环境:windows10系统,联想小新Air14电脑。
  网站什么是
  我们在使用电脑的时候经常访问一些网站。如果我们遇到一些精彩的内容网站,我们会分享给朋友。那么“网站”究竟是什么?
  网站(网站)是指在互联网上按照一定的规则,使用HTML(超文本标记语言)等工具制作的用于显示特定内容的网页的集合。简单的说,网站是一个交流工具。人们可以使用网站发布自己想要公开的信息,或者使用网站提供相关的网络服务。人们可以通过网络浏览器访问网站,获取所需信息或享受网络服务。
  网站 主要有独立的域名和空间。网页是构成网站的基本元素,但不一定有很多页面,即使只有一个页面,也叫网站。网页分为静态网页和动态网页。
  静态页面
  静态网页通常是指纯 HTML 格式的网页。它们的文件扩展名为.htm、html、shtml等,包括文本、图像、声音、FLASH动画、客户端脚本、ActiveX控件和Java小程序等。
  因此,静态网页并不意味着该页面是静态的。还可以实现GIF格式动画、FLASH、滚动字幕等“动态”显示效果。
  静态网页的“静态”是指静态网页一旦制作完成,内容就不会改变。写一次,放在服务器上浏览。如果要改,必须在页面上修改,然后上传服务器覆盖原来的,这样才能更新信息。对于静态网页,用户可以直接双击打开,看到的效果和访问服务器是一样的,即服务器是否参与对页面内容没有影响。这是因为在用户访问网页之前,网页的内容已经确定。无论谁访问,何时访问,显示的内容都是一样的。无论用户是否访问,每个静态网页的内容都存储在网站服务器上。
  静态网页的工作流程可以分为以下4个步骤。
  1、写一个静态文件发布到Web服务器上;
  2、 用户在浏览器地址栏中输入静态网页的URL(Uniform Resource Locator)并按下回车键,浏览器向Web服务器发送请求;
  3、Web 服务器找到这个静态文件的位置,将其转​​换为 HTML 流并传输到用户的浏览器;
  4、浏览器接收到HTML流并显示该网页的内容。
  工作原理图如下:
  
  动态网页
  即使动态网页的代码不变,页面上显示的内容也会随着时间、环境或数据库操作的结果而变化。动态网页可以与后端数据库交互并传输数据。文件扩展名后缀为.aspx、.asp、.jsp、.php等形式,使用HTML+ASP或HTML+PHP或HTML+JSP等网站动态语言,实现高效、 网站 的动态内容和风格以及互动管理。
  因此,动态网页并不是指网页上的各种动画、滚动字幕等视觉动态效果。动态网页也可以使用纯文本内容,无论网页是否有动态效果,只要是使用动态网站技术生成的网页都可以称为动态网页。常见的留言板、论坛、聊天室、用户注册、用户登录、在线调查、用户管理、订单管理等都是通过动态网页实现的。
  动态网页比较复杂,不能直接双击打开。动态网页的工作流程分为以下4个步骤。
  1、编写动态网页文件,包括程序代码,发布到网页服务器上;
  2、用户在浏览器地址栏中输入动态网页的URL并按下回车键(Enter),浏览器向web服务器发送访问请求;
  3、web服务器找到这个动态网页的位置,并根据其中的程序代码动态构建一个HTML流传输到用户浏览器;
  4、浏览器接收HTML流并显示该网页的内容;
  工作原理图如下:
  
  静态和动态的优缺点对比
  与动态网页相比,静态网页的内容相对安全稳定,静态网页速度更快,不需要从数据库中提取数据。速度快的同时,对服务器没有压力;但是由于目前的网页,大量使用JS导致浏览器打开页面,会占用大量内存。服务端的压力降低了,但是压力转移到了客户端,而且由于没有数据库支持,网站生产和维护的工作量比较大,所以当网站 信息量很大,很难完全依赖静态网页制作方法。
  一般来说,网站构建的基础是静态网页,静态网页和动态网页并不是互不兼容的。动态网站也可以采用动静结合的原理,为了提高网站内的搜索速度,就是利用了动态网页技术网站,也可以把内容将网页转成静态网页运行,将网页转成静态是网站的一个很好的开发方法,可以提高网页打开的速度。在同一个网站上,动态网页内容和静态网页内容同时存在是很常见的。
  以上就是动态网页和静态网页区别的详细内容。更多详情请关注其他相关html中文网站文章! 查看全部

  抓取ajax动态网页java(windows10系统、Lenovo小新Air14电脑教程操作环境:网站是什么)
  与动态网页相比,静态网页的内容相对安全稳定,静态网页速度更快,不需要从数据库中提取数据。速度快的同时,对服务器没有压力;但是因为没有数据库支持,静态网页页面在网站的制作和维护上有很多工作要做。
  
  本教程运行环境:windows10系统,联想小新Air14电脑。
  网站什么是
  我们在使用电脑的时候经常访问一些网站。如果我们遇到一些精彩的内容网站,我们会分享给朋友。那么“网站”究竟是什么?
  网站(网站)是指在互联网上按照一定的规则,使用HTML(超文本标记语言)等工具制作的用于显示特定内容的网页的集合。简单的说,网站是一个交流工具。人们可以使用网站发布自己想要公开的信息,或者使用网站提供相关的网络服务。人们可以通过网络浏览器访问网站,获取所需信息或享受网络服务。
  网站 主要有独立的域名和空间。网页是构成网站的基本元素,但不一定有很多页面,即使只有一个页面,也叫网站。网页分为静态网页和动态网页。
  静态页面
  静态网页通常是指纯 HTML 格式的网页。它们的文件扩展名为.htm、html、shtml等,包括文本、图像、声音、FLASH动画、客户端脚本、ActiveX控件和Java小程序等。
  因此,静态网页并不意味着该页面是静态的。还可以实现GIF格式动画、FLASH、滚动字幕等“动态”显示效果。
  静态网页的“静态”是指静态网页一旦制作完成,内容就不会改变。写一次,放在服务器上浏览。如果要改,必须在页面上修改,然后上传服务器覆盖原来的,这样才能更新信息。对于静态网页,用户可以直接双击打开,看到的效果和访问服务器是一样的,即服务器是否参与对页面内容没有影响。这是因为在用户访问网页之前,网页的内容已经确定。无论谁访问,何时访问,显示的内容都是一样的。无论用户是否访问,每个静态网页的内容都存储在网站服务器上。
  静态网页的工作流程可以分为以下4个步骤。
  1、写一个静态文件发布到Web服务器上;
  2、 用户在浏览器地址栏中输入静态网页的URL(Uniform Resource Locator)并按下回车键,浏览器向Web服务器发送请求;
  3、Web 服务器找到这个静态文件的位置,将其转​​换为 HTML 流并传输到用户的浏览器;
  4、浏览器接收到HTML流并显示该网页的内容。
  工作原理图如下:
  
  动态网页
  即使动态网页的代码不变,页面上显示的内容也会随着时间、环境或数据库操作的结果而变化。动态网页可以与后端数据库交互并传输数据。文件扩展名后缀为.aspx、.asp、.jsp、.php等形式,使用HTML+ASP或HTML+PHP或HTML+JSP等网站动态语言,实现高效、 网站 的动态内容和风格以及互动管理。
  因此,动态网页并不是指网页上的各种动画、滚动字幕等视觉动态效果。动态网页也可以使用纯文本内容,无论网页是否有动态效果,只要是使用动态网站技术生成的网页都可以称为动态网页。常见的留言板、论坛、聊天室、用户注册、用户登录、在线调查、用户管理、订单管理等都是通过动态网页实现的。
  动态网页比较复杂,不能直接双击打开。动态网页的工作流程分为以下4个步骤。
  1、编写动态网页文件,包括程序代码,发布到网页服务器上;
  2、用户在浏览器地址栏中输入动态网页的URL并按下回车键(Enter),浏览器向web服务器发送访问请求;
  3、web服务器找到这个动态网页的位置,并根据其中的程序代码动态构建一个HTML流传输到用户浏览器;
  4、浏览器接收HTML流并显示该网页的内容;
  工作原理图如下:
  
  静态和动态的优缺点对比
  与动态网页相比,静态网页的内容相对安全稳定,静态网页速度更快,不需要从数据库中提取数据。速度快的同时,对服务器没有压力;但是由于目前的网页,大量使用JS导致浏览器打开页面,会占用大量内存。服务端的压力降低了,但是压力转移到了客户端,而且由于没有数据库支持,网站生产和维护的工作量比较大,所以当网站 信息量很大,很难完全依赖静态网页制作方法。
  一般来说,网站构建的基础是静态网页,静态网页和动态网页并不是互不兼容的。动态网站也可以采用动静结合的原理,为了提高网站内的搜索速度,就是利用了动态网页技术网站,也可以把内容将网页转成静态网页运行,将网页转成静态是网站的一个很好的开发方法,可以提高网页打开的速度。在同一个网站上,动态网页内容和静态网页内容同时存在是很常见的。
  以上就是动态网页和静态网页区别的详细内容。更多详情请关注其他相关html中文网站文章!

抓取ajax动态网页java(李凯旋创建快速动态网页的技术分析索引页下Ajax)

网站优化优采云 发表了文章 • 0 个评论 • 203 次浏览 • 2021-10-04 09:13 • 来自相关话题

  抓取ajax动态网页java(李凯旋创建快速动态网页的技术分析索引页下Ajax)
  1043-蟒蛇群:李凯旋
  工具:先解释Ajax
  Ajax 是一种用于创建快速动态网页的技术。通过在后台与服务器交换少量数据,Ajax 可以使网页异步更新。就像打开一个网页,向下拖动鼠标,就添加了网页的一部分。在这个过程中,只加载了多余的部分内容,并没有重新加载整个页面内容。这样的技术是 Ajax 创造的快速动态。网络技术。
  例如:
  
  鼠标下拉时,本次显示的加载方式为Ajax异步加载。
  目标站点分析
  输入网址网址是/search/?keyword="街拍"
  我们的目标是抓取街景图集,返回图集的标题,并将每个图集的每个子图保存到项目根目录:
  索引页
  
  详情页面
  单击图库后,将出现详细信息页面。这是我们想要得到的图片之一
  
  分析index页面下的页面源码(按F12)
  首先动态加载肯定不在Doc目录下,所以应该在XHR(异步)下搜索
  
  根据观察和向下滚动网页,我们会发现有一个?offset 标签,一直在刷新,每次增加20。然后我们找到Preview找到响应的代码,包括data标签下的图片和标题。
  图中的标题是我们需要的图集的标题,url是我们需要的图集的链接。
  
  分析详情页源码(按F12)
  
  这组图片下有8张图片,每张图片的链接都收录gallery的变量字典。
  在下一节中,我们开始获取索引页并解析索引页。
  . 查看全部

  抓取ajax动态网页java(李凯旋创建快速动态网页的技术分析索引页下Ajax)
  1043-蟒蛇群:李凯旋
  工具:先解释Ajax
  Ajax 是一种用于创建快速动态网页的技术。通过在后台与服务器交换少量数据,Ajax 可以使网页异步更新。就像打开一个网页,向下拖动鼠标,就添加了网页的一部分。在这个过程中,只加载了多余的部分内容,并没有重新加载整个页面内容。这样的技术是 Ajax 创造的快速动态。网络技术。
  例如:
  
  鼠标下拉时,本次显示的加载方式为Ajax异步加载。
  目标站点分析
  输入网址网址是/search/?keyword="街拍"
  我们的目标是抓取街景图集,返回图集的标题,并将每个图集的每个子图保存到项目根目录:
  索引页
  
  详情页面
  单击图库后,将出现详细信息页面。这是我们想要得到的图片之一
  
  分析index页面下的页面源码(按F12)
  首先动态加载肯定不在Doc目录下,所以应该在XHR(异步)下搜索
  
  根据观察和向下滚动网页,我们会发现有一个?offset 标签,一直在刷新,每次增加20。然后我们找到Preview找到响应的代码,包括data标签下的图片和标题。
  图中的标题是我们需要的图集的标题,url是我们需要的图集的链接。
  
  分析详情页源码(按F12)
  
  这组图片下有8张图片,每张图片的链接都收录gallery的变量字典。
  在下一节中,我们开始获取索引页并解析索引页。
  .

抓取ajax动态网页java(一个爬虫动态生成的网页是什么?一般来说怎么办 )

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

  抓取ajax动态网页java(一个爬虫动态生成的网页是什么?一般来说怎么办
)
  最近,该公司想写一个爬虫项目。当它遇到一些由JS或Ajax动态生成的页面时,它发现webdriver是可靠的。至于htmlunit,它直接测试了一些网站异常,这对于JS支持可能不是特别好
  Webdriver通常有两种模式:本地潜水员和远程潜水员。由于爬虫程序最终将部署到Linux服务器上,并且只能在命令行上运行,因此浏览器似乎无法安装,因此本地驱动程序的进程无法完成,因此我们只能尝试远程驱动程序。幸运的是,我们发现了一个phantomjs的web驱动程序,它可以在没有Linux接口的情况下运行,因此我们选择它作为解决方案来处理JS动态生成web页面的问题
  下载到官网:,找到相应版本下载。提取并安装。输入bin目录并执行phantomjs。您需要带上启动参数并执行远程驱动程序的地址和端口。phantomjs——webdriver 127.0.0.1:10025
  Java连接:
  WebDriver driver = new RemoteWebDriver("http://127.0.0.1:10025", DesiredCapabilities.phantomjs());
driver.get("http://www.iteye.com"); 查看全部

  抓取ajax动态网页java(一个爬虫动态生成的网页是什么?一般来说怎么办
)
  最近,该公司想写一个爬虫项目。当它遇到一些由JS或Ajax动态生成的页面时,它发现webdriver是可靠的。至于htmlunit,它直接测试了一些网站异常,这对于JS支持可能不是特别好
  Webdriver通常有两种模式:本地潜水员和远程潜水员。由于爬虫程序最终将部署到Linux服务器上,并且只能在命令行上运行,因此浏览器似乎无法安装,因此本地驱动程序的进程无法完成,因此我们只能尝试远程驱动程序。幸运的是,我们发现了一个phantomjs的web驱动程序,它可以在没有Linux接口的情况下运行,因此我们选择它作为解决方案来处理JS动态生成web页面的问题
  下载到官网:,找到相应版本下载。提取并安装。输入bin目录并执行phantomjs。您需要带上启动参数并执行远程驱动程序的地址和端口。phantomjs——webdriver 127.0.0.1:10025
  Java连接:
  WebDriver driver = new RemoteWebDriver("http://127.0.0.1:10025", DesiredCapabilities.phantomjs());
driver.get("http://www.iteye.com";);

抓取ajax动态网页java(大多数网页数据都是通过动态渲染加载的,即常说的Ajax方式 )

网站优化优采云 发表了文章 • 0 个评论 • 234 次浏览 • 2021-09-29 20:19 • 来自相关话题

  抓取ajax动态网页java(大多数网页数据都是通过动态渲染加载的,即常说的Ajax方式
)
  目前的网页数据大部分是通过动态渲染加载的,也就是通常所说的Ajax方式。在这种类型的网站 爬取数据中通常是没有网页加载数据的。一般是找到动态加载页面然后获取数据,本文分析今日头条网站,搜索关键词获取搜索页面的图片和标题,最后通过简单的多线程保存到本地下载。
  1:打开今日头条主页,网址:今日头条主页
  
  页面右上角有一个搜索框,搜索关键词加载关键词信息。
  2:分析页面
  点击搜索后,页面重新加载并返回关键字信息界面。此页面未找到具体内容信息。由此可以判断它是一个Ajax加载页面。我们可以通过网络上的XHR查看加载信息。
  
  这里可以看到加载信息的url,也可以看到下面的请求头信息。
  我们在响应中观察返回网页的源代码,可以发现所有的数据都在这里。
  
  页面信息的数据中是具体的信息,如标题、图片列表等,我们可以通过这里获取信息来获取数据。
  3:多页面数据分析
  当页面向下滑动到最后时,会自动加载新的一页数据。这里我们观察后续链接的参数。我们可以发现唯一改变的参数是offset。第一次请求时偏移量为0,第二次请求时偏移值是20,第三次是40,第四次是60,所以我们可以找到规则,这个偏移值就是反向页偏移,然后我们可以推断count参数就是一次获取的数据个数,所以我们可以使用offset参数来控制数据分页。这样我们就可以通过接口批量获取数据,然后解析数据下载图片。
  其实通过传入URL关键词,还可以进一步实现关键词下载头条图片。
  4:程序实现
  只下载第一页
  import requests
from urllib.parse import urlencode #用 urlencode() 方法构造请求的 GET 参数
import os
from hashlib import md5
headers = {
&#39;Host&#39;: &#39;www.toutiao.com&#39;,
&#39;Referer&#39;: &#39;https://www.toutiao.com/search/?keyword=香港&#39;,
&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36&#39;,
&#39;X-Requested-With&#39;: &#39;XMLHttpRequest&#39;,
&#39;Cookie&#39;: &#39;tt_webid=6704808321848215043; WEATHER_CITY=武汉; UM_distinctid=16b77e85ac24d7-006d237c790a88-4a5568-1fa400-16b77e85ac344b; CNZZDATA1259612802=1104480020-1561079689-%7C1561079689; __tasessionId=n39mykl9q1561084844772; tt_webid=6704808321848215043; csrftoken=dcd1d465bc7441c32e8f77a18e4dcb62; s_v_web_id=bfc941bbb6430551a71c9f370afd2c71TE: Trailers&#39;
}
def get_page(offset):
params={
&#39;aid&#39;:24,
&#39;app_name&#39;:&#39;web_search&#39;,
&#39;format&#39;:&#39;json&#39;,
&#39;keyword&#39;:&#39;香港&#39;,
&#39;autoload&#39;:&#39;true&#39;,
&#39;count&#39;:20,
&#39;en_qc&#39;:1,
&#39;from&#39;:&#39;search_tab&#39;,
&#39;pd&#39;:&#39;synthesis&#39;,
&#39;timestamp&#39;:&#39;1561085020266&#39;,
&#39;offset&#39;:offset
}
url=&#39;https://www.toutiao.com/api/se ... ncode(params)
response=requests.get(url,headers=headers)
if response.status_code==200:
return response.json()
return None
def get_image(page):
if page.get(&#39;data&#39;):
for item in page.get(&#39;data&#39;):
title=item.get(&#39;title&#39;,None)
image_list=item.get(&#39;image_list&#39;,[])
if title:
yield { #生成器,返回标题和图像url列表
&#39;title&#39;:title,
&#39;image_list&#39;:image_list
}
def save_image(item):
if not os.path.exists(&#39;E:\\toutiao\\&#39;+item.get(&#39;title&#39;)): #如果不存在就创建
os.mkdir(&#39;E:\\toutiao\\&#39;+item.get(&#39;title&#39;))
for img in item.get(&#39;image_list&#39;):
print(img.get(&#39;url&#39;))
response=requests.get(img.get(&#39;url&#39;))
if response.status_code==200:
file_path=&#39;E:\\toutiao\\{0}\\{1}.{2}&#39;.format(item.get(&#39;title&#39;),
md5(response.content).hexdigest(),
&#39;jpg&#39;) #使用MD5编码,防止命名重复
if not os.path.exists(file_path):
with open(file_path,&#39;wb&#39;) as f:
f.write(response.content) #下载二进制数据
else:
print(&#39;已经下载了&#39;)
else:
print(response.reason)
if __name__ == &#39;__main__&#39;:
x=get_page(0)
for y in get_image(x):
save_image(y)
  多线程下载多个页面
  在上述程序的基础上增加一个新的main函数main
  from multiprocessing.pool import Pool
def main(offset):
json = get_page(offset)
for item in get_images(json):
print(item)
save_image(item)
GROUP_START = 1 #其实页面
GROUP_END = 20 #终止页面
if __name__ == &#39;__main__&#39;:
pool = Pool() #创建多线程
groups = ([x * 20 for x in range(GROUP_START, GROUP_END + 1)]) #构造多个参数
pool.map(main, groups) #传入多个参数,多个函数同时运行
pool.close()
pool.join() 查看全部

  抓取ajax动态网页java(大多数网页数据都是通过动态渲染加载的,即常说的Ajax方式
)
  目前的网页数据大部分是通过动态渲染加载的,也就是通常所说的Ajax方式。在这种类型的网站 爬取数据中通常是没有网页加载数据的。一般是找到动态加载页面然后获取数据,本文分析今日头条网站,搜索关键词获取搜索页面的图片和标题,最后通过简单的多线程保存到本地下载。
  1:打开今日头条主页,网址:今日头条主页
  
  页面右上角有一个搜索框,搜索关键词加载关键词信息。
  2:分析页面
  点击搜索后,页面重新加载并返回关键字信息界面。此页面未找到具体内容信息。由此可以判断它是一个Ajax加载页面。我们可以通过网络上的XHR查看加载信息。
  
  这里可以看到加载信息的url,也可以看到下面的请求头信息。
  我们在响应中观察返回网页的源代码,可以发现所有的数据都在这里。
  
  页面信息的数据中是具体的信息,如标题、图片列表等,我们可以通过这里获取信息来获取数据。
  3:多页面数据分析
  当页面向下滑动到最后时,会自动加载新的一页数据。这里我们观察后续链接的参数。我们可以发现唯一改变的参数是offset。第一次请求时偏移量为0,第二次请求时偏移值是20,第三次是40,第四次是60,所以我们可以找到规则,这个偏移值就是反向页偏移,然后我们可以推断count参数就是一次获取的数据个数,所以我们可以使用offset参数来控制数据分页。这样我们就可以通过接口批量获取数据,然后解析数据下载图片。
  其实通过传入URL关键词,还可以进一步实现关键词下载头条图片。
  4:程序实现
  只下载第一页
  import requests
from urllib.parse import urlencode #用 urlencode() 方法构造请求的 GET 参数
import os
from hashlib import md5
headers = {
&#39;Host&#39;: &#39;www.toutiao.com&#39;,
&#39;Referer&#39;: &#39;https://www.toutiao.com/search/?keyword=香港&#39;,
&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36&#39;,
&#39;X-Requested-With&#39;: &#39;XMLHttpRequest&#39;,
&#39;Cookie&#39;: &#39;tt_webid=6704808321848215043; WEATHER_CITY=武汉; UM_distinctid=16b77e85ac24d7-006d237c790a88-4a5568-1fa400-16b77e85ac344b; CNZZDATA1259612802=1104480020-1561079689-%7C1561079689; __tasessionId=n39mykl9q1561084844772; tt_webid=6704808321848215043; csrftoken=dcd1d465bc7441c32e8f77a18e4dcb62; s_v_web_id=bfc941bbb6430551a71c9f370afd2c71TE: Trailers&#39;
}
def get_page(offset):
params={
&#39;aid&#39;:24,
&#39;app_name&#39;:&#39;web_search&#39;,
&#39;format&#39;:&#39;json&#39;,
&#39;keyword&#39;:&#39;香港&#39;,
&#39;autoload&#39;:&#39;true&#39;,
&#39;count&#39;:20,
&#39;en_qc&#39;:1,
&#39;from&#39;:&#39;search_tab&#39;,
&#39;pd&#39;:&#39;synthesis&#39;,
&#39;timestamp&#39;:&#39;1561085020266&#39;,
&#39;offset&#39;:offset
}
url=&#39;https://www.toutiao.com/api/se ... ncode(params)
response=requests.get(url,headers=headers)
if response.status_code==200:
return response.json()
return None
def get_image(page):
if page.get(&#39;data&#39;):
for item in page.get(&#39;data&#39;):
title=item.get(&#39;title&#39;,None)
image_list=item.get(&#39;image_list&#39;,[])
if title:
yield { #生成器,返回标题和图像url列表
&#39;title&#39;:title,
&#39;image_list&#39;:image_list
}
def save_image(item):
if not os.path.exists(&#39;E:\\toutiao\\&#39;+item.get(&#39;title&#39;)): #如果不存在就创建
os.mkdir(&#39;E:\\toutiao\\&#39;+item.get(&#39;title&#39;))
for img in item.get(&#39;image_list&#39;):
print(img.get(&#39;url&#39;))
response=requests.get(img.get(&#39;url&#39;))
if response.status_code==200:
file_path=&#39;E:\\toutiao\\{0}\\{1}.{2}&#39;.format(item.get(&#39;title&#39;),
md5(response.content).hexdigest(),
&#39;jpg&#39;) #使用MD5编码,防止命名重复
if not os.path.exists(file_path):
with open(file_path,&#39;wb&#39;) as f:
f.write(response.content) #下载二进制数据
else:
print(&#39;已经下载了&#39;)
else:
print(response.reason)
if __name__ == &#39;__main__&#39;:
x=get_page(0)
for y in get_image(x):
save_image(y)
  多线程下载多个页面
  在上述程序的基础上增加一个新的main函数main
  from multiprocessing.pool import Pool
def main(offset):
json = get_page(offset)
for item in get_images(json):
print(item)
save_image(item)
GROUP_START = 1 #其实页面
GROUP_END = 20 #终止页面
if __name__ == &#39;__main__&#39;:
pool = Pool() #创建多线程
groups = ([x * 20 for x in range(GROUP_START, GROUP_END + 1)]) #构造多个参数
pool.map(main, groups) #传入多个参数,多个函数同时运行
pool.close()
pool.join()

抓取ajax动态网页java(一下如何判断网页的编码:网上很多网页编码格式都不一样)

网站优化优采云 发表了文章 • 0 个评论 • 130 次浏览 • 2021-09-26 08:11 • 来自相关话题

  抓取ajax动态网页java(一下如何判断网页的编码:网上很多网页编码格式都不一样)
  在web开发中,我们经常会遇到网页的爬取和分析,可以用各种语言来完成。我喜欢用python来实现,因为python提供了很多成熟的模块,可以轻松实现网络爬虫。
  但是在爬取的过程中会遇到编码问题。今天我们就来看看如何判断一个网页的编码:
  互联网上很多网页都有不同的编码格式,一般是GBK、GB2312、UTF-8等。
  我们在获取到网页的数据后,首先要判断网页的编码,然后才能将抓取到的内容的编码统一转换为我们可以处理的编码,避免出现乱码问题。
  使用 chardet 模块
   1 #如果你的python没有安装chardet模块,你需要首先安装一下chardet判断编码的模块哦
2 #author:pythontab.com
3 import chardet
4 import urllib
5 #先获取网页内容
6 data1 = urllib.urlopen('http://www.baidu.com').read()
7 #用chardet进行内容分析
8 chardit1 = chardet.detect(data1)
9
10 print chardit1['encoding'] # baidu
  实施结果如下:
  gb2312
  这个结果是正确的,你可以自己验证一下~~ 查看全部

  抓取ajax动态网页java(一下如何判断网页的编码:网上很多网页编码格式都不一样)
  在web开发中,我们经常会遇到网页的爬取和分析,可以用各种语言来完成。我喜欢用python来实现,因为python提供了很多成熟的模块,可以轻松实现网络爬虫。
  但是在爬取的过程中会遇到编码问题。今天我们就来看看如何判断一个网页的编码:
  互联网上很多网页都有不同的编码格式,一般是GBK、GB2312、UTF-8等。
  我们在获取到网页的数据后,首先要判断网页的编码,然后才能将抓取到的内容的编码统一转换为我们可以处理的编码,避免出现乱码问题。
  使用 chardet 模块
   1 #如果你的python没有安装chardet模块,你需要首先安装一下chardet判断编码的模块哦
2 #author:pythontab.com
3 import chardet
4 import urllib
5 #先获取网页内容
6 data1 = urllib.urlopen('http://www.baidu.com').read()
7 #用chardet进行内容分析
8 chardit1 = chardet.detect(data1)
9
10 print chardit1['encoding'] # baidu
  实施结果如下:
  gb2312
  这个结果是正确的,你可以自己验证一下~~

抓取ajax动态网页java(之前第一篇教程.js爬虫入门(一)爬取静态页面)

网站优化优采云 发表了文章 • 0 个评论 • 65 次浏览 • 2021-09-25 10:12 • 来自相关话题

  抓取ajax动态网页java(之前第一篇教程.js爬虫入门(一)爬取静态页面)
  第一篇爬虫教程node.js爬虫介绍(一)爬取静态页面讲解了静态网页的爬取,很简单,但是如果遇到少量的动态网页(ajax),直接发送请求使用前面的方法无法获取到我们想要的数据,这时候需要爬取动态网页,selenium和puppeteer都不错。
  这里推荐Puppeteer,不是为了别的,只是因为它是谷歌自己的,一直在维护和升级。以下是翻译的官方文档详情
  Puppeteer 是一个 Node 库,通过 DevTools(开发者工具)协议提供了一系列高级接口来控制 Chrome 或 Chromium(谷歌开源)。默认运行headless模式(无浏览器UI界面),也可以通过配置运行在普通模式。
  它可用于:
  首先,我们必须先安装它,然后才能使用它。最新的Chromium会默认安装下载,大小约300M。
  npm install puppeteer
  如果你的机器上已经有较新版本的chrome,可以只安装core版本,但是启动puppeteer时需要配置本地chrome的路径。
  npm install puppeteer-core // 核心版本
  假设我们要爬取拉勾的前台招聘信息。这是一个动态页面。使用此示例尝试抓取。
  由于chrome操作都是异步操作,为了避免回调地狱,推荐使用es7的async await。这种语法具有很高的可读性,官方文档也是如此。
  首先使用puppeteer启动浏览器,打开动态页面
  需要注意的是,如果使用的是本地浏览器,则需要在启动浏览器配置中传入本地chrome路径
  const browser = await puppeteer.launch({ executablePath: 'C:/Users/Administrator/AppData/Local/Google/Chrome/Application/chrome.exe'})
  在chrome环境中执行函数,获取需要的数据,然后返回到node的执行环境
  
  上图可以看到我们需要的数据的dom位置。在chrome环境执行的函数中,我们需要获取和整理需要的数据。
  let list = document.querySelectorAll('.s_position_list .item_con_list li')let res = []for (let i = 0; i < list.length; i++) { res.push({ name: list[i].getAttribute('data-positionname'), company: list[i].getAttribute('data-company'), salary: list[i].getAttribute('data-salary'), require: list[i].querySelector('.li_b_l').childNodes[4].textContent.replace(/ |\n/g, ''), })}return res
  这里有一个调试技巧,我们可以在chrome控制台中直接编写获取数据的函数,方便调试
  最后附上完整代码
  const puppeteer = require('puppeteer');(async () => { // 启动浏览器 const browser = await puppeteer.launch({ headless: false, // 默认是无头模式,这里为了示范所以使用正常模式 }) // 控制浏览器打开新标签页面 const page = await browser.newPage() // 在新标签中打开要爬取的网页 await page.goto('https://www.lagou.com/jobs/list_web%E5%89%8D%E7%AB%AF?px=new&city=%E5%B9%BF%E5%B7%9E') // 使用evaluate方法在浏览器中执行传入函数(完全的浏览器环境,所以函数内可以直接使用window、document等所有对象和方法) let data = await page.evaluate(() => { let list = document.querySelectorAll('.s_position_list .item_con_list li') let res = [] for (let i = 0; i < list.length; i++) { res.push({ name: list[i].getAttribute('data-positionname'), company: list[i].getAttribute('data-company'), salary: list[i].getAttribute('data-salary'), require: list[i].querySelector('.li_b_l').childNodes[4].textContent.replace(/ |\n/g, ''), }) } return res }) console.log(data)})()
  操作结果
  
  成功
  到这里,动态网页的爬取也已经完成了,但是puppeteer的功能远不止这些。它还具有许多可以使用的强大 API。您可以移至官方文档。
  第三期会讲​​如何定时执行爬虫并存入数据库。 查看全部

  抓取ajax动态网页java(之前第一篇教程.js爬虫入门(一)爬取静态页面)
  第一篇爬虫教程node.js爬虫介绍(一)爬取静态页面讲解了静态网页的爬取,很简单,但是如果遇到少量的动态网页(ajax),直接发送请求使用前面的方法无法获取到我们想要的数据,这时候需要爬取动态网页,selenium和puppeteer都不错。
  这里推荐Puppeteer,不是为了别的,只是因为它是谷歌自己的,一直在维护和升级。以下是翻译的官方文档详情
  Puppeteer 是一个 Node 库,通过 DevTools(开发者工具)协议提供了一系列高级接口来控制 Chrome 或 Chromium(谷歌开源)。默认运行headless模式(无浏览器UI界面),也可以通过配置运行在普通模式。
  它可用于:
  首先,我们必须先安装它,然后才能使用它。最新的Chromium会默认安装下载,大小约300M。
  npm install puppeteer
  如果你的机器上已经有较新版本的chrome,可以只安装core版本,但是启动puppeteer时需要配置本地chrome的路径。
  npm install puppeteer-core // 核心版本
  假设我们要爬取拉勾的前台招聘信息。这是一个动态页面。使用此示例尝试抓取。
  由于chrome操作都是异步操作,为了避免回调地狱,推荐使用es7的async await。这种语法具有很高的可读性,官方文档也是如此。
  首先使用puppeteer启动浏览器,打开动态页面
  需要注意的是,如果使用的是本地浏览器,则需要在启动浏览器配置中传入本地chrome路径
  const browser = await puppeteer.launch({ executablePath: 'C:/Users/Administrator/AppData/Local/Google/Chrome/Application/chrome.exe'})
  在chrome环境中执行函数,获取需要的数据,然后返回到node的执行环境
  
  上图可以看到我们需要的数据的dom位置。在chrome环境执行的函数中,我们需要获取和整理需要的数据。
  let list = document.querySelectorAll('.s_position_list .item_con_list li')let res = []for (let i = 0; i < list.length; i++) { res.push({ name: list[i].getAttribute('data-positionname'), company: list[i].getAttribute('data-company'), salary: list[i].getAttribute('data-salary'), require: list[i].querySelector('.li_b_l').childNodes[4].textContent.replace(/ |\n/g, ''), })}return res
  这里有一个调试技巧,我们可以在chrome控制台中直接编写获取数据的函数,方便调试
  最后附上完整代码
  const puppeteer = require('puppeteer');(async () => { // 启动浏览器 const browser = await puppeteer.launch({ headless: false, // 默认是无头模式,这里为了示范所以使用正常模式 }) // 控制浏览器打开新标签页面 const page = await browser.newPage() // 在新标签中打开要爬取的网页 await page.goto('https://www.lagou.com/jobs/list_web%E5%89%8D%E7%AB%AF?px=new&city=%E5%B9%BF%E5%B7%9E') // 使用evaluate方法在浏览器中执行传入函数(完全的浏览器环境,所以函数内可以直接使用window、document等所有对象和方法) let data = await page.evaluate(() => { let list = document.querySelectorAll('.s_position_list .item_con_list li') let res = [] for (let i = 0; i < list.length; i++) { res.push({ name: list[i].getAttribute('data-positionname'), company: list[i].getAttribute('data-company'), salary: list[i].getAttribute('data-salary'), require: list[i].querySelector('.li_b_l').childNodes[4].textContent.replace(/ |\n/g, ''), }) } return res }) console.log(data)})()
  操作结果
  
  成功
  到这里,动态网页的爬取也已经完成了,但是puppeteer的功能远不止这些。它还具有许多可以使用的强大 API。您可以移至官方文档。
  第三期会讲​​如何定时执行爬虫并存入数据库。

抓取ajax动态网页java(一个爬虫动态生成的网页是什么?一般来说怎么办 )

网站优化优采云 发表了文章 • 0 个评论 • 73 次浏览 • 2021-09-24 12:06 • 来自相关话题

  抓取ajax动态网页java(一个爬虫动态生成的网页是什么?一般来说怎么办
)
  最近,该公司想写一个爬虫项目。当它遇到一些由JS或Ajax动态生成的页面时,它发现webdriver是可靠的。至于htmlunit,它直接测试了一些网站异常,这对于JS支持可能不是特别好
  Webdriver通常有两种模式:本地潜水员和远程潜水员。由于爬虫程序最终将部署到Linux服务器上,并且只能在命令行上运行,因此浏览器似乎无法安装,因此本地驱动程序的进程无法完成,因此我们只能尝试远程驱动程序。幸运的是,我们发现了一个phantomjs的web驱动程序,它可以在没有Linux接口的情况下运行,因此我们选择它作为解决方案来处理JS动态生成web页面的问题
  下载到官网:,找到相应版本下载。提取并安装。输入bin目录并执行phantomjs。您需要带上启动参数并执行远程驱动程序的地址和端口。phantomjs——webdriver 127.0.0.1:10025
  Java连接:
  WebDriver driver = new RemoteWebDriver("http://127.0.0.1:10025", DesiredCapabilities.phantomjs());
driver.get("http://www.iteye.com"); 查看全部

  抓取ajax动态网页java(一个爬虫动态生成的网页是什么?一般来说怎么办
)
  最近,该公司想写一个爬虫项目。当它遇到一些由JS或Ajax动态生成的页面时,它发现webdriver是可靠的。至于htmlunit,它直接测试了一些网站异常,这对于JS支持可能不是特别好
  Webdriver通常有两种模式:本地潜水员和远程潜水员。由于爬虫程序最终将部署到Linux服务器上,并且只能在命令行上运行,因此浏览器似乎无法安装,因此本地驱动程序的进程无法完成,因此我们只能尝试远程驱动程序。幸运的是,我们发现了一个phantomjs的web驱动程序,它可以在没有Linux接口的情况下运行,因此我们选择它作为解决方案来处理JS动态生成web页面的问题
  下载到官网:,找到相应版本下载。提取并安装。输入bin目录并执行phantomjs。您需要带上启动参数并执行远程驱动程序的地址和端口。phantomjs——webdriver 127.0.0.1:10025
  Java连接:
  WebDriver driver = new RemoteWebDriver("http://127.0.0.1:10025", DesiredCapabilities.phantomjs());
driver.get("http://www.iteye.com";);

抓取ajax动态网页java(Ajax(AsynchronousJavaScriptandXML)是什么意思?购物车示例)

网站优化优采云 发表了文章 • 0 个评论 • 87 次浏览 • 2021-09-22 06:26 • 来自相关话题

  抓取ajax动态网页java(Ajax(AsynchronousJavaScriptandXML)是什么意思?购物车示例)
  ajax(异步JavaScript和XML)是一个编程技术,与Java技术,XML和JavaScript相结合,允许您构建基于Java技术的Web应用程序并打破页面过载的使用。
  ajax,异步JavaScript和XML,是使用客户端脚本和Web服务器的Web应用程序开发方法。通过这种方式,网页不必中断互动过程到REANFINE,您可以更新它。使用AJAX,您可以创建,直接,高度可用,更丰富,更紧密的Web用户界面接口,靠近本地桌面应用程序。
  ajax不是一种技术,它更像是一种模式 - 徽标,并描述了一种有用的设计技术的方法。对于刚理解它的许多开发人员来说,它是一种新的感觉,但是实现AJAX的所有组件都存在多年。
  目前的热闹是因为2004年和2005年有一些基于Ajax的非常动态的WebUI,特别是Google的Gmail和Maps应用程序,共享网站Flickr与照片。这些UI充分利用了一些由某些开发人员称为“Web 2. 0”的后台通道,这导致了Ajax应用程序的快速上升。
  更好的购物车
  您可以使用Ajax来增强传统的Web应用程序,通过消除页面加载来使交互更平滑。要演示它,我将使用一个简单的动态更新的项目购物车。结合在线商店,此方法不能等待可点击的页面过载,让我们继续浏览并选择商品到购物车。
  虽然本文中的代码用于购物车示例,但可以在其他Ajax应用程序中使用显示的技术。购物车示例中使用的HTML代码如清单1.在整篇文章文章,我将引用这些HTML代码。
  ajax处理过程
  Ajax交互从名为XMLHTTPREQUEST的JavaScript对象开始。与名称一样,它允许客户端脚本执行HTTP请求,并将以XML格式解析服务器响应。 Ajax进程的第一步是创建XMLHTTPRequest实例。使用HTTP方法(GET或POST)处理请求并将目标URL设置为XMLHTTPREQUES对象。
  现在请记住AJAX如何在异步处理状态中首先?发送HTTP请求时,您不希望浏览器挂起并等待服务器的响应,并且您希望继续响应用户的界面,并且确实达到服务器响应。
  要完成它,您可以将回调函数注册到XMLHTTPRequest并异步发送XMLHTTPRequest请求。控件立即返回到浏览器。当服务器响应时,将调用回调函数。
  在Java Web服务器上,到达请求与任何其他HttpservletRequest相同。解析请求参数后,servlet执行XML中所需的应用程序逻辑,序列并将其写回httpservletresponse。
  返回客户端,现在将调用xmlhttperquest上注册的回调函数来处理服务器返回的XML文档。最后,通过更新用户界面来响应服务器来传输数据,使用JavaScript来操作页面的HTML DOM。图1是Ajax处理过程的时序图。
  
  图1:ajax处理过程
  现在,您应该具有ajax处理过程的高级视图。我将进入他们的每一步,以查看更多细节。如果找不到您的位置,请回顾并查看图1,添加 - 因为Ajax方法的异步本质不前进。 查看全部

  抓取ajax动态网页java(Ajax(AsynchronousJavaScriptandXML)是什么意思?购物车示例)
  ajax(异步JavaScript和XML)是一个编程技术,与Java技术,XML和JavaScript相结合,允许您构建基于Java技术的Web应用程序并打破页面过载的使用。
  ajax,异步JavaScript和XML,是使用客户端脚本和Web服务器的Web应用程序开发方法。通过这种方式,网页不必中断互动过程到REANFINE,您可以更新它。使用AJAX,您可以创建,直接,高度可用,更丰富,更紧密的Web用户界面接口,靠近本地桌面应用程序。
  ajax不是一种技术,它更像是一种模式 - 徽标,并描述了一种有用的设计技术的方法。对于刚理解它的许多开发人员来说,它是一种新的感觉,但是实现AJAX的所有组件都存在多年。
  目前的热闹是因为2004年和2005年有一些基于Ajax的非常动态的WebUI,特别是Google的Gmail和Maps应用程序,共享网站Flickr与照片。这些UI充分利用了一些由某些开发人员称为“Web 2. 0”的后台通道,这导致了Ajax应用程序的快速上升。
  更好的购物车
  您可以使用Ajax来增强传统的Web应用程序,通过消除页面加载来使交互更平滑。要演示它,我将使用一个简单的动态更新的项目购物车。结合在线商店,此方法不能等待可点击的页面过载,让我们继续浏览并选择商品到购物车。
  虽然本文中的代码用于购物车示例,但可以在其他Ajax应用程序中使用显示的技术。购物车示例中使用的HTML代码如清单1.在整篇文章文章,我将引用这些HTML代码。
  ajax处理过程
  Ajax交互从名为XMLHTTPREQUEST的JavaScript对象开始。与名称一样,它允许客户端脚本执行HTTP请求,并将以XML格式解析服务器响应。 Ajax进程的第一步是创建XMLHTTPRequest实例。使用HTTP方法(GET或POST)处理请求并将目标URL设置为XMLHTTPREQUES对象。
  现在请记住AJAX如何在异步处理状态中首先?发送HTTP请求时,您不希望浏览器挂起并等待服务器的响应,并且您希望继续响应用户的界面,并且确实达到服务器响应。
  要完成它,您可以将回调函数注册到XMLHTTPRequest并异步发送XMLHTTPRequest请求。控件立即返回到浏览器。当服务器响应时,将调用回调函数。
  在Java Web服务器上,到达请求与任何其他HttpservletRequest相同。解析请求参数后,servlet执行XML中所需的应用程序逻辑,序列并将其写回httpservletresponse。
  返回客户端,现在将调用xmlhttperquest上注册的回调函数来处理服务器返回的XML文档。最后,通过更新用户界面来响应服务器来传输数据,使用JavaScript来操作页面的HTML DOM。图1是Ajax处理过程的时序图。
  
  图1:ajax处理过程
  现在,您应该具有ajax处理过程的高级视图。我将进入他们的每一步,以查看更多细节。如果找不到您的位置,请回顾并查看图1,添加 - 因为Ajax方法的异步本质不前进。

官方客服QQ群

微信人工客服

QQ人工客服


线