md

弄了一天了……(这个月不会在摸爬虫了,浪费生命)

进入正题:

起初是想写一个爬虫来爬一个网站的视频,但是怎么爬取都爬取不到,分析了下源代码之后,发现源代码中并没有视频的dom

但是在浏览器检查元素的时候又是有的,这就让我很难过了

百度了一大天,发现是因为普通方法获取的只是服务器端本地的静态资源,也就是第一手资源

而浏览器检查元素的资源是经过js渲染后的代码

所以就要想办法去获得渲染后的代码

在看了若干个帖子之后……外加上一个httpclient课程和另一个htmlunit课程……

终于,在看完一个帖子后,知道了怎么获取渲染后网页的代码

首先,httpclient是普通httlurlConnection的升级版,可以模拟浏览器以防止被服务器封杀

但是抓取的源代码是静态的一手源代码,没有经过js渲染后的内容

所以就需要htmlunit工具,来让页面经过渲染,然后获取源代码

htmlunit的主要功能就是模拟人工操作页面内的元素,由于没有gui,所以要比普通操作要快,但是实际操作后发现还是需要肉眼可见的时间

具体两个工具的jar包在哪儿下载不在这赘述,相信看到这篇文章的人都应该知道在那里获取资源

下面直接贴上源码,具体语句含义在注释中有

源代码如下:

import java.io.IOException;
import java.net.MalformedURLException; import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage; public class HtmlUnit {
public static void main(String[] args) {
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_52);//模拟火狐浏览器
try { // HtmlPage page = webClient.getPage("http://www.baidu.com");
// webClient.getOptions().setCssEnabled(false);
// webClient.getOptions().setJavaScriptEnabled(false);
webClient.setJavaScriptTimeout(5000);
webClient.getOptions().setUseInsecureSSL(true);//接受任何主机连接 无论是否有有效证书
webClient.getOptions().setJavaScriptEnabled(true);//设置支持javascript脚本
webClient.getOptions().setCssEnabled(false);//禁用css支持
// webClient.getOptions().set
webClient.getOptions().setThrowExceptionOnScriptError(false);//js运行错误时不抛出异常
webClient.getOptions().setTimeout(100000);//设置连接超时时间
webClient.getOptions().setDoNotTrackEnabled(false);
// HtmlPage page = webClient.getPage("http://blog.csdn.net/su20145104009?viewmode=contents");
HtmlPage page = webClient.getPage("http://www.enmeiyiyuan.com/look-5bf3f60b83145.html");
// String res=page.asText();
Thread.sleep(3000);
System.out.println(page.asXml());
} catch (FailingHttpStatusCodeException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}finally {
webClient.close();
} }
}

那些注释掉的是之前尝试的……

然后一定要注意加上线程等待时间,不然获取的大概率还是第一手代码,因为js渲染需要时间,这里是等待了三秒,然后成功获取经过处理的源码

希望对大家有所帮助

以上

java_爬虫_获取经过js渲染后的网页源码的更多相关文章

  1. htmlunit抓取js执行后的网页源码

    上次我不是写了一个自动抓取博客访问量吗 (点击打开链接) 可是昨天晚上我又运行的时候,发现不能用了.. 运行了几次 发现使用URLConnection 得到的网页源码和浏览器直接查看的不同. URLC ...

  2. Python通过PhantomJS获取JS渲染后的网页源代码

    新建一个文件,命名为test.js,内容如下: var page = require('webpage').create(), system = require('system'), address; ...

  3. 服务端渲染 数据驱动 不是渲染后的网页,而是一个由html和Javascript组成的app ssr 隐藏接口服务器

    小结: 1. 服务端渲染主要的工作是把组件渲染为服务器端的 HTML 字符串,将它们直接发送到浏览器,最后将静态标记"混合"为客户端上完全交互的应用程序. 服务器给到客户端的已经是 ...

  4. python 爬取世纪佳缘,经过js渲染过的网页的爬取

    #!/usr/bin/python #-*- coding:utf-8 -*- #爬取世纪佳缘 #这个网站是真的烦,刚开始的时候用scrapy框架写,但是因为刚接触框架,碰到js渲染的页面之后就没办法 ...

  5. Python爬虫学习之获取网页源码

    偶然的机会,在知乎上看到一个有关爬虫的话题<利用爬虫技术能做到哪些很酷很有趣很有用的事情?>,因为强烈的好奇心和觉得会写爬虫是一件高大上的事情,所以就对爬虫产生了兴趣. 关于网络爬虫的定义 ...

  6. JS魔法堂:jsDeferred源码剖析

    一.前言 最近在研究Promises/A+规范及实现,而Promise/A+规范的制定则很大程度地参考了由日本geek cho45发起的jsDeferred项目(<JavaScript框架设计& ...

  7. C语言之socket获取网页源码

    写爬虫也许你用的是python,类似urlopen(url).read()即可获得普通的网页的源码,或者用的java的网络库加上流操作,或者其他高级语言.但你有没有想过使用C语言来实现呢?我曾经以为用 ...

  8. C#获取指定网页源码的几种方法

    // WebClient private string GetWebClient(string url) { string strHTML = ""; WebClient myWe ...

  9. QT:轻松获取网页源码

    获取网页源码的小例子,代码很简单,就不多作解释了. 不过一定要注意网页的编码问题,否则会出现乱码的!!! #include <QtCore> #include <QtNetwork& ...

随机推荐

  1. Codeforces Round #578 (Div. 2) 二维差分 可做模板

    题意: 在n*n的矩阵中,你可以选择一个k*k的子矩阵,然后将这个子矩阵中的所有B全部变为W,问你怎么选择这个子矩阵使得最终的矩阵中某一行全是W或者某一列全是W的个数最多 题解:考虑每一行和每一列,对 ...

  2. LeetCode 852. 山脉数组的峰顶索引 (二分)

    题目链接:https://leetcode-cn.com/problems/peak-index-in-a-mountain-array/ 我们把符合下列属性的数组 A 称作山脉: A.length ...

  3. Flask之RESTFul API前后端分离

    Flask之RESTFul API前后端分离 一:虚拟环境搭建的两种方式 1 pipenv的使用 pip install --user pipenv安装pipenv在用户目录下 py -m site ...

  4. 853. 有边数限制的最短路(Bellman-ford算法模板)

    给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你求出从1号点到n号点的最多经过k条边的最短距离,如果无法从1号点走到n号点,输出impossible. 注意:图中可能 存 ...

  5. vue实现网页简单计算器实例代码

    效果: 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  6. 记录 Docker 的学习过程 (网络篇)

    打开2个会话,分别运行以下命令 # docker run -it -P --name nginx2 nginx #-P 端口随机映射 再打开一个会话查看 运行中的容器 # docker ps -aCO ...

  7. navicat 连接报2059错误

    原因 navicat不支持mysql新版本的加密规则,mysql8 之前的版本中加密规则是mysql_native_password, mysql8之后,加密规则是caching_sha2_passw ...

  8. [Note]prufer

    [Note]Prufer编码 实现 不断删除度数为\(1\)的最小序号的点,并输出与其相连的节点的序号,直至树中只有两个节点. 性质 任何一棵\(n\)节点的树都可以唯一的用长度为\(n-2\)的pr ...

  9. StackExchange.Redis 之 SortedSet 类型示例

    1,增加操作 RedisCacheHelper.Instance.ZSortadd(); RedisCacheHelper.Instance.ZSortadd(); RedisCacheHelper. ...

  10. AntDesign(React)学习-15 组件定义、connect、interface

    虽然常用的编码用一种即可,但是看别人文档或者示例时,有的写法不熟悉的话看着很不习惯,整理几种实现同一功能的不同写法 1.Dva Connect与@Connect import React, { Pro ...