介绍:本人就爬虫而言,也是初窥门径,最近因公司项目需要,需要去某网站采集一些文章题材,在此稍作记录.
此次主要是采用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加载后的页面
和一些简单反爬虫的机制