您的位置:首页 > 编程语言 > Java开发

java爬虫糗百

2016-01-07 14:43 411 查看
继上次用java把糗百的源码下下来后,决定开始进行剥离想要的字段,不要求别的,只要能与之前用python写的程序实现相同的功能即可,糗百嘛,当然最重要的是段子,所以我只剥夺段子出来,不会乱杀无辜。这里也不用什么线程了,感觉代码给别人看最重要的就是看核心,多了让人烦,就一个类,三个私有方法,一个main方法。这里scanner.nextLine()最好不要用scanner.next(),因为会不识别回车。

package spider;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MyCreate {
private static List<String> results = new ArrayList<String>();
private static int page=1; // 表明目前是第几页
private static String url="http://www.qiushibaike.com/8hr/page/";
/**
* 爬取数据
* @param url
* @param pages
* @return
*/
private static String spider(String url,int pages) {
StringBuffer sb = null;
try {
URL urls = new URL(url+pages); // 指定要爬取得网站
URLConnection urlconnection = urls.openConnection(); // 类似于python	 中的urlopen	个人理解为发送请求并用一个对象去接
urlconnection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"); // 有些浏览器会查看浏览器信息,防止爬取。
InputStream ins = urlconnection.getInputStream(); // 以流的方式读出内容
BufferedReader buff = new BufferedReader(new InputStreamReader(ins, "utf-8")); // 以字符流读入
sb = new StringBuffer(); // 把内容提取出来
String lines = "";
while ((lines = buff.readLine()) != null) {
sb.append(lines + "\n");
}
OutputStreamWriter ops = new OutputStreamWriter(new FileOutputStream("W:/qiubai"+pages+".html", true), "utf-8");
// 写入到本地的W盘中,命名为qiubai.html
ops.write(sb.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return sb.toString();
}

/**
* 通过正则表达式获取想要的数据
* @param sb
*/
private static void filterData(String sb) {
results.clear();
Pattern pattern = Pattern.compile("<div.*?class=\"content\">(.*?)</div>", Pattern.MULTILINE | Pattern.DOTALL); // 正则表达式
Matcher matcher = pattern.matcher(sb);
while (matcher.find()) { // 会把所有查到的放入results中
results.add(matcher.group(1));
}
}

/**
* 用来在控制台展示数据
* @param index
*/
private static void showMsg(int index) {
Scanner scanner = new Scanner(System.in);
System.out.println("---------------------------------------\n  "
+ "程序:糗百爬虫  \n"
+ "版本:0.1\n  "
+ "作者:马慧超 \n "
+ "日期:2014-06-03\n  "
+ "语言:java\n "
+ "操作:输入quit退出阅读糗事百科\n  "
+ "功能:输入任意字符依次浏览今日的糗百热点\n  "
+ "\n"
+ "---------------------------------------\n ");
while (!scanner.nextLine().equals("quit")) {
System.out.println("第"+page+"页"+results.get(index++));
if(index>=results.size()){
page+=1;
String newResult=spider(url,page);
filterData(newResult);
index=0;
}
}
}

/**
*  此处测试使用(程序入口)
* @param agrs
*/
public static void main(String[] agrs) {
String result = spider(url,page);
filterData(result);
showMsg(page);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息