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); } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Python3写爬虫(四)多线程实现数据爬取
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- Scrapy的架构介绍
- PropertyChangeListener简单理解
- 爬虫笔记
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- msql 正则表达式
- 正则表达式