本人最近几天学习使用HttpClient包读取网页上的数据,运行博客http://ducaijun.iteye.com/blog/1335453上的例子:
1.首先打开Eclipse,File->New->Java Project,生成一个Java工程;
2. 然后下载HttpClient这个Java包和Jsoup这个Java包,然后将他们导入自己建立的工程。根据版本不同可能还需要commons-codec,commons-logging,httpcore等Java包;
3. 右键工程,New->Class,添加一个类,类名取为JustTest (与例http://ducaijun.iteye.com/blog/1335453中类同),将例程中代码拷贝进入类文件;
这里或许可以将网页上的代码copy进txt存成文件,然后作为现成的类直接导入工程中。但是偶是新手,暂时还不会。所以用笨方法。
4. 可能会因为HttpClient等包的版本问题出现一些红叉叉,提示不能识别一些标识符。这个时候我的笨方法就俩,(1)使用最高版本HttpClient\HttpCore\Jsoup,把.jar解压完,然后 直接搜不能识别的类,如果搜到就把所在的package路径 import进入JustTest中;(2)遇到上述无法解决或者提示函数已经废弃不用的,就按照提示去谷歌里面搜,一般能找到解决方案的.
5. 如下显示代码:
package testLoadHttp;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JustTest {
public static String getHtmlByUrl(String url) {
String html = null;
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpget = new HttpGet(url);// 以get方式请求该URL
try {
CloseableHttpResponse responce = httpClient.execute(httpget);
int resStatu = responce.getStatusLine().getStatusCode();// 返回码
if (resStatu == HttpStatus.SC_OK)
{
HttpEntity entity = responce.getEntity();
if (entity != null)
{
html = EntityUtils.toString(entity);// 获得html源代码
System.out.println(html);
}
}
} catch (Exception e) {
System.out.println("访问【" + url + "】出现异常!");
e.printStackTrace();
} finally {
httpClient.getConnectionManager().shutdown();
}
// httpClient.close();
return html;
}
public static void main(String[] args) {
String html = getHtmlByUrl("http://www.iteye.com/");
if (html != null && !"".equals(html))
{
Document doc = Jsoup.parse(html);
{
String str0="div#page>div#content.clearfix>div#local>div#recommend>ul>li>a";
Elements linksElements = doc.select(str0);
for (Element ele : linksElements)
{
String href = ele.attr("href");
String title = ele.text();
System.out.println(href + "," + title);
}
}
{
String str0="div#page>div#content.clearfix>div#local>div#recommend>ul>li";
Elements linksElements = doc.select(str0);
for (Element ele : linksElements)
{
String href = ele.attr("href");
String target=ele.attr("target");
String title=ele.attr("title");
System.out.println("href:"+href + ",target:" + target+",title:"+title);
}
}
}
//**********************************************
}
}
6. 解释,该JustTest类中只有两个函数getHtmlByUrl和main函数。其中getHtmlByUrl负责根据网址获取网页内容的字符串形式。
Jsoup.parse函数将该字符串进行解析。然后根据组织方式查找,这一点偶也不太懂,只是照葫芦画瓢。
7. 详解:本程序要找http://www.iteye.com/中推荐的精华文章 如下图所示:
然后我用天行浏览器(XSkyWalker)打开该网址,右键->审查元素,然后出现如下页面,
似乎上述粉色代码部分通过getEntity函数获取的就是Element标签下body中的内容;
补充说明下,天行浏览器和Chrome浏览器都有右键“审查元素”,而IE浏览器/天行/Chrome下,都可通过F12打开此页面。
天行浏览器下还可以通过Ctrl+F来查找标签下的内容。
使用天行浏览器很方便,比如 “推荐精华文章”在哪个组织下呢? 如下所示点击浏览器中的某个内容,然后右键“审查元素”,就可跳转至其在Http Element中所在的位置
8. 调试显示的中间变量如下:
黄色代码部分生成的变量LinkElements:
黄色代码部分生成的变量ele:
红色代码部分生成的变量LinkElements:
红色代码部分生成的变量ele:
看到黄色和红色部分的区别了吧?
9. 接下来工作是,对于有多个视图的网页(如下图所示),学习如何使用网页跳转来把所有相关内容都下载到。