提取新闻下一页

package com.unbank.robotspider.util;

import java.util.HashMap;
import java.util.Map;

import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class SmartNextPageFecther {

	public static void main(String[] args) {
		String url = "http://focus.stockstar.com/SS2014061700001351.shtml";
		Document document = JsoupUtil.readUrl(url);
		Map<Integer, String> pageList = new SmartNextPageFecther()
				.getNextPageUrl(document, url);

		for (int i = 0; i < pageList.size() + 3; i++) {
			String nextUrl = pageList.get(i);
			if (nextUrl != null) {
				System.out.println(nextUrl);
			}

		}

	}

	public Map<Integer, String> getNextPageUrl(Document doc, String baseurl) {
		Document document = doc.clone();
		Map<Integer, String> map = new HashMap<Integer, String>();
		Elements a_elements = document.getElementsByTag("a");
		int prePageNum = 5;
		int pageNum = 0;
		for (Element e : a_elements) {
			String uu = e.attr("href");
			uu = UrlTools.getFullUrl(baseurl, uu);
			if (uu == null || uu.trim().isEmpty()) {
				continue;
			}
			String a_text = e.text();
			// 是否是下一页的
			boolean bl = checkText(a_text);

			if (bl) {
				int cu = checkUrl(baseurl, uu);
				if (cu != -1) {
					pageNum = pageNum > cu ? pageNum : cu;
					prePageNum = prePageNum < cu ? prePageNum : cu;
					map.put(cu, uu);
				}
			}
		}
		if (map.size() >= 2) {
			// 说明是3页了
			String second = null;
			String third = null;
			if (prePageNum == 0) {
				second = map.get(0);
				third = map.get(1);
			} else if (prePageNum == 1) {
				second = map.get(1);
				third = map.get(2);
			} else if (prePageNum == 2) {
				second = map.get(2);
				third = map.get(3);
			}
			String urlRule = UrlRuleUtil.getURlRule(second, third);
			for (int i = prePageNum; i <= pageNum; i++) {
				if (map.get(i) == null) {
					String page = UrlRuleUtil.getcheckURL(urlRule, i);
					map.put(i, page);
				}
			}

		}

		return map;
	}

	public boolean checkText(String text) {
		String[] texts = { "首页", "第一页", "下一页", "末页", "最后一页", "尾页" };
		for (int i = 0; i < texts.length; i++) {
			if (texts[i].equals(text)) {
				return true;
			}
		}
		if (text.matches("\\d{1,2}")) {
			return true;
		}
		return false;
	}

	public int checkUrl(String url1, String url2) {
		int l1 = url1.length();
		int l2 = url2.length();
		if (l1 == 0 || l2 == 0) {
			return -1;
		}

		String longStr = l1 > l2 ? url1 : url2;
		String shortStr = l1 < l2 ? url1 : url2;
		int j = 0;
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < longStr.length() - 1; i++) {
			if (longStr.charAt(i) != shortStr.charAt(j)) {
				sb.append(longStr.charAt(i));
			} else {
				j++;
				if (j == shortStr.length()) {
					break;
				}
			}
		}
		if (sb.length() == 0) {
			return -1;
		}
		String variances = sb.toString();
		String numStr = variances.replaceAll("_", "").replaceAll("=", "")
				.replaceAll("index", "").replaceAll("page", "")
				.replaceAll("p", "").replaceAll("-", "");
		if (numStr.matches("\\d{1,2}")) {
			return Integer.valueOf(numStr);
		} else {
			return -1;
		}
	}
}

提取新闻下一页

时间: 2024-11-09 01:54:43

提取新闻下一页的相关文章

GridView自定义分页样式(上一页,下一页,到第几页)

今天要为网站做一个文章列表,发现GridView的分页样式很难看,于是结合网上的例子,自己做了一个.不是很美观,不过还是很实用的,先看下效果吧,如图(1). 图(1)GridView分页效果 自定义GridView的分页样式,使用的是GridView的  <PagerTemplate>元素.我们先看这段分页代码. 1 <PagerTemplate> 2 <br /> 3 <asp:Label ID="lblPage" runat="s

nodejs爬虫笔记(五)---利用nightmare模拟点击下一页

目标 以腾讯滚动新闻为例,利用nightmare模拟点击下一页,爬取所有页面的信息.首先得感谢node社区godghdai的帮助,开始接触不太熟悉nightmare,感觉很高大上,自己写代码的时候问题也很多,多亏大神的指点. 一.选择模拟的原因 腾讯滚动新闻,是每六十秒更新一次,而且有下一页.要是直接获取页面的话得一页一页的获取,不太方便,又想到了找数据接口,然后通过请求得到数据,结果腾讯新闻的数据接口是加密的,这种想法又泡汤了.因而想到笔记(四)中模拟加载更多的模块,看利用nightmare这

DEDEcms手机网站添加详情内页上一页/下一页的翻页功能

修改文件include/arc.archives.class.php文件. 1.搜索 function GetPreNext($gtype='') 2.将这个函数的所有内容替换为 function GetPreNext($gtype='') { $rs = ''; if(count($this->PreNext)<2) { $aid = $this->ArcID; $preR = $this->dsql->GetOne("Select id From `#@__ar

css -- 映像 ,分页(上一页下一页)

1.映像:-webkit-box-reflect:blow 2px -webkit-gradient( linear, left top, left bottom, from(transparent), color-stop(0.52,transprent), to(white)); 2.对于页码的上一页以及下一页:prev以及next ---- rel属性 设置样式ol.pagination a[rel="prev"], ol.pagination a[rel="next&

MySQL中实现上一页下一页效果

下一页 select * from article where aid = (select aid from article where aid > ? order by aid asc limit 1); 上一页 select * from article where aid = (select aid from article where aid < ? order by aid desc limit 1);

Discuz帖子列表页无法ajax加载下一页问题

上周末抽空重构了一下JX3PVE的PVE栏目,只上线了宏库栏目,结果出了一堆Bug.奈何公司这段时间都在搞完美假期这专题,太忙也没去处理.这不是周末拿时间来看一下. 发现其中有一个是点“下一页”ajax出现问题.找了好一会,纳闷ajax没提示出错呢. 原来 由于ajax请求没问题,但是却无法正常插入dom,于是……这个插入,竟然是用字符串匹配……... 醉了...手贱的我改成了…… 无语. 如果还有遇到此问题的小伙伴,最简单的办法把这里的class去掉即可. DZ的JS大多都是原生写的,大量的节

从当前页获取下一页的URL

有一个很简单的现实情况:我在百度贴吧发了一篇帖子,长达10页,我想写一个爬虫从第一页爬取到第10页,然而条件是我只知道第一页的URL,而且每一页都有下一页的URL,所有的URL都没有规律可循.曾经写爬虫获取URL都是靠规律,靠发现规律,不可否认很多网站当前页的URL和下一页的URL只是阿拉伯数字上的略微区别,经过稍加分析就可以知道全网的URL,这种方法很简单,但是不可靠,如果日后想要爬去的网站URL没有规律可循,岂不是要干瞪眼了.一般网页都有下一页的链接,然后下一页有下一页的链接,像这种通过当前

jsp实现上一页下一页翻页功能

前段时间一直忙于期末考试和找实习,好久没写博客了. 这段时间做了个小项目,包含了翻页和富文本编辑器Ueditor的两个知识点,Ueditor玩的还不是很深,打算玩深后再写篇博客. 要实现翻页功能,只需要设置一个pageIndex即可,然后每次加载页面时通过pageIndex去加载数据就行. 那么我们可以设置一个隐藏的input框,用于传递pageIndex给下个页面. 当我们点击上一页的时候,通过js方法改变pageIndex的值,再提交表单即可 二话不多说,看代码,代码里面写的还算比较清楚.

手机H5页面,滑动到底部自动加载下一页内容

做公众号项目中有如下场景,一个H5页面有列表数据,不考虑一次加载所有数据,故需要分页操作,解决方案为滑动到底部自动加载下一页内容.直接在H5的js当中实现. 主要使用jquery的scroll()方法: 当用户滚动指定的元素时,会发生 scroll 事件. scroll 事件适用于所有可滚动的元素和 window 对象(浏览器窗口). scroll() 方法触发 scroll 事件,或规定当发生 scroll 事件时运行的函数. 代码如下: $(window).scroll(function()