小弟我对网页抓取很感兴趣,经过几个星期的努力加上正则表达式的学习,可以掌握抓取大部分网页了,可是最近在抓取一个我经常上的论坛时出现无法进入特定栏目的状况
<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,哪位高手能给我点提示,或者告诉我用什么样的方法也行,谢谢
<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,哪位高手能给我点提示,或者告诉我用什么样的方法也行,谢谢
以前写过社区的机器人,主要是获取一些只有好友才能看到的资料的,c#里用的是CookieContainer。楼主对应着找找
以后你每次请求都在request头部附加该jsessionID.取到的页面就是登录后的页面了。
道理一样,浏览器请求是什么,能返回正确页面,就用代码传送什么样的请求头.
用java代码登陆一次,这个怎么登陆?是用write流吗?
主要是用与连接目标网站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());
....
用了下你的方法,我查询到有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");
}
自动登录是个老话题了,很多网站也自然而然衍生出了防止自动登录的招数。 所谓矛和盾。
网站先没有啥防护,你用socket就可以登录;后来就加了Cookie,你就可以读取cookie;后来就session,你就用程序捕获session数据;后来就加了认证码,你就需要图像识别。。