小弟我对网页抓取很感兴趣,经过几个星期的努力加上正则表达式的学习,可以掌握抓取大部分网页了,可是最近在抓取一个我经常上的论坛时出现无法进入特定栏目的状况
<p><b>本版块只有特定用户组可以访问。</b></p>
<p>您还没有登录,请填写下面的登录表单后再尝试访问。</p>
<form name="login" method="post" action="logging.php?action=login">如果登陆后事可以访问这个栏目的,可是在java里怎么实现呢?本着提高自我学习能力的想法,我自己想了想,这种情况肯定是跟Cookies有关,那应该是得到这个网站的Cookies,然后在访问的时候自动提取,在java的api里java.net包下类 CookieHandler涉及一些Cookies,但苦于不知道怎么用,上csdn找了一些相关文章,大多都是怎么设置Cookies的,很难找到我想要的也看了看jsoup的doc,找到了关于Cookies的用法,可惜这个用的比较少,不知道怎么才能实现我的功能我想抓取的论坛是 discuz 6.0,哪位高手能给我点提示,或者告诉我用什么样的方法也行,谢谢

解决方案 »

  1.   

    光找cookie不行吧,如果你没登陆过 没有cookie呢?你应该想办法解决如何自动登录。
      

  2.   

    自动登陆不太好写吧。。当然在diz6.0里面登陆是不需要填写验证码的,如果有人知道怎么自动登陆也可以告知下我,谢谢
      

  3.   

    网络上的行为都是可以模拟的,加好友啊,发微博啊,什么的;你可以用程序在网上模拟一个虚拟的世界,因为用户的所有操作的最终体现都是数据(有的放在数据库里,有的在cookie里,等等),当你知道了如何存取这些数据的时候,一个虚拟的世界就出来了,因为数据体现的是操作的结果,不能体现操作的过程,有了这些数据你也很难判断他是人操作的还是程序操作的。想想如果你在一个论坛社区里看到的所有用户交互都是程序模拟的将是什么感觉,哈哈,挺慎人~~~~~
    以前写过社区的机器人,主要是获取一些只有好友才能看到的资料的,c#里用的是CookieContainer。楼主对应着找找
      

  4.   

    用java代码登录一次,登录完成后取得jsessionID.在response的返回头里可以找到.
    以后你每次请求都在request头部附加该jsessionID.取到的页面就是登录后的页面了。
      

  5.   

    最好使用firebug之类的东西,查看一下请求头和返回头部信息.
    道理一样,浏览器请求是什么,能返回正确页面,就用代码传送什么样的请求头.
      

  6.   


    用java代码登陆一次,这个怎么登陆?是用write流吗?
      

  7.   

    怎么登录都可以,httpClient,socket,httpConnection都可以,看你喜欢哪个了.
    主要是用与连接目标网站80端口,发送请求信息.
    类似于
    URL login = new URL("http://197.1.0.19:8488/Default.aspx");
    HttpURLConnection conn1 = (HttpURLConnection) login.openConnection();
    conn1.setRequestMethod("POST");
    String loginString = "ScriptManager1=UpdatePanel1%7ClbtnNormalWork&__EVENTTARGET=lbtnNormalWork&__EVENTARGUMENT=&__VIEWSTATE="
    + viewState
    + "&rmShown=1&hidName=&hidPassword=&txtUserName="
    + userName
    + "&txtPassword="
    + password
    + "&__EVENTVALIDATION="
    + eventValidation;
    conn1.setRequestProperty("referer", "http://197.1.0.19:8488");
    conn1.setRequestProperty("x-microsoftajax", "Delta=true");
    conn1.setRequestProperty("Content-Type",
    "application/x-www-form-urlencoded; charset=utf-8");
    conn1.setRequestProperty("User-Agent", IE);
    conn1.setRequestProperty("Host", "197.1.0.19:8488");
    conn1.setRequestProperty("Content-Length", Integer.toString(loginString
    .length())); conn1.setDoOutput(true);
    OutputStream os = conn1.getOutputStream();
    os.write(loginString.getBytes());
    ....
      

  8.   


    用了下你的方法,我查询到有11个“键”Accept: 
    Referer: 
    Accept-Language: 
    User-Agent: 
    Content-Type:
    Accept-Encoding: 
    Host: 
    Content-Length:
    Connection:
    Cache-Control:
    Cookie:带着后面的“值”全部都写到了conn.setRequestProperty里,我这里的loginString是以formhash开头的,不过我觉得应该就是这个,我写完os.write(loginString.getBytes());这个之后直接开始读取源代码,可惜还是无法进入,首先我这么写是不是没有什么问题啊?
    读取网页的代码InputStream in = url.openStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(in,"gbk"));
    String line;
    while((line = br.readLine())!= null){
    sb.append(line + "\n");

    }
      

  9.   

    错了,是使用httpclient来实现dz6登陆的,研究了下这个包,找了几个例子看看了,可惜还是不行,现在已经放弃了登陆我经常上的论坛,只是想研究下这个技术,看看哪位牛人闲着没事想研究下这个自动登陆论坛的功能,随便登陆个论坛就行,想研究下
      

  10.   

    不是说没人懂 httpclient, 而是 httpCLient 不是干这个事的。
    自动登录是个老话题了,很多网站也自然而然衍生出了防止自动登录的招数。 所谓矛和盾。
    网站先没有啥防护,你用socket就可以登录;后来就加了Cookie,你就可以读取cookie;后来就session,你就用程序捕获session数据;后来就加了认证码,你就需要图像识别。。