基于java+jsoup网络爬虫

时间:2022-10-31 07:45:49

介绍:本人就爬虫而言,也是初窥门径,最近因公司项目需要,需要去某网站采集一些文章题材,在此稍作记录.

      此次主要是采用java 通过httpClient获取该目标地址返回的网页源码信息,再利用jsoup进行解析具体的网页源码信息,jsoup具体是什么,jsoup是一款很好用java版本html文本解析器,提供了一系列的封装好的api,可以直接对输入的url地址,一段html文本进行解析,然后可以通过类似jquery的选择器来快速查找解析html代码或者代码段

代码


import java.util.ArrayList;
import java.util.Date;
import java.util.List;


import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;


import com.xwmao.dao.bean.WbPosts;


public class InternetWorm {
public static void main(String[] args) {
InternetWorm test = new InternetWorm();
List<WbPosts> list = test.wormLinks(test.htmlParse("http://www.paidai.com"));
list.size();
}


/**
* httpClient发送get请求
* @param url
* @return
*/
    public static String httpGet(String url){
        String result="";
          try {
                // 根据地址获取请求
                HttpGet request = new HttpGet(url);//这里发送get请求
                // 获取当前客户端对象
                HttpClient httpClient = new DefaultHttpClient();
                // 通过请求对象获取响应对象
                HttpResponse response = httpClient.execute(request);
                
                // 判断网络连接状态码是否正常(0--200都数正常)
                if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                    result= EntityUtils.toString(response.getEntity(),"utf-8");
                } 
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        return result;
        //....result是用户信息,站内业务以及具体的json转换这里也不写了...
    }
    
    /**
     * 解析html获取所有文章链接
     * @return
     */
    public List<String> htmlParse(String url){

//http请求获取该网站页面源码
String result = httpGet(url);

//Jsoup解析页面源码
Document document = Jsoup.parse(result);
List<String> links = new ArrayList<String>();

//通过class名获取所有新闻标题,以及新闻链接
Elements elemtns1 = document.getElementsByClass("i_title");
Elements elemtns2 = document.getElementsByClass("top_list");
for(Element element : elemtns1){
String link = element.attr("href");
links.add(link);
}
for(Element element : elemtns2){
Elements linkElements = element.getElementsByTag("a");
for(Element linkElement : linkElements){
String link = linkElement.attr("href");
links.add(link);
}
}
return links;
    }
    
    /**
     * 将获取的链接列表进行再次爬虫,获取该新闻数据的详细信息
     */
    public List<WbPosts> wormLinks(List<String> links){
    List<WbPosts> list =new ArrayList<WbPosts>();
    for(String link:links){
    String result = httpGet(link);
    Document document = Jsoup.parse(result);
    WbPosts post = new WbPosts();
    Element element = document.getElementsByClass("t_title").first();
    String title = element.text();
/*    title.substring(1, title.length()-32);*/
    String content = document.getElementById("topic_content").text();
    post.setPost_content(content);
    post.setPost_title(title);
    post.setPost_date(new Date());
    post.setPost_status("publish");
    list.add(post);
    }
    return list;
    }
}


像这种爬虫算是属于最简单的那种,一般的网页大部分的数据和效果都是通过js进行动态渲染,还有像一些对数据比

较敏感的公司,一般都还有放爬虫机制,比如xxx宝网,如果涉及拿到那些,用简单的http请求是无法直接获取渲染后的页面

源码的,这时就需要用到现在用的比较多的,Selenium phantomjs ,WebDriver等类似的工具进行请求,这些工具主要是直接

利用浏览器驱动进行请求该url,可以同编写自定义的事件,来模拟人工行为,从而与该页面进行交互,从而达到获取js加载后的页面

和一些简单反爬虫的机制