请问如何抓取用JS分页的网页内容 本帖最后由 luisszhou 于 2009-08-11 01:44:09 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 把html页取下来,数据在"#xmldso"指定的位置,也取下来,就是全部内容了。和分页关系不大. 利用htmlparser抓取网页内容(一) import org.htmlparser.Node;import org.htmlparser.NodeFilter;import org.htmlparser.Parser;import org.htmlparser.filters.TagNameFilter;import org.htmlparser.tags.TableTag;import org.htmlparser.util.NodeList;/** * <br> * 标题: <br> * 功能概要: <br> * 版权: cityyouth.cn (c) 2005 <br> * 公司:上海城市青年网 <br> * 创建时间:2005-12-21 <br> * 修改时间: <br> * 修改原因: * * @author 张伟 * @version 1.0 */public class TestYahoo { public static void testHtml() { try { String sCurrentLine; String sTotalString; sCurrentLine = ""; sTotalString = ""; java.io.InputStream l_urlStream; java.net.URL l_url = new java.net.URL( "http://sports.sina.com.cn/iframe/nba/live/"); java.net.HttpURLConnection l_connection = (java.net.HttpURLConnection) l_url .openConnection(); l_connection.connect(); l_urlStream = l_connection.getInputStream(); java.io.BufferedReader l_reader = new java.io.BufferedReader( new java.io.InputStreamReader(l_urlStream)); while ((sCurrentLine = l_reader.readLine()) != null) { sTotalString += sCurrentLine; } System.out.println(sTotalString); System.out.println("===================="); String testText = extractText(sTotalString); System.out.println(testText); } catch (Exception e) { e.printStackTrace(); } } /** * 抽取纯文本信息 * * @param inputHtml * @return */ public static String extractText(String inputHtml) throws Exception { StringBuffer text = new StringBuffer(); Parser parser = Parser.createParser(new String(inputHtml.getBytes(), "8859_1"), "8859-1"); // 遍历所有的节点 NodeList nodes = parser.extractAllNodesThatMatch(new NodeFilter() { public boolean accept(Node node) { return true; } }); Node node = nodes.elementAt(0); text.append(new String(node.toPlainTextString().getBytes("8859_1"))); return text.toString(); } /** * 读取文件的方式来分析内容. filePath也可以是一个Url. * * @param resource * 文件/Url */ public static void test5(String resource) throws Exception { Parser myParser = new Parser(resource); // 设置编码 myParser.setEncoding("GBK"); String filterStr = "table"; NodeFilter filter = new TagNameFilter(filterStr); NodeList nodeList = myParser.extractAllNodesThatMatch(filter); TableTag tabletag = (TableTag) nodeList.elementAt(11); System.out.println(tabletag.toHtml()); System.out.println("=============="); } /* * public static void main(String[] args) { TestYahoo testYahoo = new * TestYahoo(); testYahoo.testHtml(); } */ public static void main(String[] args) throws Exception { test5("http://sports.yahoo.com/nba/scoreboard"); }} ConnectionManager cm = new ConnectionManager(); cm.setProxyHost("XXX.XXX.XXX.XXX"); cm.setProxyPort(8080); 如果数据是一次下载下来,JS只是分页的话,那还可以获取如果是用AJAX,点一次下载一次数据,那就不好办了。提供2个思路:1.分析它的JS,自己发送信息到服务器,从返回数据里取2.创建一个类似.NET里webbrowser的对象,用它打开那个网页,模拟点击下一页,然后再获取信息 另外,打开网页速度慢,但是点击“下一页”翻页速度很快,每页20条记录,可以看出如楼上 iroyal 所言,“数据是一次性获取的,JS只是分页”。还请大家赐教,该怎么得到这个“一次性获取”的数据呢。 php的网同时在线人数超过100人以上,网站就开始打开很慢了。 求跳转显示代码 PHP 的move_uploaded_file问题 php如何接收msn机器人的信息? 帮下忙咯 在线等 如何获取method为post的表单返回的页面? 求一段php正则替换规则 Php中获取数据表中字段信息 现在要做一个新用户权限申请的流程,那位老大能给点建议呀? mysql编码 PHP如何将数据库表的列值赋值给数组? PHP+XML 留言板引用留言功能
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.tags.TableTag;
import org.htmlparser.util.NodeList;/**
* <br>
* 标题: <br>
* 功能概要: <br>
* 版权: cityyouth.cn (c) 2005 <br>
* 公司:上海城市青年网 <br>
* 创建时间:2005-12-21 <br>
* 修改时间: <br>
* 修改原因:
*
* @author 张伟
* @version 1.0
*/
public class TestYahoo {
public static void testHtml() {
try {
String sCurrentLine;
String sTotalString;
sCurrentLine = "";
sTotalString = "";
java.io.InputStream l_urlStream;
java.net.URL l_url = new java.net.URL(
"http://sports.sina.com.cn/iframe/nba/live/");
java.net.HttpURLConnection l_connection = (java.net.HttpURLConnection) l_url
.openConnection();
l_connection.connect();
l_urlStream = l_connection.getInputStream();
java.io.BufferedReader l_reader = new java.io.BufferedReader(
new java.io.InputStreamReader(l_urlStream));
while ((sCurrentLine = l_reader.readLine()) != null) {
sTotalString += sCurrentLine;
}
System.out.println(sTotalString); System.out.println("====================");
String testText = extractText(sTotalString);
System.out.println(testText);
} catch (Exception e) {
e.printStackTrace();
} } /**
* 抽取纯文本信息
*
* @param inputHtml
* @return
*/
public static String extractText(String inputHtml) throws Exception {
StringBuffer text = new StringBuffer(); Parser parser = Parser.createParser(new String(inputHtml.getBytes(),
"8859_1"), "8859-1");
// 遍历所有的节点
NodeList nodes = parser.extractAllNodesThatMatch(new NodeFilter() {
public boolean accept(Node node) {
return true;
}
});
Node node = nodes.elementAt(0);
text.append(new String(node.toPlainTextString().getBytes("8859_1")));
return text.toString();
} /**
* 读取文件的方式来分析内容. filePath也可以是一个Url.
*
* @param resource
* 文件/Url
*/
public static void test5(String resource) throws Exception {
Parser myParser = new Parser(resource); // 设置编码
myParser.setEncoding("GBK");
String filterStr = "table";
NodeFilter filter = new TagNameFilter(filterStr);
NodeList nodeList = myParser.extractAllNodesThatMatch(filter);
TableTag tabletag = (TableTag) nodeList.elementAt(11);
System.out.println(tabletag.toHtml());
System.out.println("=============="); } /*
* public static void main(String[] args) { TestYahoo testYahoo = new
* TestYahoo(); testYahoo.testHtml(); }
*/
public static void main(String[] args) throws Exception {
test5("http://sports.yahoo.com/nba/scoreboard");
}
}
cm.setProxyHost("XXX.XXX.XXX.XXX");
cm.setProxyPort(8080);
提供2个思路:
1.分析它的JS,自己发送信息到服务器,从返回数据里取
2.创建一个类似.NET里webbrowser的对象,用它打开那个网页,模拟点击下一页,然后再获取信息