MINA适合抓取网页吗?

发布于 2021-11-08 17:13:32 字数 65 浏览 842 评论 8

我没用过MINA,所以在这里请教下大家,MINA适合发起大量的http请求抓取网页吗?

 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

别再吹冷风 2021-11-08 19:08:31

贴一段代码:

这个是MainClient.java类:

package mina;

import java.net.InetSocketAddress;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

/**
 * 简单Mina Client示例
 *
 * @author javaFound
 * @www.javaKe.com
 */
public class MainClient {
 public static void main(String[] args) throws Exception {
  // Create TCP/IP connector.
  NioSocketConnector connector = new NioSocketConnector();
  // 创建接收数据的过滤器
  DefaultIoFilterChainBuilder chain = connector.getFilterChain();
  // 设定这个过滤器将一行一行(/r/n)的读取数据
  chain.addLast("myChin", new ProtocolCodecFilter(
    new TextLineCodecFactory()));
  // 设定服务器端的消息处理器:一个SamplMinaServerHandler对象,
  connector.setHandler(new SamplMinaClientHandler());
  // Set connect timeout.
  connector.setConnectTimeout(30);
  // 连结到服务器:
  ConnectFuture cf = connector.connect( new InetSocketAddress("www.126.com", 80) );
  // Wait for the connection attempt to be finished.
  cf.awaitUninterruptibly();
  cf.getSession().getCloseFuture().awaitUninterruptibly();
  connector.dispose();
 }
}

这个是SamplMinaClientHandler.java类:

package mina;

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;

/**
 * Mina Client 接收消息的处理器
 *
 * @author javaFound
 * @www.javaKe.com
 */
public class SamplMinaClientHandler extends IoHandlerAdapter {
 // 当一个客端端连结进入时
 @Override
 public void sessionOpened(IoSession session) throws Exception {
 System.out.println("incomming client : "+session.getRemoteAddress());
 
    String host = "www.126.com";
    String path = "/";
 String request = "GET " + path + " HTTP/1.1rnHost:"
    + host + "rnrn"+ "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)rnrn"
    +"Connection:closernrn";
 session.write(request.getBytes());
// session.get
 }

 // 当一个客户端关闭时
 @Override
 public void sessionClosed(IoSession session) {
  System.out.println("one Clinet Disconnect !");
 }

 // 当客户端发送的消息到达时:
 @Override
 public void messageReceived(IoSession session, Object message)
   throws Exception {
  // 我们己设定了服务器解析消息的规则是一行一行读取,这里就可转为String:
  String s = (String) message;
  // Write the received data back to remote peer
  System.out.println("服务器发来的收到消息: " + s);
  // 测试将消息回送给客户端
  //session.write(s);
 }
}

运行MainClient,返回的是:

incomming client : www.126.com/220.170.91.160:80
服务器发来的收到消息: HTTP/1.0 400 Bad request
服务器发来的收到消息: Cache-Control: no-cache
服务器发来的收到消息: Connection: close
服务器发来的收到消息: Content-Type: text/html
服务器发来的收到消息:
服务器发来的收到消息: <html><body><h1>400 Bad request</h1>
服务器发来的收到消息: Your browser sent an invalid request.
服务器发来的收到消息: </body></html>
one Clinet Disconnect !

应该如何解决?

凡尘雨 2021-11-08 19:08:31

HTTP/1.0 400 Bad request 说明请求信息不完整

这个可以用 FireBug 看看一般请求网页都要提供什么 Head,然后模拟就是了,缺啥补啥。

水水月牙 2021-11-08 19:08:31

public void sessionOpened(IoSession session) throws Exception {
 System.out.println("incomming client : "+session.getRemoteAddress());
 
    String host = "www.126.com";
    String path = "/";
 String request = "GET " + path + " HTTP/1.1rnHost:"
    + host + "rnrn"+ "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)rnrn"
    +"Connection:closernrn";
 session.write(request.getBytes());
// session.get
 }

好像写http头,不是在这里写。写对了还是400

你曾走过我的故事 2021-11-08 19:08:31

MINA不是用来做这个的,抓取网页用HttpClient+htmlparser就可以了

居里长安 2021-11-08 19:08:29

引用来自#4楼“JavaGG”的帖子

看看mina-2.0.0-M3examplesrcmainjavaorgapacheminaexamplechatclient的 ChatClientSupport.java 类和SwingChatClientHandler.java 类,这二个类有用mina做客户端的例子

眼泪淡了忧伤 2021-11-08 19:08:24

看看mina-2.0.0-M3examplesrcmainjavaorgapacheminaexamplechatclient的 ChatClientSupport.java 类和SwingChatClientHandler.java 类,这二个类有用mina做客户端的例子

南汐寒笙箫 2021-11-08 19:08:08

java的nio包提供了多路复用、非阻塞的通信方式,我想借用nio的特性来抓取网页。

网路上绝大部分都是服务器端的例子,而我的需求是在客户端上。

有什么好的例子吗?

高跟鞋的旋律 2021-11-08 19:07:35

不适合,MINA更适合做服务端应用。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文