js抓取网页内容

js抓取网页内容

js抓取网页内容(2.如何通过selenium-java爬取异步加载的数据方法。)

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

  js抓取网页内容(2.如何通过selenium-java爬取异步加载的数据方法。)
  在之前的系列文章中介绍了如何使用httpclient抓取页面html以及如何使用jsoup分析html源文件的内容得到我们想要的数据,但是有时候这两种方法都不能使用捕获我们想要的数据。所需数据,例如,请参见以下示例。
  1.需求场景:
  如果要抢到股票的最新价格,F12页信息如下:
  
  按照前面的方法,爬取的代码如下:
  /**
* @description: 爬取股票的最新股价
* @author: JAVA开发老菜鸟
* @date: 2021-10-16 21:47
*/
public class StockPriceSpider {
Logger logger = LoggerFactory.getLogger(this.getClass());
public static void main(String[] args) {
StockPriceSpider stockPriceSpider = new StockPriceSpider();
String html = stockPriceSpider.httpClientProcess();
stockPriceSpider.jsoupProcess(html);
}
private String httpClientProcess() {
String html = "";
String uri = "http://quote.eastmoney.com/sh600036.html";
//1.生成httpclient,相当于该打开一个浏览器
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
//2.创建get请求,相当于在浏览器地址栏输入 网址
HttpGet request = new HttpGet(uri);
try {
request.setHeader("user-agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36");
request.setHeader("accept", "application/json, text/javascript, */*; q=0.01");
// HttpHost proxy = new HttpHost("3.211.17.212", 80);
// RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
// request.setConfig(config);
//3.执行get请求,相当于在输入地址栏后敲回车键
response = httpClient.execute(request);
//4.判断响应状态为200,进行处理
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
//5.获取响应内容
HttpEntity httpEntity = response.getEntity();
html = EntityUtils.toString(httpEntity, "utf-8");
logger.info("访问{} 成功,返回页面数据{}", uri, html);
} else {
//如果返回状态不是200,比如404(页面不存在)等,根据情况做处理,这里略
logger.info("访问{},返回状态不是200", uri);
logger.info(EntityUtils.toString(response.getEntity(), "utf-8"));
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//6.关闭
HttpClientUtils.closeQuietly(response);
HttpClientUtils.closeQuietly(httpClient);
}
return html;
}
private void jsoupProcess(String html) {
Document document = Jsoup.parse(html);
Element price = document.getElementById("price9");
logger.info("股价为:>>> {}", price.text());
}
}
  运行结果:
  
  纳尼,股价是“-”?不可能的。
  无法爬取正确结果的原因是因为这个值是在网站上异步加载渲染的,所以无法正常获取。
  2.爬取异步加载数据的java方法
  如何爬取异步加载的数据?通常有两种方法:
  2.1 内置浏览器内核
  内置浏览器就是在爬虫程序中启动一个浏览器内核,让js渲染出来的页面和静态页面一样。常用的内核有
  这里我选择了 Selenium,它是一个模拟浏览器和自动化测试工具。它提供了一组 API 来与真正的浏览器内核交互。当然,爬虫也可以使用它。
  具体方法如下:
  
org.seleniumhq.selenium
selenium-java
3.141.59
  2.2 逆向分析
  反向解析的方法是通过F12找到Ajax异步数据获取的链接,直接调用链接得到json结果,然后直接解析json结果得到想要的数据。
  此方法的关键是找到 Ajax 链接。这个方法我没研究过,有兴趣可以百度下载。稍微在这里。
  3.结束语
  以上就是如何通过selenium-java爬取异步加载的数据。通过这个方法,我写了一个小工具:仓位市值通知系统,每天会根据自己的仓位配置自动计算账户总市值,并发送邮件通知到指定邮箱。
  使用的技术如下:
  相关代码已经上传到我的码云,有兴趣的可以看看。 查看全部

  js抓取网页内容(2.如何通过selenium-java爬取异步加载的数据方法。)
  在之前的系列文章中介绍了如何使用httpclient抓取页面html以及如何使用jsoup分析html源文件的内容得到我们想要的数据,但是有时候这两种方法都不能使用捕获我们想要的数据。所需数据,例如,请参见以下示例。
  1.需求场景:
  如果要抢到股票的最新价格,F12页信息如下:
  
  按照前面的方法,爬取的代码如下:
  /**
* @description: 爬取股票的最新股价
* @author: JAVA开发老菜鸟
* @date: 2021-10-16 21:47
*/
public class StockPriceSpider {
Logger logger = LoggerFactory.getLogger(this.getClass());
public static void main(String[] args) {
StockPriceSpider stockPriceSpider = new StockPriceSpider();
String html = stockPriceSpider.httpClientProcess();
stockPriceSpider.jsoupProcess(html);
}
private String httpClientProcess() {
String html = "";
String uri = "http://quote.eastmoney.com/sh600036.html";
//1.生成httpclient,相当于该打开一个浏览器
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
//2.创建get请求,相当于在浏览器地址栏输入 网址
HttpGet request = new HttpGet(uri);
try {
request.setHeader("user-agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36");
request.setHeader("accept", "application/json, text/javascript, */*; q=0.01");
// HttpHost proxy = new HttpHost("3.211.17.212", 80);
// RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
// request.setConfig(config);
//3.执行get请求,相当于在输入地址栏后敲回车键
response = httpClient.execute(request);
//4.判断响应状态为200,进行处理
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
//5.获取响应内容
HttpEntity httpEntity = response.getEntity();
html = EntityUtils.toString(httpEntity, "utf-8");
logger.info("访问{} 成功,返回页面数据{}", uri, html);
} else {
//如果返回状态不是200,比如404(页面不存在)等,根据情况做处理,这里略
logger.info("访问{},返回状态不是200", uri);
logger.info(EntityUtils.toString(response.getEntity(), "utf-8"));
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//6.关闭
HttpClientUtils.closeQuietly(response);
HttpClientUtils.closeQuietly(httpClient);
}
return html;
}
private void jsoupProcess(String html) {
Document document = Jsoup.parse(html);
Element price = document.getElementById("price9");
logger.info("股价为:>>> {}", price.text());
}
}
  运行结果:
  
  纳尼,股价是“-”?不可能的。
  无法爬取正确结果的原因是因为这个值是在网站上异步加载渲染的,所以无法正常获取。
  2.爬取异步加载数据的java方法
  如何爬取异步加载的数据?通常有两种方法:
  2.1 内置浏览器内核
  内置浏览器就是在爬虫程序中启动一个浏览器内核,让js渲染出来的页面和静态页面一样。常用的内核有
  这里我选择了 Selenium,它是一个模拟浏览器和自动化测试工具。它提供了一组 API 来与真正的浏览器内核交互。当然,爬虫也可以使用它。
  具体方法如下:
  
org.seleniumhq.selenium
selenium-java
3.141.59
  2.2 逆向分析
  反向解析的方法是通过F12找到Ajax异步数据获取的链接,直接调用链接得到json结果,然后直接解析json结果得到想要的数据。
  此方法的关键是找到 Ajax 链接。这个方法我没研究过,有兴趣可以百度下载。稍微在这里。
  3.结束语
  以上就是如何通过selenium-java爬取异步加载的数据。通过这个方法,我写了一个小工具:仓位市值通知系统,每天会根据自己的仓位配置自动计算账户总市值,并发送邮件通知到指定邮箱。
  使用的技术如下:
  相关代码已经上传到我的码云,有兴趣的可以看看。

js抓取网页内容(​​如何用正则表达式对数据进行数据提取和数据分类汇总)

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

  js抓取网页内容(​​如何用正则表达式对数据进行数据提取和数据分类汇总)
  ​​​​
  在很多行业中,需要及时对行业数据进行分类汇总,对行业数据进行分析,以便对公司未来的发展有很好的参考和横向比较。因此,在实际工作中,我们可能会遇到数据采集的概念。data采集的最终目的是获取数据,提取有用的数据用于数据抽取和数据分类。
  很多人刚开始了解数据时可能无法入手采集,尤其是新手,感觉很茫然,所以在这里分享一下我的经验,也希望和大家分享技术。如有不足之处,请指正。写这篇文章的目的,就是希望大家可以一起成长。我也相信,技术之间没有层次,只有互补和共享,才能让彼此更加成长。
  当网页数据采集时,我们往往要经过这些主要步骤:
  ①通过URL地址读取目标网页 ②获取网页源代码 ③通过网页源代码提取我们要提取的目标数据 ④对数据进行格式转换得到我们需要的数据。
  这是示意图,希望大家理解
  
  了解了基本流程后,我会用一个案例来具体实现如何提取我们需要的数据。对于数据提取,我们可以使用正则表达式来提取,或者httpclient+jsoup来提取。这里,我们暂时不解释httpclient+jsou提取。网页数据的实践,以后会专门针对httpclient+jsoup进行讲解。在这里,我们将首先解释如何使用正则表达式来提取数据。
  我在这里找到了一个网站:​​​.cn/userSite/publicQuote/quotes_list。​​我们要提取里面的数据。我们要提取的最终结果是型号、数量、报价、供应商,首先我们看到这个网站整页预览
  
  接下来我们看一下网页的源码结构:
  
  以上源码可以清晰的看到整个网页的源码结构,我们将提取整个网页数据。
  import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HTMLPageParser {
public static void main(String[] args) throws Exception {
//目的网页URL地址
getURLInfo("http://www.ic.net.cn/userSite/ ... ot%3B,"utf-8");
}
public static List getURLInfo(String urlInfo,String charset) throws Exception {
//读取目的网页URL地址,获取网页源码
URL url = new URL(urlInfo);
HttpURLConnection httpUrl = (HttpURLConnection)url.openConnection();
InputStream is = httpUrl.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
//这里是对链接进行处理
line = line.replaceAll("]*>", "");
//这里是对样式进行处理
line = line.replaceAll("]*>", "");
sb.append(line);
}
is.close();
br.close();
//获得网页源码
return getDataStructure(sb.toString().trim());
}
static Pattern proInfo
= Pattern.compile("(.*?)\\s*(.*?)\\s*(.*?)\\s*(.*?)\\s*(.*?)", Pattern.DOTALL);
private static List getDataStructure(String str) {
//运用正则表达式对获取的网页源码进行数据匹配,提取我们所要的数据,在以后的过程中,我们可以采用httpclient+jsoup,
//现在暂时运用正则表达式对数据进行抽取提取
String[] info = str.split("");
List list = new ArrayList();
for (String s : info) {
Matcher m = proInfo.matcher(s);
Product p = null;
if (m.find()) {
p = new Product();
//设置产品型号
String[] ss = m.group(1).trim().replace(" ", "").split(">");
p.setProStyle(ss[1]);
//设置产品数量
p.setProAmount(m.group(2).trim().replace(" ", ""));
//设置产品报价
p.setProPrice(m.group(4).trim().replace(" ", ""));
//设置产品供应商
p.setProSupplier(m.group(5).trim().replace(" ", ""));
list.add(p);
}
}
//这里对集合里面不是我们要提取的数据进行移除
list.remove(0);
for (int i = 0; i < list.size(); i++) {
System.out.println("产品型号:"+list.get(i).getProStyle()+",产品数量:"+list.get(i).getProAmount()
+",产品报价:"+list.get(i).getProPrice()+",产品供应商:"+list.get(i).getProSupplier());
}
return list;
}
}
class Product {
private String proStyle;//产品型号
private String proAmount;//产品数量
private String proPrice;//产品报价
private String proSupplier;//产品供应商
public String getProStyle() {
return proStyle;
}
public void setProStyle(String proStyle) {
this.proStyle = proStyle;
}
public String getProSupplier() {
return proSupplier;
}
public void setProSupplier(String proSupplier) {
this.proSupplier = proSupplier;
}

public String getProAmount() {
return proAmount;
}
public void setProAmount(String proAmount) {
this.proAmount = proAmount;
}
public String getProPrice() {
return proPrice;
}
public void setProPrice(String proPrice) {
this.proPrice = proPrice;
}
public Product() {

}
@Override
public String toString() {
return "Product [proAmount=" + proAmount + ", proPrice=" + proPrice
+ ", proStyle=" + proStyle + ", proSupplier=" + proSupplier
+ "]";
}

}
  好了,运行上面的程序,我们得到下面的数据,也就是我们最终想要得到的数据
  
  获取数据成功,这就是我们要获取的最终数据结果。最后想说,这里的这个网页比较简单,可以在网页的源码中看到源数据,而这个方法就是在get方法中提交数据。,当真的是采集时,有些网页结构比较复杂,源代码中可能没有我们要提取的数据。关于这一点的解决方案稍后会为大家介绍。另外,当我在采集页面时,我只是采集当前页面的数据,它也有分页数据。这里我就不解释了,只是一个提示,我们可以使用多线程对所有页面的当前数据执行采集,通过一个线程采集当前页面数据和一个翻页动作,所有数据都可以采集完成。
  我们匹配的数据可能在项目的实际开发中,需要我们将提取的数据存储起来,方便我们接下来的数据查询操作。 查看全部

  js抓取网页内容(​​如何用正则表达式对数据进行数据提取和数据分类汇总)
  ​​​​
  在很多行业中,需要及时对行业数据进行分类汇总,对行业数据进行分析,以便对公司未来的发展有很好的参考和横向比较。因此,在实际工作中,我们可能会遇到数据采集的概念。data采集的最终目的是获取数据,提取有用的数据用于数据抽取和数据分类。
  很多人刚开始了解数据时可能无法入手采集,尤其是新手,感觉很茫然,所以在这里分享一下我的经验,也希望和大家分享技术。如有不足之处,请指正。写这篇文章的目的,就是希望大家可以一起成长。我也相信,技术之间没有层次,只有互补和共享,才能让彼此更加成长。
  当网页数据采集时,我们往往要经过这些主要步骤:
  ①通过URL地址读取目标网页 ②获取网页源代码 ③通过网页源代码提取我们要提取的目标数据 ④对数据进行格式转换得到我们需要的数据。
  这是示意图,希望大家理解
  
  了解了基本流程后,我会用一个案例来具体实现如何提取我们需要的数据。对于数据提取,我们可以使用正则表达式来提取,或者httpclient+jsoup来提取。这里,我们暂时不解释httpclient+jsou提取。网页数据的实践,以后会专门针对httpclient+jsoup进行讲解。在这里,我们将首先解释如何使用正则表达式来提取数据。
  我在这里找到了一个网站:​​​.cn/userSite/publicQuote/quotes_list。​​我们要提取里面的数据。我们要提取的最终结果是型号、数量、报价、供应商,首先我们看到这个网站整页预览
  
  接下来我们看一下网页的源码结构:
  
  以上源码可以清晰的看到整个网页的源码结构,我们将提取整个网页数据。
  import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HTMLPageParser {
public static void main(String[] args) throws Exception {
//目的网页URL地址
getURLInfo("http://www.ic.net.cn/userSite/ ... ot%3B,"utf-8");
}
public static List getURLInfo(String urlInfo,String charset) throws Exception {
//读取目的网页URL地址,获取网页源码
URL url = new URL(urlInfo);
HttpURLConnection httpUrl = (HttpURLConnection)url.openConnection();
InputStream is = httpUrl.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
//这里是对链接进行处理
line = line.replaceAll("]*>", "");
//这里是对样式进行处理
line = line.replaceAll("]*>", "");
sb.append(line);
}
is.close();
br.close();
//获得网页源码
return getDataStructure(sb.toString().trim());
}
static Pattern proInfo
= Pattern.compile("(.*?)\\s*(.*?)\\s*(.*?)\\s*(.*?)\\s*(.*?)", Pattern.DOTALL);
private static List getDataStructure(String str) {
//运用正则表达式对获取的网页源码进行数据匹配,提取我们所要的数据,在以后的过程中,我们可以采用httpclient+jsoup,
//现在暂时运用正则表达式对数据进行抽取提取
String[] info = str.split("");
List list = new ArrayList();
for (String s : info) {
Matcher m = proInfo.matcher(s);
Product p = null;
if (m.find()) {
p = new Product();
//设置产品型号
String[] ss = m.group(1).trim().replace(" ", "").split(">");
p.setProStyle(ss[1]);
//设置产品数量
p.setProAmount(m.group(2).trim().replace(" ", ""));
//设置产品报价
p.setProPrice(m.group(4).trim().replace(" ", ""));
//设置产品供应商
p.setProSupplier(m.group(5).trim().replace(" ", ""));
list.add(p);
}
}
//这里对集合里面不是我们要提取的数据进行移除
list.remove(0);
for (int i = 0; i < list.size(); i++) {
System.out.println("产品型号:"+list.get(i).getProStyle()+",产品数量:"+list.get(i).getProAmount()
+",产品报价:"+list.get(i).getProPrice()+",产品供应商:"+list.get(i).getProSupplier());
}
return list;
}
}
class Product {
private String proStyle;//产品型号
private String proAmount;//产品数量
private String proPrice;//产品报价
private String proSupplier;//产品供应商
public String getProStyle() {
return proStyle;
}
public void setProStyle(String proStyle) {
this.proStyle = proStyle;
}
public String getProSupplier() {
return proSupplier;
}
public void setProSupplier(String proSupplier) {
this.proSupplier = proSupplier;
}

public String getProAmount() {
return proAmount;
}
public void setProAmount(String proAmount) {
this.proAmount = proAmount;
}
public String getProPrice() {
return proPrice;
}
public void setProPrice(String proPrice) {
this.proPrice = proPrice;
}
public Product() {

}
@Override
public String toString() {
return "Product [proAmount=" + proAmount + ", proPrice=" + proPrice
+ ", proStyle=" + proStyle + ", proSupplier=" + proSupplier
+ "]";
}

}
  好了,运行上面的程序,我们得到下面的数据,也就是我们最终想要得到的数据
  
  获取数据成功,这就是我们要获取的最终数据结果。最后想说,这里的这个网页比较简单,可以在网页的源码中看到源数据,而这个方法就是在get方法中提交数据。,当真的是采集时,有些网页结构比较复杂,源代码中可能没有我们要提取的数据。关于这一点的解决方案稍后会为大家介绍。另外,当我在采集页面时,我只是采集当前页面的数据,它也有分页数据。这里我就不解释了,只是一个提示,我们可以使用多线程对所有页面的当前数据执行采集,通过一个线程采集当前页面数据和一个翻页动作,所有数据都可以采集完成。
  我们匹配的数据可能在项目的实际开发中,需要我们将提取的数据存储起来,方便我们接下来的数据查询操作。

js抓取网页内容(浏览器中有没有,监听到页面的生命周期,如何解决?)

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

  js抓取网页内容(浏览器中有没有,监听到页面的生命周期,如何解决?)
  这篇文章的速度只需要一分钟
  在做业务开发的时候,遇到了以下问题:
  在一些浏览器中,比如Safari,当从下一页返回到上一页时,页面不刷新,而是保持页面的最后状态。这样如果用户不知道已经提交了,就有可能再次提交,导致用户体验差等。
  那么如何解决这个问题呢?很容易想到,如果我们能像开发原生应用一样监控页面的生命周期,那么这个问题自然就迎刃而解了。
  那么浏览器中的页面有生命周期方法吗?其实没有,但是有类似功能的事件可以帮助我们解决问题
  浏览器页面事件
  浏览器页面事件如下:
  这些事件描述如下:
  负载
  此事件在页面首次加载时触发,而不是在从浏览器缓存中读取页面时触发
  window.onload = (e) => {
alert(&#39;page onload&#39;)
}
  onpageshow
  每次页面加载时都会触发这个事件,也就是说,即使页面是从浏览器读取的,这个事件也会触发
  机智的小伙伴们一定想到了,我们可以通过这个方法来判断返回的页面是否是缓存中直接读取的页面
  但是还有一个问题。虽然每次都会触发onpageshow,但是如何判断是否从缓存中读取呢?请看下面的代码:
  window.onpageshow = (e) => {
if (e.persisted) {
alert(&#39;page read from cache&#39;)
window.location.reload()
}
  上面代码中,是否从缓存中读取是由事件对象的persisted属性来判断的,它会返回true或者false
  但并不是所有的浏览器都需要添加这个方法。现在很多浏览器返回后会自动刷新,所以我们只需要对那些不会刷新的浏览器使用这个方法即可。
  onpagehide 和 onunload
  离开页面时会触发这两个事件。不同的是,触发onpagehide后页面仍然可以缓存,而触发onunload后页面不能缓存。
  如果同时使用这两种方法,你会发现在onunload之前会触发onpagehide,并且两个事件都不能使用alert
  卸载前
  页面关闭前触发的事件是在上述两个离开页面事件之前触发的,也不能使用alert
  浏览器页面事件的触发顺序
  onload -> onpageshow -> onbeforeunload -> onpagehide -> onunload
  一分钟结束。小伙伴们下周见!:) 查看全部

  js抓取网页内容(浏览器中有没有,监听到页面的生命周期,如何解决?)
  这篇文章的速度只需要一分钟
  在做业务开发的时候,遇到了以下问题:
  在一些浏览器中,比如Safari,当从下一页返回到上一页时,页面不刷新,而是保持页面的最后状态。这样如果用户不知道已经提交了,就有可能再次提交,导致用户体验差等。
  那么如何解决这个问题呢?很容易想到,如果我们能像开发原生应用一样监控页面的生命周期,那么这个问题自然就迎刃而解了。
  那么浏览器中的页面有生命周期方法吗?其实没有,但是有类似功能的事件可以帮助我们解决问题
  浏览器页面事件
  浏览器页面事件如下:
  这些事件描述如下:
  负载
  此事件在页面首次加载时触发,而不是在从浏览器缓存中读取页面时触发
  window.onload = (e) => {
alert(&#39;page onload&#39;)
}
  onpageshow
  每次页面加载时都会触发这个事件,也就是说,即使页面是从浏览器读取的,这个事件也会触发
  机智的小伙伴们一定想到了,我们可以通过这个方法来判断返回的页面是否是缓存中直接读取的页面
  但是还有一个问题。虽然每次都会触发onpageshow,但是如何判断是否从缓存中读取呢?请看下面的代码:
  window.onpageshow = (e) => {
if (e.persisted) {
alert(&#39;page read from cache&#39;)
window.location.reload()
}
  上面代码中,是否从缓存中读取是由事件对象的persisted属性来判断的,它会返回true或者false
  但并不是所有的浏览器都需要添加这个方法。现在很多浏览器返回后会自动刷新,所以我们只需要对那些不会刷新的浏览器使用这个方法即可。
  onpagehide 和 onunload
  离开页面时会触发这两个事件。不同的是,触发onpagehide后页面仍然可以缓存,而触发onunload后页面不能缓存。
  如果同时使用这两种方法,你会发现在onunload之前会触发onpagehide,并且两个事件都不能使用alert
  卸载前
  页面关闭前触发的事件是在上述两个离开页面事件之前触发的,也不能使用alert
  浏览器页面事件的触发顺序
  onload -> onpageshow -> onbeforeunload -> onpagehide -> onunload
  一分钟结束。小伙伴们下周见!:)

js抓取网页内容(我正在尝试从当用户向下滚动到底部时动态生成内容的页面中抓取链接)

网站优化优采云 发表了文章 • 0 个评论 • 43 次浏览 • 2022-03-27 11:18 • 来自相关话题

  js抓取网页内容(我正在尝试从当用户向下滚动到底部时动态生成内容的页面中抓取链接)
  我试图从当用户向下滚动到底部(无限滚动)时动态生成内容的页面中抓取链接。我已经尝试将 Phantomjs 用于不同的事情,但我无法采集第一页之外的链接。假设在底部加载内容的元素具有类 .has-more-items。它在滚动加载最终内容之前可用,然后在 DOM 中变得不可用(显示:无)。这是我尝试过的 - 之后立即将 viewportSize 设置为更大的高度 var page = require('webpage').create();page.viewportSize = { width: 1600, height: 10000, };page.scrollPosition = {顶部:10000,左侧:0 } 在内部使用 page.open 但没有效果,例如 - 也尝试将其放入 page.evaluate 函数中,但这会给出参考错误:未找到可变页面尝试内部使用 jQuery 和 JS 代码 page.evaluate, page.open 但无济于事 - $("html, body").animate({ scrollTop: $(document).height() }, 10, function () { //console.log ('检查执行'); }); 照原样,也在 document.ready 中。同样对于 JS 代码 - 在 window.onload 中,我已经被它击中了两天,但找不到方法。任何帮助或提示将不胜感激。更新我在#!topic/phantomjs/8LrWRW8ZrA0 找到了一段有用的代码,其中是我想要访问的元素的类。has-more-items,最初位于页面底部,当我们滚动时它会向下移动down ,直到所有数据都加载完毕,然后变得不可用。然而,当我测试它时,很明显,它在没有向下滚动的情况下进入了无限循环(我渲染图片以检查)。我也试过 page.scrollPosition = { top: page. 查看全部

  js抓取网页内容(我正在尝试从当用户向下滚动到底部时动态生成内容的页面中抓取链接)
  我试图从当用户向下滚动到底部(无限滚动)时动态生成内容的页面中抓取链接。我已经尝试将 Phantomjs 用于不同的事情,但我无法采集第一页之外的链接。假设在底部加载内容的元素具有类 .has-more-items。它在滚动加载最终内容之前可用,然后在 DOM 中变得不可用(显示:无)。这是我尝试过的 - 之后立即将 viewportSize 设置为更大的高度 var page = require('webpage').create();page.viewportSize = { width: 1600, height: 10000, };page.scrollPosition = {顶部:10000,左侧:0 } 在内部使用 page.open 但没有效果,例如 - 也尝试将其放入 page.evaluate 函数中,但这会给出参考错误:未找到可变页面尝试内部使用 jQuery 和 JS 代码 page.evaluate, page.open 但无济于事 - $("html, body").animate({ scrollTop: $(document).height() }, 10, function () { //console.log ('检查执行'); }); 照原样,也在 document.ready 中。同样对于 JS 代码 - 在 window.onload 中,我已经被它击中了两天,但找不到方法。任何帮助或提示将不胜感激。更新我在#!topic/phantomjs/8LrWRW8ZrA0 找到了一段有用的代码,其中是我想要访问的元素的类。has-more-items,最初位于页面底部,当我们滚动时它会向下移动down ,直到所有数据都加载完毕,然后变得不可用。然而,当我测试它时,很明显,它在没有向下滚动的情况下进入了无限循环(我渲染图片以检查)。我也试过 page.scrollPosition = { top: page.

js抓取网页内容(一个页面通过script加载请求服务端进行统计再输出js进行跳转)

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

  js抓取网页内容(一个页面通过script加载请求服务端进行统计再输出js进行跳转)
  在这期间,我遇到了一个非常崩溃的问题。一个页面加载脚本请求服务器统计,然后输出js进行跳转。分别分为两步进行统计。
  打开页面,通过脚本向远程服务器请求统计,并通过js输出最终重定向到页面的地址。页面获取跳转位置后,通过位置跳转
  很简单的事情,但是百度手机搜索有个大问题:
  通过百度搜索引擎关键词搜索网页后,第一个请求没有发出,很奇怪。
  研究了半天,发现了这个百度手机的自动转码问题
  类似于下图的搜索结果,网页已经被JS跳转,导致被百度缓存。下次点击不会进入网站页面,而是直接跳转到第二步的目标页面,导致第一次点击。步数统计失败
  
  // 只是类似这样的链接,下面的链接可能已经失效了
$url = 'http://m.baidu.com/from=0/bd_page_type=1/ssid=0/uid=0/pu=usm%400%2Csz%401320_1001%2Cta%40iphone_2_4.3_3_534/baiduid=637EBC50744C1291B831A26D208F44D8/w=0_10_%E7%A6%81%E4%B9%A6%E5%A4%A7%E5%85%A8%E9%9B%86/t=iphone/l=3/tc?ref=www_iphone&lid=13212517736186082851&order=1&vit=osres&tj=www_normal_1_0_10_title&m=8&srd=1&cltj=cloud_title&dict=32&title=%E5%8D%81%E5%A4%A7%E7%A6%81%E4%B9%A6%E4%B9%8B%E5%B0%91%E5%B9%B4%E9%98%BF%E5%AE%BE%E7%9B%AE%E5%BD%95%2C%E5%8D%81%E5%A4%A7%E7%A6%81%E4%B9%A6%E4%B9%8B%E5%B0%91%E5%B9%B4%E9%98%BF%E5%AE%BE%E6%9C%80%E6%96%B0%E7%AB%A0%E8%8A%82...&sec=8191&di=e644ac04d0707d79&bdenc=1&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_zRPQGjm95qshbWxBcNiV8KhVinHVZy';
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
$content = curl_exec($curl);
echo htmlentities($content);
curl_close($curl);
  通过CURL抓取内容,设置为不跟随跳转,获取第一个请求的输出如下:
  
  看图上三个红色箭头,这是百度自己转码输出的js跳转和meta刷新。他实际上抓住了我跳到的地址。真的很厉害,不知道百度是怎么做到的。实现了第一步的请求,刚放上去的时候只请求了一两次,然后第二天发现一整天都没有请求,说明百度直接跳到搜索结果页,但一点也不。进入网页,缓存跳转地址。
  如果你把跳转放在复杂的if判断中或者加上几秒的延迟,我不知道会发生什么。如果是通过分析代码得到的,页面上会有很多js。如果条件在另一个 js 中是动态的,他如何捕获输出?如果不是为了分析js,我跳的时候百度怎么知道?他不可能监视几分钟。
  对于站长,可以添加百度自己的协议或者手机适配文件拒绝转码
  但是网站不是我的,我无权操作页面的其他部分。我没有解决办法。百度的转码太傻了。
  目前没有条件再次测试,很郁闷。. 不过他还是会不定时更新,去掉js跳转后会自动恢复。 查看全部

  js抓取网页内容(一个页面通过script加载请求服务端进行统计再输出js进行跳转)
  在这期间,我遇到了一个非常崩溃的问题。一个页面加载脚本请求服务器统计,然后输出js进行跳转。分别分为两步进行统计。
  打开页面,通过脚本向远程服务器请求统计,并通过js输出最终重定向到页面的地址。页面获取跳转位置后,通过位置跳转
  很简单的事情,但是百度手机搜索有个大问题:
  通过百度搜索引擎关键词搜索网页后,第一个请求没有发出,很奇怪。
  研究了半天,发现了这个百度手机的自动转码问题
  类似于下图的搜索结果,网页已经被JS跳转,导致被百度缓存。下次点击不会进入网站页面,而是直接跳转到第二步的目标页面,导致第一次点击。步数统计失败
  
  // 只是类似这样的链接,下面的链接可能已经失效了
$url = 'http://m.baidu.com/from=0/bd_page_type=1/ssid=0/uid=0/pu=usm%400%2Csz%401320_1001%2Cta%40iphone_2_4.3_3_534/baiduid=637EBC50744C1291B831A26D208F44D8/w=0_10_%E7%A6%81%E4%B9%A6%E5%A4%A7%E5%85%A8%E9%9B%86/t=iphone/l=3/tc?ref=www_iphone&lid=13212517736186082851&order=1&vit=osres&tj=www_normal_1_0_10_title&m=8&srd=1&cltj=cloud_title&dict=32&title=%E5%8D%81%E5%A4%A7%E7%A6%81%E4%B9%A6%E4%B9%8B%E5%B0%91%E5%B9%B4%E9%98%BF%E5%AE%BE%E7%9B%AE%E5%BD%95%2C%E5%8D%81%E5%A4%A7%E7%A6%81%E4%B9%A6%E4%B9%8B%E5%B0%91%E5%B9%B4%E9%98%BF%E5%AE%BE%E6%9C%80%E6%96%B0%E7%AB%A0%E8%8A%82...&sec=8191&di=e644ac04d0707d79&bdenc=1&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_zRPQGjm95qshbWxBcNiV8KhVinHVZy';
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
$content = curl_exec($curl);
echo htmlentities($content);
curl_close($curl);
  通过CURL抓取内容,设置为不跟随跳转,获取第一个请求的输出如下:
  
  看图上三个红色箭头,这是百度自己转码输出的js跳转和meta刷新。他实际上抓住了我跳到的地址。真的很厉害,不知道百度是怎么做到的。实现了第一步的请求,刚放上去的时候只请求了一两次,然后第二天发现一整天都没有请求,说明百度直接跳到搜索结果页,但一点也不。进入网页,缓存跳转地址。
  如果你把跳转放在复杂的if判断中或者加上几秒的延迟,我不知道会发生什么。如果是通过分析代码得到的,页面上会有很多js。如果条件在另一个 js 中是动态的,他如何捕获输出?如果不是为了分析js,我跳的时候百度怎么知道?他不可能监视几分钟。
  对于站长,可以添加百度自己的协议或者手机适配文件拒绝转码
  但是网站不是我的,我无权操作页面的其他部分。我没有解决办法。百度的转码太傻了。
  目前没有条件再次测试,很郁闷。. 不过他还是会不定时更新,去掉js跳转后会自动恢复。

js抓取网页内容(百度科技园行动度基因沙龙之SEO、网站域名、百度页面)

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

  js抓取网页内容(百度科技园行动度基因沙龙之SEO、网站域名、百度页面)
  上个月,百度站长平台在百度科技园举办了变蝶行动基因沙龙。会上就网站SEO、网站域名、百度爬虫页面、APPLink等进行了交流讨论。以下为活动问答:包括JS代码收录、URL链接长度、海外域名对排名的影响等。问答详情如下:
  一、SEO 问题解答
  Q:使用百度统计进行广告跟踪时,配置的URL链接会很长。这种跟踪会影响搜索引擎优化吗?
  A:这种有多个URL版本的统计代码肯定会对SEO产生影响。对于这种情况有两个建议,一个是使用两组url进行真正的蜘蛛抓取和用户展示。另一种选择是停止使用百度统计,你可以使用谷歌中的跟踪,他可以使用#链接,事件跟踪,并参考美团网。所有链接加上事件跟踪。如果是生成的,也是用#号生成的,不加额外的参数。
  Q:如果一个页面一开始不符合百度的SEO标准,后来改成符合标准,百度需要多长时间才能提供好的结果?
  A:不同的站点可能会贡献不同的流量。因此,Spider 爬行的侧重点不同。有些站可能会发现更多新链接,有些站可能会查看旧链接。建议推到百度上,像首页一样抓取一般是没有问题的。
  Q:推送审核需要多长时间,一周还是半个月?
  A:如果说推送符合抓取标准,可以立即抓取。
  问:网站有两种 URL,旧的和新的。更换大约需要两年时间。现在旧 URL 将跳转到新 URL。由于服务器问题,网络中断了半个小时。搜索 关键词 后,旧的 url 出现了。现在基本上所有方法都无法恢复。在这种情况下我们应该怎么做?
  A:使用修改工具重新提交,保证修改成功,不会有问题。如有问题,截图并报告给工程师排查。
  Q:由于网站使用的是海外域名(暂时无法更改),有什么办法可以提高搜索量或爬取量?
  A:百度搜索引擎都是在中国备案的,最好使用国内的服务器和域名。
  Q:有些网站注册使用了很多域名,很多域名并不是供用户搜索的。现在这些域名都被注销了,但是还是可以找到的。我关了一次,但是没有用。我不知道如何处理这个?
  A:如果不需要那些站?你可以把它们关掉。短时间关闭新域名可能会为用户调用旧域名。当这个域名被关闭时,我们不会为用户进行长期调用。这些东西也不会被发现。
  Q:网站是母婴类网站,PC端搜索流量很差。想知道有没有办法?
  A:与医疗、养生、保健、母婴等问题类似,百度对搜索结果的展示非常谨慎。百度只对优质的网站开放他们的展示可能性,网站很可能很长时间都得不到流量。如果网站在SEO方面没有大问题,可以检查一下内容是否在争抢一些热门词。建议整个网站的权重和流量达到一定规模后再做热词。如果一开始就这样做关键词,当网站名声不是很高的时候,就不会有流量了。在这种情况下,网站 可能会更好地找到他们自己的区分和相关词之一。
  问:网站 从事教育行业。现在通过官网的认证是安全或权威的认证。认证后会有潜在的特殊待遇或无所谓。
  A:比如认证方面,你是真的,还有一个是假的。从用户的认知来看,你就是官网。
  问:关于数据化、软件和PDF和Word显示的问题,包括哪些类型和多少资源?应该和文章的内容一起发布,还是PDF和文章一样?也有矛盾。产品及操作希望用户下载后直接使用,不会对PDF、WORD产生一些压缩或工具处理。有些用户会被引导到 Word,无论他们是无意还是无意。我该怎么办?
  A:百度搜索栏现在默认称为网页搜索。顾名思义,我们向用户展示了一个网页。后面的库还有一种文件格式。搜索结果都是供用户下载使用的,他们可以去学习和展示图书馆的内容。
  Q:有没有渠道告诉搜索引擎我们的页面内容发生了变化,我们通常如何处理?一个老页面已经收录,排序了,过了一段时间他发起了新资源的添加和更改?
  A:目前还没有这样的渠道。首先,Spider 会检查一些东西。他发现网站经常出现在这种情况下,他的相关检查流量会增加。如果你担心,你应该把他放在站点地图中。
  Q:网站原本只是一个主页,一个APP下载。我们现在正在发布内容。过去,这些内容无法被抓取。现在,我们是否需要提交修订以将其发布到目录或子域中?
  A:这个是放在域名下的,一个子目录用来放分类的东西,没有修改。改首页,改版就没有其他问题了。使用主动推送工具的效果还是很明显的。如果内容质量非常好,您可以使用所有配额。
  Q:自动推送份额多久调整一次?因为我觉得你的份额对于我们几千万或几百万的海量数据来说太小了。
  A:我们也很关心一个网站有没有这种爆发力,突然增加这么多,我们觉得很不正常。你要循序渐进,不要又短又快,一夜之间吃成胖子。第二,你有这么多优秀的数据,你可以关注百度的另一个平台,你就变成了一个API,让别人使用你的数据。其他人为您的数据使用付费,您可以注意这一点。
  Q:URL的绝对路径和相对路径是否会受到超链接的影响?修改后我们的页面有翻页,翻页链接是12345,上面有标签。每次抓到12345都抓不到。模拟抓,感觉抓不到。Spider会抓取页面上的A标签吗?
  A:影响不大,能正常访问就可以了。不管是绝对路径还是相对路径,只要地址为Spider或者用户畅通无阻,并且页面渲染时地址完整,这条路径就可以顺利爬取。
  对于not收录的问题,可以参考其他的点,比如页面本身没有被访问或者目录级别比较高。页面首页推送的链接会被百度一层一层抓到。如果路径正常,会从首页爬取Spider路径。
  首先要做的是查看不是收录的链接日志是否已经被捕获。如果它被捕获而不是 收录,则可能是页面本身的问题。你也可以看一个周期,因为我们用一天。二是看日志中是否有长尾,是否隐藏或没有有效抓取或建关时推荐。如果你能看到日志,你可以看看日志来分析它。
  可以调整首页的变化,提出建议,做个测试看看是链接问题还是蜘蛛没有抓到的问题。还有push等方法可以解决,从而判断不收录是什么原因。学院有一个解决许多问题的文件,类似于流程图。当这个戒指出现时,为什么?如果够长,可以看看下面的树枝。
  Q:站点之前,所有的框架都是通过JS来展示的。后来百度没有收录,进行了PHP改版。外观是一样的。现在感觉这个PHP不是很规范。什么是百度非标收录?
  A:酒店行业很多内容不是实时加载的,而是通过JS慢慢获取页面上的内容。如果搜索引擎捕捉到它,那就是导航,这就是问题所在。以前有很多空白页收录,质量很差。关于 Pattern 认为质量低的模式,内容可能是一样的,所以考虑换个目录。
  二、APPLINK问题解答
  Q:现在网站的APP已经准备好了,加入APPLINK会不会有什么大的变化?
  A:H5网站和APP有对应关系吗?比如这里是100条H5站的内容,有100条APP的内容,应该是匹配的。关键是把网站放在行首,一定要调整好。
  Q:目前APP引流是Android和IOS,但有一小部分是Windows Phone。这个APP需要多长时间?
  A:分两点,我们来看看诺基亚的Windows平台战略。如果我们看到他的一些动作,我们一定会注意的。因为其实我们早期有一个关于APPLINK接入协议的协议。我们可以有WindowsPhone调用的机制。用户点击了一个结果,如果点击了结果,我们那里就有一个Android IE,它可以接受IE并将信息发回给用户。只要在前端实现一些信息,就可以做好。劳动量似乎不是很大,是可以实现的。除了WindowsPhone和手表,毕竟还可以调APP,大家可以看看。
  Q:APP和网页版,很多APP都嵌入在H5网页中,里面只是一个外壳。百度做的AppLink,他点击后,从百度APP弹到糯米APP,然后弹走。他用百度搜索了很多数据。百度用户可以点击下一个网站。如果你把他推到糯米,我们后面的人就没有机会了。
  A:其实APPLINK不是技术壁垒的问题,是努力的问题。对于大型网站,您可以自己做。对于APPLINK,未来可能会有各方面的调整。对于小站来说,如果小站连接起来,目前就有这个优势。因为小站访问也可以跳转到小站。
  Q:加入APPLINK后,如果小站数据不够,会一下子弹出来吗?
  A:当你回到你的站,至少进入你自己的生态。事实上,从搜索的角度来看,我们的目标是满足用户的需求。如果我们引导到网站,如果网站不能满足需求,用户自然会被转移。将用户引向你是网站满足用户需求的动力。我认为应该是这样的。
  Q:如果整个页面有APPLINK,会有一个分发按钮。分配按钮的条件是什么?
  A:没有条件,你把APP包给我们,我们给你分发。
  Q:目前除了你的团队之外,还有几个百度内容的手机助手。有什么区别吗?
  A:这是一个早期的尝试。我们都知道移动端和PC端已经合并了。作为一个整体,我们输出了一组解决方案。可能上半年我们把这件事推的很紧。当时我们也很困惑。那个时候整个生态合并之后,现在我们整体的输出是由APPLINK来做比较合理。移动助手不是搜索结果。输出可能在不同的产品线中,APPLINK 出现在搜索结果中。
  Q:加入APPLINK对移动站平台有影响吗?
  答:还没有。但他会有一个正常的点击。
  Q:Android生态最麻烦的就是有时候不能调整。这种问题不调整,会不会指导下载操作?
  A:一般有两种情况是不能调整的。一个是安装包,因为安卓或者IOS包还有一个版本问题。因为网上提交的版本是用户没有更新新版本,或者有可能出现用户安装了新版本,但又删除了,有时无法调整的情况。在这种情况下,将访问 H5 站。现在有监控系统。如果我们不能去H5站,我们会发现搜索流量异常,我们会修复它。最快的情况是处理问题反馈。 查看全部

  js抓取网页内容(百度科技园行动度基因沙龙之SEO、网站域名、百度页面)
  上个月,百度站长平台在百度科技园举办了变蝶行动基因沙龙。会上就网站SEO、网站域名、百度爬虫页面、APPLink等进行了交流讨论。以下为活动问答:包括JS代码收录、URL链接长度、海外域名对排名的影响等。问答详情如下:
  一、SEO 问题解答
  Q:使用百度统计进行广告跟踪时,配置的URL链接会很长。这种跟踪会影响搜索引擎优化吗?
  A:这种有多个URL版本的统计代码肯定会对SEO产生影响。对于这种情况有两个建议,一个是使用两组url进行真正的蜘蛛抓取和用户展示。另一种选择是停止使用百度统计,你可以使用谷歌中的跟踪,他可以使用#链接,事件跟踪,并参考美团网。所有链接加上事件跟踪。如果是生成的,也是用#号生成的,不加额外的参数。
  Q:如果一个页面一开始不符合百度的SEO标准,后来改成符合标准,百度需要多长时间才能提供好的结果?
  A:不同的站点可能会贡献不同的流量。因此,Spider 爬行的侧重点不同。有些站可能会发现更多新链接,有些站可能会查看旧链接。建议推到百度上,像首页一样抓取一般是没有问题的。
  Q:推送审核需要多长时间,一周还是半个月?
  A:如果说推送符合抓取标准,可以立即抓取。
  问:网站有两种 URL,旧的和新的。更换大约需要两年时间。现在旧 URL 将跳转到新 URL。由于服务器问题,网络中断了半个小时。搜索 关键词 后,旧的 url 出现了。现在基本上所有方法都无法恢复。在这种情况下我们应该怎么做?
  A:使用修改工具重新提交,保证修改成功,不会有问题。如有问题,截图并报告给工程师排查。
  Q:由于网站使用的是海外域名(暂时无法更改),有什么办法可以提高搜索量或爬取量?
  A:百度搜索引擎都是在中国备案的,最好使用国内的服务器和域名。
  Q:有些网站注册使用了很多域名,很多域名并不是供用户搜索的。现在这些域名都被注销了,但是还是可以找到的。我关了一次,但是没有用。我不知道如何处理这个?
  A:如果不需要那些站?你可以把它们关掉。短时间关闭新域名可能会为用户调用旧域名。当这个域名被关闭时,我们不会为用户进行长期调用。这些东西也不会被发现。
  Q:网站是母婴类网站,PC端搜索流量很差。想知道有没有办法?
  A:与医疗、养生、保健、母婴等问题类似,百度对搜索结果的展示非常谨慎。百度只对优质的网站开放他们的展示可能性,网站很可能很长时间都得不到流量。如果网站在SEO方面没有大问题,可以检查一下内容是否在争抢一些热门词。建议整个网站的权重和流量达到一定规模后再做热词。如果一开始就这样做关键词,当网站名声不是很高的时候,就不会有流量了。在这种情况下,网站 可能会更好地找到他们自己的区分和相关词之一。
  问:网站 从事教育行业。现在通过官网的认证是安全或权威的认证。认证后会有潜在的特殊待遇或无所谓。
  A:比如认证方面,你是真的,还有一个是假的。从用户的认知来看,你就是官网。
  问:关于数据化、软件和PDF和Word显示的问题,包括哪些类型和多少资源?应该和文章的内容一起发布,还是PDF和文章一样?也有矛盾。产品及操作希望用户下载后直接使用,不会对PDF、WORD产生一些压缩或工具处理。有些用户会被引导到 Word,无论他们是无意还是无意。我该怎么办?
  A:百度搜索栏现在默认称为网页搜索。顾名思义,我们向用户展示了一个网页。后面的库还有一种文件格式。搜索结果都是供用户下载使用的,他们可以去学习和展示图书馆的内容。
  Q:有没有渠道告诉搜索引擎我们的页面内容发生了变化,我们通常如何处理?一个老页面已经收录,排序了,过了一段时间他发起了新资源的添加和更改?
  A:目前还没有这样的渠道。首先,Spider 会检查一些东西。他发现网站经常出现在这种情况下,他的相关检查流量会增加。如果你担心,你应该把他放在站点地图中。
  Q:网站原本只是一个主页,一个APP下载。我们现在正在发布内容。过去,这些内容无法被抓取。现在,我们是否需要提交修订以将其发布到目录或子域中?
  A:这个是放在域名下的,一个子目录用来放分类的东西,没有修改。改首页,改版就没有其他问题了。使用主动推送工具的效果还是很明显的。如果内容质量非常好,您可以使用所有配额。
  Q:自动推送份额多久调整一次?因为我觉得你的份额对于我们几千万或几百万的海量数据来说太小了。
  A:我们也很关心一个网站有没有这种爆发力,突然增加这么多,我们觉得很不正常。你要循序渐进,不要又短又快,一夜之间吃成胖子。第二,你有这么多优秀的数据,你可以关注百度的另一个平台,你就变成了一个API,让别人使用你的数据。其他人为您的数据使用付费,您可以注意这一点。
  Q:URL的绝对路径和相对路径是否会受到超链接的影响?修改后我们的页面有翻页,翻页链接是12345,上面有标签。每次抓到12345都抓不到。模拟抓,感觉抓不到。Spider会抓取页面上的A标签吗?
  A:影响不大,能正常访问就可以了。不管是绝对路径还是相对路径,只要地址为Spider或者用户畅通无阻,并且页面渲染时地址完整,这条路径就可以顺利爬取。
  对于not收录的问题,可以参考其他的点,比如页面本身没有被访问或者目录级别比较高。页面首页推送的链接会被百度一层一层抓到。如果路径正常,会从首页爬取Spider路径。
  首先要做的是查看不是收录的链接日志是否已经被捕获。如果它被捕获而不是 收录,则可能是页面本身的问题。你也可以看一个周期,因为我们用一天。二是看日志中是否有长尾,是否隐藏或没有有效抓取或建关时推荐。如果你能看到日志,你可以看看日志来分析它。
  可以调整首页的变化,提出建议,做个测试看看是链接问题还是蜘蛛没有抓到的问题。还有push等方法可以解决,从而判断不收录是什么原因。学院有一个解决许多问题的文件,类似于流程图。当这个戒指出现时,为什么?如果够长,可以看看下面的树枝。
  Q:站点之前,所有的框架都是通过JS来展示的。后来百度没有收录,进行了PHP改版。外观是一样的。现在感觉这个PHP不是很规范。什么是百度非标收录?
  A:酒店行业很多内容不是实时加载的,而是通过JS慢慢获取页面上的内容。如果搜索引擎捕捉到它,那就是导航,这就是问题所在。以前有很多空白页收录,质量很差。关于 Pattern 认为质量低的模式,内容可能是一样的,所以考虑换个目录。
  二、APPLINK问题解答
  Q:现在网站的APP已经准备好了,加入APPLINK会不会有什么大的变化?
  A:H5网站和APP有对应关系吗?比如这里是100条H5站的内容,有100条APP的内容,应该是匹配的。关键是把网站放在行首,一定要调整好。
  Q:目前APP引流是Android和IOS,但有一小部分是Windows Phone。这个APP需要多长时间?
  A:分两点,我们来看看诺基亚的Windows平台战略。如果我们看到他的一些动作,我们一定会注意的。因为其实我们早期有一个关于APPLINK接入协议的协议。我们可以有WindowsPhone调用的机制。用户点击了一个结果,如果点击了结果,我们那里就有一个Android IE,它可以接受IE并将信息发回给用户。只要在前端实现一些信息,就可以做好。劳动量似乎不是很大,是可以实现的。除了WindowsPhone和手表,毕竟还可以调APP,大家可以看看。
  Q:APP和网页版,很多APP都嵌入在H5网页中,里面只是一个外壳。百度做的AppLink,他点击后,从百度APP弹到糯米APP,然后弹走。他用百度搜索了很多数据。百度用户可以点击下一个网站。如果你把他推到糯米,我们后面的人就没有机会了。
  A:其实APPLINK不是技术壁垒的问题,是努力的问题。对于大型网站,您可以自己做。对于APPLINK,未来可能会有各方面的调整。对于小站来说,如果小站连接起来,目前就有这个优势。因为小站访问也可以跳转到小站。
  Q:加入APPLINK后,如果小站数据不够,会一下子弹出来吗?
  A:当你回到你的站,至少进入你自己的生态。事实上,从搜索的角度来看,我们的目标是满足用户的需求。如果我们引导到网站,如果网站不能满足需求,用户自然会被转移。将用户引向你是网站满足用户需求的动力。我认为应该是这样的。
  Q:如果整个页面有APPLINK,会有一个分发按钮。分配按钮的条件是什么?
  A:没有条件,你把APP包给我们,我们给你分发。
  Q:目前除了你的团队之外,还有几个百度内容的手机助手。有什么区别吗?
  A:这是一个早期的尝试。我们都知道移动端和PC端已经合并了。作为一个整体,我们输出了一组解决方案。可能上半年我们把这件事推的很紧。当时我们也很困惑。那个时候整个生态合并之后,现在我们整体的输出是由APPLINK来做比较合理。移动助手不是搜索结果。输出可能在不同的产品线中,APPLINK 出现在搜索结果中。
  Q:加入APPLINK对移动站平台有影响吗?
  答:还没有。但他会有一个正常的点击。
  Q:Android生态最麻烦的就是有时候不能调整。这种问题不调整,会不会指导下载操作?
  A:一般有两种情况是不能调整的。一个是安装包,因为安卓或者IOS包还有一个版本问题。因为网上提交的版本是用户没有更新新版本,或者有可能出现用户安装了新版本,但又删除了,有时无法调整的情况。在这种情况下,将访问 H5 站。现在有监控系统。如果我们不能去H5站,我们会发现搜索流量异常,我们会修复它。最快的情况是处理问题反馈。

js抓取网页内容(MicrosoftEdge浏览器和360极速浏览器中的截图为例对照图片 )

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

  js抓取网页内容(MicrosoftEdge浏览器和360极速浏览器中的截图为例对照图片
)
  最近很多同学问我浏览器的F12是什么?它是干什么用的?为了解决大家的疑惑,特地写了这个文章,总结一下F12的使用。
  以下讲解主要以微软Edge浏览器和360极速浏览器截图为例。 (注:以下截图中,中文截图为Microsoft Edge浏览器截图,英文截图为360度浏览器截图。)
  推荐大家使用360极速浏览器,抓包更好更全面(不同于360浏览器);如果你英文不好,那就用微软Edge或者其他浏览器吧。
  F12:可以打开浏览器的开发者工具,主要收录网页的源代码、请求数据和响应数据。
  打开方法:打开浏览器,然后按快捷键F12或FN+F12打开“开发者工具”。
  
  
  下图为浏览器开发者工具(中文)的主要标签/功能:
  
  下图中,标签的中英文对比图:
  
  下面一一解释每个标签的含义
  1.元素
  我们在做 web 测试的时候,并没有过多关注 Elements 标签中的内容。除了查看页面元素属性和进行修改之外,其余的都不是很有用。
  
  2.控制台
  在Console标签中,可以查看页面的错误信息,打印调试信息(console.log()),编写一些测试脚本,作为JavaScript API查看;您也可以在控制台中查看它。有哪些方法和属性,
  下图显示错误信息:
  
  在日常的测试工作中,我经常使用Console标签中的内容来帮助定位bug——看看前端JS或者CSS有没有报错,然后再去前端开发...
  在控制台打印一些调试信息,console.log()的使用如下:
  
  3.来源
  Sources标签中,是网页实现的一部分源码,主要是JS文件、CSS文件、图片等,如下图,是JS文件的源码:
  
  下图是CSS文件的源代码:
  
  4. 网络 - F12 捕获
  这个Network标签中的内容是常用的测试用...
  每次在web端发现bug,第一反应就是赶紧打开:F12看看能不能抓到数据。
  这个网络真的好用,你可以在子标签中捕获请求数据和响应数据。
  
  如下图,Headers标签中,抓取百度搜索的请求数据(分别在Edge和360浏览器中抓取):
  
  
  
  
  如下图,在Response标签中,抓取百度搜索的响应数据(分别在Edge和360浏览器中抓取):
   查看全部

  js抓取网页内容(MicrosoftEdge浏览器和360极速浏览器中的截图为例对照图片
)
  最近很多同学问我浏览器的F12是什么?它是干什么用的?为了解决大家的疑惑,特地写了这个文章,总结一下F12的使用。
  以下讲解主要以微软Edge浏览器和360极速浏览器截图为例。 (注:以下截图中,中文截图为Microsoft Edge浏览器截图,英文截图为360度浏览器截图。)
  推荐大家使用360极速浏览器,抓包更好更全面(不同于360浏览器);如果你英文不好,那就用微软Edge或者其他浏览器吧。
  F12:可以打开浏览器的开发者工具,主要收录网页的源代码、请求数据和响应数据。
  打开方法:打开浏览器,然后按快捷键F12或FN+F12打开“开发者工具”。
  
  
  下图为浏览器开发者工具(中文)的主要标签/功能:
  
  下图中,标签的中英文对比图:
  
  下面一一解释每个标签的含义
  1.元素
  我们在做 web 测试的时候,并没有过多关注 Elements 标签中的内容。除了查看页面元素属性和进行修改之外,其余的都不是很有用。
  
  2.控制台
  在Console标签中,可以查看页面的错误信息,打印调试信息(console.log()),编写一些测试脚本,作为JavaScript API查看;您也可以在控制台中查看它。有哪些方法和属性,
  下图显示错误信息:
  
  在日常的测试工作中,我经常使用Console标签中的内容来帮助定位bug——看看前端JS或者CSS有没有报错,然后再去前端开发...
  在控制台打印一些调试信息,console.log()的使用如下:
  
  3.来源
  Sources标签中,是网页实现的一部分源码,主要是JS文件、CSS文件、图片等,如下图,是JS文件的源码:
  
  下图是CSS文件的源代码:
  
  4. 网络 - F12 捕获
  这个Network标签中的内容是常用的测试用...
  每次在web端发现bug,第一反应就是赶紧打开:F12看看能不能抓到数据。
  这个网络真的好用,你可以在子标签中捕获请求数据和响应数据。
  
  如下图,Headers标签中,抓取百度搜索的请求数据(分别在Edge和360浏览器中抓取):
  
  
  
  
  如下图,在Response标签中,抓取百度搜索的响应数据(分别在Edge和360浏览器中抓取):
  

js抓取网页内容(新浪财经为例之1.依赖的jar包-1. )

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

  js抓取网页内容(新浪财经为例之1.依赖的jar包-1.
)
  使用 Selenium 和 PhantomJs 可以模拟用户操作并抓取大部分 网站。以新浪财经为例,我们抓取新浪财经的新闻版块。
  
  1.依赖的jar包。我的项目是一个普通的SSM单间WEB项目。最后一个jar包用于抓取网页的DOM后解析网页的内容。
  

org.seleniumhq.selenium
selenium-java
3.2.0



javax
javaee-web-api
7.0
provided




com.google.guava
guava
20.0



cn.wanghaomiao
JsoupXpath
2.2


  2.获取网页dom内容
  package com.nsjr.grab.util;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriverService;
import org.openqa.selenium.remote.DesiredCapabilities;
import cn.wanghaomiao.xpath.model.JXDocument;
@SuppressWarnings("deprecation")
public class SeleniumUtil {

public static JXDocument getDocument(String driverUrl,String pageUrl){
JXDocument jxDocument = null;
PhantomJSDriver driver = null;
try{
System.setProperty("phantomjs.binary.path", driverUrl);
System.setProperty("webdriver.chrome.driver", driverUrl);

DesiredCapabilities dcaps = new DesiredCapabilities();
//ssl证书支持
dcaps.setCapability("acceptSslCerts", true);
//截屏支持
dcaps.setCapability("takesScreenshot", true);
//css搜索支持
dcaps.setCapability("cssSelectorsEnabled", true);
//js支持
dcaps.setJavascriptEnabled(true);
//驱动支持
dcaps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY,driverUrl);
//创建无界面浏览器对象
driver = new PhantomJSDriver(dcaps);
//WebDriver driver = new ChromeDriver(dcaps);
driver.get(pageUrl);
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
Document document = Jsoup.parse(driver.getPageSource());
jxDocument = new JXDocument(document);
}catch(Exception e){
e.printStackTrace();
}finally{
if(driver != null){
driver.quit();
}
}
return jxDocument;
}


public static String getProperty(List list){
if(list.isEmpty()){
return "";
}else{
return list.get(0).toString();
}
}
}
  3.解析并保存内容
  JXDocument jxDocument = SeleniumUtil.getDocument(captureUrl.getDriverUrl(), captureUrl.getSinaNews());

//保存第一部分加粗新闻
List listh3 = jxDocument.sel("//div[@id='impNews1']/div[@id='fin_tabs0_c0']/div[@id='blk_hdline_01']/h3/a");
for(Object a :listh3){
JXDocument doc = new JXDocument(a.toString());
//System.out.println("地址:"+doc.sel("//a/@href"));
//System.out.println("标题:"+doc.sel("//text()"));
saveNews(SeleniumUtil.getProperty(doc.sel("//text()")), SeleniumUtil.getProperty(doc.sel("//a/@href")), Constant.NEWS_TYPE_BOTTOM, Constant.NEWS_SOURCE_SINA);
}

//保存其余新闻
List listP = jxDocument.sel("//div[@id='impNews1']/div[@id='fin_tabs0_c0']/div[@id='blk_hdline_01']/p/a");
for(Object a :listP){
JXDocument doc = new JXDocument(a.toString());
//System.out.println("地址:"+doc.sel("//a/@href"));
//System.out.println("标题:"+doc.sel("//text()"));
saveNews(SeleniumUtil.getProperty(doc.sel("//text()")), SeleniumUtil.getProperty(doc.sel("//a/@href")), Constant.NEWS_TYPE_BOTTOM, Constant.NEWS_SOURCE_SINA);
}

//保存第二部分新闻
List listpart2 = jxDocument.sel("//div[@id='impNews1']/div[@id='fin_tabs0_c0']/div[2]/ul");
for(Object a :listpart2){
JXDocument doc = new JXDocument(a.toString());
List alist = doc.sel("//li/a");
for(Object a2 :alist){
JXDocument doc2 = new JXDocument(a2.toString());
//System.out.println("地址:"+doc2.sel("//a/@href"));
//System.out.println("标题:"+doc2.sel("//text()"));
saveNews(
SeleniumUtil.getProperty(doc2.sel("//text()")),
SeleniumUtil.getProperty(doc2.sel("//a/@href")),
Constant.NEWS_TYPE_BOTTOM,
Constant.NEWS_SOURCE_SINA
);
}
}
  4.解释
  captureUrl.getDriverUrl(), captureUrl.getSinaNews() 这两个地址分别是PhantomJs工具的地址和要爬取的网站的地址,其中
  sina_news = https://finance.sina.com.cn/
  driverUrl= D:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe
  PhantomJs工具的下载可以直接到官网下载。有windows和Linux版本可供下载。网页结构的解析使用了JsoupXpath,这是一个中国人写的html文档解析工具包,非常好用。语法可以参考Xpath的相关语法进行节点选择。
  5. 爬取结果。由于项目要求比较简单,对实时性和性能要求不高,只有存储才能满足要求。
  
  最后,刚开始接触爬虫的时候,有的需要webmagic可以满足,有的需要其他方法,具体问题需要详细分析。目前还在探索阶段,本文只提供解决方案。
    查看全部

  js抓取网页内容(新浪财经为例之1.依赖的jar包-1.
)
  使用 Selenium 和 PhantomJs 可以模拟用户操作并抓取大部分 网站。以新浪财经为例,我们抓取新浪财经的新闻版块。
  
  1.依赖的jar包。我的项目是一个普通的SSM单间WEB项目。最后一个jar包用于抓取网页的DOM后解析网页的内容。
  

org.seleniumhq.selenium
selenium-java
3.2.0



javax
javaee-web-api
7.0
provided




com.google.guava
guava
20.0



cn.wanghaomiao
JsoupXpath
2.2


  2.获取网页dom内容
  package com.nsjr.grab.util;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriverService;
import org.openqa.selenium.remote.DesiredCapabilities;
import cn.wanghaomiao.xpath.model.JXDocument;
@SuppressWarnings("deprecation")
public class SeleniumUtil {

public static JXDocument getDocument(String driverUrl,String pageUrl){
JXDocument jxDocument = null;
PhantomJSDriver driver = null;
try{
System.setProperty("phantomjs.binary.path", driverUrl);
System.setProperty("webdriver.chrome.driver", driverUrl);

DesiredCapabilities dcaps = new DesiredCapabilities();
//ssl证书支持
dcaps.setCapability("acceptSslCerts", true);
//截屏支持
dcaps.setCapability("takesScreenshot", true);
//css搜索支持
dcaps.setCapability("cssSelectorsEnabled", true);
//js支持
dcaps.setJavascriptEnabled(true);
//驱动支持
dcaps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY,driverUrl);
//创建无界面浏览器对象
driver = new PhantomJSDriver(dcaps);
//WebDriver driver = new ChromeDriver(dcaps);
driver.get(pageUrl);
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
Document document = Jsoup.parse(driver.getPageSource());
jxDocument = new JXDocument(document);
}catch(Exception e){
e.printStackTrace();
}finally{
if(driver != null){
driver.quit();
}
}
return jxDocument;
}


public static String getProperty(List list){
if(list.isEmpty()){
return "";
}else{
return list.get(0).toString();
}
}
}
  3.解析并保存内容
  JXDocument jxDocument = SeleniumUtil.getDocument(captureUrl.getDriverUrl(), captureUrl.getSinaNews());

//保存第一部分加粗新闻
List listh3 = jxDocument.sel("//div[@id='impNews1']/div[@id='fin_tabs0_c0']/div[@id='blk_hdline_01']/h3/a");
for(Object a :listh3){
JXDocument doc = new JXDocument(a.toString());
//System.out.println("地址:"+doc.sel("//a/@href"));
//System.out.println("标题:"+doc.sel("//text()"));
saveNews(SeleniumUtil.getProperty(doc.sel("//text()")), SeleniumUtil.getProperty(doc.sel("//a/@href")), Constant.NEWS_TYPE_BOTTOM, Constant.NEWS_SOURCE_SINA);
}

//保存其余新闻
List listP = jxDocument.sel("//div[@id='impNews1']/div[@id='fin_tabs0_c0']/div[@id='blk_hdline_01']/p/a");
for(Object a :listP){
JXDocument doc = new JXDocument(a.toString());
//System.out.println("地址:"+doc.sel("//a/@href"));
//System.out.println("标题:"+doc.sel("//text()"));
saveNews(SeleniumUtil.getProperty(doc.sel("//text()")), SeleniumUtil.getProperty(doc.sel("//a/@href")), Constant.NEWS_TYPE_BOTTOM, Constant.NEWS_SOURCE_SINA);
}

//保存第二部分新闻
List listpart2 = jxDocument.sel("//div[@id='impNews1']/div[@id='fin_tabs0_c0']/div[2]/ul");
for(Object a :listpart2){
JXDocument doc = new JXDocument(a.toString());
List alist = doc.sel("//li/a");
for(Object a2 :alist){
JXDocument doc2 = new JXDocument(a2.toString());
//System.out.println("地址:"+doc2.sel("//a/@href"));
//System.out.println("标题:"+doc2.sel("//text()"));
saveNews(
SeleniumUtil.getProperty(doc2.sel("//text()")),
SeleniumUtil.getProperty(doc2.sel("//a/@href")),
Constant.NEWS_TYPE_BOTTOM,
Constant.NEWS_SOURCE_SINA
);
}
}
  4.解释
  captureUrl.getDriverUrl(), captureUrl.getSinaNews() 这两个地址分别是PhantomJs工具的地址和要爬取的网站的地址,其中
  sina_news = https://finance.sina.com.cn/
  driverUrl= D:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe
  PhantomJs工具的下载可以直接到官网下载。有windows和Linux版本可供下载。网页结构的解析使用了JsoupXpath,这是一个中国人写的html文档解析工具包,非常好用。语法可以参考Xpath的相关语法进行节点选择。
  5. 爬取结果。由于项目要求比较简单,对实时性和性能要求不高,只有存储才能满足要求。
  
  最后,刚开始接触爬虫的时候,有的需要webmagic可以满足,有的需要其他方法,具体问题需要详细分析。目前还在探索阶段,本文只提供解决方案。
   

js抓取网页内容( “显示更多”按钮刮一个谷歌学者页面(组图) )

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

  js抓取网页内容(
“显示更多”按钮刮一个谷歌学者页面(组图)
)
  使用 Selenium 使用 javascript 抓取网页
  pythonseleniumweb-scraping
  使用 Selenium 用 javascript、javascript、python、selenium、web-scraping、beautifulsoup、Javascript、Python、Selenium、Web Scraping、Beautifulsoup 抓取网页,我想用“显示更多”按钮抓取一个 Google Scholar 页面。我从上一个问题中了解到,它不是 html 而是 javascript,并且有几种方法可以抓取这样的页面。我尝试了 selenium 并尝试了以下代码 from selenium import webdriverfrom bs4 import BeautifulSoupoptions = webdriver.ChromeOptions()options.add_argument('--ignore-certificate-errors')option
  我想用“显示更多”按钮抓取一个谷歌学者页面。我从上一个问题中了解到,它不是 html 而是 javascript,并且有几种方法可以抓取这样的页面。我尝试了硒并尝试了以下代码
  from selenium import webdriver
from bs4 import BeautifulSoup
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--incognito')
options.add_argument('--headless')
chrome_path = r"....path....."
driver = webdriver.Chrome(chrome_path)
driver.get("https://scholar.google.com/cit ... 6quot;)
driver.find_element_by_xpath('/html/body/div/div[13]/div[2]/div/div[4]/form/div[2]/div/button/span/span[2]').click()
soup = BeautifulSoup(driver.page_source,'html.parser')
papers = soup.find_all('tr',{'class':'gsc_a_tr'})
for paper in papers:
title = paper.find('a',{'class':'gsc_a_at'}).text
author = paper.find('div',{'class':'gs_gray'}).text
journal = [a.text for a in paper.select("td:nth-child(1) > div:nth-child(3)")]


print('Paper Title:', title, '\nAuthor:', author, '\nJournal:', journal)
  浏览器现在单击“显示更多”按钮并显示整个页面。但是,我仍然只能获得前 20 篇论文的信息。我不理解为什么。请帮忙
  谢谢
  我认为您的问题是当您的程序检查 网站 时,新元素尚未完全加载。尝试导入时间,然后睡几分钟。这样(我删除了无头功能,以便您可以看到程序工作):
  导入时间
从selenium导入webdriver
从selenium.webdriver.chrome.options导入选项
选项=选项()
options.page_load_策略='normal'
driver=webdriver.Chrome(options=options)
驱动程序。获取(“https://scholar.google.com/cit ... 6quot;)
#笨拙的方法
#加载所有可用文章,然后对其进行迭代
对于范围(1,3)内的i:
驱动程序。通过_css_选择器('#gsc_bpf_more')查找_元素。单击()
#等待元素加载
时间。睡眠(3)
#所有数据所在的容器
对于驱动程序中的结果。通过“css”选择器(“#gsc_a_b.gsc_a_t”)查找“元素”:
title=result.find_element_by_css_选择器('.gsc_a_at')。text
authors=result.find_element_by_css_selector('.gsc_a_at+.gs_gray')。text
publication=result.find_element_by_css_选择器('.gs_gray+.gs_gray')。text
印刷品(标题)
印刷品(作者)
印刷品(出版物)
#只是为了分开
打印()
  部分输出:
  有环保意识的消费者参与的税收/补贴政策
南班萨尔,南甘戈帕迪亚
环境经济与管理杂志45(2),333-355
绿色消费者面前监管工具的选择与设计
班萨尔群岛
资源和能源经济学30(3),345-368
  from selenium import webdriver
import time
from bs4 import BeautifulSoup
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--incognito')
driver = webdriver.Chrome()
driver.get("https://scholar.google.com/cit ... 6quot;)
time.sleep(3)
driver.find_element_by_id("gsc_bpf_more").click()
time.sleep(4)
soup = BeautifulSoup(driver.page_source, 'html.parser')
papers = soup.find_all('tr', {'class': 'gsc_a_tr'})
for paper in papers:
title = paper.find('a', {'class': 'gsc_a_at'}).text
author = paper.find('div', {'class': 'gs_gray'}).text
journal = [a.text for a in paper.select("td:nth-child(1) > div:nth-child(3)")]
print('Paper Title:', title, '\nAuthor:', author, '\nJournal:', journal) 查看全部

  js抓取网页内容(
“显示更多”按钮刮一个谷歌学者页面(组图)
)
  使用 Selenium 使用 javascript 抓取网页
  pythonseleniumweb-scraping
  使用 Selenium 用 javascript、javascript、python、selenium、web-scraping、beautifulsoup、Javascript、Python、Selenium、Web Scraping、Beautifulsoup 抓取网页,我想用“显示更多”按钮抓取一个 Google Scholar 页面。我从上一个问题中了解到,它不是 html 而是 javascript,并且有几种方法可以抓取这样的页面。我尝试了 selenium 并尝试了以下代码 from selenium import webdriverfrom bs4 import BeautifulSoupoptions = webdriver.ChromeOptions()options.add_argument('--ignore-certificate-errors')option
  我想用“显示更多”按钮抓取一个谷歌学者页面。我从上一个问题中了解到,它不是 html 而是 javascript,并且有几种方法可以抓取这样的页面。我尝试了硒并尝试了以下代码
  from selenium import webdriver
from bs4 import BeautifulSoup
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--incognito')
options.add_argument('--headless')
chrome_path = r"....path....."
driver = webdriver.Chrome(chrome_path)
driver.get("https://scholar.google.com/cit ... 6quot;)
driver.find_element_by_xpath('/html/body/div/div[13]/div[2]/div/div[4]/form/div[2]/div/button/span/span[2]').click()
soup = BeautifulSoup(driver.page_source,'html.parser')
papers = soup.find_all('tr',{'class':'gsc_a_tr'})
for paper in papers:
title = paper.find('a',{'class':'gsc_a_at'}).text
author = paper.find('div',{'class':'gs_gray'}).text
journal = [a.text for a in paper.select("td:nth-child(1) > div:nth-child(3)")]


print('Paper Title:', title, '\nAuthor:', author, '\nJournal:', journal)
  浏览器现在单击“显示更多”按钮并显示整个页面。但是,我仍然只能获得前 20 篇论文的信息。我不理解为什么。请帮忙
  谢谢
  我认为您的问题是当您的程序检查 网站 时,新元素尚未完全加载。尝试导入时间,然后睡几分钟。这样(我删除了无头功能,以便您可以看到程序工作):
  导入时间
从selenium导入webdriver
从selenium.webdriver.chrome.options导入选项
选项=选项()
options.page_load_策略='normal'
driver=webdriver.Chrome(options=options)
驱动程序。获取(“https://scholar.google.com/cit ... 6quot;)
#笨拙的方法
#加载所有可用文章,然后对其进行迭代
对于范围(1,3)内的i:
驱动程序。通过_css_选择器('#gsc_bpf_more')查找_元素。单击()
#等待元素加载
时间。睡眠(3)
#所有数据所在的容器
对于驱动程序中的结果。通过“css”选择器(“#gsc_a_b.gsc_a_t”)查找“元素”:
title=result.find_element_by_css_选择器('.gsc_a_at')。text
authors=result.find_element_by_css_selector('.gsc_a_at+.gs_gray')。text
publication=result.find_element_by_css_选择器('.gs_gray+.gs_gray')。text
印刷品(标题)
印刷品(作者)
印刷品(出版物)
#只是为了分开
打印()
  部分输出:
  有环保意识的消费者参与的税收/补贴政策
南班萨尔,南甘戈帕迪亚
环境经济与管理杂志45(2),333-355
绿色消费者面前监管工具的选择与设计
班萨尔群岛
资源和能源经济学30(3),345-368
  from selenium import webdriver
import time
from bs4 import BeautifulSoup
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--incognito')
driver = webdriver.Chrome()
driver.get("https://scholar.google.com/cit ... 6quot;)
time.sleep(3)
driver.find_element_by_id("gsc_bpf_more").click()
time.sleep(4)
soup = BeautifulSoup(driver.page_source, 'html.parser')
papers = soup.find_all('tr', {'class': 'gsc_a_tr'})
for paper in papers:
title = paper.find('a', {'class': 'gsc_a_at'}).text
author = paper.find('div', {'class': 'gs_gray'}).text
journal = [a.text for a in paper.select("td:nth-child(1) > div:nth-child(3)")]
print('Paper Title:', title, '\nAuthor:', author, '\nJournal:', journal)

js抓取网页内容(解析XML网页链接来抓取指定的内容比如豆瓣电影排行榜,)

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

  js抓取网页内容(解析XML网页链接来抓取指定的内容比如豆瓣电影排行榜,)
  如果给你一个网页链接去抓取特定的内容,比如豆瓣电影排名,你怎么做?
  其实网页内容的结构和XML很相似,所以我们可以通过解析XML来解析HTML,但是两者之间还是有很大差距的。好了,事不宜迟,让我们开始解析 HTML。
  然后解析xml的库很多,这里我们使用libxml来解析,因为libxml是C语言接口,我找了一个library-hpple用objective-c封装接口,它的地址是,那么网页用的是豆瓣电影排名,地址是。
  接下来新建项目,使用ARC,引入libxml2和hpple库,新建实体类movie。完整的项目结构如下:
  
  movie的实现如下,这是一个实体类,根据爬取的网页内容确定实体
  电影.h
  1@interface Movie : NSObject
2@property(nonatomic, strong) NSString *name;
3@property(nonatomic, strong) NSString *imageUrl;
4@property(nonatomic, strong) NSString *descrition;
5@property(nonatomic, strong) NSString *movieUrl;
6@property(nonatomic) NSInteger ratingNumber;
7@property(nonatomic, strong) NSString *comment;
8@end
9
  那么最重要的部分就到这里了,不管网页的内容是什么,我们都需要先获取网页的内容。下面是通过NSURLConnection获取整个网页的内容。
  1- (void)loadHTMLContent
2{
3 NSString *movieUrl = MOVIE_URL;
4 NSString *urlString = [movieUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
5 NSURL *url = [NSURL URLWithString:urlString];
6
7 NSURLRequest *request = [NSURLRequest requestWithURL:url];
8
9 [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
10
11 __weak ViewController *weak_self = self;
12 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
13 if (nil == error) {
14// NSString *retString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
15// NSLog(@"%@", retString);
16 [weak_self parserHTML:data];
17 }
18
19 [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
20 }];
21}
22
  这只是获取网页内容的一种简单方法。一些HTTP和错误处理本文不讨论,所以这里的代码比较简单。上面代码中有一个parserHTML:方法,就是对获取到的网页内容进行解析。在此之前,让我们拆除 xpath。
  假设一个简单的网页收录以下内容:
  1

3    Some webpage


6    This is the first paragraph
7    This is the second paragraph. This is in bold.
8   
9
  比如要获取title的内容,那么xpath表达式就是/html/head/title。如果要获取 class="special" 节点内容,xpath 为 /html/body/p[@class='special']。
  所以只要找到合适的xpath,就会得到对应的节点内容,接下来我们用hpple来解析html
  1- (void)parserHTML:(NSData *)data
2{
3 if (nil != data) {
4 TFHpple *movieParser = [TFHpple hppleWithHTMLData:data];
5 NSString *movieXpathQueryString = @"/html/body/div[@id=&#x27;wrapper&#x27;]/div[@id=&#x27;content&#x27;]/div[@class=&#x27;grid-16-8 clearfix&#x27;]/div[@class=&#x27;article&#x27;]/div[@class=&#x27;indent&#x27;]/table/tr/td/a[@class=&#x27;nbg&#x27;]";
6 NSArray *movieNodes = [movieParser searchWithXPathQuery:movieXpathQueryString];
7
8 for (TFHppleElement *element in movieNodes) {
9 Movie *m = [[Movie alloc] init];
10 m.name = [element objectForKey:@"title"];
11 m.movieUrl = [element objectForKey:@"href"];
12
13 for (TFHppleElement *child in element.children) {
14 if ([child.tagName isEqualToString:@"img"]) {
15 @try {
16 m.imageUrl = [child objectForKey:@"src"];
17 }
18 @catch (NSException *exception) {
19
20 }
21 }
22 }
23
24 [self.movies addObject:m];
25 }
26
27 [self.movieTableView reloadData];
28 }
29}
30
  代码中,第一页找到对应节点的路径,然后searchWithXPathQuery得到一个数组。遍历组织数据后,可以在表格视图中展示。具体效果如下:
  
  嗯,网页的内容已经爬出来了,实际项目比这个复杂,所以这里只是一个指导性的例子。
  参考:
  注:本文由小涵撰写,请支持原创!如需转载,请附上原文链接: 查看全部

  js抓取网页内容(解析XML网页链接来抓取指定的内容比如豆瓣电影排行榜,)
  如果给你一个网页链接去抓取特定的内容,比如豆瓣电影排名,你怎么做?
  其实网页内容的结构和XML很相似,所以我们可以通过解析XML来解析HTML,但是两者之间还是有很大差距的。好了,事不宜迟,让我们开始解析 HTML。
  然后解析xml的库很多,这里我们使用libxml来解析,因为libxml是C语言接口,我找了一个library-hpple用objective-c封装接口,它的地址是,那么网页用的是豆瓣电影排名,地址是。
  接下来新建项目,使用ARC,引入libxml2和hpple库,新建实体类movie。完整的项目结构如下:
  
  movie的实现如下,这是一个实体类,根据爬取的网页内容确定实体
  电影.h
  1@interface Movie : NSObject
2@property(nonatomic, strong) NSString *name;
3@property(nonatomic, strong) NSString *imageUrl;
4@property(nonatomic, strong) NSString *descrition;
5@property(nonatomic, strong) NSString *movieUrl;
6@property(nonatomic) NSInteger ratingNumber;
7@property(nonatomic, strong) NSString *comment;
8@end
9
  那么最重要的部分就到这里了,不管网页的内容是什么,我们都需要先获取网页的内容。下面是通过NSURLConnection获取整个网页的内容。
  1- (void)loadHTMLContent
2{
3 NSString *movieUrl = MOVIE_URL;
4 NSString *urlString = [movieUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
5 NSURL *url = [NSURL URLWithString:urlString];
6
7 NSURLRequest *request = [NSURLRequest requestWithURL:url];
8
9 [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
10
11 __weak ViewController *weak_self = self;
12 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
13 if (nil == error) {
14// NSString *retString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
15// NSLog(@"%@", retString);
16 [weak_self parserHTML:data];
17 }
18
19 [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
20 }];
21}
22
  这只是获取网页内容的一种简单方法。一些HTTP和错误处理本文不讨论,所以这里的代码比较简单。上面代码中有一个parserHTML:方法,就是对获取到的网页内容进行解析。在此之前,让我们拆除 xpath。
  假设一个简单的网页收录以下内容:
  1

3    Some webpage


6    This is the first paragraph
7    This is the second paragraph. This is in bold.
8   
9
  比如要获取title的内容,那么xpath表达式就是/html/head/title。如果要获取 class="special" 节点内容,xpath 为 /html/body/p[@class='special']。
  所以只要找到合适的xpath,就会得到对应的节点内容,接下来我们用hpple来解析html
  1- (void)parserHTML:(NSData *)data
2{
3 if (nil != data) {
4 TFHpple *movieParser = [TFHpple hppleWithHTMLData:data];
5 NSString *movieXpathQueryString = @"/html/body/div[@id=&#x27;wrapper&#x27;]/div[@id=&#x27;content&#x27;]/div[@class=&#x27;grid-16-8 clearfix&#x27;]/div[@class=&#x27;article&#x27;]/div[@class=&#x27;indent&#x27;]/table/tr/td/a[@class=&#x27;nbg&#x27;]";
6 NSArray *movieNodes = [movieParser searchWithXPathQuery:movieXpathQueryString];
7
8 for (TFHppleElement *element in movieNodes) {
9 Movie *m = [[Movie alloc] init];
10 m.name = [element objectForKey:@"title"];
11 m.movieUrl = [element objectForKey:@"href"];
12
13 for (TFHppleElement *child in element.children) {
14 if ([child.tagName isEqualToString:@"img"]) {
15 @try {
16 m.imageUrl = [child objectForKey:@"src"];
17 }
18 @catch (NSException *exception) {
19
20 }
21 }
22 }
23
24 [self.movies addObject:m];
25 }
26
27 [self.movieTableView reloadData];
28 }
29}
30
  代码中,第一页找到对应节点的路径,然后searchWithXPathQuery得到一个数组。遍历组织数据后,可以在表格视图中展示。具体效果如下:
  
  嗯,网页的内容已经爬出来了,实际项目比这个复杂,所以这里只是一个指导性的例子。
  参考:
  注:本文由小涵撰写,请支持原创!如需转载,请附上原文链接:

js抓取网页内容(js抓取网页内容的3大步骤可以给网页信息打一个标签)

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

  js抓取网页内容(js抓取网页内容的3大步骤可以给网页信息打一个标签)
  js抓取网页内容的3大步骤可以给网页信息打一个标签,用户即可获取其中的信息及其与自己的关系:如搜索结果等使用javascript,可以解析网页,访问和获取原始数据当然你也可以使用浏览器来制作一个工具如:ga安装:node。js和python2。7如果没有nodejs和python,可以用v8和express代替nodejsnpmi-grequire-jsexpressreact-node。
  js数据获取:主要用到四个方法:setdata-将数据保存到本地数据库replacedata-从服务器获取数据,转换方法:xmlhttprequest,transformrator,request,tojsondemo-jsga网页数据爬取数据获取的post时会检查post参数和数据模板,并且会检查accept,cookie,authenticate,authorization。其他。
  (二维码自动识别)
  精确定位商品信息,在卖家自定义打标的情况下,首先可以选择同行的产品,将商品的标签下发到同行信息平台,然后把url放到需要抓取的网页,例如京东信息平台,就可以直接抓取了。但是这种方法缺点很明显,数据不够精准,因为同行的商品信息里面是存在真正同行产品的所有信息的。而且需要数据库查询的功能,如果比较在意数据质量,还是自己打标的方法更好。
  其实爬虫如果做不好准备的话,百分之九十拿到的数据是post出来的格式,要么是乱码,要么就是假货数据。还是建议你一定要有个数据库来保存你的数据,再去京东这些平台,根据他们的产品要求去筛选就可以了。如果做一个独立爬虫,成本确实不小。 查看全部

  js抓取网页内容(js抓取网页内容的3大步骤可以给网页信息打一个标签)
  js抓取网页内容的3大步骤可以给网页信息打一个标签,用户即可获取其中的信息及其与自己的关系:如搜索结果等使用javascript,可以解析网页,访问和获取原始数据当然你也可以使用浏览器来制作一个工具如:ga安装:node。js和python2。7如果没有nodejs和python,可以用v8和express代替nodejsnpmi-grequire-jsexpressreact-node。
  js数据获取:主要用到四个方法:setdata-将数据保存到本地数据库replacedata-从服务器获取数据,转换方法:xmlhttprequest,transformrator,request,tojsondemo-jsga网页数据爬取数据获取的post时会检查post参数和数据模板,并且会检查accept,cookie,authenticate,authorization。其他。
  (二维码自动识别)
  精确定位商品信息,在卖家自定义打标的情况下,首先可以选择同行的产品,将商品的标签下发到同行信息平台,然后把url放到需要抓取的网页,例如京东信息平台,就可以直接抓取了。但是这种方法缺点很明显,数据不够精准,因为同行的商品信息里面是存在真正同行产品的所有信息的。而且需要数据库查询的功能,如果比较在意数据质量,还是自己打标的方法更好。
  其实爬虫如果做不好准备的话,百分之九十拿到的数据是post出来的格式,要么是乱码,要么就是假货数据。还是建议你一定要有个数据库来保存你的数据,再去京东这些平台,根据他们的产品要求去筛选就可以了。如果做一个独立爬虫,成本确实不小。

js抓取网页内容(关于GoogleAnalytics的一些维度和指标(amp)(图) )

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

  js抓取网页内容(关于GoogleAnalytics的一些维度和指标(amp)(图)
)
  概述
  深入了解数据的维度和指标是正确理解和分析数据的开始。Google Analytics (GA) 有许多内置的维度和指标。本系列文章将对这些维度和指标一一整理讲解。结合 GA 官方 JavaScript 库和 SDK,我们将深入探讨这些数据是如何获取和传递的……
  注:本文默认封装为GA中的维度或指标。
  &amp;
  页面和主机名是 GA 中最常用的维度之一。
  JS: document.location.pathname + document.location.search
例如:"/test?key=123"
  JS: document.location.hostname
例如:"127.0.0.1" / "analytics.google.com"
  以上两个维度在GA中应用比较广泛,比如推荐排除/跨域...
  可用于行为定位、模型创建、目标设定……
  那么这两个指标在GA中是如何得到的呢?
  我们知道 GA 通过向 Google 服务器发送带有参数的请求来进行数据采集。比如我们最常见的页面浏览量是:pageview
  可能是发送了如下所示的请求。
  
  请求中,t代表匹配类型,这里是pageview;dl 代表文档位置URL,这里是
  ; dp 表示文档路径,在本例中为 /test#ga_dp。
  那么这个请求发送给 GA 后,GA 显示的网页和主机名是什么?不用在这里买了。
   /test#ga_dp
127.0.0.1
  那么还有一个问题,如果这里没有发送 dp 怎么办?因为如果我们平时注意的话,一般都是在pageview中看到dl,而除非有特殊设置,我们很少看到dp
  答案是
   /test?key=123
  之所以这样改动,是因为dl是analytics.js或者gtag.js(简称GA_js库)发送的默认参数,而dp是可选参数。默认发送dl时,GA_js库会自动抓取以下浏览器参数,即:
  document.location.origin + document.location.pathname + document.location.search
  形成 dl 并发送。发送给GA后,GA服务器会对dl传递的参数进行反汇编,取出主机名和URI部分,分别赋值&amp;两个维度。
  但是如果除了默认发送的 dl 之外还指定了两个可选参数 dh(文档主机名)和 dp(文档路径),GA 会先使用指定的 dh 或 dp。
  所以对于虚拟页面的价值如何传递而纠结的同学,可以在这里安心。您可以使用综合浏览量发送位置或页面,但必须发送位置。
  Ok~这个问题就结束了,但是如果你和GA接触很久了,你可能还有一些其他的问题,比如:
  如果我在 dl 参数中传递一个随机数,例如:test:///test?protocol:test 怎么办?—— 请求无效。如果是dl参数,我传一个数字,如上,还要传dp的值吗?—— 请求有效,网页通过dp的值。如果我在A页面部署默认的GA基础代码,同时在网页出现弹窗的时候发送一个dummy page事件(B页面),弹窗有点击事件,如果我进入网页,然后触发弹窗,然后点击事件,那么此时事件所属的网页是A还是虚拟页面B——如果是用set命令设置的pageview ,此时事件所属的网页是B,不仅是弹窗上的B,而且在下面刷新页面之前的所有事件都是B。如果在默认发送浏览量中添加参数{'page'},则事件所属的页面为A,其他事件不受该页面影响。(出现这种现象的原因是GA在加载analytics.js时默认会在tracker中设置tracker的dl参数,后续事件会使用这个参数,除非被显式值覆盖。)如果我的网页中的锚点(#) 后面的信息在区分网页中起着重要的作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... 该事件所属的页面为A,其他事件不受该页面影响。(出现这种现象的原因是GA在加载analytics.js时默认会在tracker中设置tracker的dl参数,后续事件会使用这个参数,除非被显式值覆盖。)如果我的网页中的锚点(#) 后面的信息在区分网页中起着重要的作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... 该事件所属的页面为A,其他事件不受该页面影响。(出现这种现象的原因是GA在加载analytics.js时默认会在tracker中设置tracker的dl参数,后续事件会使用这个参数,除非被显式值覆盖。)如果我的网页中的锚点(#) 后面的信息在区分网页中起着重要的作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... (出现这种现象的原因是GA在加载analytics.js时默认会在tracker中设置tracker的dl参数,后续事件会使用这个参数,除非被显式值覆盖。)如果我的网页中的锚点(#) 后面的信息在区分网页中起着重要的作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... (出现这种现象的原因是GA在加载analytics.js时默认会在tracker中设置tracker的dl参数,后续事件会使用这个参数,除非被显式值覆盖。)如果我的网页中的锚点(#) 后面的信息在区分网页中起着重要的作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... ) 如果我的网页中的锚点 (#) 后面的信息对区分网页起重要作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... ) 如果我的网页中的锚点 (#) 后面的信息对区分网页起重要作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。...
  了解了这一点后,我们似乎对 &amp; 这两个指标有了更多的了解。但是我们可以再深入一点吗?
  当然,你会怎么写这个 文章
  以analytics.js为例,扩展analytics.js,看看GA是怎么得到的。
  搜索关键词 location dl后,可以找到如下代码:
  
  其他代码就省略了,当然如果你好奇,也可以关注我的另一个系列文章《谷歌analytics.js源码分析》。
  这里,Kb = '位置'
  a.set等的取值以及在对应tracker中设置参数位置为:
  
  可以看出,实际上dl的传递值是在analytics.js中设置的,不是GA账号处理的。
  ##
  现在我提到了,顺便说一句。
  登陆页面的定义众所周知,这里不再赘述。在 GA 中,着陆页定义为
  
  正常情况下,这自然是没有问题的,但是遇到意外情况,这个解释就显得有些不清楚了。
  例如:
  假设用户进入某个网站页面A,在页面上发送事件e_1,然后进入页面B。
  但是由于实际登陆页面A的页面浏览代码部署错误,导致页面浏览丢失,那么此时事件e_1的登陆页面是什么呢?
  A: (not set)
B: 网页B
  答案将在下一期揭晓,也可以私下交流心得~
  白色 白色
   查看全部

  js抓取网页内容(关于GoogleAnalytics的一些维度和指标(amp)(图)
)
  概述
  深入了解数据的维度和指标是正确理解和分析数据的开始。Google Analytics (GA) 有许多内置的维度和指标。本系列文章将对这些维度和指标一一整理讲解。结合 GA 官方 JavaScript 库和 SDK,我们将深入探讨这些数据是如何获取和传递的……
  注:本文默认封装为GA中的维度或指标。
  &amp;
  页面和主机名是 GA 中最常用的维度之一。
  JS: document.location.pathname + document.location.search
例如:"/test?key=123"
  JS: document.location.hostname
例如:"127.0.0.1" / "analytics.google.com"
  以上两个维度在GA中应用比较广泛,比如推荐排除/跨域...
  可用于行为定位、模型创建、目标设定……
  那么这两个指标在GA中是如何得到的呢?
  我们知道 GA 通过向 Google 服务器发送带有参数的请求来进行数据采集。比如我们最常见的页面浏览量是:pageview
  可能是发送了如下所示的请求。
  
  请求中,t代表匹配类型,这里是pageview;dl 代表文档位置URL,这里是
  ; dp 表示文档路径,在本例中为 /test#ga_dp。
  那么这个请求发送给 GA 后,GA 显示的网页和主机名是什么?不用在这里买了。
   /test#ga_dp
127.0.0.1
  那么还有一个问题,如果这里没有发送 dp 怎么办?因为如果我们平时注意的话,一般都是在pageview中看到dl,而除非有特殊设置,我们很少看到dp
  答案是
   /test?key=123
  之所以这样改动,是因为dl是analytics.js或者gtag.js(简称GA_js库)发送的默认参数,而dp是可选参数。默认发送dl时,GA_js库会自动抓取以下浏览器参数,即:
  document.location.origin + document.location.pathname + document.location.search
  形成 dl 并发送。发送给GA后,GA服务器会对dl传递的参数进行反汇编,取出主机名和URI部分,分别赋值&amp;两个维度。
  但是如果除了默认发送的 dl 之外还指定了两个可选参数 dh(文档主机名)和 dp(文档路径),GA 会先使用指定的 dh 或 dp。
  所以对于虚拟页面的价值如何传递而纠结的同学,可以在这里安心。您可以使用综合浏览量发送位置或页面,但必须发送位置。
  Ok~这个问题就结束了,但是如果你和GA接触很久了,你可能还有一些其他的问题,比如:
  如果我在 dl 参数中传递一个随机数,例如:test:///test?protocol:test 怎么办?—— 请求无效。如果是dl参数,我传一个数字,如上,还要传dp的值吗?—— 请求有效,网页通过dp的值。如果我在A页面部署默认的GA基础代码,同时在网页出现弹窗的时候发送一个dummy page事件(B页面),弹窗有点击事件,如果我进入网页,然后触发弹窗,然后点击事件,那么此时事件所属的网页是A还是虚拟页面B——如果是用set命令设置的pageview ,此时事件所属的网页是B,不仅是弹窗上的B,而且在下面刷新页面之前的所有事件都是B。如果在默认发送浏览量中添加参数{'page'},则事件所属的页面为A,其他事件不受该页面影响。(出现这种现象的原因是GA在加载analytics.js时默认会在tracker中设置tracker的dl参数,后续事件会使用这个参数,除非被显式值覆盖。)如果我的网页中的锚点(#) 后面的信息在区分网页中起着重要的作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... 该事件所属的页面为A,其他事件不受该页面影响。(出现这种现象的原因是GA在加载analytics.js时默认会在tracker中设置tracker的dl参数,后续事件会使用这个参数,除非被显式值覆盖。)如果我的网页中的锚点(#) 后面的信息在区分网页中起着重要的作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... 该事件所属的页面为A,其他事件不受该页面影响。(出现这种现象的原因是GA在加载analytics.js时默认会在tracker中设置tracker的dl参数,后续事件会使用这个参数,除非被显式值覆盖。)如果我的网页中的锚点(#) 后面的信息在区分网页中起着重要的作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... (出现这种现象的原因是GA在加载analytics.js时默认会在tracker中设置tracker的dl参数,后续事件会使用这个参数,除非被显式值覆盖。)如果我的网页中的锚点(#) 后面的信息在区分网页中起着重要的作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... (出现这种现象的原因是GA在加载analytics.js时默认会在tracker中设置tracker的dl参数,后续事件会使用这个参数,除非被显式值覆盖。)如果我的网页中的锚点(#) 后面的信息在区分网页中起着重要的作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... ) 如果我的网页中的锚点 (#) 后面的信息对区分网页起重要作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... ) 如果我的网页中的锚点 (#) 后面的信息对区分网页起重要作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。...
  了解了这一点后,我们似乎对 &amp; 这两个指标有了更多的了解。但是我们可以再深入一点吗?
  当然,你会怎么写这个 文章
  以analytics.js为例,扩展analytics.js,看看GA是怎么得到的。
  搜索关键词 location dl后,可以找到如下代码:
  
  其他代码就省略了,当然如果你好奇,也可以关注我的另一个系列文章《谷歌analytics.js源码分析》。
  这里,Kb = '位置'
  a.set等的取值以及在对应tracker中设置参数位置为:
  
  可以看出,实际上dl的传递值是在analytics.js中设置的,不是GA账号处理的。
  ##
  现在我提到了,顺便说一句。
  登陆页面的定义众所周知,这里不再赘述。在 GA 中,着陆页定义为
  
  正常情况下,这自然是没有问题的,但是遇到意外情况,这个解释就显得有些不清楚了。
  例如:
  假设用户进入某个网站页面A,在页面上发送事件e_1,然后进入页面B。
  但是由于实际登陆页面A的页面浏览代码部署错误,导致页面浏览丢失,那么此时事件e_1的登陆页面是什么呢?
  A: (not set)
B: 网页B
  答案将在下一期揭晓,也可以私下交流心得~
  白色 白色
  

js抓取网页内容(JavaScript逆向工程如何从网络API中获取JSON格式的数据)

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

  js抓取网页内容(JavaScript逆向工程如何从网络API中获取JSON格式的数据)
  解析动态内容
  根据权威机构发布的《全球互联网无障碍审计报告》,全球约四分之三的网站内容或部分内容是通过JavaScript动态生成的,这意味着“以一种在HTML代码中找不到浏览器窗口“源代码”,说明我们以前抓取数据的方式并不能正常工作。解决这样的问题基本上有两种方案,一种是JavaScript逆向工程;另一种是渲染 JavaScript 以获取渲染的内容。
  JavaScript 逆向工程
  我们以“360图片”网站为例来说明什么是JavaScript逆向工程。其实所谓JavaScript逆向工程就是通过Ajax技术找到动态获取数据的接口。在浏览器中输入打开“360图片”的“美颜”板块,如下图所示。
  [外链图片传输失败(img-ZRl9xYmn-75)(./res/image360-website.png)]
  但是当我们在浏览器中使用右键菜单“显示网页的源代码”时,我们惊奇地发现页面的HTML代码中有一个链接。
  没有标签,那么我们看到的图片是怎么出现的呢?原来所有图片都是通过JavaScript动态加载的,在浏览器“开发者工具”的“网络”中可以找到获取这些图片数据的网络API接口,如下图所示。
  [外链图片传输失败(img-XVAx1JK3-78)(./res/api-image360.png)]
  那么结论就很简单了。只要找到这些网络API接口,就可以通过这些接口获取数据。当然,在实际开发中,我们可能还需要对这些接口的参数和接口返回的数据进行分析,以了解各个参数的含义以及返回的 JSON 数据的格式,以便我们可以在我们的爬虫。
  如何从网络API中获取JSON格式的数据,提取出我们需要的内容,在上一篇《文件与异常》中已经说明,这里不再赘述。
  使用硒
  虽然很多网站保护了自己的网络API接口,增加了获取数据的难度,但大部分只要努力够就可以进行逆向工程,但是在实际开发中,我们可以通过浏览器渲染引擎来避免这些繁琐的工作,WebKit 是一个利用的渲染引擎。
  WebKit 的代码始于 1998 年的 KHTML 项目,当时它是 Konqueror 浏览器的渲染引擎。2001 年,Apple 从这个项目的代码中衍生出 WebKit,并将其应用到 Safari 浏览器中,早期的 Chrome 浏览器也使用了内核。在 Python 中,我们可以通过 Qt 框架获取 WebKit 引擎,并使用它来渲染页面以获取动态内容。本内容请阅读文章《爬虫技术:动态页面爬取超导》。
  如果你不打算使用上面的方法来渲染页面并获取动态内容,其实还有一个替代方案可以使用自动化测试工具 Selenium,它提供了浏览器自动化的 API 接口,这样你就可以通过操纵浏览器。内容。首先,您可以使用 pip 安装 Selenium。
  pip3 install selenium
  下面以“阿里巴巴V任务”的“直播服务”为例,演示如何使用Selenium获取动态内容和抓拍主播的画面。
  import requests
from bs4 import BeautifulSoup
def main():
resp = requests.get('https://v.taobao.com/v/content/live?catetype=704&from=taonvlang')
soup = BeautifulSoup(resp.text, 'lxml')
for img_tag in soup.select('img[src]'):
print(img_tag.attrs['src'])
if __name__ == '__main__':
main()
  运行上面的程序会发现没有输出,因为页面的html代码根本找不到
  标签。接下来,我们使用 Selenium 来获取页面上的动态内容,然后提取锚点图像。
  from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
def main():
driver = webdriver.Chrome()
driver.get('https://v.taobao.com/v/content/live?catetype=704&from=taonvlang')
soup = BeautifulSoup(driver.page_source, 'lxml')
for img_tag in soup.body.select('img[src]'):
print(img_tag.attrs['src'])
if __name__ == '__main__':
main()
  在上面的程序中,我们使用 Selenium 来控制 Chrome 浏览器。如果我们要控制其他浏览器,可以创建相应的浏览器对象,比如Firefox、IE等。运行上面的程序,如果看到下图的错误信息,说明我们没有添加Chrome浏览器驱动PATH环境变量,我们也没有在程序中指定Chrome浏览器驱动的位置。
  selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chr ... /home
  为了解决以上问题,可以到Selenium的官方网站找到浏览器驱动的下载链接,下载需要的驱动。在 Linux 或 macOS 系统中,可以通过以下命令设置 PATH 环境变量,在 Windows 下配置环境变量也很简单,不清楚的可以自行理解。
  export PATH=$PATH:/Users/Hao/Downloads/Tools/chromedriver/
  其中/Users/Hao/Downloads/Tools/chromedriver/是chromedriver所在的路径。 查看全部

  js抓取网页内容(JavaScript逆向工程如何从网络API中获取JSON格式的数据)
  解析动态内容
  根据权威机构发布的《全球互联网无障碍审计报告》,全球约四分之三的网站内容或部分内容是通过JavaScript动态生成的,这意味着“以一种在HTML代码中找不到浏览器窗口“源代码”,说明我们以前抓取数据的方式并不能正常工作。解决这样的问题基本上有两种方案,一种是JavaScript逆向工程;另一种是渲染 JavaScript 以获取渲染的内容。
  JavaScript 逆向工程
  我们以“360图片”网站为例来说明什么是JavaScript逆向工程。其实所谓JavaScript逆向工程就是通过Ajax技术找到动态获取数据的接口。在浏览器中输入打开“360图片”的“美颜”板块,如下图所示。
  [外链图片传输失败(img-ZRl9xYmn-75)(./res/image360-website.png)]
  但是当我们在浏览器中使用右键菜单“显示网页的源代码”时,我们惊奇地发现页面的HTML代码中有一个链接。
  没有标签,那么我们看到的图片是怎么出现的呢?原来所有图片都是通过JavaScript动态加载的,在浏览器“开发者工具”的“网络”中可以找到获取这些图片数据的网络API接口,如下图所示。
  [外链图片传输失败(img-XVAx1JK3-78)(./res/api-image360.png)]
  那么结论就很简单了。只要找到这些网络API接口,就可以通过这些接口获取数据。当然,在实际开发中,我们可能还需要对这些接口的参数和接口返回的数据进行分析,以了解各个参数的含义以及返回的 JSON 数据的格式,以便我们可以在我们的爬虫。
  如何从网络API中获取JSON格式的数据,提取出我们需要的内容,在上一篇《文件与异常》中已经说明,这里不再赘述。
  使用硒
  虽然很多网站保护了自己的网络API接口,增加了获取数据的难度,但大部分只要努力够就可以进行逆向工程,但是在实际开发中,我们可以通过浏览器渲染引擎来避免这些繁琐的工作,WebKit 是一个利用的渲染引擎。
  WebKit 的代码始于 1998 年的 KHTML 项目,当时它是 Konqueror 浏览器的渲染引擎。2001 年,Apple 从这个项目的代码中衍生出 WebKit,并将其应用到 Safari 浏览器中,早期的 Chrome 浏览器也使用了内核。在 Python 中,我们可以通过 Qt 框架获取 WebKit 引擎,并使用它来渲染页面以获取动态内容。本内容请阅读文章《爬虫技术:动态页面爬取超导》。
  如果你不打算使用上面的方法来渲染页面并获取动态内容,其实还有一个替代方案可以使用自动化测试工具 Selenium,它提供了浏览器自动化的 API 接口,这样你就可以通过操纵浏览器。内容。首先,您可以使用 pip 安装 Selenium。
  pip3 install selenium
  下面以“阿里巴巴V任务”的“直播服务”为例,演示如何使用Selenium获取动态内容和抓拍主播的画面。
  import requests
from bs4 import BeautifulSoup
def main():
resp = requests.get('https://v.taobao.com/v/content/live?catetype=704&from=taonvlang')
soup = BeautifulSoup(resp.text, 'lxml')
for img_tag in soup.select('img[src]'):
print(img_tag.attrs['src'])
if __name__ == '__main__':
main()
  运行上面的程序会发现没有输出,因为页面的html代码根本找不到
  标签。接下来,我们使用 Selenium 来获取页面上的动态内容,然后提取锚点图像。
  from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
def main():
driver = webdriver.Chrome()
driver.get('https://v.taobao.com/v/content/live?catetype=704&from=taonvlang')
soup = BeautifulSoup(driver.page_source, 'lxml')
for img_tag in soup.body.select('img[src]'):
print(img_tag.attrs['src'])
if __name__ == '__main__':
main()
  在上面的程序中,我们使用 Selenium 来控制 Chrome 浏览器。如果我们要控制其他浏览器,可以创建相应的浏览器对象,比如Firefox、IE等。运行上面的程序,如果看到下图的错误信息,说明我们没有添加Chrome浏览器驱动PATH环境变量,我们也没有在程序中指定Chrome浏览器驱动的位置。
  selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chr ... /home
  为了解决以上问题,可以到Selenium的官方网站找到浏览器驱动的下载链接,下载需要的驱动。在 Linux 或 macOS 系统中,可以通过以下命令设置 PATH 环境变量,在 Windows 下配置环境变量也很简单,不清楚的可以自行理解。
  export PATH=$PATH:/Users/Hao/Downloads/Tools/chromedriver/
  其中/Users/Hao/Downloads/Tools/chromedriver/是chromedriver所在的路径。

js抓取网页内容(使用urllib+phantomjs是什么呢?使用js动态加载的网页)

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

  js抓取网页内容(使用urllib+phantomjs是什么呢?使用js动态加载的网页)
  我们在进行网页抓取时,一般使用 urllib 和 urllib2 来满足我们的大部分需求。
  但是有时我们会遇到使用js动态加载的网页。你会发现 urllib 只能抓取部分空白的网页。就像下面百度图片的结果页面:
  审查元素后, . 发现在百度图片中,显示图片的div是:pullimages
  此 div 内的内容是动态加载的。但是使用 urllib&amp;urllib2 不能爬取。
  要抓取动态加载的元素,首先考虑使用 selenium 调用浏览器进行抓取。
  而我们的运行环境是linux,最理想的方式是无界面抓取。
  所以使用 selenium+phantomjs 进行无界面抓取
  什么是phantomjs?它是基于webkit内核的无头浏览器,即没有UI界面,即是浏览器
  selenium和phantomjs的安装和配置可以google,这里就不多说了。
  代码显示如下:
  from selenium import webdriver
def fetchBdImage(query):
#如果不方便配置环境变量。填入phantomjs的绝对路径也可以
driver =webdriver.PhantomJS(executable_path='/bin/phantomjs/bin/phantomjs')
#抓取百度图片页面,query由参数决定
url = 'http://image.baidu.com/i?ie=utf-8&word='+query;
driver.get(url)
#这就是获取页面内容了,与urllib2.urlopen().read()的效果是类似的。
html = driver.page_source
#抓取结束,记得释放资源
driver.quit()
#返回抓取到的页面内容
return html
  到这里。抓取成功。
  【备注】:linux下使用phantomJS,windows下可以使用chrome、firefox等浏览器 查看全部

  js抓取网页内容(使用urllib+phantomjs是什么呢?使用js动态加载的网页)
  我们在进行网页抓取时,一般使用 urllib 和 urllib2 来满足我们的大部分需求。
  但是有时我们会遇到使用js动态加载的网页。你会发现 urllib 只能抓取部分空白的网页。就像下面百度图片的结果页面:
  审查元素后, . 发现在百度图片中,显示图片的div是:pullimages
  此 div 内的内容是动态加载的。但是使用 urllib&amp;urllib2 不能爬取。
  要抓取动态加载的元素,首先考虑使用 selenium 调用浏览器进行抓取。
  而我们的运行环境是linux,最理想的方式是无界面抓取。
  所以使用 selenium+phantomjs 进行无界面抓取
  什么是phantomjs?它是基于webkit内核的无头浏览器,即没有UI界面,即是浏览器
  selenium和phantomjs的安装和配置可以google,这里就不多说了。
  代码显示如下:
  from selenium import webdriver
def fetchBdImage(query):
#如果不方便配置环境变量。填入phantomjs的绝对路径也可以
driver =webdriver.PhantomJS(executable_path='/bin/phantomjs/bin/phantomjs')
#抓取百度图片页面,query由参数决定
url = 'http://image.baidu.com/i?ie=utf-8&word='+query;
driver.get(url)
#这就是获取页面内容了,与urllib2.urlopen().read()的效果是类似的。
html = driver.page_source
#抓取结束,记得释放资源
driver.quit()
#返回抓取到的页面内容
return html
  到这里。抓取成功。
  【备注】:linux下使用phantomJS,windows下可以使用chrome、firefox等浏览器

js抓取网页内容(网站越小频繁出现“异常提示”怎么办?(图))

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

  js抓取网页内容(网站越小频繁出现“异常提示”怎么办?(图))
  网站 越小,出现问题的概率越低。反之,网站 规模越大,出现问题的概率越高。自百度“爬取异常”检查以来,很多站长发现网站总是频繁出现“异常提示”。而这个问题往往是网站的规模越大,问题越严重。那么,这里发生了什么?A5 Marketing 今天带您揭开面纱。
  一:出现50X类型错误:
  
  此类链接的共同特点之一是有 504、500、502 个问题未显示给搜索引擎。打开后一切正常。那么蜘蛛为什么会报错提醒呢?
  这类问题100%是服务器造成的,对于某个状态码的含义,请百度直接搜索,交给技术解决。如果技术还是不能解决,建议更换服务器。
  二:爬取时出现DNS错误
  很多小白发现网站打不开会找服务商,但忽略了一点:域名DNS服务器也会有问题!当网站出现问题时,第一时间确定问题是什么。如果是DNS问题,建议立即更换DSN。友情提示:DNSPOD 被广泛使用。笔者最近监控空闲节点有些超时,也提醒DSNPOD解决。
  另外,目前很多站长喜欢用“一些云加速”,但笔者也想说:目前很多所谓的云加速还不成熟,尤其是那些免费的。糟糕的。
  友情提示:如果你的网站没有受到严重攻击,请不要使用所谓的云加速,追求花样,更容易伤到自己。在域名DSN方面,万网(阿里)目前做的是最稳定的。
  3:存在抓取超时问题
  在A5营销的SEO诊断中,我们特别注重用户体验。其中一点非常重要:用户打开页面的速度。如果页面无法在第一时间打开页面,就会失去访问资格,跳转到Others网站上去。那么蜘蛛呢?也是如此。如果第一时间抢不到,就会出现抢超时的问题。
  而这种爬取超时往往是由于带宽不足、页面过大造成的,我们建议: A:尽量在不影响图片质量的情况下压缩图片,上传的时候再压缩。B:减少使用JS脚本等文件类型,或者将它们组合起来。C:控制页面的长度,尤其是网站首页。D. 内部链接的数量。一个页面上的内部链接数量通常不建议超过 500 个。
  其实建站选择成熟的方案,稳定的IDC,只要你的网站规模不是特别大,基本上这些问题都可以避免。恐怕我想花最少的钱,得到最好的服务。这个世界有多久没有这种东西了? 查看全部

  js抓取网页内容(网站越小频繁出现“异常提示”怎么办?(图))
  网站 越小,出现问题的概率越低。反之,网站 规模越大,出现问题的概率越高。自百度“爬取异常”检查以来,很多站长发现网站总是频繁出现“异常提示”。而这个问题往往是网站的规模越大,问题越严重。那么,这里发生了什么?A5 Marketing 今天带您揭开面纱。
  一:出现50X类型错误:
  
  此类链接的共同特点之一是有 504、500、502 个问题未显示给搜索引擎。打开后一切正常。那么蜘蛛为什么会报错提醒呢?
  这类问题100%是服务器造成的,对于某个状态码的含义,请百度直接搜索,交给技术解决。如果技术还是不能解决,建议更换服务器。
  二:爬取时出现DNS错误
  很多小白发现网站打不开会找服务商,但忽略了一点:域名DNS服务器也会有问题!当网站出现问题时,第一时间确定问题是什么。如果是DNS问题,建议立即更换DSN。友情提示:DNSPOD 被广泛使用。笔者最近监控空闲节点有些超时,也提醒DSNPOD解决。
  另外,目前很多站长喜欢用“一些云加速”,但笔者也想说:目前很多所谓的云加速还不成熟,尤其是那些免费的。糟糕的。
  友情提示:如果你的网站没有受到严重攻击,请不要使用所谓的云加速,追求花样,更容易伤到自己。在域名DSN方面,万网(阿里)目前做的是最稳定的。
  3:存在抓取超时问题
  在A5营销的SEO诊断中,我们特别注重用户体验。其中一点非常重要:用户打开页面的速度。如果页面无法在第一时间打开页面,就会失去访问资格,跳转到Others网站上去。那么蜘蛛呢?也是如此。如果第一时间抢不到,就会出现抢超时的问题。
  而这种爬取超时往往是由于带宽不足、页面过大造成的,我们建议: A:尽量在不影响图片质量的情况下压缩图片,上传的时候再压缩。B:减少使用JS脚本等文件类型,或者将它们组合起来。C:控制页面的长度,尤其是网站首页。D. 内部链接的数量。一个页面上的内部链接数量通常不建议超过 500 个。
  其实建站选择成熟的方案,稳定的IDC,只要你的网站规模不是特别大,基本上这些问题都可以避免。恐怕我想花最少的钱,得到最好的服务。这个世界有多久没有这种东西了?

js抓取网页内容(Python基础知识:元素而不仅仅是标题元素是什么)

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

  js抓取网页内容(Python基础知识:元素而不仅仅是标题元素是什么)
  元素,而不仅仅是标题元素。
  使用每个 Beautiful Soup 对象附带的 .parent 属性,您可以直观地逐步浏览 DOM 结构并使用您需要的元素。您还可以以类似的方式访问子元素和兄弟元素。阅读导航树以获取更多信息。
  从 HTML 元素中提取属性
  此时,您的 Python 脚本已抓取该站点并过滤其 HTML 以查找相关职位发布。做得好!但是,申请工作的链接仍然缺失。
  检查页面时,您在每张卡片的底部发现了两个链接。如果您处理链接元素的方式与处理其他元素的方式相同,您将不会获得您感兴趣的 URL:
  for job_element in python_job_elements:
# -- snip --
links = job_element.find_all("a")
for link in links:
print(link.text.strip())
  如果您运行此代码片段,那么您将获得链接文本 Learn、Apply 而不是关联的 URL。
  这是因为 .text 属性只留下 HTML 元素的可见内容。它去除所有 HTML 标记,包括收录 URL 的 HTML 属性,只留下链接文本。要改为获取 URL,您需要提取 HTML 属性之一的值,而不是丢弃它。
  链接元素的 URL 与 href 属性相关联。您要查找的特定 URL 是单个职位发布的 HTML 底部的第二个 href 标记的属性值:
  

Learn
Apply


  首先获取工作卡中的所有元素。href 然后,使用方括号表示法提取它们的属性值:
  for job_element in python_job_elements:
# -- snip --
links = job_element.find_all("a")
for link in links:
link_url = link["href"]
print(f"Apply here: {link_url}\n")
  在此代码段中,您首先从每个过滤的职位发布中获取所有链接。然后提取收录 URL 的 href 属性,使用 ["href"] 并将其打印到控制台。
  在下面的练习块中,您可以找到挑战说明,以优化您收到的链接结果:
  练习:优化结果显示/隐藏
  每张工作卡都有两个与之关联的链接。您正在寻找的只是第二个链接。如何编辑上面显示的代码片段,以便始终只采集第二个链接的 URL?
  单击解决方案块以阅读此练习的可能解决方案:
  解决方案:优化您的结果显示/隐藏
  要获取每个工作卡的第二个链接的 URL,您可以使用以下代码段:
  for job_element in python_job_elements:
link_url = job_element.find_all("a")[1]["href"]
print(f"Apply here: {link_url}\n")
  您正在通过索引 ( ) 从结果中选择第二个链接元素。然后,您将使用方括号表示法直接提取 URL 并对属性 ( ) 进行寻址。.find_all()[1]href["href"]
  您还可以使用相同的方括号表示法来提取其他 HTML 属性。
  保持练习
  如果您在本教程旁边编写了代码,那么您可以按原样运行您的脚本,您会看到终端中弹出虚假的作业消息。您的下一步是处理现实生活中的工作委员会!要继续练习您的新技能,请使用以下任何或所有 网站 重新访问网络抓取过程:
  链接的 网站 将其搜索结果作为静态 HTML 响应返回,类似于 Fake Python 工作板。所以你可以用美丽的汤把它们刮掉。
  使用这些其他站点之一从顶部重新开始阅读本教程。您会看到每个 网站 的结构都不同,您需要以稍微不同的方式重构代码以获得所需的数据。接受这个挑战是练习刚刚学到的概念的好方法。虽然它可能会让你大汗淋漓,但你的编码技能会因此而变得更强!
  在您第二次尝试时,您还可以探索 Beautiful Soup 的其他功能。使用文档作为您的指南和灵感。额外的练习将帮助您更熟练地使用 Python、.requests 和 Beautiful Soup 进行网络抓取。
  为了结束您的网络抓取之旅,您可以对您的代码进行最后的改造,并创建一个命令行界面 (CLI) 应用程序,该应用程序可以抓取其中一个工作板,并允许您在每次执行时键入按关键字过滤结果。您的 CLI 工具可让您搜索特定类型或位置的工作。
  如果您有兴趣了解如何使脚本适应命令行界面,请查看如何使用 argparse 在 Python 中构建命令行界面。
  综上所述
  requests 库为您提供了一种使用 Python 从 Internet 获取静态 HTML 的用户友好方式。然后,您可以使用另一个名为 Beautiful Soup 的包来解析 HTML。这两个软件包都是您的网络抓取冒险值得信赖且有用的伴侣。您会发现 Beautiful Soup 将满足您的大部分解析需求,包括导航和高级搜索。
  在本教程中,您学习了如何使用 Python 请求和 Beautiful Soup 从 Web 抓取数据。您构建了一个脚本,该脚本从 Internet 获取招聘信息,并从头到尾执行完整的网络抓取过程。
  你已经学会了如何:
  考虑到这个广泛的管道和工具包中的两个强大的库,您可以出去看看您还能获取哪些其他 网站。玩得开心,并始终记住尊重和负责任地使用您的编程技能。
  您可以通过单击下面的链接下载您在本教程中构建的示例脚本的源代码: 查看全部

  js抓取网页内容(Python基础知识:元素而不仅仅是标题元素是什么)
  元素,而不仅仅是标题元素。
  使用每个 Beautiful Soup 对象附带的 .parent 属性,您可以直观地逐步浏览 DOM 结构并使用您需要的元素。您还可以以类似的方式访问子元素和兄弟元素。阅读导航树以获取更多信息。
  从 HTML 元素中提取属性
  此时,您的 Python 脚本已抓取该站点并过滤其 HTML 以查找相关职位发布。做得好!但是,申请工作的链接仍然缺失。
  检查页面时,您在每张卡片的底部发现了两个链接。如果您处理链接元素的方式与处理其他元素的方式相同,您将不会获得您感兴趣的 URL:
  for job_element in python_job_elements:
# -- snip --
links = job_element.find_all("a")
for link in links:
print(link.text.strip())
  如果您运行此代码片段,那么您将获得链接文本 Learn、Apply 而不是关联的 URL。
  这是因为 .text 属性只留下 HTML 元素的可见内容。它去除所有 HTML 标记,包括收录 URL 的 HTML 属性,只留下链接文本。要改为获取 URL,您需要提取 HTML 属性之一的值,而不是丢弃它。
  链接元素的 URL 与 href 属性相关联。您要查找的特定 URL 是单个职位发布的 HTML 底部的第二个 href 标记的属性值:
  

Learn
Apply


  首先获取工作卡中的所有元素。href 然后,使用方括号表示法提取它们的属性值:
  for job_element in python_job_elements:
# -- snip --
links = job_element.find_all("a")
for link in links:
link_url = link["href"]
print(f"Apply here: {link_url}\n")
  在此代码段中,您首先从每个过滤的职位发布中获取所有链接。然后提取收录 URL 的 href 属性,使用 ["href"] 并将其打印到控制台。
  在下面的练习块中,您可以找到挑战说明,以优化您收到的链接结果:
  练习:优化结果显示/隐藏
  每张工作卡都有两个与之关联的链接。您正在寻找的只是第二个链接。如何编辑上面显示的代码片段,以便始终只采集第二个链接的 URL?
  单击解决方案块以阅读此练习的可能解决方案:
  解决方案:优化您的结果显示/隐藏
  要获取每个工作卡的第二个链接的 URL,您可以使用以下代码段:
  for job_element in python_job_elements:
link_url = job_element.find_all("a")[1]["href"]
print(f"Apply here: {link_url}\n")
  您正在通过索引 ( ) 从结果中选择第二个链接元素。然后,您将使用方括号表示法直接提取 URL 并对属性 ( ) 进行寻址。.find_all()[1]href["href"]
  您还可以使用相同的方括号表示法来提取其他 HTML 属性。
  保持练习
  如果您在本教程旁边编写了代码,那么您可以按原样运行您的脚本,您会看到终端中弹出虚假的作业消息。您的下一步是处理现实生活中的工作委员会!要继续练习您的新技能,请使用以下任何或所有 网站 重新访问网络抓取过程:
  链接的 网站 将其搜索结果作为静态 HTML 响应返回,类似于 Fake Python 工作板。所以你可以用美丽的汤把它们刮掉。
  使用这些其他站点之一从顶部重新开始阅读本教程。您会看到每个 网站 的结构都不同,您需要以稍微不同的方式重构代码以获得所需的数据。接受这个挑战是练习刚刚学到的概念的好方法。虽然它可能会让你大汗淋漓,但你的编码技能会因此而变得更强!
  在您第二次尝试时,您还可以探索 Beautiful Soup 的其他功能。使用文档作为您的指南和灵感。额外的练习将帮助您更熟练地使用 Python、.requests 和 Beautiful Soup 进行网络抓取。
  为了结束您的网络抓取之旅,您可以对您的代码进行最后的改造,并创建一个命令行界面 (CLI) 应用程序,该应用程序可以抓取其中一个工作板,并允许您在每次执行时键入按关键字过滤结果。您的 CLI 工具可让您搜索特定类型或位置的工作。
  如果您有兴趣了解如何使脚本适应命令行界面,请查看如何使用 argparse 在 Python 中构建命令行界面。
  综上所述
  requests 库为您提供了一种使用 Python 从 Internet 获取静态 HTML 的用户友好方式。然后,您可以使用另一个名为 Beautiful Soup 的包来解析 HTML。这两个软件包都是您的网络抓取冒险值得信赖且有用的伴侣。您会发现 Beautiful Soup 将满足您的大部分解析需求,包括导航和高级搜索。
  在本教程中,您学习了如何使用 Python 请求和 Beautiful Soup 从 Web 抓取数据。您构建了一个脚本,该脚本从 Internet 获取招聘信息,并从头到尾执行完整的网络抓取过程。
  你已经学会了如何:
  考虑到这个广泛的管道和工具包中的两个强大的库,您可以出去看看您还能获取哪些其他 网站。玩得开心,并始终记住尊重和负责任地使用您的编程技能。
  您可以通过单击下面的链接下载您在本教程中构建的示例脚本的源代码:

js抓取网页内容(Javascript元素在网页上的确切位置教程总结元素的相关知识)

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

  js抓取网页内容(Javascript元素在网页上的确切位置教程总结元素的相关知识)
  在创建网页的过程中,您有时需要知道某个元素在网页上的确切位置。
  下面的教程总结了Javascript在网页定位方面的知识。
  一、网页大小和浏览器窗口大小
  首先,必须澄清两个基本概念。
  一个网页的整个区域就是它的大小。通常,网页的大小由内容和 CSS 样式表决定。
  浏览器窗口的大小是指在浏览器窗口中看到的网页区域的一部分,也称为视口。
  显然,如果网页的内容可以在浏览器窗口中完全显示(即没有滚动条),那么网页的大小和浏览器窗口的大小是相等的。如果不能全部显示,滚动浏览器窗口可以显示网页的各个部分。
  二、获取网页大小
  网页上的每个元素都有 clientHeight 和 clientWidth 属性。这两个属性指的是元素的内容部分加上内边距所占据的可视区域,不包括边框和滚动条所占据的空间。
  
  (图一clientHeight和clientWidth属性)
  因此,文档元素的clientHeight 和clientWidth 属性代表了网页的大小。
  函数 getViewport(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.clientWidth,
  高度:document.body.clientHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.clientWidth,
  高度:document.documentElement.clientHeight
  }
  }
  }
  上面的getViewport函数可以返回浏览器窗口的高度和宽度。使用时要注意三个地方:
  1)该函数必须在页面加载完毕后运行,否则还没有生成文档对象,浏览器会报错。
  2)在大多数情况下,document.documentElement.clientWidth 返回正确的值。但是在IE6的quirks模式下,document.body.clientWidth返回正确的值,所以函数中加入了对document模式的判断。
  3)clientWidth 和 clientHeight 是只读属性,不能赋值。
  三、另一种获取页面大小的方法
  网页上的每个元素也有scrollHeight和scrollWidth属性,它们指的是包括滚动条在内的元素的可视区域。
  那么,document对象的scrollHeight和scrollWidth属性就是网页的大小,也就是滚动条滚动的所有长度和宽度。
  在getViewport() 函数之后,可以编写getPagearea() 函数。
  函数getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.scrollWidth,
  高度:document.body.scrollHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.scrollWidth,
  高度:document.documentElement.scrollHeight
  }
  }
  }
  但是,此功能存在问题。如果网页的内容可以在浏览器窗口中完全显示而没有滚动条,那么网页的clientWidth和scrollWidth应该相等。但实际上不同的浏览器有不同的处理,这两个值不一定相等。因此,我们需要取其中较大的值,所以我们需要重写getPagearea()函数。
  函数getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:Math.max(document.body.scrollWidth,
  document.body.clientWidth),
  高度:Math.max(document.body.scrollHeight,
  文档.body.clientHeight)
  }
  } 别的 {
  返回 {
  宽度:Math.max(document.documentElement.scrollWidth,
  document.documentElement.clientWidth),
  高度:Math.max(document.documentElement.scrollHeight,
  document.documentElement.clientHeight)
  }
  }
  }
  四、获取网页元素的绝对位置
  网页元素的绝对位置是指该元素的左上角相对于整个网页左上角的坐标。这个绝对位置只能通过计算得到。
  首先,每个元素都有offsetTop和offsetLeft属性,表示元素左上角到父容器(offsetParent对象)左上角的距离。所以,只需要将这两个值累加就可以得到元素的绝对坐标。
  
  (图2 offsetTop 和 offsetLeft 属性)
  下面两个函数可以用来获取绝对位置的横坐标和纵坐标。
  函数getElementLeft(元素){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== null){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  返回实际左;
  }
  函数getElementTop(元素){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== null){
  actualTop += current.offsetTop;
  当前 = current.offsetParent;
  }
  返回实际顶部;
  }
  由于在表格和 iframe 中,offsetParent 对象不一定等于父容器,因此上述功能不适用于表格和 iframe 中的元素。
  五、获取网页元素的相对位置
  网页元素的相对位置,指的是该元素的左上角相对于浏览器窗口左上角的坐标。
  有了绝对位置,就很容易得到相对位置,只要从页面滚动条的滚动距离中减去绝对坐标即可。滚动条的垂直距离是文档对象的 scrollTop 属性;滚动条的水平距离是文档对象的 scrollLeft 属性。
  
  (图 3 scrollTop 和 scrollLeft 属性)
  相应地重写上一节中的两个函数:
  函数getElementViewLeft(元素){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== null){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollLeft=document.body.scrollLeft;
  } 别的 {
  var elementScrollLeft=document.documentElement.scrollLeft;
  }
  返回实际左元素滚动左;
  }
  函数getElementViewTop(元素){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== null){
  actualTop += current.offsetTop;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollTop=document.body.scrollTop;
  } 别的 {
  var elementScrollTop=document.documentElement.scrollTop;
  }
  返回实际顶部元素滚动顶部;
  }
  scrollTop 和 scrollLeft 属性是可赋值的,并且会立即自动将网页滚动到相应的位置,因此它们可以用来改变网页元素的相对位置。此外,element.scrollIntoView() 方法也有类似的效果,可以让网页元素出现在浏览器窗口的左上角。
  六、快速获取元素位置的方法
  除了上面的功能之外,还有一个快速的方法可以一次获取网页元素的位置。
  那就是使用 getBoundingClientRect() 方法。它返回一个收录四个属性的对象,left、right、top、bottom,分别对应于元素的左上角和右下角相对于浏览器窗口(视口)左上角的距离。
  所以,页面元素的相对位置是
  var X= this.getBoundingClientRect().left;
  var Y =this.getBoundingClientRect().top;
  添加滚动距离以获得绝对位置
  var X= this.getBoundingClientRect().left+document.documentElement.scrollLeft;
  var Y =this.getBoundingClientRect().top+document.documentElement.scrollTop;
  目前,IE、Firefox 3.0+、Opera 9.5+ 支持此方法,Firefox 2.x、Safari、Chrome、Konqueror 不支持。
  (超过) 查看全部

  js抓取网页内容(Javascript元素在网页上的确切位置教程总结元素的相关知识)
  在创建网页的过程中,您有时需要知道某个元素在网页上的确切位置。
  下面的教程总结了Javascript在网页定位方面的知识。
  一、网页大小和浏览器窗口大小
  首先,必须澄清两个基本概念。
  一个网页的整个区域就是它的大小。通常,网页的大小由内容和 CSS 样式表决定。
  浏览器窗口的大小是指在浏览器窗口中看到的网页区域的一部分,也称为视口。
  显然,如果网页的内容可以在浏览器窗口中完全显示(即没有滚动条),那么网页的大小和浏览器窗口的大小是相等的。如果不能全部显示,滚动浏览器窗口可以显示网页的各个部分。
  二、获取网页大小
  网页上的每个元素都有 clientHeight 和 clientWidth 属性。这两个属性指的是元素的内容部分加上内边距所占据的可视区域,不包括边框和滚动条所占据的空间。
  
  (图一clientHeight和clientWidth属性)
  因此,文档元素的clientHeight 和clientWidth 属性代表了网页的大小。
  函数 getViewport(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.clientWidth,
  高度:document.body.clientHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.clientWidth,
  高度:document.documentElement.clientHeight
  }
  }
  }
  上面的getViewport函数可以返回浏览器窗口的高度和宽度。使用时要注意三个地方:
  1)该函数必须在页面加载完毕后运行,否则还没有生成文档对象,浏览器会报错。
  2)在大多数情况下,document.documentElement.clientWidth 返回正确的值。但是在IE6的quirks模式下,document.body.clientWidth返回正确的值,所以函数中加入了对document模式的判断。
  3)clientWidth 和 clientHeight 是只读属性,不能赋值。
  三、另一种获取页面大小的方法
  网页上的每个元素也有scrollHeight和scrollWidth属性,它们指的是包括滚动条在内的元素的可视区域。
  那么,document对象的scrollHeight和scrollWidth属性就是网页的大小,也就是滚动条滚动的所有长度和宽度。
  在getViewport() 函数之后,可以编写getPagearea() 函数。
  函数getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.scrollWidth,
  高度:document.body.scrollHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.scrollWidth,
  高度:document.documentElement.scrollHeight
  }
  }
  }
  但是,此功能存在问题。如果网页的内容可以在浏览器窗口中完全显示而没有滚动条,那么网页的clientWidth和scrollWidth应该相等。但实际上不同的浏览器有不同的处理,这两个值不一定相等。因此,我们需要取其中较大的值,所以我们需要重写getPagearea()函数。
  函数getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:Math.max(document.body.scrollWidth,
  document.body.clientWidth),
  高度:Math.max(document.body.scrollHeight,
  文档.body.clientHeight)
  }
  } 别的 {
  返回 {
  宽度:Math.max(document.documentElement.scrollWidth,
  document.documentElement.clientWidth),
  高度:Math.max(document.documentElement.scrollHeight,
  document.documentElement.clientHeight)
  }
  }
  }
  四、获取网页元素的绝对位置
  网页元素的绝对位置是指该元素的左上角相对于整个网页左上角的坐标。这个绝对位置只能通过计算得到。
  首先,每个元素都有offsetTop和offsetLeft属性,表示元素左上角到父容器(offsetParent对象)左上角的距离。所以,只需要将这两个值累加就可以得到元素的绝对坐标。
  
  (图2 offsetTop 和 offsetLeft 属性)
  下面两个函数可以用来获取绝对位置的横坐标和纵坐标。
  函数getElementLeft(元素){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== null){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  返回实际左;
  }
  函数getElementTop(元素){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== null){
  actualTop += current.offsetTop;
  当前 = current.offsetParent;
  }
  返回实际顶部;
  }
  由于在表格和 iframe 中,offsetParent 对象不一定等于父容器,因此上述功能不适用于表格和 iframe 中的元素。
  五、获取网页元素的相对位置
  网页元素的相对位置,指的是该元素的左上角相对于浏览器窗口左上角的坐标。
  有了绝对位置,就很容易得到相对位置,只要从页面滚动条的滚动距离中减去绝对坐标即可。滚动条的垂直距离是文档对象的 scrollTop 属性;滚动条的水平距离是文档对象的 scrollLeft 属性。
  
  (图 3 scrollTop 和 scrollLeft 属性)
  相应地重写上一节中的两个函数:
  函数getElementViewLeft(元素){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== null){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollLeft=document.body.scrollLeft;
  } 别的 {
  var elementScrollLeft=document.documentElement.scrollLeft;
  }
  返回实际左元素滚动左;
  }
  函数getElementViewTop(元素){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== null){
  actualTop += current.offsetTop;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollTop=document.body.scrollTop;
  } 别的 {
  var elementScrollTop=document.documentElement.scrollTop;
  }
  返回实际顶部元素滚动顶部;
  }
  scrollTop 和 scrollLeft 属性是可赋值的,并且会立即自动将网页滚动到相应的位置,因此它们可以用来改变网页元素的相对位置。此外,element.scrollIntoView() 方法也有类似的效果,可以让网页元素出现在浏览器窗口的左上角。
  六、快速获取元素位置的方法
  除了上面的功能之外,还有一个快速的方法可以一次获取网页元素的位置。
  那就是使用 getBoundingClientRect() 方法。它返回一个收录四个属性的对象,left、right、top、bottom,分别对应于元素的左上角和右下角相对于浏览器窗口(视口)左上角的距离。
  所以,页面元素的相对位置是
  var X= this.getBoundingClientRect().left;
  var Y =this.getBoundingClientRect().top;
  添加滚动距离以获得绝对位置
  var X= this.getBoundingClientRect().left+document.documentElement.scrollLeft;
  var Y =this.getBoundingClientRect().top+document.documentElement.scrollTop;
  目前,IE、Firefox 3.0+、Opera 9.5+ 支持此方法,Firefox 2.x、Safari、Chrome、Konqueror 不支持。
  (超过)

js抓取网页内容(一个微信小程序的云开发功能是不需要前端搭建服务器)

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

  js抓取网页内容(一个微信小程序的云开发功能是不需要前端搭建服务器)
  最近在研究微信小程序的云开发功能。云开发最大的优势就是不需要搭建前端服务器,可以利用云的能力编写一个可以从零启动的微信小程序,从而避免了购买服务器的成本。个人觉得从前端到后端开发微信小程序是个不错的选择。一天就能上线一个微信小程序。
  云开发的优势
  云开发为开发者提供完整的云支持,弱化后端和运维的概念,利用平台提供的API进行核心业务开发,无需搭建服务器,实现快速上线和迭代。同时,此功能与开发人员已经使用的云服务兼容,而不是相互排斥。
  云开发目前提供三种基本能力支持:
  云功能:代码运行在云端,微信私有协议自然认证,开发者只需要编写自己的业务逻辑代码数据库:可以在小程序前端操作的JSON数据库,云端读写小程序前端上传/下载云文件,并在云开发控制台中可视化管理。
  嗯,介绍了这么多云开发的知识,感性的同学可以学习一下。官方文档地址:
  网页内容捕获
  小程序是关于回答问题的,所以问题的来源就是问题。上网一搜,一个接一个的发帖是一种方法,但是就是这么重复的工作,估计发帖10年左右,就想放弃了。所以我想到了网络抓取。只需拿起你之前学过的节点。
  必备工具:再见。一个类似于服务器端 JQuery 的包。主要用于分析和过滤爬取的内容。Node 的 fs 模块。该模块带有用于读取和写入文件的节点。这用于将解析后的数据写入 json 文件。Axios(非必需)。用于抓取 网站 的 HTML 页面。由于我想要的数据是通过点击网页上的一个按钮来呈现的,所以直接访问这个网站是无法得到的。但是您只能复制您想要的内容,将其保存为字符串,然后解析该字符串。
  接下来可以使用npm init来初始化一个node项目,一路回去之后就可以生成一个package.json文件了。然后 npm install -save axioscheerio 来安装 cherio 和 axios 包。
  关键是使用cheerio来实现类似jQuery的功能。只需点击你刮过cheerio.load(quesitons)的内容,然后你就可以根据jquery获取dom并组装你想要的数据。
  最后,使用 fs.writeFile 将数据保存在 json 文件中,就完成了。
  具体代码如下:
  让 axios = 要求(axios);
  让 cherio = 要求(cherio);
  让 fs = 要求(fs);
  //我的html结构大致如下,有很多条数据。
  不断的问题=
  `;
  常量 $=cheerio.load(问题);
  var arr = [];
  for(var I=0; i 300I){ var obj={ }; obj.questions=$(#qi)。查找(.问题)。文本(); 目的。A=$($(#qi).Find(.answer)[0])。文本(); 目的。B=$($(#qi).Find(.answer)[1])。文本(); 目的。C=$($(#qi).Find(.answer)[2])。文本(); 目的。D=$($(#qi).Find(.answer)[3])。text();obj.index=I 1;obj.answer=$($(#qi).find(.answer)[0])。属性(值)=1?答:$($(#qi).Find(.answer)[1])。属性(值)=1?B : $($(#qi).Find(.answer)[2])。属性(值)=1?c:D; arr.push(obj); }
  fs.writeFile(poem.json, JSON.stringify(arr), err={ if(err) throw err; Console.log(json文件保存成功!);
  });
  保存到json的文件格式如下,这样就可以通过json文件上传到云服务器了。
  
  注意事项
  在微信小程序云开发的数据库中,需要注意上传的json文件的数据格式。在此之前,我们总是提示格式错误。后来我们发现JSON数据不是数组,而是类似于JSON Lines,即每个记录对象用n隔开,而不是逗号。因此,在上传成功之前,需要对节点写入的json文件做一点处理。 查看全部

  js抓取网页内容(一个微信小程序的云开发功能是不需要前端搭建服务器)
  最近在研究微信小程序的云开发功能。云开发最大的优势就是不需要搭建前端服务器,可以利用云的能力编写一个可以从零启动的微信小程序,从而避免了购买服务器的成本。个人觉得从前端到后端开发微信小程序是个不错的选择。一天就能上线一个微信小程序。
  云开发的优势
  云开发为开发者提供完整的云支持,弱化后端和运维的概念,利用平台提供的API进行核心业务开发,无需搭建服务器,实现快速上线和迭代。同时,此功能与开发人员已经使用的云服务兼容,而不是相互排斥。
  云开发目前提供三种基本能力支持:
  云功能:代码运行在云端,微信私有协议自然认证,开发者只需要编写自己的业务逻辑代码数据库:可以在小程序前端操作的JSON数据库,云端读写小程序前端上传/下载云文件,并在云开发控制台中可视化管理。
  嗯,介绍了这么多云开发的知识,感性的同学可以学习一下。官方文档地址:
  网页内容捕获
  小程序是关于回答问题的,所以问题的来源就是问题。上网一搜,一个接一个的发帖是一种方法,但是就是这么重复的工作,估计发帖10年左右,就想放弃了。所以我想到了网络抓取。只需拿起你之前学过的节点。
  必备工具:再见。一个类似于服务器端 JQuery 的包。主要用于分析和过滤爬取的内容。Node 的 fs 模块。该模块带有用于读取和写入文件的节点。这用于将解析后的数据写入 json 文件。Axios(非必需)。用于抓取 网站 的 HTML 页面。由于我想要的数据是通过点击网页上的一个按钮来呈现的,所以直接访问这个网站是无法得到的。但是您只能复制您想要的内容,将其保存为字符串,然后解析该字符串。
  接下来可以使用npm init来初始化一个node项目,一路回去之后就可以生成一个package.json文件了。然后 npm install -save axioscheerio 来安装 cherio 和 axios 包。
  关键是使用cheerio来实现类似jQuery的功能。只需点击你刮过cheerio.load(quesitons)的内容,然后你就可以根据jquery获取dom并组装你想要的数据。
  最后,使用 fs.writeFile 将数据保存在 json 文件中,就完成了。
  具体代码如下:
  让 axios = 要求(axios);
  让 cherio = 要求(cherio);
  让 fs = 要求(fs);
  //我的html结构大致如下,有很多条数据。
  不断的问题=
  `;
  常量 $=cheerio.load(问题);
  var arr = [];
  for(var I=0; i 300I){ var obj={ }; obj.questions=$(#qi)。查找(.问题)。文本(); 目的。A=$($(#qi).Find(.answer)[0])。文本(); 目的。B=$($(#qi).Find(.answer)[1])。文本(); 目的。C=$($(#qi).Find(.answer)[2])。文本(); 目的。D=$($(#qi).Find(.answer)[3])。text();obj.index=I 1;obj.answer=$($(#qi).find(.answer)[0])。属性(值)=1?答:$($(#qi).Find(.answer)[1])。属性(值)=1?B : $($(#qi).Find(.answer)[2])。属性(值)=1?c:D; arr.push(obj); }
  fs.writeFile(poem.json, JSON.stringify(arr), err={ if(err) throw err; Console.log(json文件保存成功!);
  });
  保存到json的文件格式如下,这样就可以通过json文件上传到云服务器了。
  
  注意事项
  在微信小程序云开发的数据库中,需要注意上传的json文件的数据格式。在此之前,我们总是提示格式错误。后来我们发现JSON数据不是数组,而是类似于JSON Lines,即每个记录对象用n隔开,而不是逗号。因此,在上传成功之前,需要对节点写入的json文件做一点处理。

js抓取网页内容(不时之需:我的理解)

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

  js抓取网页内容(不时之需:我的理解)
  phantomjs:我的理解是它是一个不显示的浏览器,也就是说它基本上可以做浏览器能做的任何事情,只是它不能显示页面的内容。所以,最近因为实验需要,要爬一些电商的图片,但是是AJAX生成的,爬HTML的简单方法不行,o(╯□╰)o,所以经过一些帮助 ,; 了解了PHANTOMJS,由于网上没有找到太多的例子,只好自己总结一下,以备不时之需。另外,直接看官网文档会有很大的收获~顺便锻炼一下英语o(╯□╰)o。这是一个实现的栗子:
  下载并解压phantom到D盘,目录下有一个phantomjs.exe文件(win7)这个WebKit可以通过js文件调用来达到想要的目的:比如生成网页快照。我的什么想做的就是爬取AJAX页面上的图片,先看js文件:命名为s.js
  [javascript]
  
  在 CODE 上查看代码片段
  
  派生到我的代码片
  system = require('system') //传递一些需要的参数给js文件

address = system.args[1];//获得命令行第二个参数 ,也就是指定要加载的页面地址,接下来会用到

var page = require('webpage').create();

var url = address;


page.open(url, function (status) {

if (status !== 'success') {

console.log('Unable to post!');
} else {

var encodings = ["euc-jp", "sjis", "utf8", "System"];//这一步是用来测试输出的编码格式,选择合适的编码格式很重要,不然你抓取下来的页面会乱码o(╯□╰)o,给出的几个编码格式是官网上的例子,根据具体需要自己去调整。

for (var i = 3; i < encodings.length; i++) {//我这里只要一种编码就OK啦

phantom.outputEncoding = encodings[i];

console.log(phantom.outputEncoding+page.content);//最后返回webkit加载之后的页面内容
}

}
phantom.exit();
});
  下一步是编写java类:
  [爪哇]
  
  在 CODE 上查看代码片段
  
  派生到我的代码片
  package com.mvc.rest;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class GetAjaxHtml {
public static String getAjaxContent(String url) throws Exception {
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("D:/tools/phantomjs/phantomjs.exe D:/tools/phantomjs/examples/s.js " + url);
InputStream is = p.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
StringBuffer sbf = new StringBuffer();
String tmp = "";
while((tmp=br.readLine())!=null) {
sbf.append(tmp + "\n");
}
return sbf.toString();
}

public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();
String result = getAjaxContent("http://114.111.162.220:8093/404Web/");
System.out.println(result);
long end = System.currentTimeMillis();
System.out.println("===============耗时:" + (end - start) + "===============");
}
}
  
  至此,你就得到了需要的AJAX完整页面的代码串,接下来就可以为所欲为。
  是最终的解决方案 查看全部

  js抓取网页内容(不时之需:我的理解)
  phantomjs:我的理解是它是一个不显示的浏览器,也就是说它基本上可以做浏览器能做的任何事情,只是它不能显示页面的内容。所以,最近因为实验需要,要爬一些电商的图片,但是是AJAX生成的,爬HTML的简单方法不行,o(╯□╰)o,所以经过一些帮助 ,; 了解了PHANTOMJS,由于网上没有找到太多的例子,只好自己总结一下,以备不时之需。另外,直接看官网文档会有很大的收获~顺便锻炼一下英语o(╯□╰)o。这是一个实现的栗子:
  下载并解压phantom到D盘,目录下有一个phantomjs.exe文件(win7)这个WebKit可以通过js文件调用来达到想要的目的:比如生成网页快照。我的什么想做的就是爬取AJAX页面上的图片,先看js文件:命名为s.js
  [javascript]
  
  在 CODE 上查看代码片段
  
  派生到我的代码片
  system = require('system') //传递一些需要的参数给js文件

address = system.args[1];//获得命令行第二个参数 ,也就是指定要加载的页面地址,接下来会用到

var page = require('webpage').create();

var url = address;


page.open(url, function (status) {

if (status !== 'success') {

console.log('Unable to post!');
} else {

var encodings = ["euc-jp", "sjis", "utf8", "System"];//这一步是用来测试输出的编码格式,选择合适的编码格式很重要,不然你抓取下来的页面会乱码o(╯□╰)o,给出的几个编码格式是官网上的例子,根据具体需要自己去调整。

for (var i = 3; i < encodings.length; i++) {//我这里只要一种编码就OK啦

phantom.outputEncoding = encodings[i];

console.log(phantom.outputEncoding+page.content);//最后返回webkit加载之后的页面内容
}

}
phantom.exit();
});
  下一步是编写java类:
  [爪哇]
  
  在 CODE 上查看代码片段
  
  派生到我的代码片
  package com.mvc.rest;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class GetAjaxHtml {
public static String getAjaxContent(String url) throws Exception {
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("D:/tools/phantomjs/phantomjs.exe D:/tools/phantomjs/examples/s.js " + url);
InputStream is = p.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
StringBuffer sbf = new StringBuffer();
String tmp = "";
while((tmp=br.readLine())!=null) {
sbf.append(tmp + "\n");
}
return sbf.toString();
}

public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();
String result = getAjaxContent("http://114.111.162.220:8093/404Web/";);
System.out.println(result);
long end = System.currentTimeMillis();
System.out.println("===============耗时:" + (end - start) + "===============");
}
}
  
  至此,你就得到了需要的AJAX完整页面的代码串,接下来就可以为所欲为。
  是最终的解决方案

js抓取网页内容(项目招商找A5快速获取精准代理名单一些站长们都了解JS代码是什么?)

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

  js抓取网页内容(项目招商找A5快速获取精准代理名单一些站长们都了解JS代码是什么?)
  项目投资找A5快速获取精准代理商名单
  有的站长知道什么是JS代码吗?一些新的 SEOER 不懂 JS。那我就在这里简单介绍一下。JS的全称是Javascript,是一种计算机脚本语言,一种新的描述语言。网站中经常用到JS,应用比较广泛。做过SEO的都看过《百度搜索引擎优化指南》,百度也明确表示:“尽量用flash、javascript等进行文字展示。也说明百度不能收录这样的文字既然百度说无法收录,也没有具体原因,百度暂时无法识别JS代码,可能有很多SEO高手已经知道,百度现在可能会识别JS代码,反正今天我会举个例子说明百度对网站JS代码链接不是爬不爬的响应,
  从这里看到 网站 使用了自己的 JS
  从这里可以看出,文章是百度在6月28日发布的。这个网站内容是百度收录拍摄的。下图是网站的内部链接内容
  但是百度没有收录网站内容,接下来看JS代码
  上图的内容已经显示出来了,我们这里用的是JS代码,网站还是百度用的收录,也就是说百度对JS代码不是很严格。从上面的例子中,我们清楚地了解到,百度仍然无法完全爬取 JS 代码。从例子可以看出网站文章出现在JS代码区收录的文本部分,可能是百度对网站的临时测试,但是不完整的代码已经认出了JS。目前还没有搜索引擎可以完全爬取JS,包括国外知名的GOOGLE也不能完全爬取JS,这个还需要大家继续研究。
  以上是SEO美食哥给大家分享的,但不代表我个人观点是正确的。这也是我观察到的。作为SEO优化工作者,我们需要及时了解百度、谷歌等搜索的动态,看搜索引擎新闻,观察它们的变化。这是我们对 SEO 研究的重要一步。
  申请创业报告,分享创业好点子。点击这里一起讨论新的商机! 查看全部

  js抓取网页内容(项目招商找A5快速获取精准代理名单一些站长们都了解JS代码是什么?)
  项目投资找A5快速获取精准代理商名单
  有的站长知道什么是JS代码吗?一些新的 SEOER 不懂 JS。那我就在这里简单介绍一下。JS的全称是Javascript,是一种计算机脚本语言,一种新的描述语言。网站中经常用到JS,应用比较广泛。做过SEO的都看过《百度搜索引擎优化指南》,百度也明确表示:“尽量用flash、javascript等进行文字展示。也说明百度不能收录这样的文字既然百度说无法收录,也没有具体原因,百度暂时无法识别JS代码,可能有很多SEO高手已经知道,百度现在可能会识别JS代码,反正今天我会举个例子说明百度对网站JS代码链接不是爬不爬的响应,
  从这里看到 网站 使用了自己的 JS
  从这里可以看出,文章是百度在6月28日发布的。这个网站内容是百度收录拍摄的。下图是网站的内部链接内容
  但是百度没有收录网站内容,接下来看JS代码
  上图的内容已经显示出来了,我们这里用的是JS代码,网站还是百度用的收录,也就是说百度对JS代码不是很严格。从上面的例子中,我们清楚地了解到,百度仍然无法完全爬取 JS 代码。从例子可以看出网站文章出现在JS代码区收录的文本部分,可能是百度对网站的临时测试,但是不完整的代码已经认出了JS。目前还没有搜索引擎可以完全爬取JS,包括国外知名的GOOGLE也不能完全爬取JS,这个还需要大家继续研究。
  以上是SEO美食哥给大家分享的,但不代表我个人观点是正确的。这也是我观察到的。作为SEO优化工作者,我们需要及时了解百度、谷歌等搜索的动态,看搜索引擎新闻,观察它们的变化。这是我们对 SEO 研究的重要一步。
  申请创业报告,分享创业好点子。点击这里一起讨论新的商机!

js抓取网页内容(2.如何通过selenium-java爬取异步加载的数据方法。)

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

  js抓取网页内容(2.如何通过selenium-java爬取异步加载的数据方法。)
  在之前的系列文章中介绍了如何使用httpclient抓取页面html以及如何使用jsoup分析html源文件的内容得到我们想要的数据,但是有时候这两种方法都不能使用捕获我们想要的数据。所需数据,例如,请参见以下示例。
  1.需求场景:
  如果要抢到股票的最新价格,F12页信息如下:
  
  按照前面的方法,爬取的代码如下:
  /**
* @description: 爬取股票的最新股价
* @author: JAVA开发老菜鸟
* @date: 2021-10-16 21:47
*/
public class StockPriceSpider {
Logger logger = LoggerFactory.getLogger(this.getClass());
public static void main(String[] args) {
StockPriceSpider stockPriceSpider = new StockPriceSpider();
String html = stockPriceSpider.httpClientProcess();
stockPriceSpider.jsoupProcess(html);
}
private String httpClientProcess() {
String html = "";
String uri = "http://quote.eastmoney.com/sh600036.html";
//1.生成httpclient,相当于该打开一个浏览器
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
//2.创建get请求,相当于在浏览器地址栏输入 网址
HttpGet request = new HttpGet(uri);
try {
request.setHeader("user-agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36");
request.setHeader("accept", "application/json, text/javascript, */*; q=0.01");
// HttpHost proxy = new HttpHost("3.211.17.212", 80);
// RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
// request.setConfig(config);
//3.执行get请求,相当于在输入地址栏后敲回车键
response = httpClient.execute(request);
//4.判断响应状态为200,进行处理
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
//5.获取响应内容
HttpEntity httpEntity = response.getEntity();
html = EntityUtils.toString(httpEntity, "utf-8");
logger.info("访问{} 成功,返回页面数据{}", uri, html);
} else {
//如果返回状态不是200,比如404(页面不存在)等,根据情况做处理,这里略
logger.info("访问{},返回状态不是200", uri);
logger.info(EntityUtils.toString(response.getEntity(), "utf-8"));
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//6.关闭
HttpClientUtils.closeQuietly(response);
HttpClientUtils.closeQuietly(httpClient);
}
return html;
}
private void jsoupProcess(String html) {
Document document = Jsoup.parse(html);
Element price = document.getElementById("price9");
logger.info("股价为:>>> {}", price.text());
}
}
  运行结果:
  
  纳尼,股价是“-”?不可能的。
  无法爬取正确结果的原因是因为这个值是在网站上异步加载渲染的,所以无法正常获取。
  2.爬取异步加载数据的java方法
  如何爬取异步加载的数据?通常有两种方法:
  2.1 内置浏览器内核
  内置浏览器就是在爬虫程序中启动一个浏览器内核,让js渲染出来的页面和静态页面一样。常用的内核有
  这里我选择了 Selenium,它是一个模拟浏览器和自动化测试工具。它提供了一组 API 来与真正的浏览器内核交互。当然,爬虫也可以使用它。
  具体方法如下:
  
org.seleniumhq.selenium
selenium-java
3.141.59
  2.2 逆向分析
  反向解析的方法是通过F12找到Ajax异步数据获取的链接,直接调用链接得到json结果,然后直接解析json结果得到想要的数据。
  此方法的关键是找到 Ajax 链接。这个方法我没研究过,有兴趣可以百度下载。稍微在这里。
  3.结束语
  以上就是如何通过selenium-java爬取异步加载的数据。通过这个方法,我写了一个小工具:仓位市值通知系统,每天会根据自己的仓位配置自动计算账户总市值,并发送邮件通知到指定邮箱。
  使用的技术如下:
  相关代码已经上传到我的码云,有兴趣的可以看看。 查看全部

  js抓取网页内容(2.如何通过selenium-java爬取异步加载的数据方法。)
  在之前的系列文章中介绍了如何使用httpclient抓取页面html以及如何使用jsoup分析html源文件的内容得到我们想要的数据,但是有时候这两种方法都不能使用捕获我们想要的数据。所需数据,例如,请参见以下示例。
  1.需求场景:
  如果要抢到股票的最新价格,F12页信息如下:
  
  按照前面的方法,爬取的代码如下:
  /**
* @description: 爬取股票的最新股价
* @author: JAVA开发老菜鸟
* @date: 2021-10-16 21:47
*/
public class StockPriceSpider {
Logger logger = LoggerFactory.getLogger(this.getClass());
public static void main(String[] args) {
StockPriceSpider stockPriceSpider = new StockPriceSpider();
String html = stockPriceSpider.httpClientProcess();
stockPriceSpider.jsoupProcess(html);
}
private String httpClientProcess() {
String html = "";
String uri = "http://quote.eastmoney.com/sh600036.html";
//1.生成httpclient,相当于该打开一个浏览器
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
//2.创建get请求,相当于在浏览器地址栏输入 网址
HttpGet request = new HttpGet(uri);
try {
request.setHeader("user-agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36");
request.setHeader("accept", "application/json, text/javascript, */*; q=0.01");
// HttpHost proxy = new HttpHost("3.211.17.212", 80);
// RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
// request.setConfig(config);
//3.执行get请求,相当于在输入地址栏后敲回车键
response = httpClient.execute(request);
//4.判断响应状态为200,进行处理
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
//5.获取响应内容
HttpEntity httpEntity = response.getEntity();
html = EntityUtils.toString(httpEntity, "utf-8");
logger.info("访问{} 成功,返回页面数据{}", uri, html);
} else {
//如果返回状态不是200,比如404(页面不存在)等,根据情况做处理,这里略
logger.info("访问{},返回状态不是200", uri);
logger.info(EntityUtils.toString(response.getEntity(), "utf-8"));
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//6.关闭
HttpClientUtils.closeQuietly(response);
HttpClientUtils.closeQuietly(httpClient);
}
return html;
}
private void jsoupProcess(String html) {
Document document = Jsoup.parse(html);
Element price = document.getElementById("price9");
logger.info("股价为:>>> {}", price.text());
}
}
  运行结果:
  
  纳尼,股价是“-”?不可能的。
  无法爬取正确结果的原因是因为这个值是在网站上异步加载渲染的,所以无法正常获取。
  2.爬取异步加载数据的java方法
  如何爬取异步加载的数据?通常有两种方法:
  2.1 内置浏览器内核
  内置浏览器就是在爬虫程序中启动一个浏览器内核,让js渲染出来的页面和静态页面一样。常用的内核有
  这里我选择了 Selenium,它是一个模拟浏览器和自动化测试工具。它提供了一组 API 来与真正的浏览器内核交互。当然,爬虫也可以使用它。
  具体方法如下:
  
org.seleniumhq.selenium
selenium-java
3.141.59
  2.2 逆向分析
  反向解析的方法是通过F12找到Ajax异步数据获取的链接,直接调用链接得到json结果,然后直接解析json结果得到想要的数据。
  此方法的关键是找到 Ajax 链接。这个方法我没研究过,有兴趣可以百度下载。稍微在这里。
  3.结束语
  以上就是如何通过selenium-java爬取异步加载的数据。通过这个方法,我写了一个小工具:仓位市值通知系统,每天会根据自己的仓位配置自动计算账户总市值,并发送邮件通知到指定邮箱。
  使用的技术如下:
  相关代码已经上传到我的码云,有兴趣的可以看看。

js抓取网页内容(​​如何用正则表达式对数据进行数据提取和数据分类汇总)

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

  js抓取网页内容(​​如何用正则表达式对数据进行数据提取和数据分类汇总)
  ​​​​
  在很多行业中,需要及时对行业数据进行分类汇总,对行业数据进行分析,以便对公司未来的发展有很好的参考和横向比较。因此,在实际工作中,我们可能会遇到数据采集的概念。data采集的最终目的是获取数据,提取有用的数据用于数据抽取和数据分类。
  很多人刚开始了解数据时可能无法入手采集,尤其是新手,感觉很茫然,所以在这里分享一下我的经验,也希望和大家分享技术。如有不足之处,请指正。写这篇文章的目的,就是希望大家可以一起成长。我也相信,技术之间没有层次,只有互补和共享,才能让彼此更加成长。
  当网页数据采集时,我们往往要经过这些主要步骤:
  ①通过URL地址读取目标网页 ②获取网页源代码 ③通过网页源代码提取我们要提取的目标数据 ④对数据进行格式转换得到我们需要的数据。
  这是示意图,希望大家理解
  
  了解了基本流程后,我会用一个案例来具体实现如何提取我们需要的数据。对于数据提取,我们可以使用正则表达式来提取,或者httpclient+jsoup来提取。这里,我们暂时不解释httpclient+jsou提取。网页数据的实践,以后会专门针对httpclient+jsoup进行讲解。在这里,我们将首先解释如何使用正则表达式来提取数据。
  我在这里找到了一个网站:​​​.cn/userSite/publicQuote/quotes_list。​​我们要提取里面的数据。我们要提取的最终结果是型号、数量、报价、供应商,首先我们看到这个网站整页预览
  
  接下来我们看一下网页的源码结构:
  
  以上源码可以清晰的看到整个网页的源码结构,我们将提取整个网页数据。
  import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HTMLPageParser {
public static void main(String[] args) throws Exception {
//目的网页URL地址
getURLInfo("http://www.ic.net.cn/userSite/ ... ot%3B,"utf-8");
}
public static List getURLInfo(String urlInfo,String charset) throws Exception {
//读取目的网页URL地址,获取网页源码
URL url = new URL(urlInfo);
HttpURLConnection httpUrl = (HttpURLConnection)url.openConnection();
InputStream is = httpUrl.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
//这里是对链接进行处理
line = line.replaceAll("]*>", "");
//这里是对样式进行处理
line = line.replaceAll("]*>", "");
sb.append(line);
}
is.close();
br.close();
//获得网页源码
return getDataStructure(sb.toString().trim());
}
static Pattern proInfo
= Pattern.compile("(.*?)\\s*(.*?)\\s*(.*?)\\s*(.*?)\\s*(.*?)", Pattern.DOTALL);
private static List getDataStructure(String str) {
//运用正则表达式对获取的网页源码进行数据匹配,提取我们所要的数据,在以后的过程中,我们可以采用httpclient+jsoup,
//现在暂时运用正则表达式对数据进行抽取提取
String[] info = str.split("");
List list = new ArrayList();
for (String s : info) {
Matcher m = proInfo.matcher(s);
Product p = null;
if (m.find()) {
p = new Product();
//设置产品型号
String[] ss = m.group(1).trim().replace(" ", "").split(">");
p.setProStyle(ss[1]);
//设置产品数量
p.setProAmount(m.group(2).trim().replace(" ", ""));
//设置产品报价
p.setProPrice(m.group(4).trim().replace(" ", ""));
//设置产品供应商
p.setProSupplier(m.group(5).trim().replace(" ", ""));
list.add(p);
}
}
//这里对集合里面不是我们要提取的数据进行移除
list.remove(0);
for (int i = 0; i < list.size(); i++) {
System.out.println("产品型号:"+list.get(i).getProStyle()+",产品数量:"+list.get(i).getProAmount()
+",产品报价:"+list.get(i).getProPrice()+",产品供应商:"+list.get(i).getProSupplier());
}
return list;
}
}
class Product {
private String proStyle;//产品型号
private String proAmount;//产品数量
private String proPrice;//产品报价
private String proSupplier;//产品供应商
public String getProStyle() {
return proStyle;
}
public void setProStyle(String proStyle) {
this.proStyle = proStyle;
}
public String getProSupplier() {
return proSupplier;
}
public void setProSupplier(String proSupplier) {
this.proSupplier = proSupplier;
}

public String getProAmount() {
return proAmount;
}
public void setProAmount(String proAmount) {
this.proAmount = proAmount;
}
public String getProPrice() {
return proPrice;
}
public void setProPrice(String proPrice) {
this.proPrice = proPrice;
}
public Product() {

}
@Override
public String toString() {
return "Product [proAmount=" + proAmount + ", proPrice=" + proPrice
+ ", proStyle=" + proStyle + ", proSupplier=" + proSupplier
+ "]";
}

}
  好了,运行上面的程序,我们得到下面的数据,也就是我们最终想要得到的数据
  
  获取数据成功,这就是我们要获取的最终数据结果。最后想说,这里的这个网页比较简单,可以在网页的源码中看到源数据,而这个方法就是在get方法中提交数据。,当真的是采集时,有些网页结构比较复杂,源代码中可能没有我们要提取的数据。关于这一点的解决方案稍后会为大家介绍。另外,当我在采集页面时,我只是采集当前页面的数据,它也有分页数据。这里我就不解释了,只是一个提示,我们可以使用多线程对所有页面的当前数据执行采集,通过一个线程采集当前页面数据和一个翻页动作,所有数据都可以采集完成。
  我们匹配的数据可能在项目的实际开发中,需要我们将提取的数据存储起来,方便我们接下来的数据查询操作。 查看全部

  js抓取网页内容(​​如何用正则表达式对数据进行数据提取和数据分类汇总)
  ​​​​
  在很多行业中,需要及时对行业数据进行分类汇总,对行业数据进行分析,以便对公司未来的发展有很好的参考和横向比较。因此,在实际工作中,我们可能会遇到数据采集的概念。data采集的最终目的是获取数据,提取有用的数据用于数据抽取和数据分类。
  很多人刚开始了解数据时可能无法入手采集,尤其是新手,感觉很茫然,所以在这里分享一下我的经验,也希望和大家分享技术。如有不足之处,请指正。写这篇文章的目的,就是希望大家可以一起成长。我也相信,技术之间没有层次,只有互补和共享,才能让彼此更加成长。
  当网页数据采集时,我们往往要经过这些主要步骤:
  ①通过URL地址读取目标网页 ②获取网页源代码 ③通过网页源代码提取我们要提取的目标数据 ④对数据进行格式转换得到我们需要的数据。
  这是示意图,希望大家理解
  
  了解了基本流程后,我会用一个案例来具体实现如何提取我们需要的数据。对于数据提取,我们可以使用正则表达式来提取,或者httpclient+jsoup来提取。这里,我们暂时不解释httpclient+jsou提取。网页数据的实践,以后会专门针对httpclient+jsoup进行讲解。在这里,我们将首先解释如何使用正则表达式来提取数据。
  我在这里找到了一个网站:​​​.cn/userSite/publicQuote/quotes_list。​​我们要提取里面的数据。我们要提取的最终结果是型号、数量、报价、供应商,首先我们看到这个网站整页预览
  
  接下来我们看一下网页的源码结构:
  
  以上源码可以清晰的看到整个网页的源码结构,我们将提取整个网页数据。
  import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HTMLPageParser {
public static void main(String[] args) throws Exception {
//目的网页URL地址
getURLInfo("http://www.ic.net.cn/userSite/ ... ot%3B,"utf-8");
}
public static List getURLInfo(String urlInfo,String charset) throws Exception {
//读取目的网页URL地址,获取网页源码
URL url = new URL(urlInfo);
HttpURLConnection httpUrl = (HttpURLConnection)url.openConnection();
InputStream is = httpUrl.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
//这里是对链接进行处理
line = line.replaceAll("]*>", "");
//这里是对样式进行处理
line = line.replaceAll("]*>", "");
sb.append(line);
}
is.close();
br.close();
//获得网页源码
return getDataStructure(sb.toString().trim());
}
static Pattern proInfo
= Pattern.compile("(.*?)\\s*(.*?)\\s*(.*?)\\s*(.*?)\\s*(.*?)", Pattern.DOTALL);
private static List getDataStructure(String str) {
//运用正则表达式对获取的网页源码进行数据匹配,提取我们所要的数据,在以后的过程中,我们可以采用httpclient+jsoup,
//现在暂时运用正则表达式对数据进行抽取提取
String[] info = str.split("");
List list = new ArrayList();
for (String s : info) {
Matcher m = proInfo.matcher(s);
Product p = null;
if (m.find()) {
p = new Product();
//设置产品型号
String[] ss = m.group(1).trim().replace(" ", "").split(">");
p.setProStyle(ss[1]);
//设置产品数量
p.setProAmount(m.group(2).trim().replace(" ", ""));
//设置产品报价
p.setProPrice(m.group(4).trim().replace(" ", ""));
//设置产品供应商
p.setProSupplier(m.group(5).trim().replace(" ", ""));
list.add(p);
}
}
//这里对集合里面不是我们要提取的数据进行移除
list.remove(0);
for (int i = 0; i < list.size(); i++) {
System.out.println("产品型号:"+list.get(i).getProStyle()+",产品数量:"+list.get(i).getProAmount()
+",产品报价:"+list.get(i).getProPrice()+",产品供应商:"+list.get(i).getProSupplier());
}
return list;
}
}
class Product {
private String proStyle;//产品型号
private String proAmount;//产品数量
private String proPrice;//产品报价
private String proSupplier;//产品供应商
public String getProStyle() {
return proStyle;
}
public void setProStyle(String proStyle) {
this.proStyle = proStyle;
}
public String getProSupplier() {
return proSupplier;
}
public void setProSupplier(String proSupplier) {
this.proSupplier = proSupplier;
}

public String getProAmount() {
return proAmount;
}
public void setProAmount(String proAmount) {
this.proAmount = proAmount;
}
public String getProPrice() {
return proPrice;
}
public void setProPrice(String proPrice) {
this.proPrice = proPrice;
}
public Product() {

}
@Override
public String toString() {
return "Product [proAmount=" + proAmount + ", proPrice=" + proPrice
+ ", proStyle=" + proStyle + ", proSupplier=" + proSupplier
+ "]";
}

}
  好了,运行上面的程序,我们得到下面的数据,也就是我们最终想要得到的数据
  
  获取数据成功,这就是我们要获取的最终数据结果。最后想说,这里的这个网页比较简单,可以在网页的源码中看到源数据,而这个方法就是在get方法中提交数据。,当真的是采集时,有些网页结构比较复杂,源代码中可能没有我们要提取的数据。关于这一点的解决方案稍后会为大家介绍。另外,当我在采集页面时,我只是采集当前页面的数据,它也有分页数据。这里我就不解释了,只是一个提示,我们可以使用多线程对所有页面的当前数据执行采集,通过一个线程采集当前页面数据和一个翻页动作,所有数据都可以采集完成。
  我们匹配的数据可能在项目的实际开发中,需要我们将提取的数据存储起来,方便我们接下来的数据查询操作。

js抓取网页内容(浏览器中有没有,监听到页面的生命周期,如何解决?)

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

  js抓取网页内容(浏览器中有没有,监听到页面的生命周期,如何解决?)
  这篇文章的速度只需要一分钟
  在做业务开发的时候,遇到了以下问题:
  在一些浏览器中,比如Safari,当从下一页返回到上一页时,页面不刷新,而是保持页面的最后状态。这样如果用户不知道已经提交了,就有可能再次提交,导致用户体验差等。
  那么如何解决这个问题呢?很容易想到,如果我们能像开发原生应用一样监控页面的生命周期,那么这个问题自然就迎刃而解了。
  那么浏览器中的页面有生命周期方法吗?其实没有,但是有类似功能的事件可以帮助我们解决问题
  浏览器页面事件
  浏览器页面事件如下:
  这些事件描述如下:
  负载
  此事件在页面首次加载时触发,而不是在从浏览器缓存中读取页面时触发
  window.onload = (e) => {
alert(&#39;page onload&#39;)
}
  onpageshow
  每次页面加载时都会触发这个事件,也就是说,即使页面是从浏览器读取的,这个事件也会触发
  机智的小伙伴们一定想到了,我们可以通过这个方法来判断返回的页面是否是缓存中直接读取的页面
  但是还有一个问题。虽然每次都会触发onpageshow,但是如何判断是否从缓存中读取呢?请看下面的代码:
  window.onpageshow = (e) => {
if (e.persisted) {
alert(&#39;page read from cache&#39;)
window.location.reload()
}
  上面代码中,是否从缓存中读取是由事件对象的persisted属性来判断的,它会返回true或者false
  但并不是所有的浏览器都需要添加这个方法。现在很多浏览器返回后会自动刷新,所以我们只需要对那些不会刷新的浏览器使用这个方法即可。
  onpagehide 和 onunload
  离开页面时会触发这两个事件。不同的是,触发onpagehide后页面仍然可以缓存,而触发onunload后页面不能缓存。
  如果同时使用这两种方法,你会发现在onunload之前会触发onpagehide,并且两个事件都不能使用alert
  卸载前
  页面关闭前触发的事件是在上述两个离开页面事件之前触发的,也不能使用alert
  浏览器页面事件的触发顺序
  onload -> onpageshow -> onbeforeunload -> onpagehide -> onunload
  一分钟结束。小伙伴们下周见!:) 查看全部

  js抓取网页内容(浏览器中有没有,监听到页面的生命周期,如何解决?)
  这篇文章的速度只需要一分钟
  在做业务开发的时候,遇到了以下问题:
  在一些浏览器中,比如Safari,当从下一页返回到上一页时,页面不刷新,而是保持页面的最后状态。这样如果用户不知道已经提交了,就有可能再次提交,导致用户体验差等。
  那么如何解决这个问题呢?很容易想到,如果我们能像开发原生应用一样监控页面的生命周期,那么这个问题自然就迎刃而解了。
  那么浏览器中的页面有生命周期方法吗?其实没有,但是有类似功能的事件可以帮助我们解决问题
  浏览器页面事件
  浏览器页面事件如下:
  这些事件描述如下:
  负载
  此事件在页面首次加载时触发,而不是在从浏览器缓存中读取页面时触发
  window.onload = (e) => {
alert(&#39;page onload&#39;)
}
  onpageshow
  每次页面加载时都会触发这个事件,也就是说,即使页面是从浏览器读取的,这个事件也会触发
  机智的小伙伴们一定想到了,我们可以通过这个方法来判断返回的页面是否是缓存中直接读取的页面
  但是还有一个问题。虽然每次都会触发onpageshow,但是如何判断是否从缓存中读取呢?请看下面的代码:
  window.onpageshow = (e) => {
if (e.persisted) {
alert(&#39;page read from cache&#39;)
window.location.reload()
}
  上面代码中,是否从缓存中读取是由事件对象的persisted属性来判断的,它会返回true或者false
  但并不是所有的浏览器都需要添加这个方法。现在很多浏览器返回后会自动刷新,所以我们只需要对那些不会刷新的浏览器使用这个方法即可。
  onpagehide 和 onunload
  离开页面时会触发这两个事件。不同的是,触发onpagehide后页面仍然可以缓存,而触发onunload后页面不能缓存。
  如果同时使用这两种方法,你会发现在onunload之前会触发onpagehide,并且两个事件都不能使用alert
  卸载前
  页面关闭前触发的事件是在上述两个离开页面事件之前触发的,也不能使用alert
  浏览器页面事件的触发顺序
  onload -> onpageshow -> onbeforeunload -> onpagehide -> onunload
  一分钟结束。小伙伴们下周见!:)

js抓取网页内容(我正在尝试从当用户向下滚动到底部时动态生成内容的页面中抓取链接)

网站优化优采云 发表了文章 • 0 个评论 • 43 次浏览 • 2022-03-27 11:18 • 来自相关话题

  js抓取网页内容(我正在尝试从当用户向下滚动到底部时动态生成内容的页面中抓取链接)
  我试图从当用户向下滚动到底部(无限滚动)时动态生成内容的页面中抓取链接。我已经尝试将 Phantomjs 用于不同的事情,但我无法采集第一页之外的链接。假设在底部加载内容的元素具有类 .has-more-items。它在滚动加载最终内容之前可用,然后在 DOM 中变得不可用(显示:无)。这是我尝试过的 - 之后立即将 viewportSize 设置为更大的高度 var page = require('webpage').create();page.viewportSize = { width: 1600, height: 10000, };page.scrollPosition = {顶部:10000,左侧:0 } 在内部使用 page.open 但没有效果,例如 - 也尝试将其放入 page.evaluate 函数中,但这会给出参考错误:未找到可变页面尝试内部使用 jQuery 和 JS 代码 page.evaluate, page.open 但无济于事 - $("html, body").animate({ scrollTop: $(document).height() }, 10, function () { //console.log ('检查执行'); }); 照原样,也在 document.ready 中。同样对于 JS 代码 - 在 window.onload 中,我已经被它击中了两天,但找不到方法。任何帮助或提示将不胜感激。更新我在#!topic/phantomjs/8LrWRW8ZrA0 找到了一段有用的代码,其中是我想要访问的元素的类。has-more-items,最初位于页面底部,当我们滚动时它会向下移动down ,直到所有数据都加载完毕,然后变得不可用。然而,当我测试它时,很明显,它在没有向下滚动的情况下进入了无限循环(我渲染图片以检查)。我也试过 page.scrollPosition = { top: page. 查看全部

  js抓取网页内容(我正在尝试从当用户向下滚动到底部时动态生成内容的页面中抓取链接)
  我试图从当用户向下滚动到底部(无限滚动)时动态生成内容的页面中抓取链接。我已经尝试将 Phantomjs 用于不同的事情,但我无法采集第一页之外的链接。假设在底部加载内容的元素具有类 .has-more-items。它在滚动加载最终内容之前可用,然后在 DOM 中变得不可用(显示:无)。这是我尝试过的 - 之后立即将 viewportSize 设置为更大的高度 var page = require('webpage').create();page.viewportSize = { width: 1600, height: 10000, };page.scrollPosition = {顶部:10000,左侧:0 } 在内部使用 page.open 但没有效果,例如 - 也尝试将其放入 page.evaluate 函数中,但这会给出参考错误:未找到可变页面尝试内部使用 jQuery 和 JS 代码 page.evaluate, page.open 但无济于事 - $("html, body").animate({ scrollTop: $(document).height() }, 10, function () { //console.log ('检查执行'); }); 照原样,也在 document.ready 中。同样对于 JS 代码 - 在 window.onload 中,我已经被它击中了两天,但找不到方法。任何帮助或提示将不胜感激。更新我在#!topic/phantomjs/8LrWRW8ZrA0 找到了一段有用的代码,其中是我想要访问的元素的类。has-more-items,最初位于页面底部,当我们滚动时它会向下移动down ,直到所有数据都加载完毕,然后变得不可用。然而,当我测试它时,很明显,它在没有向下滚动的情况下进入了无限循环(我渲染图片以检查)。我也试过 page.scrollPosition = { top: page.

js抓取网页内容(一个页面通过script加载请求服务端进行统计再输出js进行跳转)

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

  js抓取网页内容(一个页面通过script加载请求服务端进行统计再输出js进行跳转)
  在这期间,我遇到了一个非常崩溃的问题。一个页面加载脚本请求服务器统计,然后输出js进行跳转。分别分为两步进行统计。
  打开页面,通过脚本向远程服务器请求统计,并通过js输出最终重定向到页面的地址。页面获取跳转位置后,通过位置跳转
  很简单的事情,但是百度手机搜索有个大问题:
  通过百度搜索引擎关键词搜索网页后,第一个请求没有发出,很奇怪。
  研究了半天,发现了这个百度手机的自动转码问题
  类似于下图的搜索结果,网页已经被JS跳转,导致被百度缓存。下次点击不会进入网站页面,而是直接跳转到第二步的目标页面,导致第一次点击。步数统计失败
  
  // 只是类似这样的链接,下面的链接可能已经失效了
$url = 'http://m.baidu.com/from=0/bd_page_type=1/ssid=0/uid=0/pu=usm%400%2Csz%401320_1001%2Cta%40iphone_2_4.3_3_534/baiduid=637EBC50744C1291B831A26D208F44D8/w=0_10_%E7%A6%81%E4%B9%A6%E5%A4%A7%E5%85%A8%E9%9B%86/t=iphone/l=3/tc?ref=www_iphone&lid=13212517736186082851&order=1&vit=osres&tj=www_normal_1_0_10_title&m=8&srd=1&cltj=cloud_title&dict=32&title=%E5%8D%81%E5%A4%A7%E7%A6%81%E4%B9%A6%E4%B9%8B%E5%B0%91%E5%B9%B4%E9%98%BF%E5%AE%BE%E7%9B%AE%E5%BD%95%2C%E5%8D%81%E5%A4%A7%E7%A6%81%E4%B9%A6%E4%B9%8B%E5%B0%91%E5%B9%B4%E9%98%BF%E5%AE%BE%E6%9C%80%E6%96%B0%E7%AB%A0%E8%8A%82...&sec=8191&di=e644ac04d0707d79&bdenc=1&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_zRPQGjm95qshbWxBcNiV8KhVinHVZy';
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
$content = curl_exec($curl);
echo htmlentities($content);
curl_close($curl);
  通过CURL抓取内容,设置为不跟随跳转,获取第一个请求的输出如下:
  
  看图上三个红色箭头,这是百度自己转码输出的js跳转和meta刷新。他实际上抓住了我跳到的地址。真的很厉害,不知道百度是怎么做到的。实现了第一步的请求,刚放上去的时候只请求了一两次,然后第二天发现一整天都没有请求,说明百度直接跳到搜索结果页,但一点也不。进入网页,缓存跳转地址。
  如果你把跳转放在复杂的if判断中或者加上几秒的延迟,我不知道会发生什么。如果是通过分析代码得到的,页面上会有很多js。如果条件在另一个 js 中是动态的,他如何捕获输出?如果不是为了分析js,我跳的时候百度怎么知道?他不可能监视几分钟。
  对于站长,可以添加百度自己的协议或者手机适配文件拒绝转码
  但是网站不是我的,我无权操作页面的其他部分。我没有解决办法。百度的转码太傻了。
  目前没有条件再次测试,很郁闷。. 不过他还是会不定时更新,去掉js跳转后会自动恢复。 查看全部

  js抓取网页内容(一个页面通过script加载请求服务端进行统计再输出js进行跳转)
  在这期间,我遇到了一个非常崩溃的问题。一个页面加载脚本请求服务器统计,然后输出js进行跳转。分别分为两步进行统计。
  打开页面,通过脚本向远程服务器请求统计,并通过js输出最终重定向到页面的地址。页面获取跳转位置后,通过位置跳转
  很简单的事情,但是百度手机搜索有个大问题:
  通过百度搜索引擎关键词搜索网页后,第一个请求没有发出,很奇怪。
  研究了半天,发现了这个百度手机的自动转码问题
  类似于下图的搜索结果,网页已经被JS跳转,导致被百度缓存。下次点击不会进入网站页面,而是直接跳转到第二步的目标页面,导致第一次点击。步数统计失败
  
  // 只是类似这样的链接,下面的链接可能已经失效了
$url = 'http://m.baidu.com/from=0/bd_page_type=1/ssid=0/uid=0/pu=usm%400%2Csz%401320_1001%2Cta%40iphone_2_4.3_3_534/baiduid=637EBC50744C1291B831A26D208F44D8/w=0_10_%E7%A6%81%E4%B9%A6%E5%A4%A7%E5%85%A8%E9%9B%86/t=iphone/l=3/tc?ref=www_iphone&lid=13212517736186082851&order=1&vit=osres&tj=www_normal_1_0_10_title&m=8&srd=1&cltj=cloud_title&dict=32&title=%E5%8D%81%E5%A4%A7%E7%A6%81%E4%B9%A6%E4%B9%8B%E5%B0%91%E5%B9%B4%E9%98%BF%E5%AE%BE%E7%9B%AE%E5%BD%95%2C%E5%8D%81%E5%A4%A7%E7%A6%81%E4%B9%A6%E4%B9%8B%E5%B0%91%E5%B9%B4%E9%98%BF%E5%AE%BE%E6%9C%80%E6%96%B0%E7%AB%A0%E8%8A%82...&sec=8191&di=e644ac04d0707d79&bdenc=1&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_zRPQGjm95qshbWxBcNiV8KhVinHVZy';
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
$content = curl_exec($curl);
echo htmlentities($content);
curl_close($curl);
  通过CURL抓取内容,设置为不跟随跳转,获取第一个请求的输出如下:
  
  看图上三个红色箭头,这是百度自己转码输出的js跳转和meta刷新。他实际上抓住了我跳到的地址。真的很厉害,不知道百度是怎么做到的。实现了第一步的请求,刚放上去的时候只请求了一两次,然后第二天发现一整天都没有请求,说明百度直接跳到搜索结果页,但一点也不。进入网页,缓存跳转地址。
  如果你把跳转放在复杂的if判断中或者加上几秒的延迟,我不知道会发生什么。如果是通过分析代码得到的,页面上会有很多js。如果条件在另一个 js 中是动态的,他如何捕获输出?如果不是为了分析js,我跳的时候百度怎么知道?他不可能监视几分钟。
  对于站长,可以添加百度自己的协议或者手机适配文件拒绝转码
  但是网站不是我的,我无权操作页面的其他部分。我没有解决办法。百度的转码太傻了。
  目前没有条件再次测试,很郁闷。. 不过他还是会不定时更新,去掉js跳转后会自动恢复。

js抓取网页内容(百度科技园行动度基因沙龙之SEO、网站域名、百度页面)

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

  js抓取网页内容(百度科技园行动度基因沙龙之SEO、网站域名、百度页面)
  上个月,百度站长平台在百度科技园举办了变蝶行动基因沙龙。会上就网站SEO、网站域名、百度爬虫页面、APPLink等进行了交流讨论。以下为活动问答:包括JS代码收录、URL链接长度、海外域名对排名的影响等。问答详情如下:
  一、SEO 问题解答
  Q:使用百度统计进行广告跟踪时,配置的URL链接会很长。这种跟踪会影响搜索引擎优化吗?
  A:这种有多个URL版本的统计代码肯定会对SEO产生影响。对于这种情况有两个建议,一个是使用两组url进行真正的蜘蛛抓取和用户展示。另一种选择是停止使用百度统计,你可以使用谷歌中的跟踪,他可以使用#链接,事件跟踪,并参考美团网。所有链接加上事件跟踪。如果是生成的,也是用#号生成的,不加额外的参数。
  Q:如果一个页面一开始不符合百度的SEO标准,后来改成符合标准,百度需要多长时间才能提供好的结果?
  A:不同的站点可能会贡献不同的流量。因此,Spider 爬行的侧重点不同。有些站可能会发现更多新链接,有些站可能会查看旧链接。建议推到百度上,像首页一样抓取一般是没有问题的。
  Q:推送审核需要多长时间,一周还是半个月?
  A:如果说推送符合抓取标准,可以立即抓取。
  问:网站有两种 URL,旧的和新的。更换大约需要两年时间。现在旧 URL 将跳转到新 URL。由于服务器问题,网络中断了半个小时。搜索 关键词 后,旧的 url 出现了。现在基本上所有方法都无法恢复。在这种情况下我们应该怎么做?
  A:使用修改工具重新提交,保证修改成功,不会有问题。如有问题,截图并报告给工程师排查。
  Q:由于网站使用的是海外域名(暂时无法更改),有什么办法可以提高搜索量或爬取量?
  A:百度搜索引擎都是在中国备案的,最好使用国内的服务器和域名。
  Q:有些网站注册使用了很多域名,很多域名并不是供用户搜索的。现在这些域名都被注销了,但是还是可以找到的。我关了一次,但是没有用。我不知道如何处理这个?
  A:如果不需要那些站?你可以把它们关掉。短时间关闭新域名可能会为用户调用旧域名。当这个域名被关闭时,我们不会为用户进行长期调用。这些东西也不会被发现。
  Q:网站是母婴类网站,PC端搜索流量很差。想知道有没有办法?
  A:与医疗、养生、保健、母婴等问题类似,百度对搜索结果的展示非常谨慎。百度只对优质的网站开放他们的展示可能性,网站很可能很长时间都得不到流量。如果网站在SEO方面没有大问题,可以检查一下内容是否在争抢一些热门词。建议整个网站的权重和流量达到一定规模后再做热词。如果一开始就这样做关键词,当网站名声不是很高的时候,就不会有流量了。在这种情况下,网站 可能会更好地找到他们自己的区分和相关词之一。
  问:网站 从事教育行业。现在通过官网的认证是安全或权威的认证。认证后会有潜在的特殊待遇或无所谓。
  A:比如认证方面,你是真的,还有一个是假的。从用户的认知来看,你就是官网。
  问:关于数据化、软件和PDF和Word显示的问题,包括哪些类型和多少资源?应该和文章的内容一起发布,还是PDF和文章一样?也有矛盾。产品及操作希望用户下载后直接使用,不会对PDF、WORD产生一些压缩或工具处理。有些用户会被引导到 Word,无论他们是无意还是无意。我该怎么办?
  A:百度搜索栏现在默认称为网页搜索。顾名思义,我们向用户展示了一个网页。后面的库还有一种文件格式。搜索结果都是供用户下载使用的,他们可以去学习和展示图书馆的内容。
  Q:有没有渠道告诉搜索引擎我们的页面内容发生了变化,我们通常如何处理?一个老页面已经收录,排序了,过了一段时间他发起了新资源的添加和更改?
  A:目前还没有这样的渠道。首先,Spider 会检查一些东西。他发现网站经常出现在这种情况下,他的相关检查流量会增加。如果你担心,你应该把他放在站点地图中。
  Q:网站原本只是一个主页,一个APP下载。我们现在正在发布内容。过去,这些内容无法被抓取。现在,我们是否需要提交修订以将其发布到目录或子域中?
  A:这个是放在域名下的,一个子目录用来放分类的东西,没有修改。改首页,改版就没有其他问题了。使用主动推送工具的效果还是很明显的。如果内容质量非常好,您可以使用所有配额。
  Q:自动推送份额多久调整一次?因为我觉得你的份额对于我们几千万或几百万的海量数据来说太小了。
  A:我们也很关心一个网站有没有这种爆发力,突然增加这么多,我们觉得很不正常。你要循序渐进,不要又短又快,一夜之间吃成胖子。第二,你有这么多优秀的数据,你可以关注百度的另一个平台,你就变成了一个API,让别人使用你的数据。其他人为您的数据使用付费,您可以注意这一点。
  Q:URL的绝对路径和相对路径是否会受到超链接的影响?修改后我们的页面有翻页,翻页链接是12345,上面有标签。每次抓到12345都抓不到。模拟抓,感觉抓不到。Spider会抓取页面上的A标签吗?
  A:影响不大,能正常访问就可以了。不管是绝对路径还是相对路径,只要地址为Spider或者用户畅通无阻,并且页面渲染时地址完整,这条路径就可以顺利爬取。
  对于not收录的问题,可以参考其他的点,比如页面本身没有被访问或者目录级别比较高。页面首页推送的链接会被百度一层一层抓到。如果路径正常,会从首页爬取Spider路径。
  首先要做的是查看不是收录的链接日志是否已经被捕获。如果它被捕获而不是 收录,则可能是页面本身的问题。你也可以看一个周期,因为我们用一天。二是看日志中是否有长尾,是否隐藏或没有有效抓取或建关时推荐。如果你能看到日志,你可以看看日志来分析它。
  可以调整首页的变化,提出建议,做个测试看看是链接问题还是蜘蛛没有抓到的问题。还有push等方法可以解决,从而判断不收录是什么原因。学院有一个解决许多问题的文件,类似于流程图。当这个戒指出现时,为什么?如果够长,可以看看下面的树枝。
  Q:站点之前,所有的框架都是通过JS来展示的。后来百度没有收录,进行了PHP改版。外观是一样的。现在感觉这个PHP不是很规范。什么是百度非标收录?
  A:酒店行业很多内容不是实时加载的,而是通过JS慢慢获取页面上的内容。如果搜索引擎捕捉到它,那就是导航,这就是问题所在。以前有很多空白页收录,质量很差。关于 Pattern 认为质量低的模式,内容可能是一样的,所以考虑换个目录。
  二、APPLINK问题解答
  Q:现在网站的APP已经准备好了,加入APPLINK会不会有什么大的变化?
  A:H5网站和APP有对应关系吗?比如这里是100条H5站的内容,有100条APP的内容,应该是匹配的。关键是把网站放在行首,一定要调整好。
  Q:目前APP引流是Android和IOS,但有一小部分是Windows Phone。这个APP需要多长时间?
  A:分两点,我们来看看诺基亚的Windows平台战略。如果我们看到他的一些动作,我们一定会注意的。因为其实我们早期有一个关于APPLINK接入协议的协议。我们可以有WindowsPhone调用的机制。用户点击了一个结果,如果点击了结果,我们那里就有一个Android IE,它可以接受IE并将信息发回给用户。只要在前端实现一些信息,就可以做好。劳动量似乎不是很大,是可以实现的。除了WindowsPhone和手表,毕竟还可以调APP,大家可以看看。
  Q:APP和网页版,很多APP都嵌入在H5网页中,里面只是一个外壳。百度做的AppLink,他点击后,从百度APP弹到糯米APP,然后弹走。他用百度搜索了很多数据。百度用户可以点击下一个网站。如果你把他推到糯米,我们后面的人就没有机会了。
  A:其实APPLINK不是技术壁垒的问题,是努力的问题。对于大型网站,您可以自己做。对于APPLINK,未来可能会有各方面的调整。对于小站来说,如果小站连接起来,目前就有这个优势。因为小站访问也可以跳转到小站。
  Q:加入APPLINK后,如果小站数据不够,会一下子弹出来吗?
  A:当你回到你的站,至少进入你自己的生态。事实上,从搜索的角度来看,我们的目标是满足用户的需求。如果我们引导到网站,如果网站不能满足需求,用户自然会被转移。将用户引向你是网站满足用户需求的动力。我认为应该是这样的。
  Q:如果整个页面有APPLINK,会有一个分发按钮。分配按钮的条件是什么?
  A:没有条件,你把APP包给我们,我们给你分发。
  Q:目前除了你的团队之外,还有几个百度内容的手机助手。有什么区别吗?
  A:这是一个早期的尝试。我们都知道移动端和PC端已经合并了。作为一个整体,我们输出了一组解决方案。可能上半年我们把这件事推的很紧。当时我们也很困惑。那个时候整个生态合并之后,现在我们整体的输出是由APPLINK来做比较合理。移动助手不是搜索结果。输出可能在不同的产品线中,APPLINK 出现在搜索结果中。
  Q:加入APPLINK对移动站平台有影响吗?
  答:还没有。但他会有一个正常的点击。
  Q:Android生态最麻烦的就是有时候不能调整。这种问题不调整,会不会指导下载操作?
  A:一般有两种情况是不能调整的。一个是安装包,因为安卓或者IOS包还有一个版本问题。因为网上提交的版本是用户没有更新新版本,或者有可能出现用户安装了新版本,但又删除了,有时无法调整的情况。在这种情况下,将访问 H5 站。现在有监控系统。如果我们不能去H5站,我们会发现搜索流量异常,我们会修复它。最快的情况是处理问题反馈。 查看全部

  js抓取网页内容(百度科技园行动度基因沙龙之SEO、网站域名、百度页面)
  上个月,百度站长平台在百度科技园举办了变蝶行动基因沙龙。会上就网站SEO、网站域名、百度爬虫页面、APPLink等进行了交流讨论。以下为活动问答:包括JS代码收录、URL链接长度、海外域名对排名的影响等。问答详情如下:
  一、SEO 问题解答
  Q:使用百度统计进行广告跟踪时,配置的URL链接会很长。这种跟踪会影响搜索引擎优化吗?
  A:这种有多个URL版本的统计代码肯定会对SEO产生影响。对于这种情况有两个建议,一个是使用两组url进行真正的蜘蛛抓取和用户展示。另一种选择是停止使用百度统计,你可以使用谷歌中的跟踪,他可以使用#链接,事件跟踪,并参考美团网。所有链接加上事件跟踪。如果是生成的,也是用#号生成的,不加额外的参数。
  Q:如果一个页面一开始不符合百度的SEO标准,后来改成符合标准,百度需要多长时间才能提供好的结果?
  A:不同的站点可能会贡献不同的流量。因此,Spider 爬行的侧重点不同。有些站可能会发现更多新链接,有些站可能会查看旧链接。建议推到百度上,像首页一样抓取一般是没有问题的。
  Q:推送审核需要多长时间,一周还是半个月?
  A:如果说推送符合抓取标准,可以立即抓取。
  问:网站有两种 URL,旧的和新的。更换大约需要两年时间。现在旧 URL 将跳转到新 URL。由于服务器问题,网络中断了半个小时。搜索 关键词 后,旧的 url 出现了。现在基本上所有方法都无法恢复。在这种情况下我们应该怎么做?
  A:使用修改工具重新提交,保证修改成功,不会有问题。如有问题,截图并报告给工程师排查。
  Q:由于网站使用的是海外域名(暂时无法更改),有什么办法可以提高搜索量或爬取量?
  A:百度搜索引擎都是在中国备案的,最好使用国内的服务器和域名。
  Q:有些网站注册使用了很多域名,很多域名并不是供用户搜索的。现在这些域名都被注销了,但是还是可以找到的。我关了一次,但是没有用。我不知道如何处理这个?
  A:如果不需要那些站?你可以把它们关掉。短时间关闭新域名可能会为用户调用旧域名。当这个域名被关闭时,我们不会为用户进行长期调用。这些东西也不会被发现。
  Q:网站是母婴类网站,PC端搜索流量很差。想知道有没有办法?
  A:与医疗、养生、保健、母婴等问题类似,百度对搜索结果的展示非常谨慎。百度只对优质的网站开放他们的展示可能性,网站很可能很长时间都得不到流量。如果网站在SEO方面没有大问题,可以检查一下内容是否在争抢一些热门词。建议整个网站的权重和流量达到一定规模后再做热词。如果一开始就这样做关键词,当网站名声不是很高的时候,就不会有流量了。在这种情况下,网站 可能会更好地找到他们自己的区分和相关词之一。
  问:网站 从事教育行业。现在通过官网的认证是安全或权威的认证。认证后会有潜在的特殊待遇或无所谓。
  A:比如认证方面,你是真的,还有一个是假的。从用户的认知来看,你就是官网。
  问:关于数据化、软件和PDF和Word显示的问题,包括哪些类型和多少资源?应该和文章的内容一起发布,还是PDF和文章一样?也有矛盾。产品及操作希望用户下载后直接使用,不会对PDF、WORD产生一些压缩或工具处理。有些用户会被引导到 Word,无论他们是无意还是无意。我该怎么办?
  A:百度搜索栏现在默认称为网页搜索。顾名思义,我们向用户展示了一个网页。后面的库还有一种文件格式。搜索结果都是供用户下载使用的,他们可以去学习和展示图书馆的内容。
  Q:有没有渠道告诉搜索引擎我们的页面内容发生了变化,我们通常如何处理?一个老页面已经收录,排序了,过了一段时间他发起了新资源的添加和更改?
  A:目前还没有这样的渠道。首先,Spider 会检查一些东西。他发现网站经常出现在这种情况下,他的相关检查流量会增加。如果你担心,你应该把他放在站点地图中。
  Q:网站原本只是一个主页,一个APP下载。我们现在正在发布内容。过去,这些内容无法被抓取。现在,我们是否需要提交修订以将其发布到目录或子域中?
  A:这个是放在域名下的,一个子目录用来放分类的东西,没有修改。改首页,改版就没有其他问题了。使用主动推送工具的效果还是很明显的。如果内容质量非常好,您可以使用所有配额。
  Q:自动推送份额多久调整一次?因为我觉得你的份额对于我们几千万或几百万的海量数据来说太小了。
  A:我们也很关心一个网站有没有这种爆发力,突然增加这么多,我们觉得很不正常。你要循序渐进,不要又短又快,一夜之间吃成胖子。第二,你有这么多优秀的数据,你可以关注百度的另一个平台,你就变成了一个API,让别人使用你的数据。其他人为您的数据使用付费,您可以注意这一点。
  Q:URL的绝对路径和相对路径是否会受到超链接的影响?修改后我们的页面有翻页,翻页链接是12345,上面有标签。每次抓到12345都抓不到。模拟抓,感觉抓不到。Spider会抓取页面上的A标签吗?
  A:影响不大,能正常访问就可以了。不管是绝对路径还是相对路径,只要地址为Spider或者用户畅通无阻,并且页面渲染时地址完整,这条路径就可以顺利爬取。
  对于not收录的问题,可以参考其他的点,比如页面本身没有被访问或者目录级别比较高。页面首页推送的链接会被百度一层一层抓到。如果路径正常,会从首页爬取Spider路径。
  首先要做的是查看不是收录的链接日志是否已经被捕获。如果它被捕获而不是 收录,则可能是页面本身的问题。你也可以看一个周期,因为我们用一天。二是看日志中是否有长尾,是否隐藏或没有有效抓取或建关时推荐。如果你能看到日志,你可以看看日志来分析它。
  可以调整首页的变化,提出建议,做个测试看看是链接问题还是蜘蛛没有抓到的问题。还有push等方法可以解决,从而判断不收录是什么原因。学院有一个解决许多问题的文件,类似于流程图。当这个戒指出现时,为什么?如果够长,可以看看下面的树枝。
  Q:站点之前,所有的框架都是通过JS来展示的。后来百度没有收录,进行了PHP改版。外观是一样的。现在感觉这个PHP不是很规范。什么是百度非标收录?
  A:酒店行业很多内容不是实时加载的,而是通过JS慢慢获取页面上的内容。如果搜索引擎捕捉到它,那就是导航,这就是问题所在。以前有很多空白页收录,质量很差。关于 Pattern 认为质量低的模式,内容可能是一样的,所以考虑换个目录。
  二、APPLINK问题解答
  Q:现在网站的APP已经准备好了,加入APPLINK会不会有什么大的变化?
  A:H5网站和APP有对应关系吗?比如这里是100条H5站的内容,有100条APP的内容,应该是匹配的。关键是把网站放在行首,一定要调整好。
  Q:目前APP引流是Android和IOS,但有一小部分是Windows Phone。这个APP需要多长时间?
  A:分两点,我们来看看诺基亚的Windows平台战略。如果我们看到他的一些动作,我们一定会注意的。因为其实我们早期有一个关于APPLINK接入协议的协议。我们可以有WindowsPhone调用的机制。用户点击了一个结果,如果点击了结果,我们那里就有一个Android IE,它可以接受IE并将信息发回给用户。只要在前端实现一些信息,就可以做好。劳动量似乎不是很大,是可以实现的。除了WindowsPhone和手表,毕竟还可以调APP,大家可以看看。
  Q:APP和网页版,很多APP都嵌入在H5网页中,里面只是一个外壳。百度做的AppLink,他点击后,从百度APP弹到糯米APP,然后弹走。他用百度搜索了很多数据。百度用户可以点击下一个网站。如果你把他推到糯米,我们后面的人就没有机会了。
  A:其实APPLINK不是技术壁垒的问题,是努力的问题。对于大型网站,您可以自己做。对于APPLINK,未来可能会有各方面的调整。对于小站来说,如果小站连接起来,目前就有这个优势。因为小站访问也可以跳转到小站。
  Q:加入APPLINK后,如果小站数据不够,会一下子弹出来吗?
  A:当你回到你的站,至少进入你自己的生态。事实上,从搜索的角度来看,我们的目标是满足用户的需求。如果我们引导到网站,如果网站不能满足需求,用户自然会被转移。将用户引向你是网站满足用户需求的动力。我认为应该是这样的。
  Q:如果整个页面有APPLINK,会有一个分发按钮。分配按钮的条件是什么?
  A:没有条件,你把APP包给我们,我们给你分发。
  Q:目前除了你的团队之外,还有几个百度内容的手机助手。有什么区别吗?
  A:这是一个早期的尝试。我们都知道移动端和PC端已经合并了。作为一个整体,我们输出了一组解决方案。可能上半年我们把这件事推的很紧。当时我们也很困惑。那个时候整个生态合并之后,现在我们整体的输出是由APPLINK来做比较合理。移动助手不是搜索结果。输出可能在不同的产品线中,APPLINK 出现在搜索结果中。
  Q:加入APPLINK对移动站平台有影响吗?
  答:还没有。但他会有一个正常的点击。
  Q:Android生态最麻烦的就是有时候不能调整。这种问题不调整,会不会指导下载操作?
  A:一般有两种情况是不能调整的。一个是安装包,因为安卓或者IOS包还有一个版本问题。因为网上提交的版本是用户没有更新新版本,或者有可能出现用户安装了新版本,但又删除了,有时无法调整的情况。在这种情况下,将访问 H5 站。现在有监控系统。如果我们不能去H5站,我们会发现搜索流量异常,我们会修复它。最快的情况是处理问题反馈。

js抓取网页内容(MicrosoftEdge浏览器和360极速浏览器中的截图为例对照图片 )

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

  js抓取网页内容(MicrosoftEdge浏览器和360极速浏览器中的截图为例对照图片
)
  最近很多同学问我浏览器的F12是什么?它是干什么用的?为了解决大家的疑惑,特地写了这个文章,总结一下F12的使用。
  以下讲解主要以微软Edge浏览器和360极速浏览器截图为例。 (注:以下截图中,中文截图为Microsoft Edge浏览器截图,英文截图为360度浏览器截图。)
  推荐大家使用360极速浏览器,抓包更好更全面(不同于360浏览器);如果你英文不好,那就用微软Edge或者其他浏览器吧。
  F12:可以打开浏览器的开发者工具,主要收录网页的源代码、请求数据和响应数据。
  打开方法:打开浏览器,然后按快捷键F12或FN+F12打开“开发者工具”。
  
  
  下图为浏览器开发者工具(中文)的主要标签/功能:
  
  下图中,标签的中英文对比图:
  
  下面一一解释每个标签的含义
  1.元素
  我们在做 web 测试的时候,并没有过多关注 Elements 标签中的内容。除了查看页面元素属性和进行修改之外,其余的都不是很有用。
  
  2.控制台
  在Console标签中,可以查看页面的错误信息,打印调试信息(console.log()),编写一些测试脚本,作为JavaScript API查看;您也可以在控制台中查看它。有哪些方法和属性,
  下图显示错误信息:
  
  在日常的测试工作中,我经常使用Console标签中的内容来帮助定位bug——看看前端JS或者CSS有没有报错,然后再去前端开发...
  在控制台打印一些调试信息,console.log()的使用如下:
  
  3.来源
  Sources标签中,是网页实现的一部分源码,主要是JS文件、CSS文件、图片等,如下图,是JS文件的源码:
  
  下图是CSS文件的源代码:
  
  4. 网络 - F12 捕获
  这个Network标签中的内容是常用的测试用...
  每次在web端发现bug,第一反应就是赶紧打开:F12看看能不能抓到数据。
  这个网络真的好用,你可以在子标签中捕获请求数据和响应数据。
  
  如下图,Headers标签中,抓取百度搜索的请求数据(分别在Edge和360浏览器中抓取):
  
  
  
  
  如下图,在Response标签中,抓取百度搜索的响应数据(分别在Edge和360浏览器中抓取):
   查看全部

  js抓取网页内容(MicrosoftEdge浏览器和360极速浏览器中的截图为例对照图片
)
  最近很多同学问我浏览器的F12是什么?它是干什么用的?为了解决大家的疑惑,特地写了这个文章,总结一下F12的使用。
  以下讲解主要以微软Edge浏览器和360极速浏览器截图为例。 (注:以下截图中,中文截图为Microsoft Edge浏览器截图,英文截图为360度浏览器截图。)
  推荐大家使用360极速浏览器,抓包更好更全面(不同于360浏览器);如果你英文不好,那就用微软Edge或者其他浏览器吧。
  F12:可以打开浏览器的开发者工具,主要收录网页的源代码、请求数据和响应数据。
  打开方法:打开浏览器,然后按快捷键F12或FN+F12打开“开发者工具”。
  
  
  下图为浏览器开发者工具(中文)的主要标签/功能:
  
  下图中,标签的中英文对比图:
  
  下面一一解释每个标签的含义
  1.元素
  我们在做 web 测试的时候,并没有过多关注 Elements 标签中的内容。除了查看页面元素属性和进行修改之外,其余的都不是很有用。
  
  2.控制台
  在Console标签中,可以查看页面的错误信息,打印调试信息(console.log()),编写一些测试脚本,作为JavaScript API查看;您也可以在控制台中查看它。有哪些方法和属性,
  下图显示错误信息:
  
  在日常的测试工作中,我经常使用Console标签中的内容来帮助定位bug——看看前端JS或者CSS有没有报错,然后再去前端开发...
  在控制台打印一些调试信息,console.log()的使用如下:
  
  3.来源
  Sources标签中,是网页实现的一部分源码,主要是JS文件、CSS文件、图片等,如下图,是JS文件的源码:
  
  下图是CSS文件的源代码:
  
  4. 网络 - F12 捕获
  这个Network标签中的内容是常用的测试用...
  每次在web端发现bug,第一反应就是赶紧打开:F12看看能不能抓到数据。
  这个网络真的好用,你可以在子标签中捕获请求数据和响应数据。
  
  如下图,Headers标签中,抓取百度搜索的请求数据(分别在Edge和360浏览器中抓取):
  
  
  
  
  如下图,在Response标签中,抓取百度搜索的响应数据(分别在Edge和360浏览器中抓取):
  

js抓取网页内容(新浪财经为例之1.依赖的jar包-1. )

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

  js抓取网页内容(新浪财经为例之1.依赖的jar包-1.
)
  使用 Selenium 和 PhantomJs 可以模拟用户操作并抓取大部分 网站。以新浪财经为例,我们抓取新浪财经的新闻版块。
  
  1.依赖的jar包。我的项目是一个普通的SSM单间WEB项目。最后一个jar包用于抓取网页的DOM后解析网页的内容。
  

org.seleniumhq.selenium
selenium-java
3.2.0



javax
javaee-web-api
7.0
provided




com.google.guava
guava
20.0



cn.wanghaomiao
JsoupXpath
2.2


  2.获取网页dom内容
  package com.nsjr.grab.util;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriverService;
import org.openqa.selenium.remote.DesiredCapabilities;
import cn.wanghaomiao.xpath.model.JXDocument;
@SuppressWarnings("deprecation")
public class SeleniumUtil {

public static JXDocument getDocument(String driverUrl,String pageUrl){
JXDocument jxDocument = null;
PhantomJSDriver driver = null;
try{
System.setProperty("phantomjs.binary.path", driverUrl);
System.setProperty("webdriver.chrome.driver", driverUrl);

DesiredCapabilities dcaps = new DesiredCapabilities();
//ssl证书支持
dcaps.setCapability("acceptSslCerts", true);
//截屏支持
dcaps.setCapability("takesScreenshot", true);
//css搜索支持
dcaps.setCapability("cssSelectorsEnabled", true);
//js支持
dcaps.setJavascriptEnabled(true);
//驱动支持
dcaps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY,driverUrl);
//创建无界面浏览器对象
driver = new PhantomJSDriver(dcaps);
//WebDriver driver = new ChromeDriver(dcaps);
driver.get(pageUrl);
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
Document document = Jsoup.parse(driver.getPageSource());
jxDocument = new JXDocument(document);
}catch(Exception e){
e.printStackTrace();
}finally{
if(driver != null){
driver.quit();
}
}
return jxDocument;
}


public static String getProperty(List list){
if(list.isEmpty()){
return "";
}else{
return list.get(0).toString();
}
}
}
  3.解析并保存内容
  JXDocument jxDocument = SeleniumUtil.getDocument(captureUrl.getDriverUrl(), captureUrl.getSinaNews());

//保存第一部分加粗新闻
List listh3 = jxDocument.sel("//div[@id='impNews1']/div[@id='fin_tabs0_c0']/div[@id='blk_hdline_01']/h3/a");
for(Object a :listh3){
JXDocument doc = new JXDocument(a.toString());
//System.out.println("地址:"+doc.sel("//a/@href"));
//System.out.println("标题:"+doc.sel("//text()"));
saveNews(SeleniumUtil.getProperty(doc.sel("//text()")), SeleniumUtil.getProperty(doc.sel("//a/@href")), Constant.NEWS_TYPE_BOTTOM, Constant.NEWS_SOURCE_SINA);
}

//保存其余新闻
List listP = jxDocument.sel("//div[@id='impNews1']/div[@id='fin_tabs0_c0']/div[@id='blk_hdline_01']/p/a");
for(Object a :listP){
JXDocument doc = new JXDocument(a.toString());
//System.out.println("地址:"+doc.sel("//a/@href"));
//System.out.println("标题:"+doc.sel("//text()"));
saveNews(SeleniumUtil.getProperty(doc.sel("//text()")), SeleniumUtil.getProperty(doc.sel("//a/@href")), Constant.NEWS_TYPE_BOTTOM, Constant.NEWS_SOURCE_SINA);
}

//保存第二部分新闻
List listpart2 = jxDocument.sel("//div[@id='impNews1']/div[@id='fin_tabs0_c0']/div[2]/ul");
for(Object a :listpart2){
JXDocument doc = new JXDocument(a.toString());
List alist = doc.sel("//li/a");
for(Object a2 :alist){
JXDocument doc2 = new JXDocument(a2.toString());
//System.out.println("地址:"+doc2.sel("//a/@href"));
//System.out.println("标题:"+doc2.sel("//text()"));
saveNews(
SeleniumUtil.getProperty(doc2.sel("//text()")),
SeleniumUtil.getProperty(doc2.sel("//a/@href")),
Constant.NEWS_TYPE_BOTTOM,
Constant.NEWS_SOURCE_SINA
);
}
}
  4.解释
  captureUrl.getDriverUrl(), captureUrl.getSinaNews() 这两个地址分别是PhantomJs工具的地址和要爬取的网站的地址,其中
  sina_news = https://finance.sina.com.cn/
  driverUrl= D:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe
  PhantomJs工具的下载可以直接到官网下载。有windows和Linux版本可供下载。网页结构的解析使用了JsoupXpath,这是一个中国人写的html文档解析工具包,非常好用。语法可以参考Xpath的相关语法进行节点选择。
  5. 爬取结果。由于项目要求比较简单,对实时性和性能要求不高,只有存储才能满足要求。
  
  最后,刚开始接触爬虫的时候,有的需要webmagic可以满足,有的需要其他方法,具体问题需要详细分析。目前还在探索阶段,本文只提供解决方案。
    查看全部

  js抓取网页内容(新浪财经为例之1.依赖的jar包-1.
)
  使用 Selenium 和 PhantomJs 可以模拟用户操作并抓取大部分 网站。以新浪财经为例,我们抓取新浪财经的新闻版块。
  
  1.依赖的jar包。我的项目是一个普通的SSM单间WEB项目。最后一个jar包用于抓取网页的DOM后解析网页的内容。
  

org.seleniumhq.selenium
selenium-java
3.2.0



javax
javaee-web-api
7.0
provided




com.google.guava
guava
20.0



cn.wanghaomiao
JsoupXpath
2.2


  2.获取网页dom内容
  package com.nsjr.grab.util;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriverService;
import org.openqa.selenium.remote.DesiredCapabilities;
import cn.wanghaomiao.xpath.model.JXDocument;
@SuppressWarnings("deprecation")
public class SeleniumUtil {

public static JXDocument getDocument(String driverUrl,String pageUrl){
JXDocument jxDocument = null;
PhantomJSDriver driver = null;
try{
System.setProperty("phantomjs.binary.path", driverUrl);
System.setProperty("webdriver.chrome.driver", driverUrl);

DesiredCapabilities dcaps = new DesiredCapabilities();
//ssl证书支持
dcaps.setCapability("acceptSslCerts", true);
//截屏支持
dcaps.setCapability("takesScreenshot", true);
//css搜索支持
dcaps.setCapability("cssSelectorsEnabled", true);
//js支持
dcaps.setJavascriptEnabled(true);
//驱动支持
dcaps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY,driverUrl);
//创建无界面浏览器对象
driver = new PhantomJSDriver(dcaps);
//WebDriver driver = new ChromeDriver(dcaps);
driver.get(pageUrl);
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
Document document = Jsoup.parse(driver.getPageSource());
jxDocument = new JXDocument(document);
}catch(Exception e){
e.printStackTrace();
}finally{
if(driver != null){
driver.quit();
}
}
return jxDocument;
}


public static String getProperty(List list){
if(list.isEmpty()){
return "";
}else{
return list.get(0).toString();
}
}
}
  3.解析并保存内容
  JXDocument jxDocument = SeleniumUtil.getDocument(captureUrl.getDriverUrl(), captureUrl.getSinaNews());

//保存第一部分加粗新闻
List listh3 = jxDocument.sel("//div[@id='impNews1']/div[@id='fin_tabs0_c0']/div[@id='blk_hdline_01']/h3/a");
for(Object a :listh3){
JXDocument doc = new JXDocument(a.toString());
//System.out.println("地址:"+doc.sel("//a/@href"));
//System.out.println("标题:"+doc.sel("//text()"));
saveNews(SeleniumUtil.getProperty(doc.sel("//text()")), SeleniumUtil.getProperty(doc.sel("//a/@href")), Constant.NEWS_TYPE_BOTTOM, Constant.NEWS_SOURCE_SINA);
}

//保存其余新闻
List listP = jxDocument.sel("//div[@id='impNews1']/div[@id='fin_tabs0_c0']/div[@id='blk_hdline_01']/p/a");
for(Object a :listP){
JXDocument doc = new JXDocument(a.toString());
//System.out.println("地址:"+doc.sel("//a/@href"));
//System.out.println("标题:"+doc.sel("//text()"));
saveNews(SeleniumUtil.getProperty(doc.sel("//text()")), SeleniumUtil.getProperty(doc.sel("//a/@href")), Constant.NEWS_TYPE_BOTTOM, Constant.NEWS_SOURCE_SINA);
}

//保存第二部分新闻
List listpart2 = jxDocument.sel("//div[@id='impNews1']/div[@id='fin_tabs0_c0']/div[2]/ul");
for(Object a :listpart2){
JXDocument doc = new JXDocument(a.toString());
List alist = doc.sel("//li/a");
for(Object a2 :alist){
JXDocument doc2 = new JXDocument(a2.toString());
//System.out.println("地址:"+doc2.sel("//a/@href"));
//System.out.println("标题:"+doc2.sel("//text()"));
saveNews(
SeleniumUtil.getProperty(doc2.sel("//text()")),
SeleniumUtil.getProperty(doc2.sel("//a/@href")),
Constant.NEWS_TYPE_BOTTOM,
Constant.NEWS_SOURCE_SINA
);
}
}
  4.解释
  captureUrl.getDriverUrl(), captureUrl.getSinaNews() 这两个地址分别是PhantomJs工具的地址和要爬取的网站的地址,其中
  sina_news = https://finance.sina.com.cn/
  driverUrl= D:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe
  PhantomJs工具的下载可以直接到官网下载。有windows和Linux版本可供下载。网页结构的解析使用了JsoupXpath,这是一个中国人写的html文档解析工具包,非常好用。语法可以参考Xpath的相关语法进行节点选择。
  5. 爬取结果。由于项目要求比较简单,对实时性和性能要求不高,只有存储才能满足要求。
  
  最后,刚开始接触爬虫的时候,有的需要webmagic可以满足,有的需要其他方法,具体问题需要详细分析。目前还在探索阶段,本文只提供解决方案。
   

js抓取网页内容( “显示更多”按钮刮一个谷歌学者页面(组图) )

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

  js抓取网页内容(
“显示更多”按钮刮一个谷歌学者页面(组图)
)
  使用 Selenium 使用 javascript 抓取网页
  pythonseleniumweb-scraping
  使用 Selenium 用 javascript、javascript、python、selenium、web-scraping、beautifulsoup、Javascript、Python、Selenium、Web Scraping、Beautifulsoup 抓取网页,我想用“显示更多”按钮抓取一个 Google Scholar 页面。我从上一个问题中了解到,它不是 html 而是 javascript,并且有几种方法可以抓取这样的页面。我尝试了 selenium 并尝试了以下代码 from selenium import webdriverfrom bs4 import BeautifulSoupoptions = webdriver.ChromeOptions()options.add_argument('--ignore-certificate-errors')option
  我想用“显示更多”按钮抓取一个谷歌学者页面。我从上一个问题中了解到,它不是 html 而是 javascript,并且有几种方法可以抓取这样的页面。我尝试了硒并尝试了以下代码
  from selenium import webdriver
from bs4 import BeautifulSoup
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--incognito')
options.add_argument('--headless')
chrome_path = r"....path....."
driver = webdriver.Chrome(chrome_path)
driver.get("https://scholar.google.com/cit ... 6quot;)
driver.find_element_by_xpath('/html/body/div/div[13]/div[2]/div/div[4]/form/div[2]/div/button/span/span[2]').click()
soup = BeautifulSoup(driver.page_source,'html.parser')
papers = soup.find_all('tr',{'class':'gsc_a_tr'})
for paper in papers:
title = paper.find('a',{'class':'gsc_a_at'}).text
author = paper.find('div',{'class':'gs_gray'}).text
journal = [a.text for a in paper.select("td:nth-child(1) > div:nth-child(3)")]


print('Paper Title:', title, '\nAuthor:', author, '\nJournal:', journal)
  浏览器现在单击“显示更多”按钮并显示整个页面。但是,我仍然只能获得前 20 篇论文的信息。我不理解为什么。请帮忙
  谢谢
  我认为您的问题是当您的程序检查 网站 时,新元素尚未完全加载。尝试导入时间,然后睡几分钟。这样(我删除了无头功能,以便您可以看到程序工作):
  导入时间
从selenium导入webdriver
从selenium.webdriver.chrome.options导入选项
选项=选项()
options.page_load_策略='normal'
driver=webdriver.Chrome(options=options)
驱动程序。获取(“https://scholar.google.com/cit ... 6quot;)
#笨拙的方法
#加载所有可用文章,然后对其进行迭代
对于范围(1,3)内的i:
驱动程序。通过_css_选择器('#gsc_bpf_more')查找_元素。单击()
#等待元素加载
时间。睡眠(3)
#所有数据所在的容器
对于驱动程序中的结果。通过“css”选择器(“#gsc_a_b.gsc_a_t”)查找“元素”:
title=result.find_element_by_css_选择器('.gsc_a_at')。text
authors=result.find_element_by_css_selector('.gsc_a_at+.gs_gray')。text
publication=result.find_element_by_css_选择器('.gs_gray+.gs_gray')。text
印刷品(标题)
印刷品(作者)
印刷品(出版物)
#只是为了分开
打印()
  部分输出:
  有环保意识的消费者参与的税收/补贴政策
南班萨尔,南甘戈帕迪亚
环境经济与管理杂志45(2),333-355
绿色消费者面前监管工具的选择与设计
班萨尔群岛
资源和能源经济学30(3),345-368
  from selenium import webdriver
import time
from bs4 import BeautifulSoup
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--incognito')
driver = webdriver.Chrome()
driver.get("https://scholar.google.com/cit ... 6quot;)
time.sleep(3)
driver.find_element_by_id("gsc_bpf_more").click()
time.sleep(4)
soup = BeautifulSoup(driver.page_source, 'html.parser')
papers = soup.find_all('tr', {'class': 'gsc_a_tr'})
for paper in papers:
title = paper.find('a', {'class': 'gsc_a_at'}).text
author = paper.find('div', {'class': 'gs_gray'}).text
journal = [a.text for a in paper.select("td:nth-child(1) > div:nth-child(3)")]
print('Paper Title:', title, '\nAuthor:', author, '\nJournal:', journal) 查看全部

  js抓取网页内容(
“显示更多”按钮刮一个谷歌学者页面(组图)
)
  使用 Selenium 使用 javascript 抓取网页
  pythonseleniumweb-scraping
  使用 Selenium 用 javascript、javascript、python、selenium、web-scraping、beautifulsoup、Javascript、Python、Selenium、Web Scraping、Beautifulsoup 抓取网页,我想用“显示更多”按钮抓取一个 Google Scholar 页面。我从上一个问题中了解到,它不是 html 而是 javascript,并且有几种方法可以抓取这样的页面。我尝试了 selenium 并尝试了以下代码 from selenium import webdriverfrom bs4 import BeautifulSoupoptions = webdriver.ChromeOptions()options.add_argument('--ignore-certificate-errors')option
  我想用“显示更多”按钮抓取一个谷歌学者页面。我从上一个问题中了解到,它不是 html 而是 javascript,并且有几种方法可以抓取这样的页面。我尝试了硒并尝试了以下代码
  from selenium import webdriver
from bs4 import BeautifulSoup
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--incognito')
options.add_argument('--headless')
chrome_path = r"....path....."
driver = webdriver.Chrome(chrome_path)
driver.get("https://scholar.google.com/cit ... 6quot;)
driver.find_element_by_xpath('/html/body/div/div[13]/div[2]/div/div[4]/form/div[2]/div/button/span/span[2]').click()
soup = BeautifulSoup(driver.page_source,'html.parser')
papers = soup.find_all('tr',{'class':'gsc_a_tr'})
for paper in papers:
title = paper.find('a',{'class':'gsc_a_at'}).text
author = paper.find('div',{'class':'gs_gray'}).text
journal = [a.text for a in paper.select("td:nth-child(1) > div:nth-child(3)")]


print('Paper Title:', title, '\nAuthor:', author, '\nJournal:', journal)
  浏览器现在单击“显示更多”按钮并显示整个页面。但是,我仍然只能获得前 20 篇论文的信息。我不理解为什么。请帮忙
  谢谢
  我认为您的问题是当您的程序检查 网站 时,新元素尚未完全加载。尝试导入时间,然后睡几分钟。这样(我删除了无头功能,以便您可以看到程序工作):
  导入时间
从selenium导入webdriver
从selenium.webdriver.chrome.options导入选项
选项=选项()
options.page_load_策略='normal'
driver=webdriver.Chrome(options=options)
驱动程序。获取(“https://scholar.google.com/cit ... 6quot;)
#笨拙的方法
#加载所有可用文章,然后对其进行迭代
对于范围(1,3)内的i:
驱动程序。通过_css_选择器('#gsc_bpf_more')查找_元素。单击()
#等待元素加载
时间。睡眠(3)
#所有数据所在的容器
对于驱动程序中的结果。通过“css”选择器(“#gsc_a_b.gsc_a_t”)查找“元素”:
title=result.find_element_by_css_选择器('.gsc_a_at')。text
authors=result.find_element_by_css_selector('.gsc_a_at+.gs_gray')。text
publication=result.find_element_by_css_选择器('.gs_gray+.gs_gray')。text
印刷品(标题)
印刷品(作者)
印刷品(出版物)
#只是为了分开
打印()
  部分输出:
  有环保意识的消费者参与的税收/补贴政策
南班萨尔,南甘戈帕迪亚
环境经济与管理杂志45(2),333-355
绿色消费者面前监管工具的选择与设计
班萨尔群岛
资源和能源经济学30(3),345-368
  from selenium import webdriver
import time
from bs4 import BeautifulSoup
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--incognito')
driver = webdriver.Chrome()
driver.get("https://scholar.google.com/cit ... 6quot;)
time.sleep(3)
driver.find_element_by_id("gsc_bpf_more").click()
time.sleep(4)
soup = BeautifulSoup(driver.page_source, 'html.parser')
papers = soup.find_all('tr', {'class': 'gsc_a_tr'})
for paper in papers:
title = paper.find('a', {'class': 'gsc_a_at'}).text
author = paper.find('div', {'class': 'gs_gray'}).text
journal = [a.text for a in paper.select("td:nth-child(1) > div:nth-child(3)")]
print('Paper Title:', title, '\nAuthor:', author, '\nJournal:', journal)

js抓取网页内容(解析XML网页链接来抓取指定的内容比如豆瓣电影排行榜,)

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

  js抓取网页内容(解析XML网页链接来抓取指定的内容比如豆瓣电影排行榜,)
  如果给你一个网页链接去抓取特定的内容,比如豆瓣电影排名,你怎么做?
  其实网页内容的结构和XML很相似,所以我们可以通过解析XML来解析HTML,但是两者之间还是有很大差距的。好了,事不宜迟,让我们开始解析 HTML。
  然后解析xml的库很多,这里我们使用libxml来解析,因为libxml是C语言接口,我找了一个library-hpple用objective-c封装接口,它的地址是,那么网页用的是豆瓣电影排名,地址是。
  接下来新建项目,使用ARC,引入libxml2和hpple库,新建实体类movie。完整的项目结构如下:
  
  movie的实现如下,这是一个实体类,根据爬取的网页内容确定实体
  电影.h
  1@interface Movie : NSObject
2@property(nonatomic, strong) NSString *name;
3@property(nonatomic, strong) NSString *imageUrl;
4@property(nonatomic, strong) NSString *descrition;
5@property(nonatomic, strong) NSString *movieUrl;
6@property(nonatomic) NSInteger ratingNumber;
7@property(nonatomic, strong) NSString *comment;
8@end
9
  那么最重要的部分就到这里了,不管网页的内容是什么,我们都需要先获取网页的内容。下面是通过NSURLConnection获取整个网页的内容。
  1- (void)loadHTMLContent
2{
3 NSString *movieUrl = MOVIE_URL;
4 NSString *urlString = [movieUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
5 NSURL *url = [NSURL URLWithString:urlString];
6
7 NSURLRequest *request = [NSURLRequest requestWithURL:url];
8
9 [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
10
11 __weak ViewController *weak_self = self;
12 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
13 if (nil == error) {
14// NSString *retString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
15// NSLog(@"%@", retString);
16 [weak_self parserHTML:data];
17 }
18
19 [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
20 }];
21}
22
  这只是获取网页内容的一种简单方法。一些HTTP和错误处理本文不讨论,所以这里的代码比较简单。上面代码中有一个parserHTML:方法,就是对获取到的网页内容进行解析。在此之前,让我们拆除 xpath。
  假设一个简单的网页收录以下内容:
  1

3    Some webpage


6    This is the first paragraph
7    This is the second paragraph. This is in bold.
8   
9
  比如要获取title的内容,那么xpath表达式就是/html/head/title。如果要获取 class="special" 节点内容,xpath 为 /html/body/p[@class='special']。
  所以只要找到合适的xpath,就会得到对应的节点内容,接下来我们用hpple来解析html
  1- (void)parserHTML:(NSData *)data
2{
3 if (nil != data) {
4 TFHpple *movieParser = [TFHpple hppleWithHTMLData:data];
5 NSString *movieXpathQueryString = @"/html/body/div[@id=&#x27;wrapper&#x27;]/div[@id=&#x27;content&#x27;]/div[@class=&#x27;grid-16-8 clearfix&#x27;]/div[@class=&#x27;article&#x27;]/div[@class=&#x27;indent&#x27;]/table/tr/td/a[@class=&#x27;nbg&#x27;]";
6 NSArray *movieNodes = [movieParser searchWithXPathQuery:movieXpathQueryString];
7
8 for (TFHppleElement *element in movieNodes) {
9 Movie *m = [[Movie alloc] init];
10 m.name = [element objectForKey:@"title"];
11 m.movieUrl = [element objectForKey:@"href"];
12
13 for (TFHppleElement *child in element.children) {
14 if ([child.tagName isEqualToString:@"img"]) {
15 @try {
16 m.imageUrl = [child objectForKey:@"src"];
17 }
18 @catch (NSException *exception) {
19
20 }
21 }
22 }
23
24 [self.movies addObject:m];
25 }
26
27 [self.movieTableView reloadData];
28 }
29}
30
  代码中,第一页找到对应节点的路径,然后searchWithXPathQuery得到一个数组。遍历组织数据后,可以在表格视图中展示。具体效果如下:
  
  嗯,网页的内容已经爬出来了,实际项目比这个复杂,所以这里只是一个指导性的例子。
  参考:
  注:本文由小涵撰写,请支持原创!如需转载,请附上原文链接: 查看全部

  js抓取网页内容(解析XML网页链接来抓取指定的内容比如豆瓣电影排行榜,)
  如果给你一个网页链接去抓取特定的内容,比如豆瓣电影排名,你怎么做?
  其实网页内容的结构和XML很相似,所以我们可以通过解析XML来解析HTML,但是两者之间还是有很大差距的。好了,事不宜迟,让我们开始解析 HTML。
  然后解析xml的库很多,这里我们使用libxml来解析,因为libxml是C语言接口,我找了一个library-hpple用objective-c封装接口,它的地址是,那么网页用的是豆瓣电影排名,地址是。
  接下来新建项目,使用ARC,引入libxml2和hpple库,新建实体类movie。完整的项目结构如下:
  
  movie的实现如下,这是一个实体类,根据爬取的网页内容确定实体
  电影.h
  1@interface Movie : NSObject
2@property(nonatomic, strong) NSString *name;
3@property(nonatomic, strong) NSString *imageUrl;
4@property(nonatomic, strong) NSString *descrition;
5@property(nonatomic, strong) NSString *movieUrl;
6@property(nonatomic) NSInteger ratingNumber;
7@property(nonatomic, strong) NSString *comment;
8@end
9
  那么最重要的部分就到这里了,不管网页的内容是什么,我们都需要先获取网页的内容。下面是通过NSURLConnection获取整个网页的内容。
  1- (void)loadHTMLContent
2{
3 NSString *movieUrl = MOVIE_URL;
4 NSString *urlString = [movieUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
5 NSURL *url = [NSURL URLWithString:urlString];
6
7 NSURLRequest *request = [NSURLRequest requestWithURL:url];
8
9 [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
10
11 __weak ViewController *weak_self = self;
12 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
13 if (nil == error) {
14// NSString *retString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
15// NSLog(@"%@", retString);
16 [weak_self parserHTML:data];
17 }
18
19 [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
20 }];
21}
22
  这只是获取网页内容的一种简单方法。一些HTTP和错误处理本文不讨论,所以这里的代码比较简单。上面代码中有一个parserHTML:方法,就是对获取到的网页内容进行解析。在此之前,让我们拆除 xpath。
  假设一个简单的网页收录以下内容:
  1

3    Some webpage


6    This is the first paragraph
7    This is the second paragraph. This is in bold.
8   
9
  比如要获取title的内容,那么xpath表达式就是/html/head/title。如果要获取 class="special" 节点内容,xpath 为 /html/body/p[@class='special']。
  所以只要找到合适的xpath,就会得到对应的节点内容,接下来我们用hpple来解析html
  1- (void)parserHTML:(NSData *)data
2{
3 if (nil != data) {
4 TFHpple *movieParser = [TFHpple hppleWithHTMLData:data];
5 NSString *movieXpathQueryString = @"/html/body/div[@id=&#x27;wrapper&#x27;]/div[@id=&#x27;content&#x27;]/div[@class=&#x27;grid-16-8 clearfix&#x27;]/div[@class=&#x27;article&#x27;]/div[@class=&#x27;indent&#x27;]/table/tr/td/a[@class=&#x27;nbg&#x27;]";
6 NSArray *movieNodes = [movieParser searchWithXPathQuery:movieXpathQueryString];
7
8 for (TFHppleElement *element in movieNodes) {
9 Movie *m = [[Movie alloc] init];
10 m.name = [element objectForKey:@"title"];
11 m.movieUrl = [element objectForKey:@"href"];
12
13 for (TFHppleElement *child in element.children) {
14 if ([child.tagName isEqualToString:@"img"]) {
15 @try {
16 m.imageUrl = [child objectForKey:@"src"];
17 }
18 @catch (NSException *exception) {
19
20 }
21 }
22 }
23
24 [self.movies addObject:m];
25 }
26
27 [self.movieTableView reloadData];
28 }
29}
30
  代码中,第一页找到对应节点的路径,然后searchWithXPathQuery得到一个数组。遍历组织数据后,可以在表格视图中展示。具体效果如下:
  
  嗯,网页的内容已经爬出来了,实际项目比这个复杂,所以这里只是一个指导性的例子。
  参考:
  注:本文由小涵撰写,请支持原创!如需转载,请附上原文链接:

js抓取网页内容(js抓取网页内容的3大步骤可以给网页信息打一个标签)

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

  js抓取网页内容(js抓取网页内容的3大步骤可以给网页信息打一个标签)
  js抓取网页内容的3大步骤可以给网页信息打一个标签,用户即可获取其中的信息及其与自己的关系:如搜索结果等使用javascript,可以解析网页,访问和获取原始数据当然你也可以使用浏览器来制作一个工具如:ga安装:node。js和python2。7如果没有nodejs和python,可以用v8和express代替nodejsnpmi-grequire-jsexpressreact-node。
  js数据获取:主要用到四个方法:setdata-将数据保存到本地数据库replacedata-从服务器获取数据,转换方法:xmlhttprequest,transformrator,request,tojsondemo-jsga网页数据爬取数据获取的post时会检查post参数和数据模板,并且会检查accept,cookie,authenticate,authorization。其他。
  (二维码自动识别)
  精确定位商品信息,在卖家自定义打标的情况下,首先可以选择同行的产品,将商品的标签下发到同行信息平台,然后把url放到需要抓取的网页,例如京东信息平台,就可以直接抓取了。但是这种方法缺点很明显,数据不够精准,因为同行的商品信息里面是存在真正同行产品的所有信息的。而且需要数据库查询的功能,如果比较在意数据质量,还是自己打标的方法更好。
  其实爬虫如果做不好准备的话,百分之九十拿到的数据是post出来的格式,要么是乱码,要么就是假货数据。还是建议你一定要有个数据库来保存你的数据,再去京东这些平台,根据他们的产品要求去筛选就可以了。如果做一个独立爬虫,成本确实不小。 查看全部

  js抓取网页内容(js抓取网页内容的3大步骤可以给网页信息打一个标签)
  js抓取网页内容的3大步骤可以给网页信息打一个标签,用户即可获取其中的信息及其与自己的关系:如搜索结果等使用javascript,可以解析网页,访问和获取原始数据当然你也可以使用浏览器来制作一个工具如:ga安装:node。js和python2。7如果没有nodejs和python,可以用v8和express代替nodejsnpmi-grequire-jsexpressreact-node。
  js数据获取:主要用到四个方法:setdata-将数据保存到本地数据库replacedata-从服务器获取数据,转换方法:xmlhttprequest,transformrator,request,tojsondemo-jsga网页数据爬取数据获取的post时会检查post参数和数据模板,并且会检查accept,cookie,authenticate,authorization。其他。
  (二维码自动识别)
  精确定位商品信息,在卖家自定义打标的情况下,首先可以选择同行的产品,将商品的标签下发到同行信息平台,然后把url放到需要抓取的网页,例如京东信息平台,就可以直接抓取了。但是这种方法缺点很明显,数据不够精准,因为同行的商品信息里面是存在真正同行产品的所有信息的。而且需要数据库查询的功能,如果比较在意数据质量,还是自己打标的方法更好。
  其实爬虫如果做不好准备的话,百分之九十拿到的数据是post出来的格式,要么是乱码,要么就是假货数据。还是建议你一定要有个数据库来保存你的数据,再去京东这些平台,根据他们的产品要求去筛选就可以了。如果做一个独立爬虫,成本确实不小。

js抓取网页内容(关于GoogleAnalytics的一些维度和指标(amp)(图) )

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

  js抓取网页内容(关于GoogleAnalytics的一些维度和指标(amp)(图)
)
  概述
  深入了解数据的维度和指标是正确理解和分析数据的开始。Google Analytics (GA) 有许多内置的维度和指标。本系列文章将对这些维度和指标一一整理讲解。结合 GA 官方 JavaScript 库和 SDK,我们将深入探讨这些数据是如何获取和传递的……
  注:本文默认封装为GA中的维度或指标。
  &amp;
  页面和主机名是 GA 中最常用的维度之一。
  JS: document.location.pathname + document.location.search
例如:"/test?key=123"
  JS: document.location.hostname
例如:"127.0.0.1" / "analytics.google.com"
  以上两个维度在GA中应用比较广泛,比如推荐排除/跨域...
  可用于行为定位、模型创建、目标设定……
  那么这两个指标在GA中是如何得到的呢?
  我们知道 GA 通过向 Google 服务器发送带有参数的请求来进行数据采集。比如我们最常见的页面浏览量是:pageview
  可能是发送了如下所示的请求。
  
  请求中,t代表匹配类型,这里是pageview;dl 代表文档位置URL,这里是
  ; dp 表示文档路径,在本例中为 /test#ga_dp。
  那么这个请求发送给 GA 后,GA 显示的网页和主机名是什么?不用在这里买了。
   /test#ga_dp
127.0.0.1
  那么还有一个问题,如果这里没有发送 dp 怎么办?因为如果我们平时注意的话,一般都是在pageview中看到dl,而除非有特殊设置,我们很少看到dp
  答案是
   /test?key=123
  之所以这样改动,是因为dl是analytics.js或者gtag.js(简称GA_js库)发送的默认参数,而dp是可选参数。默认发送dl时,GA_js库会自动抓取以下浏览器参数,即:
  document.location.origin + document.location.pathname + document.location.search
  形成 dl 并发送。发送给GA后,GA服务器会对dl传递的参数进行反汇编,取出主机名和URI部分,分别赋值&amp;两个维度。
  但是如果除了默认发送的 dl 之外还指定了两个可选参数 dh(文档主机名)和 dp(文档路径),GA 会先使用指定的 dh 或 dp。
  所以对于虚拟页面的价值如何传递而纠结的同学,可以在这里安心。您可以使用综合浏览量发送位置或页面,但必须发送位置。
  Ok~这个问题就结束了,但是如果你和GA接触很久了,你可能还有一些其他的问题,比如:
  如果我在 dl 参数中传递一个随机数,例如:test:///test?protocol:test 怎么办?—— 请求无效。如果是dl参数,我传一个数字,如上,还要传dp的值吗?—— 请求有效,网页通过dp的值。如果我在A页面部署默认的GA基础代码,同时在网页出现弹窗的时候发送一个dummy page事件(B页面),弹窗有点击事件,如果我进入网页,然后触发弹窗,然后点击事件,那么此时事件所属的网页是A还是虚拟页面B——如果是用set命令设置的pageview ,此时事件所属的网页是B,不仅是弹窗上的B,而且在下面刷新页面之前的所有事件都是B。如果在默认发送浏览量中添加参数{'page'},则事件所属的页面为A,其他事件不受该页面影响。(出现这种现象的原因是GA在加载analytics.js时默认会在tracker中设置tracker的dl参数,后续事件会使用这个参数,除非被显式值覆盖。)如果我的网页中的锚点(#) 后面的信息在区分网页中起着重要的作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... 该事件所属的页面为A,其他事件不受该页面影响。(出现这种现象的原因是GA在加载analytics.js时默认会在tracker中设置tracker的dl参数,后续事件会使用这个参数,除非被显式值覆盖。)如果我的网页中的锚点(#) 后面的信息在区分网页中起着重要的作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... 该事件所属的页面为A,其他事件不受该页面影响。(出现这种现象的原因是GA在加载analytics.js时默认会在tracker中设置tracker的dl参数,后续事件会使用这个参数,除非被显式值覆盖。)如果我的网页中的锚点(#) 后面的信息在区分网页中起着重要的作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... (出现这种现象的原因是GA在加载analytics.js时默认会在tracker中设置tracker的dl参数,后续事件会使用这个参数,除非被显式值覆盖。)如果我的网页中的锚点(#) 后面的信息在区分网页中起着重要的作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... (出现这种现象的原因是GA在加载analytics.js时默认会在tracker中设置tracker的dl参数,后续事件会使用这个参数,除非被显式值覆盖。)如果我的网页中的锚点(#) 后面的信息在区分网页中起着重要的作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... ) 如果我的网页中的锚点 (#) 后面的信息对区分网页起重要作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... ) 如果我的网页中的锚点 (#) 后面的信息对区分网页起重要作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。...
  了解了这一点后,我们似乎对 &amp; 这两个指标有了更多的了解。但是我们可以再深入一点吗?
  当然,你会怎么写这个 文章
  以analytics.js为例,扩展analytics.js,看看GA是怎么得到的。
  搜索关键词 location dl后,可以找到如下代码:
  
  其他代码就省略了,当然如果你好奇,也可以关注我的另一个系列文章《谷歌analytics.js源码分析》。
  这里,Kb = '位置'
  a.set等的取值以及在对应tracker中设置参数位置为:
  
  可以看出,实际上dl的传递值是在analytics.js中设置的,不是GA账号处理的。
  ##
  现在我提到了,顺便说一句。
  登陆页面的定义众所周知,这里不再赘述。在 GA 中,着陆页定义为
  
  正常情况下,这自然是没有问题的,但是遇到意外情况,这个解释就显得有些不清楚了。
  例如:
  假设用户进入某个网站页面A,在页面上发送事件e_1,然后进入页面B。
  但是由于实际登陆页面A的页面浏览代码部署错误,导致页面浏览丢失,那么此时事件e_1的登陆页面是什么呢?
  A: (not set)
B: 网页B
  答案将在下一期揭晓,也可以私下交流心得~
  白色 白色
   查看全部

  js抓取网页内容(关于GoogleAnalytics的一些维度和指标(amp)(图)
)
  概述
  深入了解数据的维度和指标是正确理解和分析数据的开始。Google Analytics (GA) 有许多内置的维度和指标。本系列文章将对这些维度和指标一一整理讲解。结合 GA 官方 JavaScript 库和 SDK,我们将深入探讨这些数据是如何获取和传递的……
  注:本文默认封装为GA中的维度或指标。
  &amp;
  页面和主机名是 GA 中最常用的维度之一。
  JS: document.location.pathname + document.location.search
例如:"/test?key=123"
  JS: document.location.hostname
例如:"127.0.0.1" / "analytics.google.com"
  以上两个维度在GA中应用比较广泛,比如推荐排除/跨域...
  可用于行为定位、模型创建、目标设定……
  那么这两个指标在GA中是如何得到的呢?
  我们知道 GA 通过向 Google 服务器发送带有参数的请求来进行数据采集。比如我们最常见的页面浏览量是:pageview
  可能是发送了如下所示的请求。
  
  请求中,t代表匹配类型,这里是pageview;dl 代表文档位置URL,这里是
  ; dp 表示文档路径,在本例中为 /test#ga_dp。
  那么这个请求发送给 GA 后,GA 显示的网页和主机名是什么?不用在这里买了。
   /test#ga_dp
127.0.0.1
  那么还有一个问题,如果这里没有发送 dp 怎么办?因为如果我们平时注意的话,一般都是在pageview中看到dl,而除非有特殊设置,我们很少看到dp
  答案是
   /test?key=123
  之所以这样改动,是因为dl是analytics.js或者gtag.js(简称GA_js库)发送的默认参数,而dp是可选参数。默认发送dl时,GA_js库会自动抓取以下浏览器参数,即:
  document.location.origin + document.location.pathname + document.location.search
  形成 dl 并发送。发送给GA后,GA服务器会对dl传递的参数进行反汇编,取出主机名和URI部分,分别赋值&amp;两个维度。
  但是如果除了默认发送的 dl 之外还指定了两个可选参数 dh(文档主机名)和 dp(文档路径),GA 会先使用指定的 dh 或 dp。
  所以对于虚拟页面的价值如何传递而纠结的同学,可以在这里安心。您可以使用综合浏览量发送位置或页面,但必须发送位置。
  Ok~这个问题就结束了,但是如果你和GA接触很久了,你可能还有一些其他的问题,比如:
  如果我在 dl 参数中传递一个随机数,例如:test:///test?protocol:test 怎么办?—— 请求无效。如果是dl参数,我传一个数字,如上,还要传dp的值吗?—— 请求有效,网页通过dp的值。如果我在A页面部署默认的GA基础代码,同时在网页出现弹窗的时候发送一个dummy page事件(B页面),弹窗有点击事件,如果我进入网页,然后触发弹窗,然后点击事件,那么此时事件所属的网页是A还是虚拟页面B——如果是用set命令设置的pageview ,此时事件所属的网页是B,不仅是弹窗上的B,而且在下面刷新页面之前的所有事件都是B。如果在默认发送浏览量中添加参数{'page'},则事件所属的页面为A,其他事件不受该页面影响。(出现这种现象的原因是GA在加载analytics.js时默认会在tracker中设置tracker的dl参数,后续事件会使用这个参数,除非被显式值覆盖。)如果我的网页中的锚点(#) 后面的信息在区分网页中起着重要的作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... 该事件所属的页面为A,其他事件不受该页面影响。(出现这种现象的原因是GA在加载analytics.js时默认会在tracker中设置tracker的dl参数,后续事件会使用这个参数,除非被显式值覆盖。)如果我的网页中的锚点(#) 后面的信息在区分网页中起着重要的作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... 该事件所属的页面为A,其他事件不受该页面影响。(出现这种现象的原因是GA在加载analytics.js时默认会在tracker中设置tracker的dl参数,后续事件会使用这个参数,除非被显式值覆盖。)如果我的网页中的锚点(#) 后面的信息在区分网页中起着重要的作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... (出现这种现象的原因是GA在加载analytics.js时默认会在tracker中设置tracker的dl参数,后续事件会使用这个参数,除非被显式值覆盖。)如果我的网页中的锚点(#) 后面的信息在区分网页中起着重要的作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... (出现这种现象的原因是GA在加载analytics.js时默认会在tracker中设置tracker的dl参数,后续事件会使用这个参数,除非被显式值覆盖。)如果我的网页中的锚点(#) 后面的信息在区分网页中起着重要的作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... ) 如果我的网页中的锚点 (#) 后面的信息对区分网页起重要作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。... ) 如果我的网页中的锚点 (#) 后面的信息对区分网页起重要作用。GA会抓住它吗?- 不,如果我传递的dl是实际的url(document.location.href),它必须设置为传递。那么传给GA的数字,网页传过来的值中#后面的部分会有影响吗?GA 会处理 dl 传递值吗?-- 将被处理,但 # 部分不受影响。...
  了解了这一点后,我们似乎对 &amp; 这两个指标有了更多的了解。但是我们可以再深入一点吗?
  当然,你会怎么写这个 文章
  以analytics.js为例,扩展analytics.js,看看GA是怎么得到的。
  搜索关键词 location dl后,可以找到如下代码:
  
  其他代码就省略了,当然如果你好奇,也可以关注我的另一个系列文章《谷歌analytics.js源码分析》。
  这里,Kb = '位置'
  a.set等的取值以及在对应tracker中设置参数位置为:
  
  可以看出,实际上dl的传递值是在analytics.js中设置的,不是GA账号处理的。
  ##
  现在我提到了,顺便说一句。
  登陆页面的定义众所周知,这里不再赘述。在 GA 中,着陆页定义为
  
  正常情况下,这自然是没有问题的,但是遇到意外情况,这个解释就显得有些不清楚了。
  例如:
  假设用户进入某个网站页面A,在页面上发送事件e_1,然后进入页面B。
  但是由于实际登陆页面A的页面浏览代码部署错误,导致页面浏览丢失,那么此时事件e_1的登陆页面是什么呢?
  A: (not set)
B: 网页B
  答案将在下一期揭晓,也可以私下交流心得~
  白色 白色
  

js抓取网页内容(JavaScript逆向工程如何从网络API中获取JSON格式的数据)

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

  js抓取网页内容(JavaScript逆向工程如何从网络API中获取JSON格式的数据)
  解析动态内容
  根据权威机构发布的《全球互联网无障碍审计报告》,全球约四分之三的网站内容或部分内容是通过JavaScript动态生成的,这意味着“以一种在HTML代码中找不到浏览器窗口“源代码”,说明我们以前抓取数据的方式并不能正常工作。解决这样的问题基本上有两种方案,一种是JavaScript逆向工程;另一种是渲染 JavaScript 以获取渲染的内容。
  JavaScript 逆向工程
  我们以“360图片”网站为例来说明什么是JavaScript逆向工程。其实所谓JavaScript逆向工程就是通过Ajax技术找到动态获取数据的接口。在浏览器中输入打开“360图片”的“美颜”板块,如下图所示。
  [外链图片传输失败(img-ZRl9xYmn-75)(./res/image360-website.png)]
  但是当我们在浏览器中使用右键菜单“显示网页的源代码”时,我们惊奇地发现页面的HTML代码中有一个链接。
  没有标签,那么我们看到的图片是怎么出现的呢?原来所有图片都是通过JavaScript动态加载的,在浏览器“开发者工具”的“网络”中可以找到获取这些图片数据的网络API接口,如下图所示。
  [外链图片传输失败(img-XVAx1JK3-78)(./res/api-image360.png)]
  那么结论就很简单了。只要找到这些网络API接口,就可以通过这些接口获取数据。当然,在实际开发中,我们可能还需要对这些接口的参数和接口返回的数据进行分析,以了解各个参数的含义以及返回的 JSON 数据的格式,以便我们可以在我们的爬虫。
  如何从网络API中获取JSON格式的数据,提取出我们需要的内容,在上一篇《文件与异常》中已经说明,这里不再赘述。
  使用硒
  虽然很多网站保护了自己的网络API接口,增加了获取数据的难度,但大部分只要努力够就可以进行逆向工程,但是在实际开发中,我们可以通过浏览器渲染引擎来避免这些繁琐的工作,WebKit 是一个利用的渲染引擎。
  WebKit 的代码始于 1998 年的 KHTML 项目,当时它是 Konqueror 浏览器的渲染引擎。2001 年,Apple 从这个项目的代码中衍生出 WebKit,并将其应用到 Safari 浏览器中,早期的 Chrome 浏览器也使用了内核。在 Python 中,我们可以通过 Qt 框架获取 WebKit 引擎,并使用它来渲染页面以获取动态内容。本内容请阅读文章《爬虫技术:动态页面爬取超导》。
  如果你不打算使用上面的方法来渲染页面并获取动态内容,其实还有一个替代方案可以使用自动化测试工具 Selenium,它提供了浏览器自动化的 API 接口,这样你就可以通过操纵浏览器。内容。首先,您可以使用 pip 安装 Selenium。
  pip3 install selenium
  下面以“阿里巴巴V任务”的“直播服务”为例,演示如何使用Selenium获取动态内容和抓拍主播的画面。
  import requests
from bs4 import BeautifulSoup
def main():
resp = requests.get('https://v.taobao.com/v/content/live?catetype=704&from=taonvlang')
soup = BeautifulSoup(resp.text, 'lxml')
for img_tag in soup.select('img[src]'):
print(img_tag.attrs['src'])
if __name__ == '__main__':
main()
  运行上面的程序会发现没有输出,因为页面的html代码根本找不到
  标签。接下来,我们使用 Selenium 来获取页面上的动态内容,然后提取锚点图像。
  from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
def main():
driver = webdriver.Chrome()
driver.get('https://v.taobao.com/v/content/live?catetype=704&from=taonvlang')
soup = BeautifulSoup(driver.page_source, 'lxml')
for img_tag in soup.body.select('img[src]'):
print(img_tag.attrs['src'])
if __name__ == '__main__':
main()
  在上面的程序中,我们使用 Selenium 来控制 Chrome 浏览器。如果我们要控制其他浏览器,可以创建相应的浏览器对象,比如Firefox、IE等。运行上面的程序,如果看到下图的错误信息,说明我们没有添加Chrome浏览器驱动PATH环境变量,我们也没有在程序中指定Chrome浏览器驱动的位置。
  selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chr ... /home
  为了解决以上问题,可以到Selenium的官方网站找到浏览器驱动的下载链接,下载需要的驱动。在 Linux 或 macOS 系统中,可以通过以下命令设置 PATH 环境变量,在 Windows 下配置环境变量也很简单,不清楚的可以自行理解。
  export PATH=$PATH:/Users/Hao/Downloads/Tools/chromedriver/
  其中/Users/Hao/Downloads/Tools/chromedriver/是chromedriver所在的路径。 查看全部

  js抓取网页内容(JavaScript逆向工程如何从网络API中获取JSON格式的数据)
  解析动态内容
  根据权威机构发布的《全球互联网无障碍审计报告》,全球约四分之三的网站内容或部分内容是通过JavaScript动态生成的,这意味着“以一种在HTML代码中找不到浏览器窗口“源代码”,说明我们以前抓取数据的方式并不能正常工作。解决这样的问题基本上有两种方案,一种是JavaScript逆向工程;另一种是渲染 JavaScript 以获取渲染的内容。
  JavaScript 逆向工程
  我们以“360图片”网站为例来说明什么是JavaScript逆向工程。其实所谓JavaScript逆向工程就是通过Ajax技术找到动态获取数据的接口。在浏览器中输入打开“360图片”的“美颜”板块,如下图所示。
  [外链图片传输失败(img-ZRl9xYmn-75)(./res/image360-website.png)]
  但是当我们在浏览器中使用右键菜单“显示网页的源代码”时,我们惊奇地发现页面的HTML代码中有一个链接。
  没有标签,那么我们看到的图片是怎么出现的呢?原来所有图片都是通过JavaScript动态加载的,在浏览器“开发者工具”的“网络”中可以找到获取这些图片数据的网络API接口,如下图所示。
  [外链图片传输失败(img-XVAx1JK3-78)(./res/api-image360.png)]
  那么结论就很简单了。只要找到这些网络API接口,就可以通过这些接口获取数据。当然,在实际开发中,我们可能还需要对这些接口的参数和接口返回的数据进行分析,以了解各个参数的含义以及返回的 JSON 数据的格式,以便我们可以在我们的爬虫。
  如何从网络API中获取JSON格式的数据,提取出我们需要的内容,在上一篇《文件与异常》中已经说明,这里不再赘述。
  使用硒
  虽然很多网站保护了自己的网络API接口,增加了获取数据的难度,但大部分只要努力够就可以进行逆向工程,但是在实际开发中,我们可以通过浏览器渲染引擎来避免这些繁琐的工作,WebKit 是一个利用的渲染引擎。
  WebKit 的代码始于 1998 年的 KHTML 项目,当时它是 Konqueror 浏览器的渲染引擎。2001 年,Apple 从这个项目的代码中衍生出 WebKit,并将其应用到 Safari 浏览器中,早期的 Chrome 浏览器也使用了内核。在 Python 中,我们可以通过 Qt 框架获取 WebKit 引擎,并使用它来渲染页面以获取动态内容。本内容请阅读文章《爬虫技术:动态页面爬取超导》。
  如果你不打算使用上面的方法来渲染页面并获取动态内容,其实还有一个替代方案可以使用自动化测试工具 Selenium,它提供了浏览器自动化的 API 接口,这样你就可以通过操纵浏览器。内容。首先,您可以使用 pip 安装 Selenium。
  pip3 install selenium
  下面以“阿里巴巴V任务”的“直播服务”为例,演示如何使用Selenium获取动态内容和抓拍主播的画面。
  import requests
from bs4 import BeautifulSoup
def main():
resp = requests.get('https://v.taobao.com/v/content/live?catetype=704&from=taonvlang')
soup = BeautifulSoup(resp.text, 'lxml')
for img_tag in soup.select('img[src]'):
print(img_tag.attrs['src'])
if __name__ == '__main__':
main()
  运行上面的程序会发现没有输出,因为页面的html代码根本找不到
  标签。接下来,我们使用 Selenium 来获取页面上的动态内容,然后提取锚点图像。
  from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
def main():
driver = webdriver.Chrome()
driver.get('https://v.taobao.com/v/content/live?catetype=704&from=taonvlang')
soup = BeautifulSoup(driver.page_source, 'lxml')
for img_tag in soup.body.select('img[src]'):
print(img_tag.attrs['src'])
if __name__ == '__main__':
main()
  在上面的程序中,我们使用 Selenium 来控制 Chrome 浏览器。如果我们要控制其他浏览器,可以创建相应的浏览器对象,比如Firefox、IE等。运行上面的程序,如果看到下图的错误信息,说明我们没有添加Chrome浏览器驱动PATH环境变量,我们也没有在程序中指定Chrome浏览器驱动的位置。
  selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chr ... /home
  为了解决以上问题,可以到Selenium的官方网站找到浏览器驱动的下载链接,下载需要的驱动。在 Linux 或 macOS 系统中,可以通过以下命令设置 PATH 环境变量,在 Windows 下配置环境变量也很简单,不清楚的可以自行理解。
  export PATH=$PATH:/Users/Hao/Downloads/Tools/chromedriver/
  其中/Users/Hao/Downloads/Tools/chromedriver/是chromedriver所在的路径。

js抓取网页内容(使用urllib+phantomjs是什么呢?使用js动态加载的网页)

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

  js抓取网页内容(使用urllib+phantomjs是什么呢?使用js动态加载的网页)
  我们在进行网页抓取时,一般使用 urllib 和 urllib2 来满足我们的大部分需求。
  但是有时我们会遇到使用js动态加载的网页。你会发现 urllib 只能抓取部分空白的网页。就像下面百度图片的结果页面:
  审查元素后, . 发现在百度图片中,显示图片的div是:pullimages
  此 div 内的内容是动态加载的。但是使用 urllib&amp;urllib2 不能爬取。
  要抓取动态加载的元素,首先考虑使用 selenium 调用浏览器进行抓取。
  而我们的运行环境是linux,最理想的方式是无界面抓取。
  所以使用 selenium+phantomjs 进行无界面抓取
  什么是phantomjs?它是基于webkit内核的无头浏览器,即没有UI界面,即是浏览器
  selenium和phantomjs的安装和配置可以google,这里就不多说了。
  代码显示如下:
  from selenium import webdriver
def fetchBdImage(query):
#如果不方便配置环境变量。填入phantomjs的绝对路径也可以
driver =webdriver.PhantomJS(executable_path='/bin/phantomjs/bin/phantomjs')
#抓取百度图片页面,query由参数决定
url = 'http://image.baidu.com/i?ie=utf-8&word='+query;
driver.get(url)
#这就是获取页面内容了,与urllib2.urlopen().read()的效果是类似的。
html = driver.page_source
#抓取结束,记得释放资源
driver.quit()
#返回抓取到的页面内容
return html
  到这里。抓取成功。
  【备注】:linux下使用phantomJS,windows下可以使用chrome、firefox等浏览器 查看全部

  js抓取网页内容(使用urllib+phantomjs是什么呢?使用js动态加载的网页)
  我们在进行网页抓取时,一般使用 urllib 和 urllib2 来满足我们的大部分需求。
  但是有时我们会遇到使用js动态加载的网页。你会发现 urllib 只能抓取部分空白的网页。就像下面百度图片的结果页面:
  审查元素后, . 发现在百度图片中,显示图片的div是:pullimages
  此 div 内的内容是动态加载的。但是使用 urllib&amp;urllib2 不能爬取。
  要抓取动态加载的元素,首先考虑使用 selenium 调用浏览器进行抓取。
  而我们的运行环境是linux,最理想的方式是无界面抓取。
  所以使用 selenium+phantomjs 进行无界面抓取
  什么是phantomjs?它是基于webkit内核的无头浏览器,即没有UI界面,即是浏览器
  selenium和phantomjs的安装和配置可以google,这里就不多说了。
  代码显示如下:
  from selenium import webdriver
def fetchBdImage(query):
#如果不方便配置环境变量。填入phantomjs的绝对路径也可以
driver =webdriver.PhantomJS(executable_path='/bin/phantomjs/bin/phantomjs')
#抓取百度图片页面,query由参数决定
url = 'http://image.baidu.com/i?ie=utf-8&word='+query;
driver.get(url)
#这就是获取页面内容了,与urllib2.urlopen().read()的效果是类似的。
html = driver.page_source
#抓取结束,记得释放资源
driver.quit()
#返回抓取到的页面内容
return html
  到这里。抓取成功。
  【备注】:linux下使用phantomJS,windows下可以使用chrome、firefox等浏览器

js抓取网页内容(网站越小频繁出现“异常提示”怎么办?(图))

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

  js抓取网页内容(网站越小频繁出现“异常提示”怎么办?(图))
  网站 越小,出现问题的概率越低。反之,网站 规模越大,出现问题的概率越高。自百度“爬取异常”检查以来,很多站长发现网站总是频繁出现“异常提示”。而这个问题往往是网站的规模越大,问题越严重。那么,这里发生了什么?A5 Marketing 今天带您揭开面纱。
  一:出现50X类型错误:
  
  此类链接的共同特点之一是有 504、500、502 个问题未显示给搜索引擎。打开后一切正常。那么蜘蛛为什么会报错提醒呢?
  这类问题100%是服务器造成的,对于某个状态码的含义,请百度直接搜索,交给技术解决。如果技术还是不能解决,建议更换服务器。
  二:爬取时出现DNS错误
  很多小白发现网站打不开会找服务商,但忽略了一点:域名DNS服务器也会有问题!当网站出现问题时,第一时间确定问题是什么。如果是DNS问题,建议立即更换DSN。友情提示:DNSPOD 被广泛使用。笔者最近监控空闲节点有些超时,也提醒DSNPOD解决。
  另外,目前很多站长喜欢用“一些云加速”,但笔者也想说:目前很多所谓的云加速还不成熟,尤其是那些免费的。糟糕的。
  友情提示:如果你的网站没有受到严重攻击,请不要使用所谓的云加速,追求花样,更容易伤到自己。在域名DSN方面,万网(阿里)目前做的是最稳定的。
  3:存在抓取超时问题
  在A5营销的SEO诊断中,我们特别注重用户体验。其中一点非常重要:用户打开页面的速度。如果页面无法在第一时间打开页面,就会失去访问资格,跳转到Others网站上去。那么蜘蛛呢?也是如此。如果第一时间抢不到,就会出现抢超时的问题。
  而这种爬取超时往往是由于带宽不足、页面过大造成的,我们建议: A:尽量在不影响图片质量的情况下压缩图片,上传的时候再压缩。B:减少使用JS脚本等文件类型,或者将它们组合起来。C:控制页面的长度,尤其是网站首页。D. 内部链接的数量。一个页面上的内部链接数量通常不建议超过 500 个。
  其实建站选择成熟的方案,稳定的IDC,只要你的网站规模不是特别大,基本上这些问题都可以避免。恐怕我想花最少的钱,得到最好的服务。这个世界有多久没有这种东西了? 查看全部

  js抓取网页内容(网站越小频繁出现“异常提示”怎么办?(图))
  网站 越小,出现问题的概率越低。反之,网站 规模越大,出现问题的概率越高。自百度“爬取异常”检查以来,很多站长发现网站总是频繁出现“异常提示”。而这个问题往往是网站的规模越大,问题越严重。那么,这里发生了什么?A5 Marketing 今天带您揭开面纱。
  一:出现50X类型错误:
  
  此类链接的共同特点之一是有 504、500、502 个问题未显示给搜索引擎。打开后一切正常。那么蜘蛛为什么会报错提醒呢?
  这类问题100%是服务器造成的,对于某个状态码的含义,请百度直接搜索,交给技术解决。如果技术还是不能解决,建议更换服务器。
  二:爬取时出现DNS错误
  很多小白发现网站打不开会找服务商,但忽略了一点:域名DNS服务器也会有问题!当网站出现问题时,第一时间确定问题是什么。如果是DNS问题,建议立即更换DSN。友情提示:DNSPOD 被广泛使用。笔者最近监控空闲节点有些超时,也提醒DSNPOD解决。
  另外,目前很多站长喜欢用“一些云加速”,但笔者也想说:目前很多所谓的云加速还不成熟,尤其是那些免费的。糟糕的。
  友情提示:如果你的网站没有受到严重攻击,请不要使用所谓的云加速,追求花样,更容易伤到自己。在域名DSN方面,万网(阿里)目前做的是最稳定的。
  3:存在抓取超时问题
  在A5营销的SEO诊断中,我们特别注重用户体验。其中一点非常重要:用户打开页面的速度。如果页面无法在第一时间打开页面,就会失去访问资格,跳转到Others网站上去。那么蜘蛛呢?也是如此。如果第一时间抢不到,就会出现抢超时的问题。
  而这种爬取超时往往是由于带宽不足、页面过大造成的,我们建议: A:尽量在不影响图片质量的情况下压缩图片,上传的时候再压缩。B:减少使用JS脚本等文件类型,或者将它们组合起来。C:控制页面的长度,尤其是网站首页。D. 内部链接的数量。一个页面上的内部链接数量通常不建议超过 500 个。
  其实建站选择成熟的方案,稳定的IDC,只要你的网站规模不是特别大,基本上这些问题都可以避免。恐怕我想花最少的钱,得到最好的服务。这个世界有多久没有这种东西了?

js抓取网页内容(Python基础知识:元素而不仅仅是标题元素是什么)

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

  js抓取网页内容(Python基础知识:元素而不仅仅是标题元素是什么)
  元素,而不仅仅是标题元素。
  使用每个 Beautiful Soup 对象附带的 .parent 属性,您可以直观地逐步浏览 DOM 结构并使用您需要的元素。您还可以以类似的方式访问子元素和兄弟元素。阅读导航树以获取更多信息。
  从 HTML 元素中提取属性
  此时,您的 Python 脚本已抓取该站点并过滤其 HTML 以查找相关职位发布。做得好!但是,申请工作的链接仍然缺失。
  检查页面时,您在每张卡片的底部发现了两个链接。如果您处理链接元素的方式与处理其他元素的方式相同,您将不会获得您感兴趣的 URL:
  for job_element in python_job_elements:
# -- snip --
links = job_element.find_all("a")
for link in links:
print(link.text.strip())
  如果您运行此代码片段,那么您将获得链接文本 Learn、Apply 而不是关联的 URL。
  这是因为 .text 属性只留下 HTML 元素的可见内容。它去除所有 HTML 标记,包括收录 URL 的 HTML 属性,只留下链接文本。要改为获取 URL,您需要提取 HTML 属性之一的值,而不是丢弃它。
  链接元素的 URL 与 href 属性相关联。您要查找的特定 URL 是单个职位发布的 HTML 底部的第二个 href 标记的属性值:
  

Learn
Apply


  首先获取工作卡中的所有元素。href 然后,使用方括号表示法提取它们的属性值:
  for job_element in python_job_elements:
# -- snip --
links = job_element.find_all("a")
for link in links:
link_url = link["href"]
print(f"Apply here: {link_url}\n")
  在此代码段中,您首先从每个过滤的职位发布中获取所有链接。然后提取收录 URL 的 href 属性,使用 ["href"] 并将其打印到控制台。
  在下面的练习块中,您可以找到挑战说明,以优化您收到的链接结果:
  练习:优化结果显示/隐藏
  每张工作卡都有两个与之关联的链接。您正在寻找的只是第二个链接。如何编辑上面显示的代码片段,以便始终只采集第二个链接的 URL?
  单击解决方案块以阅读此练习的可能解决方案:
  解决方案:优化您的结果显示/隐藏
  要获取每个工作卡的第二个链接的 URL,您可以使用以下代码段:
  for job_element in python_job_elements:
link_url = job_element.find_all("a")[1]["href"]
print(f"Apply here: {link_url}\n")
  您正在通过索引 ( ) 从结果中选择第二个链接元素。然后,您将使用方括号表示法直接提取 URL 并对属性 ( ) 进行寻址。.find_all()[1]href["href"]
  您还可以使用相同的方括号表示法来提取其他 HTML 属性。
  保持练习
  如果您在本教程旁边编写了代码,那么您可以按原样运行您的脚本,您会看到终端中弹出虚假的作业消息。您的下一步是处理现实生活中的工作委员会!要继续练习您的新技能,请使用以下任何或所有 网站 重新访问网络抓取过程:
  链接的 网站 将其搜索结果作为静态 HTML 响应返回,类似于 Fake Python 工作板。所以你可以用美丽的汤把它们刮掉。
  使用这些其他站点之一从顶部重新开始阅读本教程。您会看到每个 网站 的结构都不同,您需要以稍微不同的方式重构代码以获得所需的数据。接受这个挑战是练习刚刚学到的概念的好方法。虽然它可能会让你大汗淋漓,但你的编码技能会因此而变得更强!
  在您第二次尝试时,您还可以探索 Beautiful Soup 的其他功能。使用文档作为您的指南和灵感。额外的练习将帮助您更熟练地使用 Python、.requests 和 Beautiful Soup 进行网络抓取。
  为了结束您的网络抓取之旅,您可以对您的代码进行最后的改造,并创建一个命令行界面 (CLI) 应用程序,该应用程序可以抓取其中一个工作板,并允许您在每次执行时键入按关键字过滤结果。您的 CLI 工具可让您搜索特定类型或位置的工作。
  如果您有兴趣了解如何使脚本适应命令行界面,请查看如何使用 argparse 在 Python 中构建命令行界面。
  综上所述
  requests 库为您提供了一种使用 Python 从 Internet 获取静态 HTML 的用户友好方式。然后,您可以使用另一个名为 Beautiful Soup 的包来解析 HTML。这两个软件包都是您的网络抓取冒险值得信赖且有用的伴侣。您会发现 Beautiful Soup 将满足您的大部分解析需求,包括导航和高级搜索。
  在本教程中,您学习了如何使用 Python 请求和 Beautiful Soup 从 Web 抓取数据。您构建了一个脚本,该脚本从 Internet 获取招聘信息,并从头到尾执行完整的网络抓取过程。
  你已经学会了如何:
  考虑到这个广泛的管道和工具包中的两个强大的库,您可以出去看看您还能获取哪些其他 网站。玩得开心,并始终记住尊重和负责任地使用您的编程技能。
  您可以通过单击下面的链接下载您在本教程中构建的示例脚本的源代码: 查看全部

  js抓取网页内容(Python基础知识:元素而不仅仅是标题元素是什么)
  元素,而不仅仅是标题元素。
  使用每个 Beautiful Soup 对象附带的 .parent 属性,您可以直观地逐步浏览 DOM 结构并使用您需要的元素。您还可以以类似的方式访问子元素和兄弟元素。阅读导航树以获取更多信息。
  从 HTML 元素中提取属性
  此时,您的 Python 脚本已抓取该站点并过滤其 HTML 以查找相关职位发布。做得好!但是,申请工作的链接仍然缺失。
  检查页面时,您在每张卡片的底部发现了两个链接。如果您处理链接元素的方式与处理其他元素的方式相同,您将不会获得您感兴趣的 URL:
  for job_element in python_job_elements:
# -- snip --
links = job_element.find_all("a")
for link in links:
print(link.text.strip())
  如果您运行此代码片段,那么您将获得链接文本 Learn、Apply 而不是关联的 URL。
  这是因为 .text 属性只留下 HTML 元素的可见内容。它去除所有 HTML 标记,包括收录 URL 的 HTML 属性,只留下链接文本。要改为获取 URL,您需要提取 HTML 属性之一的值,而不是丢弃它。
  链接元素的 URL 与 href 属性相关联。您要查找的特定 URL 是单个职位发布的 HTML 底部的第二个 href 标记的属性值:
  

Learn
Apply


  首先获取工作卡中的所有元素。href 然后,使用方括号表示法提取它们的属性值:
  for job_element in python_job_elements:
# -- snip --
links = job_element.find_all("a")
for link in links:
link_url = link["href"]
print(f"Apply here: {link_url}\n")
  在此代码段中,您首先从每个过滤的职位发布中获取所有链接。然后提取收录 URL 的 href 属性,使用 ["href"] 并将其打印到控制台。
  在下面的练习块中,您可以找到挑战说明,以优化您收到的链接结果:
  练习:优化结果显示/隐藏
  每张工作卡都有两个与之关联的链接。您正在寻找的只是第二个链接。如何编辑上面显示的代码片段,以便始终只采集第二个链接的 URL?
  单击解决方案块以阅读此练习的可能解决方案:
  解决方案:优化您的结果显示/隐藏
  要获取每个工作卡的第二个链接的 URL,您可以使用以下代码段:
  for job_element in python_job_elements:
link_url = job_element.find_all("a")[1]["href"]
print(f"Apply here: {link_url}\n")
  您正在通过索引 ( ) 从结果中选择第二个链接元素。然后,您将使用方括号表示法直接提取 URL 并对属性 ( ) 进行寻址。.find_all()[1]href["href"]
  您还可以使用相同的方括号表示法来提取其他 HTML 属性。
  保持练习
  如果您在本教程旁边编写了代码,那么您可以按原样运行您的脚本,您会看到终端中弹出虚假的作业消息。您的下一步是处理现实生活中的工作委员会!要继续练习您的新技能,请使用以下任何或所有 网站 重新访问网络抓取过程:
  链接的 网站 将其搜索结果作为静态 HTML 响应返回,类似于 Fake Python 工作板。所以你可以用美丽的汤把它们刮掉。
  使用这些其他站点之一从顶部重新开始阅读本教程。您会看到每个 网站 的结构都不同,您需要以稍微不同的方式重构代码以获得所需的数据。接受这个挑战是练习刚刚学到的概念的好方法。虽然它可能会让你大汗淋漓,但你的编码技能会因此而变得更强!
  在您第二次尝试时,您还可以探索 Beautiful Soup 的其他功能。使用文档作为您的指南和灵感。额外的练习将帮助您更熟练地使用 Python、.requests 和 Beautiful Soup 进行网络抓取。
  为了结束您的网络抓取之旅,您可以对您的代码进行最后的改造,并创建一个命令行界面 (CLI) 应用程序,该应用程序可以抓取其中一个工作板,并允许您在每次执行时键入按关键字过滤结果。您的 CLI 工具可让您搜索特定类型或位置的工作。
  如果您有兴趣了解如何使脚本适应命令行界面,请查看如何使用 argparse 在 Python 中构建命令行界面。
  综上所述
  requests 库为您提供了一种使用 Python 从 Internet 获取静态 HTML 的用户友好方式。然后,您可以使用另一个名为 Beautiful Soup 的包来解析 HTML。这两个软件包都是您的网络抓取冒险值得信赖且有用的伴侣。您会发现 Beautiful Soup 将满足您的大部分解析需求,包括导航和高级搜索。
  在本教程中,您学习了如何使用 Python 请求和 Beautiful Soup 从 Web 抓取数据。您构建了一个脚本,该脚本从 Internet 获取招聘信息,并从头到尾执行完整的网络抓取过程。
  你已经学会了如何:
  考虑到这个广泛的管道和工具包中的两个强大的库,您可以出去看看您还能获取哪些其他 网站。玩得开心,并始终记住尊重和负责任地使用您的编程技能。
  您可以通过单击下面的链接下载您在本教程中构建的示例脚本的源代码:

js抓取网页内容(Javascript元素在网页上的确切位置教程总结元素的相关知识)

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

  js抓取网页内容(Javascript元素在网页上的确切位置教程总结元素的相关知识)
  在创建网页的过程中,您有时需要知道某个元素在网页上的确切位置。
  下面的教程总结了Javascript在网页定位方面的知识。
  一、网页大小和浏览器窗口大小
  首先,必须澄清两个基本概念。
  一个网页的整个区域就是它的大小。通常,网页的大小由内容和 CSS 样式表决定。
  浏览器窗口的大小是指在浏览器窗口中看到的网页区域的一部分,也称为视口。
  显然,如果网页的内容可以在浏览器窗口中完全显示(即没有滚动条),那么网页的大小和浏览器窗口的大小是相等的。如果不能全部显示,滚动浏览器窗口可以显示网页的各个部分。
  二、获取网页大小
  网页上的每个元素都有 clientHeight 和 clientWidth 属性。这两个属性指的是元素的内容部分加上内边距所占据的可视区域,不包括边框和滚动条所占据的空间。
  
  (图一clientHeight和clientWidth属性)
  因此,文档元素的clientHeight 和clientWidth 属性代表了网页的大小。
  函数 getViewport(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.clientWidth,
  高度:document.body.clientHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.clientWidth,
  高度:document.documentElement.clientHeight
  }
  }
  }
  上面的getViewport函数可以返回浏览器窗口的高度和宽度。使用时要注意三个地方:
  1)该函数必须在页面加载完毕后运行,否则还没有生成文档对象,浏览器会报错。
  2)在大多数情况下,document.documentElement.clientWidth 返回正确的值。但是在IE6的quirks模式下,document.body.clientWidth返回正确的值,所以函数中加入了对document模式的判断。
  3)clientWidth 和 clientHeight 是只读属性,不能赋值。
  三、另一种获取页面大小的方法
  网页上的每个元素也有scrollHeight和scrollWidth属性,它们指的是包括滚动条在内的元素的可视区域。
  那么,document对象的scrollHeight和scrollWidth属性就是网页的大小,也就是滚动条滚动的所有长度和宽度。
  在getViewport() 函数之后,可以编写getPagearea() 函数。
  函数getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.scrollWidth,
  高度:document.body.scrollHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.scrollWidth,
  高度:document.documentElement.scrollHeight
  }
  }
  }
  但是,此功能存在问题。如果网页的内容可以在浏览器窗口中完全显示而没有滚动条,那么网页的clientWidth和scrollWidth应该相等。但实际上不同的浏览器有不同的处理,这两个值不一定相等。因此,我们需要取其中较大的值,所以我们需要重写getPagearea()函数。
  函数getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:Math.max(document.body.scrollWidth,
  document.body.clientWidth),
  高度:Math.max(document.body.scrollHeight,
  文档.body.clientHeight)
  }
  } 别的 {
  返回 {
  宽度:Math.max(document.documentElement.scrollWidth,
  document.documentElement.clientWidth),
  高度:Math.max(document.documentElement.scrollHeight,
  document.documentElement.clientHeight)
  }
  }
  }
  四、获取网页元素的绝对位置
  网页元素的绝对位置是指该元素的左上角相对于整个网页左上角的坐标。这个绝对位置只能通过计算得到。
  首先,每个元素都有offsetTop和offsetLeft属性,表示元素左上角到父容器(offsetParent对象)左上角的距离。所以,只需要将这两个值累加就可以得到元素的绝对坐标。
  
  (图2 offsetTop 和 offsetLeft 属性)
  下面两个函数可以用来获取绝对位置的横坐标和纵坐标。
  函数getElementLeft(元素){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== null){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  返回实际左;
  }
  函数getElementTop(元素){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== null){
  actualTop += current.offsetTop;
  当前 = current.offsetParent;
  }
  返回实际顶部;
  }
  由于在表格和 iframe 中,offsetParent 对象不一定等于父容器,因此上述功能不适用于表格和 iframe 中的元素。
  五、获取网页元素的相对位置
  网页元素的相对位置,指的是该元素的左上角相对于浏览器窗口左上角的坐标。
  有了绝对位置,就很容易得到相对位置,只要从页面滚动条的滚动距离中减去绝对坐标即可。滚动条的垂直距离是文档对象的 scrollTop 属性;滚动条的水平距离是文档对象的 scrollLeft 属性。
  
  (图 3 scrollTop 和 scrollLeft 属性)
  相应地重写上一节中的两个函数:
  函数getElementViewLeft(元素){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== null){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollLeft=document.body.scrollLeft;
  } 别的 {
  var elementScrollLeft=document.documentElement.scrollLeft;
  }
  返回实际左元素滚动左;
  }
  函数getElementViewTop(元素){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== null){
  actualTop += current.offsetTop;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollTop=document.body.scrollTop;
  } 别的 {
  var elementScrollTop=document.documentElement.scrollTop;
  }
  返回实际顶部元素滚动顶部;
  }
  scrollTop 和 scrollLeft 属性是可赋值的,并且会立即自动将网页滚动到相应的位置,因此它们可以用来改变网页元素的相对位置。此外,element.scrollIntoView() 方法也有类似的效果,可以让网页元素出现在浏览器窗口的左上角。
  六、快速获取元素位置的方法
  除了上面的功能之外,还有一个快速的方法可以一次获取网页元素的位置。
  那就是使用 getBoundingClientRect() 方法。它返回一个收录四个属性的对象,left、right、top、bottom,分别对应于元素的左上角和右下角相对于浏览器窗口(视口)左上角的距离。
  所以,页面元素的相对位置是
  var X= this.getBoundingClientRect().left;
  var Y =this.getBoundingClientRect().top;
  添加滚动距离以获得绝对位置
  var X= this.getBoundingClientRect().left+document.documentElement.scrollLeft;
  var Y =this.getBoundingClientRect().top+document.documentElement.scrollTop;
  目前,IE、Firefox 3.0+、Opera 9.5+ 支持此方法,Firefox 2.x、Safari、Chrome、Konqueror 不支持。
  (超过) 查看全部

  js抓取网页内容(Javascript元素在网页上的确切位置教程总结元素的相关知识)
  在创建网页的过程中,您有时需要知道某个元素在网页上的确切位置。
  下面的教程总结了Javascript在网页定位方面的知识。
  一、网页大小和浏览器窗口大小
  首先,必须澄清两个基本概念。
  一个网页的整个区域就是它的大小。通常,网页的大小由内容和 CSS 样式表决定。
  浏览器窗口的大小是指在浏览器窗口中看到的网页区域的一部分,也称为视口。
  显然,如果网页的内容可以在浏览器窗口中完全显示(即没有滚动条),那么网页的大小和浏览器窗口的大小是相等的。如果不能全部显示,滚动浏览器窗口可以显示网页的各个部分。
  二、获取网页大小
  网页上的每个元素都有 clientHeight 和 clientWidth 属性。这两个属性指的是元素的内容部分加上内边距所占据的可视区域,不包括边框和滚动条所占据的空间。
  
  (图一clientHeight和clientWidth属性)
  因此,文档元素的clientHeight 和clientWidth 属性代表了网页的大小。
  函数 getViewport(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.clientWidth,
  高度:document.body.clientHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.clientWidth,
  高度:document.documentElement.clientHeight
  }
  }
  }
  上面的getViewport函数可以返回浏览器窗口的高度和宽度。使用时要注意三个地方:
  1)该函数必须在页面加载完毕后运行,否则还没有生成文档对象,浏览器会报错。
  2)在大多数情况下,document.documentElement.clientWidth 返回正确的值。但是在IE6的quirks模式下,document.body.clientWidth返回正确的值,所以函数中加入了对document模式的判断。
  3)clientWidth 和 clientHeight 是只读属性,不能赋值。
  三、另一种获取页面大小的方法
  网页上的每个元素也有scrollHeight和scrollWidth属性,它们指的是包括滚动条在内的元素的可视区域。
  那么,document对象的scrollHeight和scrollWidth属性就是网页的大小,也就是滚动条滚动的所有长度和宽度。
  在getViewport() 函数之后,可以编写getPagearea() 函数。
  函数getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:document.body.scrollWidth,
  高度:document.body.scrollHeight
  }
  } 别的 {
  返回 {
  宽度:document.documentElement.scrollWidth,
  高度:document.documentElement.scrollHeight
  }
  }
  }
  但是,此功能存在问题。如果网页的内容可以在浏览器窗口中完全显示而没有滚动条,那么网页的clientWidth和scrollWidth应该相等。但实际上不同的浏览器有不同的处理,这两个值不一定相等。因此,我们需要取其中较大的值,所以我们需要重写getPagearea()函数。
  函数getPagearea(){
  if (patMode == "BackCompat"){
  返回 {
  宽度:Math.max(document.body.scrollWidth,
  document.body.clientWidth),
  高度:Math.max(document.body.scrollHeight,
  文档.body.clientHeight)
  }
  } 别的 {
  返回 {
  宽度:Math.max(document.documentElement.scrollWidth,
  document.documentElement.clientWidth),
  高度:Math.max(document.documentElement.scrollHeight,
  document.documentElement.clientHeight)
  }
  }
  }
  四、获取网页元素的绝对位置
  网页元素的绝对位置是指该元素的左上角相对于整个网页左上角的坐标。这个绝对位置只能通过计算得到。
  首先,每个元素都有offsetTop和offsetLeft属性,表示元素左上角到父容器(offsetParent对象)左上角的距离。所以,只需要将这两个值累加就可以得到元素的绝对坐标。
  
  (图2 offsetTop 和 offsetLeft 属性)
  下面两个函数可以用来获取绝对位置的横坐标和纵坐标。
  函数getElementLeft(元素){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== null){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  返回实际左;
  }
  函数getElementTop(元素){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== null){
  actualTop += current.offsetTop;
  当前 = current.offsetParent;
  }
  返回实际顶部;
  }
  由于在表格和 iframe 中,offsetParent 对象不一定等于父容器,因此上述功能不适用于表格和 iframe 中的元素。
  五、获取网页元素的相对位置
  网页元素的相对位置,指的是该元素的左上角相对于浏览器窗口左上角的坐标。
  有了绝对位置,就很容易得到相对位置,只要从页面滚动条的滚动距离中减去绝对坐标即可。滚动条的垂直距离是文档对象的 scrollTop 属性;滚动条的水平距离是文档对象的 scrollLeft 属性。
  
  (图 3 scrollTop 和 scrollLeft 属性)
  相应地重写上一节中的两个函数:
  函数getElementViewLeft(元素){
  var actualLeft = element.offsetLeft;
  var current = element.offsetParent;
  而(当前!== null){
  actualLeft += current.offsetLeft;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollLeft=document.body.scrollLeft;
  } 别的 {
  var elementScrollLeft=document.documentElement.scrollLeft;
  }
  返回实际左元素滚动左;
  }
  函数getElementViewTop(元素){
  var actualTop = element.offsetTop;
  var current = element.offsetParent;
  而(当前!== null){
  actualTop += current.offsetTop;
  当前 = current.offsetParent;
  }
  if (patMode == "BackCompat"){
  var elementScrollTop=document.body.scrollTop;
  } 别的 {
  var elementScrollTop=document.documentElement.scrollTop;
  }
  返回实际顶部元素滚动顶部;
  }
  scrollTop 和 scrollLeft 属性是可赋值的,并且会立即自动将网页滚动到相应的位置,因此它们可以用来改变网页元素的相对位置。此外,element.scrollIntoView() 方法也有类似的效果,可以让网页元素出现在浏览器窗口的左上角。
  六、快速获取元素位置的方法
  除了上面的功能之外,还有一个快速的方法可以一次获取网页元素的位置。
  那就是使用 getBoundingClientRect() 方法。它返回一个收录四个属性的对象,left、right、top、bottom,分别对应于元素的左上角和右下角相对于浏览器窗口(视口)左上角的距离。
  所以,页面元素的相对位置是
  var X= this.getBoundingClientRect().left;
  var Y =this.getBoundingClientRect().top;
  添加滚动距离以获得绝对位置
  var X= this.getBoundingClientRect().left+document.documentElement.scrollLeft;
  var Y =this.getBoundingClientRect().top+document.documentElement.scrollTop;
  目前,IE、Firefox 3.0+、Opera 9.5+ 支持此方法,Firefox 2.x、Safari、Chrome、Konqueror 不支持。
  (超过)

js抓取网页内容(一个微信小程序的云开发功能是不需要前端搭建服务器)

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

  js抓取网页内容(一个微信小程序的云开发功能是不需要前端搭建服务器)
  最近在研究微信小程序的云开发功能。云开发最大的优势就是不需要搭建前端服务器,可以利用云的能力编写一个可以从零启动的微信小程序,从而避免了购买服务器的成本。个人觉得从前端到后端开发微信小程序是个不错的选择。一天就能上线一个微信小程序。
  云开发的优势
  云开发为开发者提供完整的云支持,弱化后端和运维的概念,利用平台提供的API进行核心业务开发,无需搭建服务器,实现快速上线和迭代。同时,此功能与开发人员已经使用的云服务兼容,而不是相互排斥。
  云开发目前提供三种基本能力支持:
  云功能:代码运行在云端,微信私有协议自然认证,开发者只需要编写自己的业务逻辑代码数据库:可以在小程序前端操作的JSON数据库,云端读写小程序前端上传/下载云文件,并在云开发控制台中可视化管理。
  嗯,介绍了这么多云开发的知识,感性的同学可以学习一下。官方文档地址:
  网页内容捕获
  小程序是关于回答问题的,所以问题的来源就是问题。上网一搜,一个接一个的发帖是一种方法,但是就是这么重复的工作,估计发帖10年左右,就想放弃了。所以我想到了网络抓取。只需拿起你之前学过的节点。
  必备工具:再见。一个类似于服务器端 JQuery 的包。主要用于分析和过滤爬取的内容。Node 的 fs 模块。该模块带有用于读取和写入文件的节点。这用于将解析后的数据写入 json 文件。Axios(非必需)。用于抓取 网站 的 HTML 页面。由于我想要的数据是通过点击网页上的一个按钮来呈现的,所以直接访问这个网站是无法得到的。但是您只能复制您想要的内容,将其保存为字符串,然后解析该字符串。
  接下来可以使用npm init来初始化一个node项目,一路回去之后就可以生成一个package.json文件了。然后 npm install -save axioscheerio 来安装 cherio 和 axios 包。
  关键是使用cheerio来实现类似jQuery的功能。只需点击你刮过cheerio.load(quesitons)的内容,然后你就可以根据jquery获取dom并组装你想要的数据。
  最后,使用 fs.writeFile 将数据保存在 json 文件中,就完成了。
  具体代码如下:
  让 axios = 要求(axios);
  让 cherio = 要求(cherio);
  让 fs = 要求(fs);
  //我的html结构大致如下,有很多条数据。
  不断的问题=
  `;
  常量 $=cheerio.load(问题);
  var arr = [];
  for(var I=0; i 300I){ var obj={ }; obj.questions=$(#qi)。查找(.问题)。文本(); 目的。A=$($(#qi).Find(.answer)[0])。文本(); 目的。B=$($(#qi).Find(.answer)[1])。文本(); 目的。C=$($(#qi).Find(.answer)[2])。文本(); 目的。D=$($(#qi).Find(.answer)[3])。text();obj.index=I 1;obj.answer=$($(#qi).find(.answer)[0])。属性(值)=1?答:$($(#qi).Find(.answer)[1])。属性(值)=1?B : $($(#qi).Find(.answer)[2])。属性(值)=1?c:D; arr.push(obj); }
  fs.writeFile(poem.json, JSON.stringify(arr), err={ if(err) throw err; Console.log(json文件保存成功!);
  });
  保存到json的文件格式如下,这样就可以通过json文件上传到云服务器了。
  
  注意事项
  在微信小程序云开发的数据库中,需要注意上传的json文件的数据格式。在此之前,我们总是提示格式错误。后来我们发现JSON数据不是数组,而是类似于JSON Lines,即每个记录对象用n隔开,而不是逗号。因此,在上传成功之前,需要对节点写入的json文件做一点处理。 查看全部

  js抓取网页内容(一个微信小程序的云开发功能是不需要前端搭建服务器)
  最近在研究微信小程序的云开发功能。云开发最大的优势就是不需要搭建前端服务器,可以利用云的能力编写一个可以从零启动的微信小程序,从而避免了购买服务器的成本。个人觉得从前端到后端开发微信小程序是个不错的选择。一天就能上线一个微信小程序。
  云开发的优势
  云开发为开发者提供完整的云支持,弱化后端和运维的概念,利用平台提供的API进行核心业务开发,无需搭建服务器,实现快速上线和迭代。同时,此功能与开发人员已经使用的云服务兼容,而不是相互排斥。
  云开发目前提供三种基本能力支持:
  云功能:代码运行在云端,微信私有协议自然认证,开发者只需要编写自己的业务逻辑代码数据库:可以在小程序前端操作的JSON数据库,云端读写小程序前端上传/下载云文件,并在云开发控制台中可视化管理。
  嗯,介绍了这么多云开发的知识,感性的同学可以学习一下。官方文档地址:
  网页内容捕获
  小程序是关于回答问题的,所以问题的来源就是问题。上网一搜,一个接一个的发帖是一种方法,但是就是这么重复的工作,估计发帖10年左右,就想放弃了。所以我想到了网络抓取。只需拿起你之前学过的节点。
  必备工具:再见。一个类似于服务器端 JQuery 的包。主要用于分析和过滤爬取的内容。Node 的 fs 模块。该模块带有用于读取和写入文件的节点。这用于将解析后的数据写入 json 文件。Axios(非必需)。用于抓取 网站 的 HTML 页面。由于我想要的数据是通过点击网页上的一个按钮来呈现的,所以直接访问这个网站是无法得到的。但是您只能复制您想要的内容,将其保存为字符串,然后解析该字符串。
  接下来可以使用npm init来初始化一个node项目,一路回去之后就可以生成一个package.json文件了。然后 npm install -save axioscheerio 来安装 cherio 和 axios 包。
  关键是使用cheerio来实现类似jQuery的功能。只需点击你刮过cheerio.load(quesitons)的内容,然后你就可以根据jquery获取dom并组装你想要的数据。
  最后,使用 fs.writeFile 将数据保存在 json 文件中,就完成了。
  具体代码如下:
  让 axios = 要求(axios);
  让 cherio = 要求(cherio);
  让 fs = 要求(fs);
  //我的html结构大致如下,有很多条数据。
  不断的问题=
  `;
  常量 $=cheerio.load(问题);
  var arr = [];
  for(var I=0; i 300I){ var obj={ }; obj.questions=$(#qi)。查找(.问题)。文本(); 目的。A=$($(#qi).Find(.answer)[0])。文本(); 目的。B=$($(#qi).Find(.answer)[1])。文本(); 目的。C=$($(#qi).Find(.answer)[2])。文本(); 目的。D=$($(#qi).Find(.answer)[3])。text();obj.index=I 1;obj.answer=$($(#qi).find(.answer)[0])。属性(值)=1?答:$($(#qi).Find(.answer)[1])。属性(值)=1?B : $($(#qi).Find(.answer)[2])。属性(值)=1?c:D; arr.push(obj); }
  fs.writeFile(poem.json, JSON.stringify(arr), err={ if(err) throw err; Console.log(json文件保存成功!);
  });
  保存到json的文件格式如下,这样就可以通过json文件上传到云服务器了。
  
  注意事项
  在微信小程序云开发的数据库中,需要注意上传的json文件的数据格式。在此之前,我们总是提示格式错误。后来我们发现JSON数据不是数组,而是类似于JSON Lines,即每个记录对象用n隔开,而不是逗号。因此,在上传成功之前,需要对节点写入的json文件做一点处理。

js抓取网页内容(不时之需:我的理解)

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

  js抓取网页内容(不时之需:我的理解)
  phantomjs:我的理解是它是一个不显示的浏览器,也就是说它基本上可以做浏览器能做的任何事情,只是它不能显示页面的内容。所以,最近因为实验需要,要爬一些电商的图片,但是是AJAX生成的,爬HTML的简单方法不行,o(╯□╰)o,所以经过一些帮助 ,; 了解了PHANTOMJS,由于网上没有找到太多的例子,只好自己总结一下,以备不时之需。另外,直接看官网文档会有很大的收获~顺便锻炼一下英语o(╯□╰)o。这是一个实现的栗子:
  下载并解压phantom到D盘,目录下有一个phantomjs.exe文件(win7)这个WebKit可以通过js文件调用来达到想要的目的:比如生成网页快照。我的什么想做的就是爬取AJAX页面上的图片,先看js文件:命名为s.js
  [javascript]
  
  在 CODE 上查看代码片段
  
  派生到我的代码片
  system = require('system') //传递一些需要的参数给js文件

address = system.args[1];//获得命令行第二个参数 ,也就是指定要加载的页面地址,接下来会用到

var page = require('webpage').create();

var url = address;


page.open(url, function (status) {

if (status !== 'success') {

console.log('Unable to post!');
} else {

var encodings = ["euc-jp", "sjis", "utf8", "System"];//这一步是用来测试输出的编码格式,选择合适的编码格式很重要,不然你抓取下来的页面会乱码o(╯□╰)o,给出的几个编码格式是官网上的例子,根据具体需要自己去调整。

for (var i = 3; i < encodings.length; i++) {//我这里只要一种编码就OK啦

phantom.outputEncoding = encodings[i];

console.log(phantom.outputEncoding+page.content);//最后返回webkit加载之后的页面内容
}

}
phantom.exit();
});
  下一步是编写java类:
  [爪哇]
  
  在 CODE 上查看代码片段
  
  派生到我的代码片
  package com.mvc.rest;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class GetAjaxHtml {
public static String getAjaxContent(String url) throws Exception {
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("D:/tools/phantomjs/phantomjs.exe D:/tools/phantomjs/examples/s.js " + url);
InputStream is = p.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
StringBuffer sbf = new StringBuffer();
String tmp = "";
while((tmp=br.readLine())!=null) {
sbf.append(tmp + "\n");
}
return sbf.toString();
}

public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();
String result = getAjaxContent("http://114.111.162.220:8093/404Web/");
System.out.println(result);
long end = System.currentTimeMillis();
System.out.println("===============耗时:" + (end - start) + "===============");
}
}
  
  至此,你就得到了需要的AJAX完整页面的代码串,接下来就可以为所欲为。
  是最终的解决方案 查看全部

  js抓取网页内容(不时之需:我的理解)
  phantomjs:我的理解是它是一个不显示的浏览器,也就是说它基本上可以做浏览器能做的任何事情,只是它不能显示页面的内容。所以,最近因为实验需要,要爬一些电商的图片,但是是AJAX生成的,爬HTML的简单方法不行,o(╯□╰)o,所以经过一些帮助 ,; 了解了PHANTOMJS,由于网上没有找到太多的例子,只好自己总结一下,以备不时之需。另外,直接看官网文档会有很大的收获~顺便锻炼一下英语o(╯□╰)o。这是一个实现的栗子:
  下载并解压phantom到D盘,目录下有一个phantomjs.exe文件(win7)这个WebKit可以通过js文件调用来达到想要的目的:比如生成网页快照。我的什么想做的就是爬取AJAX页面上的图片,先看js文件:命名为s.js
  [javascript]
  
  在 CODE 上查看代码片段
  
  派生到我的代码片
  system = require('system') //传递一些需要的参数给js文件

address = system.args[1];//获得命令行第二个参数 ,也就是指定要加载的页面地址,接下来会用到

var page = require('webpage').create();

var url = address;


page.open(url, function (status) {

if (status !== 'success') {

console.log('Unable to post!');
} else {

var encodings = ["euc-jp", "sjis", "utf8", "System"];//这一步是用来测试输出的编码格式,选择合适的编码格式很重要,不然你抓取下来的页面会乱码o(╯□╰)o,给出的几个编码格式是官网上的例子,根据具体需要自己去调整。

for (var i = 3; i < encodings.length; i++) {//我这里只要一种编码就OK啦

phantom.outputEncoding = encodings[i];

console.log(phantom.outputEncoding+page.content);//最后返回webkit加载之后的页面内容
}

}
phantom.exit();
});
  下一步是编写java类:
  [爪哇]
  
  在 CODE 上查看代码片段
  
  派生到我的代码片
  package com.mvc.rest;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class GetAjaxHtml {
public static String getAjaxContent(String url) throws Exception {
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("D:/tools/phantomjs/phantomjs.exe D:/tools/phantomjs/examples/s.js " + url);
InputStream is = p.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
StringBuffer sbf = new StringBuffer();
String tmp = "";
while((tmp=br.readLine())!=null) {
sbf.append(tmp + "\n");
}
return sbf.toString();
}

public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();
String result = getAjaxContent("http://114.111.162.220:8093/404Web/";);
System.out.println(result);
long end = System.currentTimeMillis();
System.out.println("===============耗时:" + (end - start) + "===============");
}
}
  
  至此,你就得到了需要的AJAX完整页面的代码串,接下来就可以为所欲为。
  是最终的解决方案

js抓取网页内容(项目招商找A5快速获取精准代理名单一些站长们都了解JS代码是什么?)

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

  js抓取网页内容(项目招商找A5快速获取精准代理名单一些站长们都了解JS代码是什么?)
  项目投资找A5快速获取精准代理商名单
  有的站长知道什么是JS代码吗?一些新的 SEOER 不懂 JS。那我就在这里简单介绍一下。JS的全称是Javascript,是一种计算机脚本语言,一种新的描述语言。网站中经常用到JS,应用比较广泛。做过SEO的都看过《百度搜索引擎优化指南》,百度也明确表示:“尽量用flash、javascript等进行文字展示。也说明百度不能收录这样的文字既然百度说无法收录,也没有具体原因,百度暂时无法识别JS代码,可能有很多SEO高手已经知道,百度现在可能会识别JS代码,反正今天我会举个例子说明百度对网站JS代码链接不是爬不爬的响应,
  从这里看到 网站 使用了自己的 JS
  从这里可以看出,文章是百度在6月28日发布的。这个网站内容是百度收录拍摄的。下图是网站的内部链接内容
  但是百度没有收录网站内容,接下来看JS代码
  上图的内容已经显示出来了,我们这里用的是JS代码,网站还是百度用的收录,也就是说百度对JS代码不是很严格。从上面的例子中,我们清楚地了解到,百度仍然无法完全爬取 JS 代码。从例子可以看出网站文章出现在JS代码区收录的文本部分,可能是百度对网站的临时测试,但是不完整的代码已经认出了JS。目前还没有搜索引擎可以完全爬取JS,包括国外知名的GOOGLE也不能完全爬取JS,这个还需要大家继续研究。
  以上是SEO美食哥给大家分享的,但不代表我个人观点是正确的。这也是我观察到的。作为SEO优化工作者,我们需要及时了解百度、谷歌等搜索的动态,看搜索引擎新闻,观察它们的变化。这是我们对 SEO 研究的重要一步。
  申请创业报告,分享创业好点子。点击这里一起讨论新的商机! 查看全部

  js抓取网页内容(项目招商找A5快速获取精准代理名单一些站长们都了解JS代码是什么?)
  项目投资找A5快速获取精准代理商名单
  有的站长知道什么是JS代码吗?一些新的 SEOER 不懂 JS。那我就在这里简单介绍一下。JS的全称是Javascript,是一种计算机脚本语言,一种新的描述语言。网站中经常用到JS,应用比较广泛。做过SEO的都看过《百度搜索引擎优化指南》,百度也明确表示:“尽量用flash、javascript等进行文字展示。也说明百度不能收录这样的文字既然百度说无法收录,也没有具体原因,百度暂时无法识别JS代码,可能有很多SEO高手已经知道,百度现在可能会识别JS代码,反正今天我会举个例子说明百度对网站JS代码链接不是爬不爬的响应,
  从这里看到 网站 使用了自己的 JS
  从这里可以看出,文章是百度在6月28日发布的。这个网站内容是百度收录拍摄的。下图是网站的内部链接内容
  但是百度没有收录网站内容,接下来看JS代码
  上图的内容已经显示出来了,我们这里用的是JS代码,网站还是百度用的收录,也就是说百度对JS代码不是很严格。从上面的例子中,我们清楚地了解到,百度仍然无法完全爬取 JS 代码。从例子可以看出网站文章出现在JS代码区收录的文本部分,可能是百度对网站的临时测试,但是不完整的代码已经认出了JS。目前还没有搜索引擎可以完全爬取JS,包括国外知名的GOOGLE也不能完全爬取JS,这个还需要大家继续研究。
  以上是SEO美食哥给大家分享的,但不代表我个人观点是正确的。这也是我观察到的。作为SEO优化工作者,我们需要及时了解百度、谷歌等搜索的动态,看搜索引擎新闻,观察它们的变化。这是我们对 SEO 研究的重要一步。
  申请创业报告,分享创业好点子。点击这里一起讨论新的商机!

官方客服QQ群

微信人工客服

QQ人工客服


线