网页信息抓取进阶 支持Js生成数据 Jsoup的不足之处

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23866427

今天又遇到一个网页数据抓取的任务,给大家分享下。

说道网页信息抓取,相信Jsoup基本是首选的工具,完全的类JQuery操作,让人感觉很舒服。但是,今天我们就要说一说Jsoup的不足。

1、首先我们新建一个页面

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>main.html</title><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="this is my page"><meta http-equiv="content-type" content="text/html; charset=UTF-8"><style type="text/css">a {line-height: 30px;margin: 20px;}</style><!--<link rel="stylesheet" type="text/css" href="./styles.css">--><script type="text/javascript">var datas = [ {href : "http://news.qq.com/a/20140416/017800.htm",title : "高校一保安长相酷似作家莫言"
}, {href : "http://news.qq.com/a/20140416/015167.htm",title : "男子单臂托举悬空女半小时"
}, {href : "http://news.qq.com/a/20140416/013808.htm",title : "女子上门讨房租遭强奸拍裸照"
}, {href : "http://news.qq.com/a/20140416/016805.htm",title : "澳洲骆驼爱喝冰镇啤酒解暑"
} ];window.onload = function() {var infos = document.getElementById("infos");for( var i = 0 ; i < datas.length ; i++){var a = document.createElement("a");a.href = datas[i].href ;a.innerText = datas[i].title;infos.appendChild(a);	infos.appendChild(document.createElement("br"))}
}
</script></head><body>Hello Main HttpUnit!<br><div id="infos"style="width: 60%; border: 1px solid green; border-radius: 10px; margin: 0 auto;"></div></body>
</html>
页面上观察是这样显示的:


我们审查元素:


如果你看到这样的页面,你会觉得拿Jsoup来抓取,简直就是呵呵,小菜一叠,于是我们写了这样的代码:

        @Testpublic void testUserJsoup() {try {Document doc = Jsoup.connect("http://localhost:8080/strurts2fileupload/main.html").timeout(5000).get();Elements links = doc.body().getElementsByTag("a");for (Element link : links) {System.out.println(link.text() + " " + link.attr("href"));}} catch (IOException e) {e.printStackTrace();}}
你会觉得就这几行代码,轻轻松松搞定,快快乐乐下班。于是运行发现,其实什么的抓取不到。

于是我们再回到页面,打开页面源代码,也就是上面的HTML代码,你恍然大悟,我靠,body里面根本没有数据,难怪抓不到。这就是Jsoup的不足,如果Jsoup去抓取的页面的数据,全都是页面加载完成后,ajax获取形成的,是抓取不到的。

下面给大家推荐另一个开源项目:HttpUnit,看名字是用于测试的,但是用来抓取数据也不错

我们开始编写类似Jsoup的代码:

       @Testpublic void testUserHttpUnit() throws FailingHttpStatusCodeException,MalformedURLException, IOException {/** HtmlUnit请求web页面 */WebClient wc = new WebClient(BrowserVersion.CHROME);wc.getOptions().setUseInsecureSSL(true);wc.getOptions().setJavaScriptEnabled(true); // 启用JS解释器,默认为truewc.getOptions().setCssEnabled(false); // 禁用css支持wc.getOptions().setThrowExceptionOnScriptError(false); // js运行错误时,是否抛出异常wc.getOptions().setTimeout(100000); // 设置连接超时时间 ,这里是10S。如果为0,则无限期等待wc.getOptions().setDoNotTrackEnabled(false);HtmlPage page = wc.getPage("http://localhost:8080/strurts2fileupload/main.html");DomNodeList<DomElement> links = page.getElementsByTagName("a");for (DomElement link : links) {System.out.println(link.asText() + "  " + link.getAttribute("href"));}}
再看一下运行结果:


完美解决,HttpUnit其实就相当于一个没有UI的浏览器,它可以让页面上的js执行完成后,再抓取信息,具体的介绍,google一下就行。主要给大家介绍一种方案!


如果你觉得这篇文章对你有用,就顶一个~



版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/dingxiaoyue/p/4924983.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jmeter进行http压力测试(图文小教程)

下载地址&#xff1a;http://jmeter.apache.org/download_jmeter.cgiJMeter基于Java开发&#xff0c;需要系统有安装JDK环境。解压后进入bin目录&#xff0c;点击jmeter.bat1、添加线程组&#xff1a; 测试计划 -> 添加 -> Threads(User) -> 线程组&#xff0c;添加后…

LeetCode 1681. 最小不兼容性(回溯+剪枝)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums​​​ 和一个整数 k 。你需要将这个数组划分到 k 个相同大小的子集中&#xff0c;使得同一个子集里面没有两个相同的元素。 一个子集的 不兼容性 是该子集里面最大值和最小值的差。 请你返回将数组分成 k 个子集后&…

css bug 集2

问题浏览器DEMO解决方法Hacking Rules:property:all-ie\9; property:gte-ie8\0;*property:lte-ie7; property:ie7; _property:ie6;1input[button | submit] 不能用 margin:0 auto; 居中IE8bug | fixed为input添加width2body{overflow:hidden;}没有去掉滚动条IE6/7bug | fixed设…

python读取Excel实例详细教程

1.操作步骤&#xff1a;&#xff08;1&#xff09;安装python官方Excel库-->xlrd&#xff08;2&#xff09;获取Excel文件位置并读取&#xff08;3&#xff09;读取sheet&#xff08;4&#xff09;读取指定rows和cols内容2.示例代码&#xff1a; # -*- coding: utf-8 -*-imp…

使用CNN进行情感分类

文章目录1. 读取数据2. 数据集拆分3. 文本向量化4. 建立CNN模型5. 训练、测试参考 基于深度学习的自然语言处理 1. 读取数据 数据文件&#xff1a; import numpy as np import pandas as pddata pd.read_csv("yelp_labelled.txt", sep\t, names[sentence, label…

人生苦短,我用Python(Python快速教程 - 基础篇)

Life is short, you need Python 人生苦短&#xff0c;我用Python -- Bruce Eckel 5.1 Python简介 本章将介绍Python的最基本语法&#xff0c;以及一些和深度学习还有计算机视觉最相关的基本使用。 5.1.1 Python简史 Python是一门解释型的高级编程语言&#xff0c;特点是简单明…

A5营销:传统企业站优化正文内容在SEO方面的三大注意事项

关于网站的正文内容&#xff0c;相信站长们都应该比较清楚正文内容的作用以及给网站所带来的价值&#xff0c;优质的网站正文内容可以给用户带来阅读体验和帮助、可以给网站带来庞大的流量、可以让蜘蛛一次吃个饱等等。当然&#xff0c;优质的正文内容不光是内容的质量正重要&a…

Linux环境变量配置的三个方法--/etc/profile,~/.bashrc,shell

【环境配置的原因】在windows系统下&#xff0c;很多软件的安装都需要设置环境变量&#xff0c;比如安装JAVA JDK。如果不安装环境变量&#xff0c;在非软件安装的目录下运行javac命令&#xff0c;将会报告“找不到文件”类似的错误。那么&#xff0c;什么是环境变量呢&#xf…

LeetCode 1000. 合并石头的最低成本(区间DP)

文章目录1. 题目2. 解题1. 题目 有 N 堆石头排成一排&#xff0c;第 i 堆中有 stones[i] 块石头。 每次移动&#xff08;move&#xff09;需要将连续的 K 堆石头合并为一堆&#xff0c;而这个移动的成本为这 K 堆石头的总数。 找出把所有石头合并成一堆的最低成本。如果不可…

Android 自定义View (一)

转载请标明出处&#xff1a;http://blog.csdn.net/lmj623565791/article/details/24252901 很多的Android入门程序猿来说对于Android自定义View&#xff0c;可能都是比较恐惧的&#xff0c;但是这又是高手进阶的必经之路&#xff0c;所有准备在自定义View上面花一些功夫&#x…

Python导入全局、局部模块以及如何让避免循环导入

许多年来不时使用Python的人并不是都知道Python的导入机制其实非常灵活。在本文中&#xff0c;我们将探讨以下话题&#xff1a; 常规导入&#xff08;regular imports&#xff09;使用from语句导入相对导入&#xff08;relative imports&#xff09;可选导入&#xff08;option…

LeetCode 995. K 连续位的最小翻转次数(差分思想)

文章目录1. 题目2. 解题1. 题目 在仅包含 0 和 1 的数组 A 中&#xff0c;一次 K 位翻转包括选择一个长度为 K 的&#xff08;连续&#xff09;子数组&#xff0c;同时将子数组中的每个 0 更改为 1&#xff0c;而每个 1 更改为 0。 返回所需的 K 位翻转的次数&#xff0c;以便…

如何自学人工智能?

不少同学跃跃欲试&#xff0c;想投入 AI 的怀抱&#xff0c;但苦于不知如何下手。其中&#xff0c;人工智能的核心就是机器学习&#xff08;Machine Learning&#xff09;&#xff0c;它是使计算机具有智能的根本途径&#xff0c;其应用遍及人工智能的各个领域。 我们今天就来分…

2014/4/16

2014-04-16 crystal 14:10:53 股东大会开了没今天 crystal 14:11:08 今天296创新高了 crystal 2014/4/16 14:08:33 32.9 米多爸爸 2014/4/16 14:08:42 296不错&#xff0c;不是今天开股东大会吗 米多爸爸 2014/4/16 14:08:51 延期了&…

AI 人工智能学习经典书单

人工智能相关岗位中&#xff0c;涉及到的内容包含&#xff1a;算法、深度学习、机器学习、自然语言处理、数据结构、Tensorflow、Python 、数据挖掘、搜索开发、神经网络、视觉度量、图像识别、语音识别、推荐系统、系统算法、图像算法、数据分析、概率编程、计算机数学、数据仓…

牛客 牛牛爱喝酒(模拟)

文章目录1. 题目2. 解题1. 题目 链接&#xff1a;https://ac.nowcoder.com/acm/contest/9752/A 来源&#xff1a;牛客网 牛牛是一个酒鬼&#xff0c;非常爱喝酒&#xff0c; 一瓶酒m元钱&#xff0c; 两个酒瓶可以换一瓶酒&#xff0c; 四个瓶盖可以换一瓶酒&#xff0c; 现在…

零基础30分钟开启你的快速开发之旅

零基础30分钟开启你快速开发之旅 1. 前言 接触AgileEAS.NET SOA 中间件平台&#xff08;以下简称EAS.NET平台&#xff09;有4个多月时间&#xff0c;经过试用认为可以把它作为一个开发的基础平台&#xff0c;开发团队可以把开发的重点放在需求的把控和项目的交付上&#xff0c;…

Python语法糖——遍历列表时删除元素

Python的for可以遍历一个List&#xff0c;但是在遍历的过程中删除元素常常会得到意想不到的结果甚至程序出现异常&#xff0c;例如&#xff1a; lst [1, 1, 0, 2, 0, 0, 8, 3, 0, 2, 5, 0, 2, 6]for item in lst:if item 0:lst.remove(item) print lst输出&#xff1a; [1, 1…

牛客 牛牛的独特子序列(双指针/二分查找)

文章目录1. 题目2. 解题2.1 双指针2.2 二分查找1. 题目 链接&#xff1a;https://ac.nowcoder.com/acm/contest/9752/B 来源&#xff1a;牛客网 牛牛现在有一个长度为len只包含小写字母‘a’-z’的字符串x&#xff0c;他现在想要一个特殊的子序列&#xff0c; 这个子序列的长…

TCPIP通信

最近在开发TCPIP通信&#xff0c;封装了3个类&#xff0c;望各位大神指点指点。1 using System;2 using System.Collections.Generic;3 using System.Text;4 using System.Net.Sockets;5 using System.Threading;6 using System.Net;7 using System.Linq;8 using System.Net.Ne…