当前位置:首页 » 编程语言 » java取网页

java取网页

发布时间: 2022-10-06 17:11:26

‘壹’ 如何使用java抓取网页上指定部分的内容

1. 你可以选择用Java代码来找到整个网页的html代码,如下
(注意在处理网页方面的内容时,需要导入htmlparser包来支持)

import org.htmlparser.util.ParserException;
import org.htmlparser.visitors.HtmlPage;
import org.htmlparser.Parser;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.util.NodeList;

public class htmlmover {
public static void main(String[] args){
NodeList rt= getNodeList("http://forex.hexun.com/rmbhl/");
System.out.println(rt.toHtml());
}
public static NodeList getNodeList(String url){
Parser parser = null;
HtmlPage visitor = null;
try {
parser = new Parser(url);
parser.setEncoding("GBK");
visitor = new HtmlPage(parser);
parser.visitAllNodesWith(visitor);
} catch (ParserException e) {
e.printStackTrace();
}
NodeList nodeList = visitor.getBody();
return nodeList;
}
}

以上代码,public static NodeList getNodeList(String url) 为主体
传入需要分析网页的 url(String类型),返回值是网页Html节点List(Nodelist类型)
这个方法我没有什么要说的,刚开始的时候没看懂(没接触过),后来用了几次也懂点皮毛了
注意: parser.setEncoding("GBK"); 可能你的工程编码格式是UTF-8,有错误的话需要改动

运行该程序

2.通过浏览器工具直接查看 IE是按F12 (刚开始没发现这个方法,于是傻乎乎地找上面的代码)

分析你所获得的html代码让人眼花缭乱,不要紧,找到自己需要趴取的内容,找到它上下文有特征的节点

<!--中行牌价 开始-->
<div id="sw01_con1">
<table width="655" border="0" cellspacing="0" cellpadding="0" class="hgtab">
<thead>
<tr>
<th width="85" align="center" class="th_l">交易币种</th>
<th width="80" align="center">交易单位</th>
<th width="130" align="center">现价(人民币)</th>
<th width="80" align="center">卖出价</th>
<th width="100" align="center">现汇买入价</th>
<th width="95" align="center">现钞买入价</th>
</tr>
</thead>
<tbody>
<tr align="center">
<td> 英镑</td>
<td>100</td>
<td>992.7</td>
<td>1001.24</td>
<td>993.26</td>
<td class="no">962.6</td>
</tr>
<tr align="center" bgcolor="#f2f3f4">
<td> 港币</td>
<td>100</td>
<td>81.54</td>
<td>82.13</td>
<td>81.81</td>
<td class="no">81.16</td>
</tr>
<tr align="center">
<td> 美元</td>
<td>100</td>
<td>635.49</td>
<td>639.35</td>
<td>636.8</td>
<td class="no">631.69</td>
</tr>
<tr align="center" bgcolor="#f2f3f4">
<td> 瑞士法郎</td>
<td>100</td>
<td>710.89</td>
<td>707.78</td>
<td>702.14</td>
<td class="no">680.46</td>
</tr>
<tr align="center">
<td> 新加坡元</td>
<td>100</td>
<td>492.45</td>
<td>490.17</td>
<td>486.27</td>
<td class="no">471.25</td>
</tr>
<tr align="center" bgcolor="#f2f3f4">
<td> 瑞典克朗</td>
<td>100</td>
<td>93.66</td>
<td>93.79</td>
<td>93.04</td>
<td class="no">90.17</td>
</tr>
<tr align="center">
<td> 丹麦克朗</td>
<td>100</td>
<td>116.43</td>
<td>115.59</td>
<td>114.67</td>
<td class="no">111.13</td>
</tr>
<tr align="center" bgcolor="#f2f3f4">
<td> 挪威克朗</td>
<td>100</td>
<td>110.01</td>
<td>109.6</td>
<td>108.73</td>
<td class="no">105.37</td>
</tr>
<!--{2011-10-01 23:16:00}-->
</tbody>
</table>
</div>
<!--中行牌价 结束-->

大家可以看到这是一段很有规律,书写非常规范的Html代码(这只是第一部分,中行牌价,可以想象,接下来还会有并列的 相似的3部分)

大家想截取这些节点中的数据
以下代码仍需导入htmlparser Java支持包
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

public class Currencyrate {
public static void main(String[] args){
String url="http://forex.hexun.com/rmbhl/";
ArrayList<String> rt= getNodeList(url);
for (int i = 0; i < rt.size(); i++){
System.out.println(rt.get(i));
}
}

public static ArrayList<String> getNodeList(String url){
final ArrayList<String> result=new ArrayList<String>();
Parser parser = null;
NodeList nodeList=null;
try {
parser = new Parser(url);
parser.setEncoding("GBK");

nodeList = parser.parse(
new NodeFilter(){
@Override
public boolean accept(Node node){
Node need=node;
if(getStringsByRegex(node.getText())){
for(int i=0;i<6;i++){
result.add(need.toPlainTextString()); need=need.getPreviousSibling().getPreviousSibling();
}
return true;
}
return false;
}
}
);
}catch (ParserException e) {
e.printStackTrace();
}
return result;
}

public static boolean getStringsByRegex(String txt) {
String regex="td class=\"no\"";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(txt);
if (m.find()){
return true;
}
return false;
}
}

废话不多说,
public static ArrayList<String> getNodeList(String url) 主要方法
parser.setEncoding("GBK"); 需要注意,代码编码格式

nodeList = parser.parse(
new NodeFilter(){
@Override
public boolean accept(Node node){
}

);
nodelist是html节点的列表,现在使用NodeFilter ( 节点过滤器 )实例, 重载NodeFilter类中的accept()方法
在parser这个Parser类访问整个html页面的时候,每遇到一个html节点,就会访问这个
accept()方法,返回True的话就会将这个节点 放进nodelist中,否则就不会将这个节点放进去。这个就是NodeFilter功能。
代码段一获取整个html页面时候 parser.visitAllNodesWith(visitor); 就是获取所有节点

所以现在我们要趴取网页上的内容,只要告诉accept()这个方法,哪些节点要放进nodelist去,即 遇到哪些节点需要返回true。
于是
public boolean accept(Node node){
Node need=node;
if(getStringsByRegex(node.getText())){
for(int i=0;i<6;i++){
result.add(need.toPlainTextString()); need=need.getPreviousSibling().getPreviousSibling();
}
return true;
}
return false;
}
Parser类在遇到节点,就把这个节点拿过去问accept(),于是accept()方法分析,如果满足getStringsByRegex(node.getText())就要了

接下来分析getStringsByRegex(),只剩下最后一步了,大家坚持啊!

String regex="td class=\"no\"";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(txt);
if (m.find()){
return true;
}
return false;
}
大家可以发现我们索要的每一段都是
<tr align="center">
<td> 英镑</td>
<td>100</td>
<td>992.7</td>
<td>1001.24</td>
<td>993.26</td>
<td class="no">962.6</td>
</tr>
所以只要找到<td class="no">这个节点就行了,我们用正则表达式去比较
String regex="td class=\"no\""; 这个是比较标准(正则表达式 td class=”no” 其中两个引号需要作为转义字符来表示 成\“ )
变量txt是我们传过去的需要比较的节点的node.getText(),如果符合的话m.find就是true,于是getStringsByRegex()返回true,说明这个节点就是我们所需要的哪些节点,于是
for(int i=0;i<6;i++){
result.add(need.toPlainTextString()); need=need.getPreviousSibling().getPreviousSibling();
}
每一段html,6个为一组,先是962.6,然后是993.26,1001.24,992.7,100,英镑分别被add进result这个ArrayList<String>中去,返回,这个ArrayList装的就是我们需要抓取的数据

大家可以把我们所获得的String数据数出来试试看,是不是我们需要的顺序,main()函数获得ArrayList<String>,就可以显示到我们所需要的Java widget上去了

‘贰’ java 抓取网页数据,要怎么抓取

如果是一般允许抓取的页面用 wget就可以抓取了,
不允许抓取的的爬虫程序可以考虑用HttpClient

‘叁’ java如何获取网页中的文字

package test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.PasswordAuthentication;
import java.net.URL;
import java.net.URLConnection;
import java.util.Properties;

public class URLTest {
// 一个public方法,返回字符串,错误则返回"error open url"
public static String getContent(String strUrl) {
try {
URL url = new URL(strUrl);
BufferedReader br = new BufferedReader(new InputStreamReader(url
.openStream()));
String s = "";
StringBuffer sb = new StringBuffer("");
while ((s = br.readLine()) != null) {
sb.append(s + "/r/n");
}
br.close();
return sb.toString();
} catch (Exception e) {
return "error open url:" + strUrl;
}
}

public static void initProxy(String host, int port, final String username,
final String password) {
Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username,
new String(password).toCharArray());
}
});
System.setProperty("http.proxyType", "4");
System.setProperty("http.proxyPort", Integer.toString(port));
System.setProperty("http.proxyHost", host);
System.setProperty("http.proxySet", "true");
}

public static void main(String[] args) throws IOException {
String url = "https://www.jb51.net";
String proxy = "http://192.168.22.81";
int port = 80;
String username = "username";
String password = "password";
String curLine = "";
String content = "";
URL server = new URL(url);
initProxy(proxy, port, username, password);
HttpURLConnection connection = (HttpURLConnection) server
.openConnection();
connection.connect();
InputStream is = connection.getInputStream();
BufferedReader reader = new BufferedReader(new
InputStreamReader(is));
while ((curLine = reader.readLine()) != null) {
content = content + curLine+ "/r/n";
}
System.out.println("content= " + content);
is.close();
System.out.println(getContent(url));
}
}

‘肆’ 请大家帮帮忙. 使用java爬虫得到网页以后怎么提取里面自己需要的内容呢如果会代码请您写一下.谢谢您

根据java网络编程相关的内容,使用jdk提供的相关类可以得到url对应网页的html页面代码。
针对得到的html代码,通过使用正则表达式即可得到我们想要的内容。
比如,我们如果想得到一个网页上所有包括“java”关键字的文本内容,就可以逐行对网页代码进行正则表达式的匹配。最后达到去除html标签和不相关的内容,只得到包括“java”这个关键字的内容的效果。

‘伍’ java网页获取

StringBuffer用之前要初始化,eg:StringBuffer sb = new StringBuffer();
StringBuffer document=new StringBuffer();
String line; // 读入网页信息

while ((line = reader.readLine()) != null){
document.append(line+"\n");
}
String title = document.toString();
title = title.substring(title.indexOf("<title>") + 7,
title.indexOf("</title>"));
System.out.println(title);

‘陆’ 如何通过Java代码实现对网页数据进行指定抓取

通过Java代码实现对网页数据进行指定抓取方法步骤如下:
1在工程中导入Jsoup.jar包

2获取网址url指定HTML或者文档指定的body

3获取网页中超链接的标题和链接

4获取指定博客文章的内容

5获取网页中超链接的标题和链接的结果

‘柒’ java jsoup怎样爬取特定网页内的数据

1、Jsoup简述

Java中支持的爬虫框架有很多,比如WebMagic、Spider、Jsoup等。
​ Jsoup拥有十分方便的api来处理html文档,比如参考了DOM对象的文档遍历方法,参考了CSS选择器的用法等等,因此我们可以使用Jsoup快速地掌握爬取页面数据的技巧。

2、快速开始

1)分析HTML页面,明确哪些数据是需要抓取的

2)使用HttpClient读取HTML页面
HttpClient是一个处理Http协议数据的工具,使用它可以将HTML页面作为输入流读进java程序中.

3)使用Jsoup解析html字符串
通过引入Jsoup工具,直接调用parse方法来解析一个描述html页面内容的字符串来获得一个Document对象。该Document对象以操作DOM树的方式来获得html页面上指定的内容。

3、保存爬取的页面数据

1)保存普通数据到数据库
将爬取的数据封装进实体Bean中,并存到数据库内。

2)保存图片到服务器上
直接通过下载图片的方式将图片保存到服务器本地。

‘捌’ 如何利用 java 多线程 爬取大量网页

多线程 爬取网页

  • 一:多线程问题,建议使用线程池的方式,线程池的优点如下:

1:减少在创建和销毁线程上所花的时间以及系统资源的开销

2:如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存.

  • 二: 爬取网页建议使用第三方的jar包

推荐JSoup ,HttpClient等

JSoup 强在爬取速度快, 解析方便

HttpClient可以提交比较复杂的请求,满足登陆等复杂需求

‘玖’ java如何获取动态网页内容

Htmlunit这个工具类,进行http请求访问,获取html网页,以及过滤网页html标签获取网页文本。
主要的思路还是以下几点:
1.了解你要爬取的网页的元素,以及通讯,校验安全机制。常用方法通过chrome浏览器访问你要获取的网页,基本上一个老司机打开F12就差不多知道页面的表单,数据以及通过什么样的请求方式请求服务,并又是怎么样返回,加载到页面进行渲染。如果还不熟悉这个F12,那还不赶快去get起来啊,时间短,效率快,看一遍就知道怎么用了的好东西不利用起来,不是太浪费了。
2.了解了你要访问的网页的你想要获取的元素之后,就是怎么发起http的request请求,模拟这个请求获取response。那这个request就是通过在程序里模拟的浏览器器发起,如果成功发起,那么你需要的数据就藏在这个response里。
3.成功获取response之后,就是怎么进行解析,获取你想要的数据。当然,如果是json数据,那么解析起来就很容易。如果返回的是整个html,那也是有办法解析,抽取转换成需要的文本进行入库。
接下来,就通过实际的编码,来如何一步步实现。
有些网站,是通过登陆来取得认证看到更多数据,有些网站可以直接发请求访问。而我写的这个列子,就是登陆之后,获取的网站内部的数据。
基本思路就是,通过登陆拿到令牌,然后拿着这个令牌,去访问这个网站内你需要访问的地址,从而获取数据。来,让我们看看代码是如何实现的。

热点内容
循迹小车算法 发布:2024-12-22 22:28:41 浏览:80
scss一次编译一直生成随机数 发布:2024-12-22 22:04:24 浏览:954
嫁接睫毛加密 发布:2024-12-22 21:50:12 浏览:974
linuxbin文件的安装 发布:2024-12-22 21:46:07 浏览:798
vlcforandroid下载 发布:2024-12-22 21:45:26 浏览:664
电脑做网关把数据发送至服务器 发布:2024-12-22 21:44:50 浏览:431
新华三代理什么牌子的服务器 发布:2024-12-22 21:33:21 浏览:342
欢太会员密码是什么 发布:2024-12-22 20:57:28 浏览:74
sqllocaldb 发布:2024-12-22 20:07:08 浏览:126
如何找到我的服务器 发布:2024-12-22 19:52:14 浏览:301