通过new URL()的方式可以获取网页内容,可是目前想获取的网站 需要登录后才能显示的table内容
从java代码里进入指定的页面没有登录,指定页面没有登录状态无法获取
不同的网站具体登录的方法不同,不能给出一个通用的代码。
这里有个登录cnblog网站的例子:
https://www.cnblogs.com/zhangtingkuo/p/3968450.html
关键代码:
Cookie[] cookies = httpClient.getState().getCookies();
这里得到登录的cookie
然后
GetMethod getMethod = new GetMethod(dataUrl);
这样得到的dataUrl的内容,就是登录以后才有的。
可以研究一下使用http client来完成这个功能,登录涉及到会话session,无状态的访问用URL这种方式应该搞不定。
有状态的访问 敲错了 尴尬。。
先研究一下网站保持登陆session的cookie等,这样后面请求URL的时候也带上cookie
该项目配置了拦截器,并且并没有开放这个资源.在你请求任何一个资源的时候,
他都会判断这个资源有没有开放,如果开放了,你就可以进行访问了.如果没有开
放,你就得登陆之后并确定你有这个权限的时候,才让你请求.才可以访问该资源.
这也就是你使用new URL("统一资源定位符")不能访问该资源的原因.
如果你非要用这种方式访问 , 那么我想只有一种情况可以实现,那就是登陆的时候
只需要登录名和密码,不需要验证码.不过我估计悬的很,哪个网站会这么做啊?
如果是的话就可以进行下面的操作了,你先注册个账号,在开发者工具中,找到登陆请
求的URL路径.拼接一下账户和密码,用new URL 请求.登陆之后在进行请求html 的操作.
可以通过设置User-Agent来欺骗服务器。
首先打开网页,再按F12查看源码;
然后抓取你想要的标签,注入LinkedHashMap里面就ok了,很简单是吧!看看例子:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.*;
/**
- Created by chunmiao on 17-3-10. */ public class ReadBaiduSearch { //储存返回结果 private LinkedHashMap mapOfBaike; //获取搜索信息 public LinkedHashMap getInfomationOfBaike(String infomationWords) throws IOException { mapOfBaike = getResult(infomationWords); return mapOfBaike; } //通过网络链接获取信息 private static LinkedHashMap getResult(String keywords) throws IOException { //搜索的url String keyUrl = "http://baike.baidu.com/search?word=" + keywords; //搜索词条的节点 String startNode = "
"; //词条的链接关键字 String keyOfHref = "href=\""; //词条的标题关键字 String keyOfTitle = "target=\"_blank\">"; String endNode = "
"; boolean isNode = false; String title; String href; String rLine; LinkedHashMap keyMap = new LinkedHashMap(); //开始网络请求 URL url = new URL(keyUrl); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); InputStreamReader inputStreamReader = new InputStreamReader(urlConnection.getInputStream(),"utf-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); //读取网页内容 while ((rLine = bufferedReader.readLine()) != null){ //判断目标节点是否出现 if(rLine.contains(startNode)){ isNode = true; } //若目标节点出现,则开始抓取数据 if (isNode){ //若目标结束节点出现,则结束读取,节省读取时间 if (rLine.contains(endNode)) { //关闭读取流 bufferedReader.close(); inputStreamReader.close(); break; } //若值为空则不读取 if (((title = getName(rLine,keyOfTitle)) != "") && ((href = getHref(rLine,keyOfHref)) != "")){ keyMap.put(title,href); } } } return keyMap; } //获取词条对应的url private static String getHref(String rLine,String keyOfHref){ String baikeUrl = "http://baike.baidu.com"; String result = ""; if(rLine.contains(keyOfHref)){ //获取url for (int j = rLine.indexOf(keyOfHref) + keyOfHref.length();j < rLine.length()&&(rLine.charAt(j) != '\"');j ++){ result += rLine.charAt(j); } //获取的url中可能不含baikeUrl,如果没有则在头部添加一个 if(!result.contains(baikeUrl)){ result = baikeUrl + result; } } return result; } //获取词条对应的名称 private static String getName(String rLine,String keyOfTitle){ String result = ""; //获取标题内容 if(rLine.contains(keyOfTitle)){ result = rLine.substring(rLine.indexOf(keyOfTitle) + keyOfTitle.length(),rLine.length()); //将标题中的内容含有的标签去掉 result = result.replaceAll("|||",""); } return result; } }
这不就是传说中的爬虫吗???
你需要什么内容???我想这个东西会不会对你有帮助?
https://blog.csdn.net/android_app/article/details/80454623
参考:https://www.cnblogs.com/gaojupeng/p/5728094.html
python爬虫走一个
网站有验证码 一直搞不进去
谢谢大家,这两天有点私事没来, 这个问题我用的http client 创建了个模拟浏览器 给HttpGet get = new HttpGet(newUrl); 传浏览器参数,get.addHeader(new BasicHeader("Cookie","admin_username=; safedog-flow-item=; PHPSESSID=QW65SFE32625SGE525SDEFS52)); 这种方法 实现了我的需求