比如我已通过url读取到了某个网站的主页(内有新闻模块),现在我想抓取这个新闻模块里的所有网页,程序应该怎么写?那位能举个简单例子?另外,如何做到实时抓取,也就是当对方网站更新时,我的抓取程序也自动抓取更新后的网页?解决问题者,给200分,决不食言!
解决方案 »
- 页面跳转IE后退按钮的问题
- 不知道这个JSP网站,大家能访问到不
- network is unreachable问题
- 全国首款杀毒硬件
- 关于用list返回数据库查询sysdate结果为空的问题……挠头啊!!!
- 小弟初次接触JSP,请教大家一个比较基础的问题!
- action执行完后forward到一个frame页面,这个页面的子页面如何能得到actionForm的输出?
- 关于jsp连mysql的问题
- <jsp:forward page=...> 与 <%response.sendRedirect(...)%>有何不同?
- cookie问题
- jsp小偷程序的问题
- 我现在需要将几个汉字转化为unicode,请介绍一种简单的转化方法
<%@ page import="java.io.*,java.net.URL"%>
<%
URL url = new URL("http://www.itpub.net");//建立URL对象,并实例化为url,获得要抓取的网页地址
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(),"GB2312"));//建立BufferedReader对象,并实例化为reader,这里的GB2312是要抓取的网页编码格式
while(reader.ready())
{
out.println(reader.readLine());
}
reader.close();
%>URL url = new URL("http://www.itpub.net");//http://www.itpub.net就是你想抓的网页地址
reader 对象就是读取到该网页的内容,下面是循环输出,你可以进行过滤找到你需要的内容,小偷程序其实就是远程读取文件 out.println(reader.readLine());
这时你看到的网页内容实际上已经是你本机的代码了,而不是itpub上的主页了,图片显示不出来就是这个原因,现在就好办了,它的代码你都得到了,那么你想要什么东东就可以把它找出来了LZ说实时更新,那你加个定时器好了,比如一个小时检查一次,检查是否和上次检查时内容一样,如果不一样就抓取下来
当然,还有很多细节的东西,要你自己再写的啦。
你在抓前要判断是那种方式请求,有HTTP、Get、Post等等啦。
还需要检查提交的url地址格式是否正确,并将其为参数创建URL对象、组装socket提交的头部信息等。不是一个简单的程序啦。
最好单独写个类封装起来,不要写在JSP上面。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class Thrief extends HttpServlet {/**
* Constructor of the object.
*/
public Thrief() {
super();
}/**
* Destruction of the servlet. <br/>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}/**
* The doGet method of the servlet. <br/>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {String url = request.getParameter("url");
System.out.println(url);
URLConnection con = new URL(url).openConnection();
PrintWriter out = response.getWriter();
BufferedReader br = new BufferedReader(new InputStreamReader(con
.getInputStream()));String content = br.readLine();while (content != null) {
out.write(content);
content = br.readLine();}
out.flush();out.close();
}/**
* The doPost method of the servlet. <br/>
*
* This method is called when a form has its tag value method equals to
* post.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {response.setContentType("text/html");
PrintWriter out = response.getWriter();
out
.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" This is ");
out.print(this.getClass());
out.println(", using the POST method");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}/**
* Initialization of the servlet. <br/>
*
* @throws ServletException
* if an error occure
*/
public void init() throws ServletException {
// Put your code here
}}
写另一个servlet传入参数就可以
--------
能不能提供一个思路?或随便找一个网站为例,讲一下最简单的实现方法?
<%@ page import="java.io.*,java.net.URL"%>
<%@ page import="java.util.regex.Pattern,java.util.regex.Matcher"%>
<%
URL url = new URL("http://www.jslottery.com/showgg.asp?id=4692");//建立URL对象,并实例化为url,获得要抓取的网页地址
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(),"GB2312"));//建立BufferedReader对象,并实例化为reader,这里的GB2312是要抓取的网页编码格式
String so="";
while(reader.ready())
{
String regEx="<(.[^>]*)>"; //表示html标签
Pattern p=Pattern.compile(regEx);
Matcher m=p.matcher(reader.readLine());
String s=m.replaceAll("");
//out.println(s);
so=so+s;
}
Pattern p=Pattern.compile("::");
Matcher m=p.matcher(so);
so=m.replaceAll("");
p=Pattern.compile("中国福利彩票“双色球”开奖公告");
m=p.matcher(so);
so=m.replaceAll("::");
p=Pattern.compile("中奖情况:");
m=p.matcher(so);
so=m.replaceAll("::");
p=Pattern.compile("::");
String[] r=p.split(so);
out.println(r[1]);
reader.close();
%>
http://haolla.com/wy
提取所有指向本站超链接,
再就是分析一下哪些超链接是属于新闻模块的,至于怎么分析,就很烦了,各网站的新闻模块肯定是不一样的,你可能要事先收集一大堆的网站的新闻模块的识别标记然后,就是对属于闻新模块这些超链接一个一个的抓,再一个一个的去提取属于新闻模块的URL
没抓过的就再抓,己经抓过的就不再抓了
重复再重复
直到找不到己经没有抓过的链接为止如果对方网站的页面很多,那实时抓取的话,就不太现实了,太耗时间太耗性能
10天半个月一次倒还差不多
给楼主一个建议,如果对方网站提供了RSS,直接读RSS不更好吗
======String input = "从一个URL中读出来的网页内容";List<String> hrefs = new ArrayList<String>(); //保存提取出来的URL
input = input.replaceAll("\\\"", "");
input = input.replaceAll("\\'", "");
int s = input.indexOf("href");
while(s!=-1){
input = input.substring(s+4);
int e = input.indexOf(">");
String temp = input.substring(0,e);
temp = temp.replaceAll("\\=", "").trim();
e = temp.indexOf(" ");
if(e!=-1)
temp = temp.substring(0,e);
hrefs.add(temp);
s = input.indexOf("href");
}
for(String ss: hrefs)
System.out.println(ss);随便写了一下,楼主自己优化算法另外,还可以用正则表达式来提取判断是否新闻模块的超链,这就需要视具体情况而定,反正就是在这些URL上打主意
Pattern p=Pattern.compile(regex);
Matcher m=p.matcher(str);
while(m.find())
...
...
现写了一个,楼主测试一下试试
=========
试了一下,有些链接能提取出来,有些不能,不过终于找到了思路,谢谢,揭帖!