java jsoup 登录 抓取_java爬虫(四)利用Jsoup获取需要登陆的网站中的内容(无验证码的登录)...

一、实现原理

登录之后进行数据分析,精确抓取数据。

根据上篇文章的代码,我们不仅获取了cookies,还获取了登录之后返回的网页源码,此时有如下几种种情况:

(1)若我们所需的数据就在登录之后返回的源码里面,那么我们就可以直接通过Jsoup去解析源码了,然后利用Jsoup的选择器功能去筛选出我们需要的信息;

(2)若需要的数据是需要通过请求源码里的链接得到,那么我们就先解析源码,找出这个url,然后带上cookies模拟请求这个url就可以了。

(3)若我们所需的数据完全不在源码里面,那么我们就可以不用管这个源码了。我们看浏览器,打开谷歌的network,查找分析所有url的请求和响应结果,一般情况下,总能找到那一个url(一般这个url是一个固定的url,可能参数会不一样),其返回的数据是我们期望的,然后我们模拟请求这个url,带上cookies就可以请求了。

一开始写模拟登录得时候,总觉得数据一定要在网页源码里面才能获取,所以当一个网页是由一堆js组成得就傻眼了。然后就希望能够获取渲染后的网页源码,可以尝试selenium ,以后学习使用。

二、详细实现过程

packagedebug;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importorg.jsoup.Connection;importorg.jsoup.Connection.Method;importorg.jsoup.Connection.Response;importorg.jsoup.Jsoup;importorg.jsoup.nodes.Document;importorg.jsoup.nodes.Element;importjava.io.IOException;importorg.jsoup.select.Elements;public classtest {public static String LOGIN_URL = "http://authserver.tjut.edu.cn/authserver/login";public static String USER_AGENT = "User-Agent";public static String USER_AGENT_VALUE = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0";public static void main(String[] args) throwsException {//模拟登陆github的用户名和密码//String url = "http://ehall.tjut.edu.cn/publicapp/sys/zxzxapp/index.do#/consultingList";

String url ="http://ehall.tjut.edu.cn/publicapp/sys/zxzxapp/index.do";

get_html_num(url);

}/***@paramuserName 用户名

*@parampwd 密码

*@throwsException*/

public static Map simulateLogin(String userName, String pwd) throwsException {/** 第一次请求 grab login form page first 获取登陆提交的表单信息,及修改其提交data数据(login,password)*/

//get the response, which we will post to the action URL(rs.cookies())

Connection con = Jsoup.connect(LOGIN_URL); //获取connection

con.header(USER_AGENT, USER_AGENT_VALUE); //配置模拟浏览器

Response rs = con.execute(); //获取响应

Document d1 = Jsoup.parse(rs.body()); //通过Jsoup将返回信息转换为Dom树

List eleList = d1.select("#casLoginForm"); //获取提交form表单,可以通过查看页面源码代码得知//获取cooking和表单属性//lets make data map containing all the parameters and its values found in the//form

Map datas = new HashMap<>();for (Element e : eleList.get(0).getAllElements()) {//注意问题2:设置用户名 注意equals(这个username和password也是要去自己的登录界面input里找name值)

if (e.attr("name").equals("username")) {

e.attr("value", userName);

}//设置用户密码

if (e.attr("name").equals("password")) {

e.attr("value", pwd);

}//排除空值表单属性

if (e.attr("name").length() > 0) {

datas.put(e.attr("name"), e.attr("value"));

}

}/** 第二次请求,以post方式提交表单数据以及cookie信息*/Connection con2=Jsoup.connect("http://authserver.tjut.edu.cn/authserver/login");

con2.header(USER_AGENT, USER_AGENT_VALUE);//设置cookie和post上面的map数据

Response login = con2.ignoreContentType(true).followRedirects(true).method(Method.POST).data(datas)

.cookies(rs.cookies()).execute();//报错Exception in thread "main" org.jsoup.HttpStatusException: HTTP error fetching URL. Status=500,//报错原因:见上边注意问题2//打印,登陆成功后的信息//System.out.println(login.body());//登陆成功后的cookie信息,可以保存到本地,以后登陆时,只需一次登陆即可

Map map =login.cookies();//for (String s : map.keySet()) {//System.out.println(s + " : " + map.get(s));//}

returnmap;

}//实现切割某两个字之间的字符串

public staticString findstr(String str1, String strstrat, String strend) {

String finalstr= newString();int strStartIndex =str1.indexOf(strstrat);int strEndIndex =str1.indexOf(strend);

finalstr=str1.substring(strStartIndex, strEndIndex).substring(strstrat.length());returnfinalstr;

}//第一个,完整爬虫爬下来内容

public static void get_html_num(String url) throwsException {try{

Map cookies=simulateLogin("203128301", "密码保护");//Document doc = Jsoup.connect(url).get();

Document doc =Jsoup.connect(url).cookies(cookies).post();//得到html中id为content下的所有内容

Element ele = doc.getElementById("consultingListDetail");//分离出下面的具体内容//Elements tag = ele.getElementsByTag("td");//for (Element e : tag) {//String title = e.getElementsByTag("td").text();//String Totals = findstr(title, "共", "条");//System.out.println(Totals);

System.out.println(doc);//}

}catch(IOException e) {

e.printStackTrace();

}

}

}

三、目前的问题

目标界面的内容是AJAX动态加载的,使用jsoup不能获取到目标信息。

什么是AJAX

​AJAX(Asynchronouse JavaScript And XML)异步JavaScript和XML。过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面。因为传统的在传输数据格式方面,使用的是XML语法。因此叫做AJAX,其实现在数据交互基本上都是使用JSON。使用AJAX加载的数据,即使使用了JS,将数据渲染到了浏览器中,在右键->查看网页源代码还是不能看到通过ajax加载的数据,只能看到使用这个url加载的html代码。

解决方案:

①直接分析AJAX调用的接口。然后通过代码请求这个接口。

②使用selenium 模拟点击解决该问题。

实现过程参照下两篇文章:

java爬虫(五)利用selenium 模拟点击获取动态页面的内容

java爬虫(六)分析AJAX接口获取网页动态内容

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于使用Java编写网络爬虫,我们可以使用Jsoup库来进行HTML解析和数据抓取。 首先,您需要在项目引入Jsoup库。您可以在Maven或Gradle构建工具添加以下依赖项: Maven: ```xml <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.13.1</version> </dependency> ``` Gradle: ```groovy implementation 'org.jsoup:jsoup:1.13.1' ``` 接下来,您可以使用Jsoup获取和解析网页内容。以下是一个简单的示例代码,演示如何使用Jsoup来爬取网页并提取所需的数据: ```java import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; public class WebCrawler { public static void main(String[] args) { try { // 使用Jsoup连接到目标网页 Document document = Jsoup.connect("http://example.com").get(); // 使用CSS选择器提取所需的元素 Elements links = document.select("a[href]"); // 遍历并打印提取到的元素 for (Element link : links) { System.out.println("Link: " + link.attr("href")); System.out.println("Text: " + link.text()); } } catch (IOException e) { e.printStackTrace(); } } } ``` 在上面的示例,我们使用`Jsoup.connect()`方法连接到目标网页,并使用`document.select()`方法使用CSS选择器提取所有带有`href`属性的链接元素。然后,我们遍历这些链接元素,并打印出链接的URL和文本。 您可以根据自己的需求进一步扩展和修改代码来满足特定的爬虫需求。请注意,在编写爬虫时,请遵守相关网站的使用条款和政策,以避免违反规定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值