从网站中“扒”新闻

原创 2013年12月04日 09:49:43

元旦放假三天,天气很冷没有打算出去玩,就在家里琢磨着弄一下扒网站新闻,主要是同寝室的一个同事在弄,所以想学点东西,自己也动手写了一个,思路很简单,下面就描述一下是怎么实现的吧!

 

首先进入主页网站中,然后选择自己想“扒”的信息模块,例如是新闻、经济、娱乐等等或者其他什么的,这样就能找到自己需要信息,然后把这个模块的url链接地址给读取出来,然后遍历读取到的URL地址,读取信息的内容。

 

现在的网站一般都是动态生成的,也就是说新闻信息页面有自己的模板,那么所有的信息肯定是在某个DIV或者是容器中,只要找到这个控件的ID就能够得到里面的数据,然后把里面的数据找出来。

 

下面的代码是我测试了某网站的信息,已经读取到了信息列表,先弄上去供大家参考,为了防止某些人恶意攻击,因此我删除了具体的链接地址

 

package hb.downweb;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
 * 从网上扒新闻信息
 */
public class Main {

	//显示新闻列表的地址
	private static final String http_url = "网站导航列表网址";
	//找到需要扒的信息模块的ID
	private static final String summaryBlock = "id=\"blist\"";
	//显示的信息以什么HTML标签结束
	private static final String endSummaryBlock = "</table>";
	//存储网页中的链接标签
	public static List<String> list = new LinkedList<String>();

	public static void main(String[] args) {
		//想要抓取信息的页面
		StringBuffer stringBuffer = new StringBuffer();
		try {
			//通过字符串得到URL对象
			URL url = new URL(http_url);
			//远程连接,得到URLConnection对象(它代表应用程序和 URL 之间的通信链接)
			URLConnection conn = url.openConnection();
			int find_flag = 0;		//表示没有找到需要的内容
			//从连接中读取数据流,
			BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
			String line;
			while((line = reader.readLine()) != null){
				//找到了需要下载链接模块
				if(line.indexOf(summaryBlock)!= -1){
					find_flag = 1;//表示找到了需要的内容
				}
				//需要新闻模块的结束标记
				if(line.indexOf(endSummaryBlock) != -1){
					find_flag = 2;//表示需要找的内容结束了
				}
				//将找到的信息放入stringBuffer中
				if(1 == find_flag){
					stringBuffer.append(line);
				}
				//需要找的信息已经结束
				if(2 == find_flag){
					System.out.println("over");
					find_flag = 0;
				}
			}
			
			System.out.println(stringBuffer);
			//使用正则表达式获取想要的字符串
			Pattern pattern = Pattern.compile("[0-9]{5}\\.htm");
			Matcher matcher = pattern.matcher(stringBuffer);
			System.out.println(matcher.find());
			while(matcher.find()) {
				//将连接的地址存储到list容器中
				list.add("显示网页内容的网址" + matcher.group());
				//下面显示匹配的内容
//				System.out.println(matcher.group());
			}
			//读取具体链接信息内容
			readNews(list);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} 
	}

	/*
	 * 读显示新闻的网页
	 */
	public static void readNews(List<String> list){
		String flagName = "news";
		for(int i = 0; i < list.size(); i++){
			//得到的是每篇文章的链接地址 具体网页的地址
			String temp = list.get(i);
			String filename = "";
			filename = flagName + i+".txt";
			//将下载的网页信息保存到文件中
			getNewsContent(temp,filename);
		}
	}
	
	/*
	 * 将显示新闻的网页的内容存放在本地文件中
	 */
	public static void getNewsContent(String httpLink,String fileName){
		try {
			System.out.println("getNewsContent : " + httpLink);
			//通过URL产生链接到具体的网页,然后读取数据
			URL url = new URL(httpLink);
			URLConnection conn = url.openConnection();
			//这里读取的网页内容一定要注意后面的编码,跟网页的报纸一致,否则在后面存储在文件中的也为乱码
			BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
			String tempStr;
			//根据显示具体网页个格式,找到对应的模块,然后读取出来存储在文件中
			File file = new File(fileName);
			FileOutputStream fos = new FileOutputStream(file);
			String class_name = "class=\"content2";
			String end_content = "</div>";
			int readContentFlag = 0;
			StringBuffer strbuf = new StringBuffer();
			while((tempStr = reader.readLine()) != null){
				if(tempStr.indexOf(class_name)!= -1){
					readContentFlag = 1;
				}
				if(tempStr.indexOf(end_content)!= -1){
					readContentFlag = 2;
				}
				if(1 == readContentFlag){
					strbuf.append(tempStr);
//					System.out.println(line);
				}
				if(2 == readContentFlag){
					System.out.println("over");
					readContentFlag = 0;
				}
				tempStr = strbuf.toString();
				System.out.println("tempStr.indexOf(class_name)2: "+ tempStr.indexOf(class_name));
				tempStr = delHTMLTag(tempStr);
				tempStr = stripHtml(tempStr);
				fos.write(tempStr.getBytes("utf-8"));
			}
			//一定不要忘记了关闭数据流,否则出现异常情况
			fos.close();
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	

	public static String delHTMLTag(String htmlStr){ 
        String regEx_script="<script[^>]*?>[\\s\\S]*?<\\/script>"; //定义script的正则表达式 
        String regEx_style="<style[^>]*?>[\\s\\S]*?<\\/style>"; //定义style的正则表达式 
        String regEx_html="<[^>]+>"; //定义HTML标签的正则表达式 
         
        Pattern p_script=Pattern.compile(regEx_script,Pattern.CASE_INSENSITIVE); 
        Matcher m_script=p_script.matcher(htmlStr); 
        htmlStr=m_script.replaceAll(""); //过滤script标签 
         
        Pattern p_style=Pattern.compile(regEx_style,Pattern.CASE_INSENSITIVE); 
        Matcher m_style=p_style.matcher(htmlStr); 
        htmlStr=m_style.replaceAll(""); //过滤style标签 
         
        Pattern p_html=Pattern.compile(regEx_html,Pattern.CASE_INSENSITIVE); 
        Matcher m_html=p_html.matcher(htmlStr); 
        htmlStr=m_html.replaceAll(""); //过滤html标签 

        return htmlStr.trim(); //返回文本字符串 
    } 

	public static String stripHtml(String content) { 
		// <p>段落替换为换行 
		content = content.replaceAll("<p .*?>", "\r\n"); 
		// <br><br/>替换为换行 
		content = content.replaceAll("<br\\s*/?>", "\r\n"); 
		// 去掉其它的<>之间的东西 
		content = content.replaceAll("\\<.*?>", ""); 
		// 还原HTML 
		// content = HTMLDecoder.decode(content); 
		content = content.replaceAll("&nbsp;", "");
		return content; 
	} 


}

 

 

备注:上面运行是同步的,为了提高用户体验,可以把上面的方式改为“线程”处理,这样体验会好很多,为了让读者更容易明白,这里就不再赘述了。

 

我这种方法不是通用的,但是可以作为参考,希望大家多提意见!

相关文章推荐

【Python】爬虫爬取各大网站新闻(一)

作者博客地址:http://andyheart.mePython爬虫一步一步爬取文章背景最近在学习机器学习算法,分为回归,分类,聚类等,在学习过程中苦于没有数据做练习,就想爬取一下国内各大网站的新闻,...

中国大陆可以打开的国外新闻网站 了解世界的窗口 学习英语的好机会

编者:通过浏览网上新闻学习英语,同时又了解了世界,真可谓一举两得。但国外都有哪些不错的新闻网站呢。以下这位网友的戏说国外新闻网站提到了各种国外主要新闻网站,其中一些介绍和调侃仅供参考,大家也可以通过点...

移动新闻--移动建站工具:分秒钟将Web网站移动化

摘自:http://www.csdn.net/article/2013-09-05/2816837-mobile-site-builders-one-W-to-M 摘要:时下移动端显然已是诸多...

Blekko推出类Flipboard社交新闻网站ROCKZi

搜索引擎公司Blekko刚刚推出ROCKZi,这是一个与众不同的社交新闻网站。ROCKZi将会提供给用户可视的交流方式来分享最新最热的资讯,而这些资讯都来源于最可靠的网站。 其界面会让你联想到i...

网站推广中如何写新闻软文

张玉淦来谈谈网站推广中如何用新闻类软文来推广网站,什么是新闻软文呢?想必大家都不陌生了,新闻软文是介于新闻和广告之间的一个中间产物,是企业在销售过程中利用或者创造新闻,以求达到宣传企业或产品的特殊广告...

最受欢迎的新闻网站前15名(2014.10)

Top 15 Most Popular News Websites | October 2014 Here are the top 15 Most Popular News Sites as d...

定制高端新闻营销网站推广方式

新闻营销是企业最为常用的一种企业宣传营销模式,而随着网络的发展,更好的推进网络营销SEOer结合优化技术将其引用到了网站推广中。就笔者小丹个人之见,新闻营销模式其实就是热点软文营销,而其中的不同就在于...

牛腩新闻发布系统总结——网站发布和分页制作

牛腩新闻发布系统的视频看了将近半个月的时间,今天成功地把它发布了,哈哈。第一次看教学视频看得这么专注,都不带走思的,很不错。给小牛老师赞一个,嘿嘿!        言归正传,每学完一个阶段,最重要的...

HTML练习---制作网站新闻信息展示页面

无标题文档 .a { font-family: "Times New Roman"; font-size: 18px; font-style: normal; line-height: 40...

数据新闻网站的规划

随着技术的发展,媒体行业对于计算机的依赖日益增加,传统纸媒受到冲击,而新媒体行业则蒸蒸日上。我们的系统正是基于媒体业与计算机交叉的方向而进行的一个构思,旨在实现一个全面,创新的新闻分析,文本处理工具。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从网站中“扒”新闻
举报原因:
原因补充:

(最多只允许输入30个字)