java读取网站内容的两种方法

java读取网站内容的两种方法,第1张

HttpClient

利用apache的虚拟客户端包获取某个地址的内容  import java io UnsupportedEncodingException

import java util HashSet

import java util Iterator

import java util Set

import java util regex Matcher

import java util regex Pattern

import mons

import mons

import mons

public class catchMain {

    /** *//**

     * @param args

     */

 隐握   public static void main(String[] args) {

        String url =

        String keyword= 食雀携宽

        String response=createClient(url keyword)

    }

public static String createClient(String url String param){

        HttpClient client = new HttpClient()

        String response=null

        String keyword=null

        PostMethod postMethod = new PostMethod(url)

        try {

            if(param!=null)

           keyword = new String(param getBytes( gb ) ISO )

        } catch (UnsupportedEncodingException e ) {

            // TODO Auto generated catch block

            e printStackTrace()

        }

        NameValuePair[] data = { new NameValuePair( keyword keyword) }

        // 将表单的值放入postMethod中

        postMethod setRequestBody(data)

        try {

            int statusCode = client executeMethod(postMethod)

         顷亮   response = new String(postMethod getResponseBodyAsString()

                    getBytes( ISO ) GBK )

        } catch (Exception e) {

            e printStackTrace()

        }

        return response

    }

java自带的HttpURLConnection

public static String getPageContent(String strUrl String strPostRequest

            int maxLength) {

        //读取结果网页

        StringBuffer buffer = new StringBuffer()

        System setProperty( client defaultConnectTimeout )

        System setProperty( client defaultReadTimeout )

        try {

            URL newUrl = new URL(strUrl)

            HttpURLConnection hConnect = (HttpURLConnection) newUrl

                    openConnection()

            //POST方式的额外数据

            if (strPostRequest length() >) {

                hConnect setDoOutput(true)

                OutputStreamWriter out = new OutputStreamWriter(hConnect

                        getOutputStream())

                out write(strPostRequest)

                out flush()

                out close()

            }

            //读取内容

            BufferedReader rd = new BufferedReader(new InputStreamReader(

                    hConnect getInputStream()))

            int ch

            for (int length = (ch = rd read()) >

                    &&(maxLength <= || length <maxLength)length++)

                buffer append((char) ch)

            rd close()

            hConnect disconnect()

            return buffer toString() trim()

        } catch (Exception e) {

            // return 错误:读取网页失败!

            return null

        }

lishixinzhi/Article/program/Java/hx/201311/26339

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)保存图片到服务器上

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

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 = 0i <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=0i<6i++){

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=0i<6i++){

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=0i<6i++){

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上去了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12483946.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存