
抓取ajax动态网页java
抓取ajax动态网页java(什么是ajax呢,简单来说,就是加载一个网页完毕)
网站优化 • 优采云 发表了文章 • 0 个评论 • 91 次浏览 • 2021-09-20 02:03
抓取ajax动态网页java(什么是ajax呢,简单来说,就是加载一个网页完毕)
什么是Ajax?简而言之,在加载网页后,您仍然无法看到一些信息。您需要单击一个按钮来查看数据,或者某些网页有大量页面数据。单击下一页时,网页的URL和地址不会更改,但内容会更改。这些可以说是Ajax。如果你还不明白,让我给你看一下百度百科全书的解释。给你
Ajax,即“异步JavaScript和XML”,是指一种用于创建交互式web应用程序的web开发技术
Ajax=异步JavaScript和XML(标准公共标记语言的子集)
AJAX是一种创建快速动态网页的技术
AJAX是一种可以更新某些网页而不必重新加载整个网页的技术。[
Ajax可以通过在后台与服务器交换少量数据来异步更新web页面,这意味着可以在不重新加载整个web页面的情况下更新web页面的一部分
如果需要更新内容,传统网页(没有Ajax)必须重新加载整个网页
下面是一个例子。我捕获的最难的Ajax网页是对网易云音乐的评论。如果您感兴趣,可以使用Python对网易云音乐进行爬网,并将数据存储在MySQL中
这里的评论是由Ajax加载的,而今天的头条新闻中的其他评论也是由Ajax加载的,但我已经简化了它。还有很多,所以我不想说。让我们谈谈我今天想说的ajax网站来吧
这是肯德基的前沿信息
这里有很多页面的数据,每个页面的数据都是通过Ajax加载的。如果您直接使用Python请求上面的URL,估计您无法获得任何数据。如果您不相信,您可以尝试ha。此时,我们像往常一样打开开发工具。首先清除所有请求,检查连续日志,然后单击下一页,您将看到
上面的请求是Ajax请求的web页面,它将收录我们需要的数据。让我们看看它是什么类型的请求
这是一个post请求。请求成功状态代码为200。还有请求URL。以下来自数据的数据是我们需要发布的数据。很容易猜测PageIndex是页数,因此我们可以将此值更改为翻页
对这个网页的分析已经完成。这是如何解决Ajax动态网页的问题。你认为它很简单吗?事实上不是。只是因为这个网页的形式(来自数据)相对简单数据没有加密。如果是加密的,估计你可以找到JS文件来查看参数是如何加密的。这是我之前写的网易云音乐评论的爬行。看着这些混乱的JS来寻找加密方法有时会让你头疼,所以人们经常选择selenium来爬行,但使用的是e将降低爬虫程序的性能,因此,这种方法在工作中是不允许的,因此您必须学习如何处理这些Ajax
邮政编码
import requests<br />page = 1<br />while True:<br /> url = 'http://www.kfc.com.cn/kfccda/a ... %3Bbr /> data = {<br /> 'cname': '广州',<br /> 'pid': '',<br /> 'pageIndex': page,<br /> 'pageSize': '10'<br /> }<br /> response = requests.post(url, data=data)<br /> print(response.json())<br /> if response.json().get('Table1', ''):<br /> page += 1<br /> else:<br /> break复制代码
可以看出,不需要从数据中删除,就可以在不需要十行代码的情况下从所有数据中爬下来,所以这个网站适合实践,您可以试试
写在末尾
接下来文章我将写下复杂的Ajax请求,这个网站
我不知道有多少人想看。如果你想看,请赞美它!或者你可以先自己试试 查看全部
什么是Ajax?简而言之,在加载网页后,您仍然无法看到一些信息。您需要单击一个按钮来查看数据,或者某些网页有大量页面数据。单击下一页时,网页的URL和地址不会更改,但内容会更改。这些可以说是Ajax。如果你还不明白,让我给你看一下百度百科全书的解释。给你
Ajax,即“异步JavaScript和XML”,是指一种用于创建交互式web应用程序的web开发技术
Ajax=异步JavaScript和XML(标准公共标记语言的子集)
AJAX是一种创建快速动态网页的技术
AJAX是一种可以更新某些网页而不必重新加载整个网页的技术。[
Ajax可以通过在后台与服务器交换少量数据来异步更新web页面,这意味着可以在不重新加载整个web页面的情况下更新web页面的一部分
如果需要更新内容,传统网页(没有Ajax)必须重新加载整个网页
下面是一个例子。我捕获的最难的Ajax网页是对网易云音乐的评论。如果您感兴趣,可以使用Python对网易云音乐进行爬网,并将数据存储在MySQL中
这里的评论是由Ajax加载的,而今天的头条新闻中的其他评论也是由Ajax加载的,但我已经简化了它。还有很多,所以我不想说。让我们谈谈我今天想说的ajax网站来吧
这是肯德基的前沿信息
这里有很多页面的数据,每个页面的数据都是通过Ajax加载的。如果您直接使用Python请求上面的URL,估计您无法获得任何数据。如果您不相信,您可以尝试ha。此时,我们像往常一样打开开发工具。首先清除所有请求,检查连续日志,然后单击下一页,您将看到
上面的请求是Ajax请求的web页面,它将收录我们需要的数据。让我们看看它是什么类型的请求
这是一个post请求。请求成功状态代码为200。还有请求URL。以下来自数据的数据是我们需要发布的数据。很容易猜测PageIndex是页数,因此我们可以将此值更改为翻页
对这个网页的分析已经完成。这是如何解决Ajax动态网页的问题。你认为它很简单吗?事实上不是。只是因为这个网页的形式(来自数据)相对简单数据没有加密。如果是加密的,估计你可以找到JS文件来查看参数是如何加密的。这是我之前写的网易云音乐评论的爬行。看着这些混乱的JS来寻找加密方法有时会让你头疼,所以人们经常选择selenium来爬行,但使用的是e将降低爬虫程序的性能,因此,这种方法在工作中是不允许的,因此您必须学习如何处理这些Ajax
邮政编码
import requests<br />page = 1<br />while True:<br /> url = 'http://www.kfc.com.cn/kfccda/a ... %3Bbr /> data = {<br /> 'cname': '广州',<br /> 'pid': '',<br /> 'pageIndex': page,<br /> 'pageSize': '10'<br /> }<br /> response = requests.post(url, data=data)<br /> print(response.json())<br /> if response.json().get('Table1', ''):<br /> page += 1<br /> else:<br /> break复制代码
可以看出,不需要从数据中删除,就可以在不需要十行代码的情况下从所有数据中爬下来,所以这个网站适合实践,您可以试试
写在末尾
接下来文章我将写下复杂的Ajax请求,这个网站
我不知道有多少人想看。如果你想看,请赞美它!或者你可以先自己试试 查看全部
抓取ajax动态网页java(什么是ajax呢,简单来说,就是加载一个网页完毕)
什么是Ajax?简而言之,在加载网页后,您仍然无法看到一些信息。您需要单击一个按钮来查看数据,或者某些网页有大量页面数据。单击下一页时,网页的URL和地址不会更改,但内容会更改。这些可以说是Ajax。如果你还不明白,让我给你看一下百度百科全书的解释。给你
Ajax,即“异步JavaScript和XML”,是指一种用于创建交互式web应用程序的web开发技术
Ajax=异步JavaScript和XML(标准公共标记语言的子集)
AJAX是一种创建快速动态网页的技术
AJAX是一种可以更新某些网页而不必重新加载整个网页的技术。[
Ajax可以通过在后台与服务器交换少量数据来异步更新web页面,这意味着可以在不重新加载整个web页面的情况下更新web页面的一部分
如果需要更新内容,传统网页(没有Ajax)必须重新加载整个网页
下面是一个例子。我捕获的最难的Ajax网页是对网易云音乐的评论。如果您感兴趣,可以使用Python对网易云音乐进行爬网,并将数据存储在MySQL中
这里的评论是由Ajax加载的,而今天的头条新闻中的其他评论也是由Ajax加载的,但我已经简化了它。还有很多,所以我不想说。让我们谈谈我今天想说的ajax网站来吧
这是肯德基的前沿信息
这里有很多页面的数据,每个页面的数据都是通过Ajax加载的。如果您直接使用Python请求上面的URL,估计您无法获得任何数据。如果您不相信,您可以尝试ha。此时,我们像往常一样打开开发工具。首先清除所有请求,检查连续日志,然后单击下一页,您将看到
上面的请求是Ajax请求的web页面,它将收录我们需要的数据。让我们看看它是什么类型的请求
这是一个post请求。请求成功状态代码为200。还有请求URL。以下来自数据的数据是我们需要发布的数据。很容易猜测PageIndex是页数,因此我们可以将此值更改为翻页
对这个网页的分析已经完成。这是如何解决Ajax动态网页的问题。你认为它很简单吗?事实上不是。只是因为这个网页的形式(来自数据)相对简单数据没有加密。如果是加密的,估计你可以找到JS文件来查看参数是如何加密的。这是我之前写的网易云音乐评论的爬行。看着这些混乱的JS来寻找加密方法有时会让你头疼,所以人们经常选择selenium来爬行,但使用的是e将降低爬虫程序的性能,因此,这种方法在工作中是不允许的,因此您必须学习如何处理这些Ajax
邮政编码
import requests<br />page = 1<br />while True:<br /> url = 'http://www.kfc.com.cn/kfccda/a ... %3Bbr /> data = {<br /> 'cname': '广州',<br /> 'pid': '',<br /> 'pageIndex': page,<br /> 'pageSize': '10'<br /> }<br /> response = requests.post(url, data=data)<br /> print(response.json())<br /> if response.json().get('Table1', ''):<br /> page += 1<br /> else:<br /> break复制代码
可以看出,不需要从数据中删除,就可以在不需要十行代码的情况下从所有数据中爬下来,所以这个网站适合实践,您可以试试
写在末尾
接下来文章我将写下复杂的Ajax请求,这个网站
我不知道有多少人想看。如果你想看,请赞美它!或者你可以先自己试试
抓取ajax动态网页java(谷歌的network模拟请求和实现原理登录之后返回的网页源码)
网站优化 • 优采云 发表了文章 • 0 个评论 • 92 次浏览 • 2021-09-11 10:15
抓取ajax动态网页java(谷歌的network模拟请求和实现原理登录之后返回的网页源码)
一、实现原理
登录后,进行数据分析,准确抓取数据。
根据上一篇文章的代码,我们不仅获得了cookies,还获得了登录后返回的网页源代码。这时候有以下几种情况:
(1)如果我们需要的数据在登陆后返回的源码中,那么我们可以直接通过Jsoup解析源码,然后利用Jsoup的selector函数过滤掉我们需要的信息;<//p
p(2)如果需要通过请求源码中的链接获取需要的数据,那么我们会先解析源码找出url,然后带上cookie来模拟对这个url的请求。/p
p(3)如果源代码中根本没有我们需要的数据,那么我们可以忽略源代码。我们看浏览器,打开谷歌的网络,搜索分析所有的URL请求和响应结果,在一般接下来总能找到那个url(一般这个url是固定的url,参数可能不同),返回的数据就是我们期望的,然后我们模拟请求这个url,我们就可以用cookies请求了./p
p第一次写模拟登录的时候,总觉得数据必须在网页的源码中获取,所以当一个网页是一堆js组成的时候,傻眼了。那么我希望得到渲染网页的源码,你可以试试selenium,以后学习使用。/p
p二、详细实现过程/p
pprespan style="color: rgba(0, 0, 255, 1)"package/spanspan style="color: rgba(0, 0, 0, 1)" debug;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.util.HashMap;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.util.List;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.util.Map;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Connection;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Connection.Method;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Connection.Response;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Jsoup;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.nodes.Document;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.nodes.Element;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.io.IOException;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.select.Elements;
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"class/spanspan style="color: rgba(0, 0, 0, 1)" test {
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span String LOGIN_URL = "http://authserver.tjut.edu.cn/ ... Bspan style="color: rgba(0, 0, 0, 1)";
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span String USER_AGENT = "User-Agent"span style="color: rgba(0, 0, 0, 1)";
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span String USER_AGENT_VALUE = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0"span style="color: rgba(0, 0, 0, 1)";
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span span style="color: rgba(0, 0, 255, 1)"void/span main(String[] args) span style="color: rgba(0, 0, 255, 1)"throws/spanspan style="color: rgba(0, 0, 0, 1)" Exception {
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 模拟登陆github的用户名和密码
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" String url = "/spanspan style="color: rgba(0, 128, 0, 1); text-decoration: underline"http://ehall.tjut.edu.cn/publi ... nspan style="color: rgba(0, 128, 0, 1)"#/consultingList";/span
String url ="http://ehall.tjut.edu.cn/publi ... Bspan style="color: rgba(0, 0, 0, 1)";
get_html_num(url);
}
/spanspan style="color: rgba(0, 128, 0, 1)"/**/spanspan style="color: rgba(0, 128, 0, 1)"
* /spanspan style="color: rgba(128, 128, 128, 1)"@param/spanspan style="color: rgba(0, 128, 0, 1)" userName 用户名
* /spanspan style="color: rgba(128, 128, 128, 1)"@param/spanspan style="color: rgba(0, 128, 0, 1)" pwd 密码
* /spanspan style="color: rgba(128, 128, 128, 1)"@throws/spanspan style="color: rgba(0, 128, 0, 1)" Exception
/spanspan style="color: rgba(0, 128, 0, 1)"*//span
span style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span MapString, String simulateLogin(String userName, String pwd) span style="color: rgba(0, 0, 255, 1)"throws/spanspan style="color: rgba(0, 0, 0, 1)" Exception {
/spanspan style="color: rgba(0, 128, 0, 1)"/*/spanspan style="color: rgba(0, 128, 0, 1)"
* 第一次请求 grab login form page first 获取登陆提交的表单信息,及修改其提交data数据(login,password)
/spanspan style="color: rgba(0, 128, 0, 1)"*//span
span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" get the response, which we will post to the action URL(rs.cookies())/span
Connection con = Jsoup.connect(LOGIN_URL); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取connection/span
con.header(USER_AGENT, USER_AGENT_VALUE); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 配置模拟浏览器/span
Response rs = con.execute(); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取响应/span
Document d1 = Jsoup.parse(rs.body()); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 通过Jsoup将返回信息转换为Dom树/span
ListElement eleList = d1.select("#casLoginForm"); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取提交form表单,可以通过查看页面源码代码得知
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取cooking和表单属性
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" lets make data map containing all the parameters and its values found in the
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" form/span
MapString, String datas = span style="color: rgba(0, 0, 255, 1)"new/span HashMapspan style="color: rgba(0, 0, 0, 1)"();
/spanspan style="color: rgba(0, 0, 255, 1)"for/span (Element e : eleList.get(0span style="color: rgba(0, 0, 0, 1)").getAllElements()) {
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 注意问题2:设置用户名 注意equals(这个username和password也是要去自己的登录界面input里找name值)/span
span style="color: rgba(0, 0, 255, 1)"if/span (e.attr("name").equals("username"span style="color: rgba(0, 0, 0, 1)")) {
e.attr(/span"value"span style="color: rgba(0, 0, 0, 1)", userName);
}
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 设置用户密码/span
span style="color: rgba(0, 0, 255, 1)"if/span (e.attr("name").equals("password"span style="color: rgba(0, 0, 0, 1)")) {
e.attr(/span"value"span style="color: rgba(0, 0, 0, 1)", pwd);
}
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 排除空值表单属性/span
span style="color: rgba(0, 0, 255, 1)"if/span (e.attr("name").length() > 0) {
datas.put(e.attr("name"), e.attr("value"));
}
}
/*
* 第二次请求,以post方式提交表单数据以及cookie信息
*/
Connection con2 = Jsoup.connect(
"http://authserver.tjut.edu.cn/ ... 6quot;);
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));
// }
return map;
}
// 实现切割某两个字之间的字符串
public static String findstr(String str1, String strstrat, String strend) {
String finalstr = new String();
int strStartIndex = str1.indexOf(strstrat);
int strEndIndex = str1.indexOf(strend);
finalstr = str1.substring(strStartIndex, strEndIndex).substring(strstrat.length());
return finalstr;
}
// 第一个,完整爬虫爬下来内容
public static void get_html_num(String url) throws Exception {
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爬虫(六)analyze AJAX接口获取网页动态内容 查看全部
一、实现原理
登录后,进行数据分析,准确抓取数据。
根据上一篇文章的代码,我们不仅获得了cookies,还获得了登录后返回的网页源代码。这时候有以下几种情况:
(1)如果我们需要的数据在登陆后返回的源码中,那么我们可以直接通过Jsoup解析源码,然后利用Jsoup的selector函数过滤掉我们需要的信息;<//p
p(2)如果需要通过请求源码中的链接获取需要的数据,那么我们会先解析源码找出url,然后带上cookie来模拟对这个url的请求。/p
p(3)如果源代码中根本没有我们需要的数据,那么我们可以忽略源代码。我们看浏览器,打开谷歌的网络,搜索分析所有的URL请求和响应结果,在一般接下来总能找到那个url(一般这个url是固定的url,参数可能不同),返回的数据就是我们期望的,然后我们模拟请求这个url,我们就可以用cookies请求了./p
p第一次写模拟登录的时候,总觉得数据必须在网页的源码中获取,所以当一个网页是一堆js组成的时候,傻眼了。那么我希望得到渲染网页的源码,你可以试试selenium,以后学习使用。/p
p二、详细实现过程/p
pprespan style="color: rgba(0, 0, 255, 1)"package/spanspan style="color: rgba(0, 0, 0, 1)" debug;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.util.HashMap;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.util.List;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.util.Map;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Connection;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Connection.Method;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Connection.Response;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Jsoup;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.nodes.Document;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.nodes.Element;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.io.IOException;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.select.Elements;
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"class/spanspan style="color: rgba(0, 0, 0, 1)" test {
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span String LOGIN_URL = "http://authserver.tjut.edu.cn/ ... Bspan style="color: rgba(0, 0, 0, 1)";
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span String USER_AGENT = "User-Agent"span style="color: rgba(0, 0, 0, 1)";
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span String USER_AGENT_VALUE = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0"span style="color: rgba(0, 0, 0, 1)";
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span span style="color: rgba(0, 0, 255, 1)"void/span main(String[] args) span style="color: rgba(0, 0, 255, 1)"throws/spanspan style="color: rgba(0, 0, 0, 1)" Exception {
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 模拟登陆github的用户名和密码
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" String url = "/spanspan style="color: rgba(0, 128, 0, 1); text-decoration: underline"http://ehall.tjut.edu.cn/publi ... nspan style="color: rgba(0, 128, 0, 1)"#/consultingList";/span
String url ="http://ehall.tjut.edu.cn/publi ... Bspan style="color: rgba(0, 0, 0, 1)";
get_html_num(url);
}
/spanspan style="color: rgba(0, 128, 0, 1)"/**/spanspan style="color: rgba(0, 128, 0, 1)"
* /spanspan style="color: rgba(128, 128, 128, 1)"@param/spanspan style="color: rgba(0, 128, 0, 1)" userName 用户名
* /spanspan style="color: rgba(128, 128, 128, 1)"@param/spanspan style="color: rgba(0, 128, 0, 1)" pwd 密码
* /spanspan style="color: rgba(128, 128, 128, 1)"@throws/spanspan style="color: rgba(0, 128, 0, 1)" Exception
/spanspan style="color: rgba(0, 128, 0, 1)"*//span
span style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span MapString, String simulateLogin(String userName, String pwd) span style="color: rgba(0, 0, 255, 1)"throws/spanspan style="color: rgba(0, 0, 0, 1)" Exception {
/spanspan style="color: rgba(0, 128, 0, 1)"/*/spanspan style="color: rgba(0, 128, 0, 1)"
* 第一次请求 grab login form page first 获取登陆提交的表单信息,及修改其提交data数据(login,password)
/spanspan style="color: rgba(0, 128, 0, 1)"*//span
span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" get the response, which we will post to the action URL(rs.cookies())/span
Connection con = Jsoup.connect(LOGIN_URL); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取connection/span
con.header(USER_AGENT, USER_AGENT_VALUE); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 配置模拟浏览器/span
Response rs = con.execute(); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取响应/span
Document d1 = Jsoup.parse(rs.body()); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 通过Jsoup将返回信息转换为Dom树/span
ListElement eleList = d1.select("#casLoginForm"); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取提交form表单,可以通过查看页面源码代码得知
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取cooking和表单属性
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" lets make data map containing all the parameters and its values found in the
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" form/span
MapString, String datas = span style="color: rgba(0, 0, 255, 1)"new/span HashMapspan style="color: rgba(0, 0, 0, 1)"();
/spanspan style="color: rgba(0, 0, 255, 1)"for/span (Element e : eleList.get(0span style="color: rgba(0, 0, 0, 1)").getAllElements()) {
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 注意问题2:设置用户名 注意equals(这个username和password也是要去自己的登录界面input里找name值)/span
span style="color: rgba(0, 0, 255, 1)"if/span (e.attr("name").equals("username"span style="color: rgba(0, 0, 0, 1)")) {
e.attr(/span"value"span style="color: rgba(0, 0, 0, 1)", userName);
}
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 设置用户密码/span
span style="color: rgba(0, 0, 255, 1)"if/span (e.attr("name").equals("password"span style="color: rgba(0, 0, 0, 1)")) {
e.attr(/span"value"span style="color: rgba(0, 0, 0, 1)", pwd);
}
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 排除空值表单属性/span
span style="color: rgba(0, 0, 255, 1)"if/span (e.attr("name").length() > 0) {
datas.put(e.attr("name"), e.attr("value"));
}
}
/*
* 第二次请求,以post方式提交表单数据以及cookie信息
*/
Connection con2 = Jsoup.connect(
"http://authserver.tjut.edu.cn/ ... 6quot;);
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));
// }
return map;
}
// 实现切割某两个字之间的字符串
public static String findstr(String str1, String strstrat, String strend) {
String finalstr = new String();
int strStartIndex = str1.indexOf(strstrat);
int strEndIndex = str1.indexOf(strend);
finalstr = str1.substring(strStartIndex, strEndIndex).substring(strstrat.length());
return finalstr;
}
// 第一个,完整爬虫爬下来内容
public static void get_html_num(String url) throws Exception {
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爬虫(六)analyze AJAX接口获取网页动态内容 查看全部
抓取ajax动态网页java(谷歌的network模拟请求和实现原理登录之后返回的网页源码)
一、实现原理
登录后,进行数据分析,准确抓取数据。
根据上一篇文章的代码,我们不仅获得了cookies,还获得了登录后返回的网页源代码。这时候有以下几种情况:
(1)如果我们需要的数据在登陆后返回的源码中,那么我们可以直接通过Jsoup解析源码,然后利用Jsoup的selector函数过滤掉我们需要的信息;<//p
p(2)如果需要通过请求源码中的链接获取需要的数据,那么我们会先解析源码找出url,然后带上cookie来模拟对这个url的请求。/p
p(3)如果源代码中根本没有我们需要的数据,那么我们可以忽略源代码。我们看浏览器,打开谷歌的网络,搜索分析所有的URL请求和响应结果,在一般接下来总能找到那个url(一般这个url是固定的url,参数可能不同),返回的数据就是我们期望的,然后我们模拟请求这个url,我们就可以用cookies请求了./p
p第一次写模拟登录的时候,总觉得数据必须在网页的源码中获取,所以当一个网页是一堆js组成的时候,傻眼了。那么我希望得到渲染网页的源码,你可以试试selenium,以后学习使用。/p
p二、详细实现过程/p
pprespan style="color: rgba(0, 0, 255, 1)"package/spanspan style="color: rgba(0, 0, 0, 1)" debug;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.util.HashMap;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.util.List;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.util.Map;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Connection;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Connection.Method;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Connection.Response;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Jsoup;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.nodes.Document;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.nodes.Element;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.io.IOException;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.select.Elements;
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"class/spanspan style="color: rgba(0, 0, 0, 1)" test {
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span String LOGIN_URL = "http://authserver.tjut.edu.cn/ ... Bspan style="color: rgba(0, 0, 0, 1)";
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span String USER_AGENT = "User-Agent"span style="color: rgba(0, 0, 0, 1)";
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span String USER_AGENT_VALUE = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0"span style="color: rgba(0, 0, 0, 1)";
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span span style="color: rgba(0, 0, 255, 1)"void/span main(String[] args) span style="color: rgba(0, 0, 255, 1)"throws/spanspan style="color: rgba(0, 0, 0, 1)" Exception {
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 模拟登陆github的用户名和密码
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" String url = "/spanspan style="color: rgba(0, 128, 0, 1); text-decoration: underline"http://ehall.tjut.edu.cn/publi ... nspan style="color: rgba(0, 128, 0, 1)"#/consultingList";/span
String url ="http://ehall.tjut.edu.cn/publi ... Bspan style="color: rgba(0, 0, 0, 1)";
get_html_num(url);
}
/spanspan style="color: rgba(0, 128, 0, 1)"/**/spanspan style="color: rgba(0, 128, 0, 1)"
* /spanspan style="color: rgba(128, 128, 128, 1)"@param/spanspan style="color: rgba(0, 128, 0, 1)" userName 用户名
* /spanspan style="color: rgba(128, 128, 128, 1)"@param/spanspan style="color: rgba(0, 128, 0, 1)" pwd 密码
* /spanspan style="color: rgba(128, 128, 128, 1)"@throws/spanspan style="color: rgba(0, 128, 0, 1)" Exception
/spanspan style="color: rgba(0, 128, 0, 1)"*//span
span style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span MapString, String simulateLogin(String userName, String pwd) span style="color: rgba(0, 0, 255, 1)"throws/spanspan style="color: rgba(0, 0, 0, 1)" Exception {
/spanspan style="color: rgba(0, 128, 0, 1)"/*/spanspan style="color: rgba(0, 128, 0, 1)"
* 第一次请求 grab login form page first 获取登陆提交的表单信息,及修改其提交data数据(login,password)
/spanspan style="color: rgba(0, 128, 0, 1)"*//span
span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" get the response, which we will post to the action URL(rs.cookies())/span
Connection con = Jsoup.connect(LOGIN_URL); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取connection/span
con.header(USER_AGENT, USER_AGENT_VALUE); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 配置模拟浏览器/span
Response rs = con.execute(); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取响应/span
Document d1 = Jsoup.parse(rs.body()); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 通过Jsoup将返回信息转换为Dom树/span
ListElement eleList = d1.select("#casLoginForm"); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取提交form表单,可以通过查看页面源码代码得知
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取cooking和表单属性
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" lets make data map containing all the parameters and its values found in the
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" form/span
MapString, String datas = span style="color: rgba(0, 0, 255, 1)"new/span HashMapspan style="color: rgba(0, 0, 0, 1)"();
/spanspan style="color: rgba(0, 0, 255, 1)"for/span (Element e : eleList.get(0span style="color: rgba(0, 0, 0, 1)").getAllElements()) {
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 注意问题2:设置用户名 注意equals(这个username和password也是要去自己的登录界面input里找name值)/span
span style="color: rgba(0, 0, 255, 1)"if/span (e.attr("name").equals("username"span style="color: rgba(0, 0, 0, 1)")) {
e.attr(/span"value"span style="color: rgba(0, 0, 0, 1)", userName);
}
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 设置用户密码/span
span style="color: rgba(0, 0, 255, 1)"if/span (e.attr("name").equals("password"span style="color: rgba(0, 0, 0, 1)")) {
e.attr(/span"value"span style="color: rgba(0, 0, 0, 1)", pwd);
}
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 排除空值表单属性/span
span style="color: rgba(0, 0, 255, 1)"if/span (e.attr("name").length() > 0) {
datas.put(e.attr("name"), e.attr("value"));
}
}
/*
* 第二次请求,以post方式提交表单数据以及cookie信息
*/
Connection con2 = Jsoup.connect(
"http://authserver.tjut.edu.cn/ ... 6quot;);
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));
// }
return map;
}
// 实现切割某两个字之间的字符串
public static String findstr(String str1, String strstrat, String strend) {
String finalstr = new String();
int strStartIndex = str1.indexOf(strstrat);
int strEndIndex = str1.indexOf(strend);
finalstr = str1.substring(strStartIndex, strEndIndex).substring(strstrat.length());
return finalstr;
}
// 第一个,完整爬虫爬下来内容
public static void get_html_num(String url) throws Exception {
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爬虫(六)analyze AJAX接口获取网页动态内容
抓取ajax动态网页java(编辑收藏所属分类:Misc0.0.0.3)
网站优化 • 优采云 发表了文章 • 0 个评论 • 70 次浏览 • 2021-09-11 10:14
抓取ajax动态网页java(编辑收藏所属分类:Misc0.0.0.3)
之前发布的Krabber在执行Javascript后已经可以抓取网页了。
例如,新浪博客上的评论是在网页加载后通过JavaScript显示的。这样普通的爬虫plus是获取不到评论信息的。 Krabber 0.0.0.2 已经可以抓取将要执行的 JavaScript 网页,并在 JavaScript 执行后返回收录所需信息的网页 HTML。
现在的问题是网页上的很多内容需要用户交互才能显示结果。例如,基于基于 JavaScript 的评论结果的翻页。直接使用Krabber0.0.0.2只能得到第一页的结果。看到下面的评论,必须点击翻页,等待JavaScript执行后才能看到结果。所以,这个版本的主要目标是实现一个系统,可以模拟用户的动作,触发一些网页上的事件,比如点击下一页,然后抓取JavaScript执行结果。
此版本的 Krabber 0.0.0.3 Preview 已实现在网页上执行 AJAX 脚本。 Krabber0.0.0.3 Pre提供脚本执行机制,让信息抽取工具提供需要执行的内容,由Krabber执行,执行后的结果由克拉伯。
当然,当前的Preview在执行后是无法返回信息的,但是已经可以展示AJAX的执行过程了。有兴趣的可以看看这个原型系统。
Krabber 0.0.0.3 预览版由 pinlin:senior 编写,
发表于 2009-12-12 10:13 高级阅读(1774)评论(0)编辑采集类别:杂项) 查看全部
之前发布的Krabber在执行Javascript后已经可以抓取网页了。
例如,新浪博客上的评论是在网页加载后通过JavaScript显示的。这样普通的爬虫plus是获取不到评论信息的。 Krabber 0.0.0.2 已经可以抓取将要执行的 JavaScript 网页,并在 JavaScript 执行后返回收录所需信息的网页 HTML。
现在的问题是网页上的很多内容需要用户交互才能显示结果。例如,基于基于 JavaScript 的评论结果的翻页。直接使用Krabber0.0.0.2只能得到第一页的结果。看到下面的评论,必须点击翻页,等待JavaScript执行后才能看到结果。所以,这个版本的主要目标是实现一个系统,可以模拟用户的动作,触发一些网页上的事件,比如点击下一页,然后抓取JavaScript执行结果。
此版本的 Krabber 0.0.0.3 Preview 已实现在网页上执行 AJAX 脚本。 Krabber0.0.0.3 Pre提供脚本执行机制,让信息抽取工具提供需要执行的内容,由Krabber执行,执行后的结果由克拉伯。
当然,当前的Preview在执行后是无法返回信息的,但是已经可以展示AJAX的执行过程了。有兴趣的可以看看这个原型系统。
Krabber 0.0.0.3 预览版由 pinlin:senior 编写,
发表于 2009-12-12 10:13 高级阅读(1774)评论(0)编辑采集类别:杂项) 查看全部
抓取ajax动态网页java(编辑收藏所属分类:Misc0.0.0.3)
之前发布的Krabber在执行Javascript后已经可以抓取网页了。
例如,新浪博客上的评论是在网页加载后通过JavaScript显示的。这样普通的爬虫plus是获取不到评论信息的。 Krabber 0.0.0.2 已经可以抓取将要执行的 JavaScript 网页,并在 JavaScript 执行后返回收录所需信息的网页 HTML。
现在的问题是网页上的很多内容需要用户交互才能显示结果。例如,基于基于 JavaScript 的评论结果的翻页。直接使用Krabber0.0.0.2只能得到第一页的结果。看到下面的评论,必须点击翻页,等待JavaScript执行后才能看到结果。所以,这个版本的主要目标是实现一个系统,可以模拟用户的动作,触发一些网页上的事件,比如点击下一页,然后抓取JavaScript执行结果。
此版本的 Krabber 0.0.0.3 Preview 已实现在网页上执行 AJAX 脚本。 Krabber0.0.0.3 Pre提供脚本执行机制,让信息抽取工具提供需要执行的内容,由Krabber执行,执行后的结果由克拉伯。
当然,当前的Preview在执行后是无法返回信息的,但是已经可以展示AJAX的执行过程了。有兴趣的可以看看这个原型系统。
Krabber 0.0.0.3 预览版由 pinlin:senior 编写,
发表于 2009-12-12 10:13 高级阅读(1774)评论(0)编辑采集类别:杂项)
抓取ajax动态网页java(什么是ajax呢,简单来说,就是加载一个网页完毕)
网站优化 • 优采云 发表了文章 • 0 个评论 • 91 次浏览 • 2021-09-20 02:03
抓取ajax动态网页java(什么是ajax呢,简单来说,就是加载一个网页完毕)
什么是Ajax?简而言之,在加载网页后,您仍然无法看到一些信息。您需要单击一个按钮来查看数据,或者某些网页有大量页面数据。单击下一页时,网页的URL和地址不会更改,但内容会更改。这些可以说是Ajax。如果你还不明白,让我给你看一下百度百科全书的解释。给你
Ajax,即“异步JavaScript和XML”,是指一种用于创建交互式web应用程序的web开发技术
Ajax=异步JavaScript和XML(标准公共标记语言的子集)
AJAX是一种创建快速动态网页的技术
AJAX是一种可以更新某些网页而不必重新加载整个网页的技术。[
Ajax可以通过在后台与服务器交换少量数据来异步更新web页面,这意味着可以在不重新加载整个web页面的情况下更新web页面的一部分
如果需要更新内容,传统网页(没有Ajax)必须重新加载整个网页
下面是一个例子。我捕获的最难的Ajax网页是对网易云音乐的评论。如果您感兴趣,可以使用Python对网易云音乐进行爬网,并将数据存储在MySQL中
这里的评论是由Ajax加载的,而今天的头条新闻中的其他评论也是由Ajax加载的,但我已经简化了它。还有很多,所以我不想说。让我们谈谈我今天想说的ajax网站来吧
这是肯德基的前沿信息
这里有很多页面的数据,每个页面的数据都是通过Ajax加载的。如果您直接使用Python请求上面的URL,估计您无法获得任何数据。如果您不相信,您可以尝试ha。此时,我们像往常一样打开开发工具。首先清除所有请求,检查连续日志,然后单击下一页,您将看到
上面的请求是Ajax请求的web页面,它将收录我们需要的数据。让我们看看它是什么类型的请求
这是一个post请求。请求成功状态代码为200。还有请求URL。以下来自数据的数据是我们需要发布的数据。很容易猜测PageIndex是页数,因此我们可以将此值更改为翻页
对这个网页的分析已经完成。这是如何解决Ajax动态网页的问题。你认为它很简单吗?事实上不是。只是因为这个网页的形式(来自数据)相对简单数据没有加密。如果是加密的,估计你可以找到JS文件来查看参数是如何加密的。这是我之前写的网易云音乐评论的爬行。看着这些混乱的JS来寻找加密方法有时会让你头疼,所以人们经常选择selenium来爬行,但使用的是e将降低爬虫程序的性能,因此,这种方法在工作中是不允许的,因此您必须学习如何处理这些Ajax
邮政编码
import requests<br />page = 1<br />while True:<br /> url = 'http://www.kfc.com.cn/kfccda/a ... %3Bbr /> data = {<br /> 'cname': '广州',<br /> 'pid': '',<br /> 'pageIndex': page,<br /> 'pageSize': '10'<br /> }<br /> response = requests.post(url, data=data)<br /> print(response.json())<br /> if response.json().get('Table1', ''):<br /> page += 1<br /> else:<br /> break复制代码
可以看出,不需要从数据中删除,就可以在不需要十行代码的情况下从所有数据中爬下来,所以这个网站适合实践,您可以试试
写在末尾
接下来文章我将写下复杂的Ajax请求,这个网站
我不知道有多少人想看。如果你想看,请赞美它!或者你可以先自己试试 查看全部
什么是Ajax?简而言之,在加载网页后,您仍然无法看到一些信息。您需要单击一个按钮来查看数据,或者某些网页有大量页面数据。单击下一页时,网页的URL和地址不会更改,但内容会更改。这些可以说是Ajax。如果你还不明白,让我给你看一下百度百科全书的解释。给你
Ajax,即“异步JavaScript和XML”,是指一种用于创建交互式web应用程序的web开发技术
Ajax=异步JavaScript和XML(标准公共标记语言的子集)
AJAX是一种创建快速动态网页的技术
AJAX是一种可以更新某些网页而不必重新加载整个网页的技术。[
Ajax可以通过在后台与服务器交换少量数据来异步更新web页面,这意味着可以在不重新加载整个web页面的情况下更新web页面的一部分
如果需要更新内容,传统网页(没有Ajax)必须重新加载整个网页
下面是一个例子。我捕获的最难的Ajax网页是对网易云音乐的评论。如果您感兴趣,可以使用Python对网易云音乐进行爬网,并将数据存储在MySQL中
这里的评论是由Ajax加载的,而今天的头条新闻中的其他评论也是由Ajax加载的,但我已经简化了它。还有很多,所以我不想说。让我们谈谈我今天想说的ajax网站来吧
这是肯德基的前沿信息
这里有很多页面的数据,每个页面的数据都是通过Ajax加载的。如果您直接使用Python请求上面的URL,估计您无法获得任何数据。如果您不相信,您可以尝试ha。此时,我们像往常一样打开开发工具。首先清除所有请求,检查连续日志,然后单击下一页,您将看到
上面的请求是Ajax请求的web页面,它将收录我们需要的数据。让我们看看它是什么类型的请求
这是一个post请求。请求成功状态代码为200。还有请求URL。以下来自数据的数据是我们需要发布的数据。很容易猜测PageIndex是页数,因此我们可以将此值更改为翻页
对这个网页的分析已经完成。这是如何解决Ajax动态网页的问题。你认为它很简单吗?事实上不是。只是因为这个网页的形式(来自数据)相对简单数据没有加密。如果是加密的,估计你可以找到JS文件来查看参数是如何加密的。这是我之前写的网易云音乐评论的爬行。看着这些混乱的JS来寻找加密方法有时会让你头疼,所以人们经常选择selenium来爬行,但使用的是e将降低爬虫程序的性能,因此,这种方法在工作中是不允许的,因此您必须学习如何处理这些Ajax
邮政编码
import requests<br />page = 1<br />while True:<br /> url = 'http://www.kfc.com.cn/kfccda/a ... %3Bbr /> data = {<br /> 'cname': '广州',<br /> 'pid': '',<br /> 'pageIndex': page,<br /> 'pageSize': '10'<br /> }<br /> response = requests.post(url, data=data)<br /> print(response.json())<br /> if response.json().get('Table1', ''):<br /> page += 1<br /> else:<br /> break复制代码
可以看出,不需要从数据中删除,就可以在不需要十行代码的情况下从所有数据中爬下来,所以这个网站适合实践,您可以试试
写在末尾
接下来文章我将写下复杂的Ajax请求,这个网站
我不知道有多少人想看。如果你想看,请赞美它!或者你可以先自己试试 查看全部
抓取ajax动态网页java(什么是ajax呢,简单来说,就是加载一个网页完毕)
什么是Ajax?简而言之,在加载网页后,您仍然无法看到一些信息。您需要单击一个按钮来查看数据,或者某些网页有大量页面数据。单击下一页时,网页的URL和地址不会更改,但内容会更改。这些可以说是Ajax。如果你还不明白,让我给你看一下百度百科全书的解释。给你
Ajax,即“异步JavaScript和XML”,是指一种用于创建交互式web应用程序的web开发技术
Ajax=异步JavaScript和XML(标准公共标记语言的子集)
AJAX是一种创建快速动态网页的技术
AJAX是一种可以更新某些网页而不必重新加载整个网页的技术。[
Ajax可以通过在后台与服务器交换少量数据来异步更新web页面,这意味着可以在不重新加载整个web页面的情况下更新web页面的一部分
如果需要更新内容,传统网页(没有Ajax)必须重新加载整个网页
下面是一个例子。我捕获的最难的Ajax网页是对网易云音乐的评论。如果您感兴趣,可以使用Python对网易云音乐进行爬网,并将数据存储在MySQL中
这里的评论是由Ajax加载的,而今天的头条新闻中的其他评论也是由Ajax加载的,但我已经简化了它。还有很多,所以我不想说。让我们谈谈我今天想说的ajax网站来吧
这是肯德基的前沿信息
这里有很多页面的数据,每个页面的数据都是通过Ajax加载的。如果您直接使用Python请求上面的URL,估计您无法获得任何数据。如果您不相信,您可以尝试ha。此时,我们像往常一样打开开发工具。首先清除所有请求,检查连续日志,然后单击下一页,您将看到
上面的请求是Ajax请求的web页面,它将收录我们需要的数据。让我们看看它是什么类型的请求
这是一个post请求。请求成功状态代码为200。还有请求URL。以下来自数据的数据是我们需要发布的数据。很容易猜测PageIndex是页数,因此我们可以将此值更改为翻页
对这个网页的分析已经完成。这是如何解决Ajax动态网页的问题。你认为它很简单吗?事实上不是。只是因为这个网页的形式(来自数据)相对简单数据没有加密。如果是加密的,估计你可以找到JS文件来查看参数是如何加密的。这是我之前写的网易云音乐评论的爬行。看着这些混乱的JS来寻找加密方法有时会让你头疼,所以人们经常选择selenium来爬行,但使用的是e将降低爬虫程序的性能,因此,这种方法在工作中是不允许的,因此您必须学习如何处理这些Ajax
邮政编码
import requests<br />page = 1<br />while True:<br /> url = 'http://www.kfc.com.cn/kfccda/a ... %3Bbr /> data = {<br /> 'cname': '广州',<br /> 'pid': '',<br /> 'pageIndex': page,<br /> 'pageSize': '10'<br /> }<br /> response = requests.post(url, data=data)<br /> print(response.json())<br /> if response.json().get('Table1', ''):<br /> page += 1<br /> else:<br /> break复制代码
可以看出,不需要从数据中删除,就可以在不需要十行代码的情况下从所有数据中爬下来,所以这个网站适合实践,您可以试试
写在末尾
接下来文章我将写下复杂的Ajax请求,这个网站
我不知道有多少人想看。如果你想看,请赞美它!或者你可以先自己试试
抓取ajax动态网页java(谷歌的network模拟请求和实现原理登录之后返回的网页源码)
网站优化 • 优采云 发表了文章 • 0 个评论 • 92 次浏览 • 2021-09-11 10:15
抓取ajax动态网页java(谷歌的network模拟请求和实现原理登录之后返回的网页源码)
一、实现原理
登录后,进行数据分析,准确抓取数据。
根据上一篇文章的代码,我们不仅获得了cookies,还获得了登录后返回的网页源代码。这时候有以下几种情况:
(1)如果我们需要的数据在登陆后返回的源码中,那么我们可以直接通过Jsoup解析源码,然后利用Jsoup的selector函数过滤掉我们需要的信息;<//p
p(2)如果需要通过请求源码中的链接获取需要的数据,那么我们会先解析源码找出url,然后带上cookie来模拟对这个url的请求。/p
p(3)如果源代码中根本没有我们需要的数据,那么我们可以忽略源代码。我们看浏览器,打开谷歌的网络,搜索分析所有的URL请求和响应结果,在一般接下来总能找到那个url(一般这个url是固定的url,参数可能不同),返回的数据就是我们期望的,然后我们模拟请求这个url,我们就可以用cookies请求了./p
p第一次写模拟登录的时候,总觉得数据必须在网页的源码中获取,所以当一个网页是一堆js组成的时候,傻眼了。那么我希望得到渲染网页的源码,你可以试试selenium,以后学习使用。/p
p二、详细实现过程/p
pprespan style="color: rgba(0, 0, 255, 1)"package/spanspan style="color: rgba(0, 0, 0, 1)" debug;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.util.HashMap;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.util.List;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.util.Map;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Connection;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Connection.Method;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Connection.Response;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Jsoup;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.nodes.Document;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.nodes.Element;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.io.IOException;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.select.Elements;
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"class/spanspan style="color: rgba(0, 0, 0, 1)" test {
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span String LOGIN_URL = "http://authserver.tjut.edu.cn/ ... Bspan style="color: rgba(0, 0, 0, 1)";
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span String USER_AGENT = "User-Agent"span style="color: rgba(0, 0, 0, 1)";
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span String USER_AGENT_VALUE = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0"span style="color: rgba(0, 0, 0, 1)";
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span span style="color: rgba(0, 0, 255, 1)"void/span main(String[] args) span style="color: rgba(0, 0, 255, 1)"throws/spanspan style="color: rgba(0, 0, 0, 1)" Exception {
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 模拟登陆github的用户名和密码
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" String url = "/spanspan style="color: rgba(0, 128, 0, 1); text-decoration: underline"http://ehall.tjut.edu.cn/publi ... nspan style="color: rgba(0, 128, 0, 1)"#/consultingList";/span
String url ="http://ehall.tjut.edu.cn/publi ... Bspan style="color: rgba(0, 0, 0, 1)";
get_html_num(url);
}
/spanspan style="color: rgba(0, 128, 0, 1)"/**/spanspan style="color: rgba(0, 128, 0, 1)"
* /spanspan style="color: rgba(128, 128, 128, 1)"@param/spanspan style="color: rgba(0, 128, 0, 1)" userName 用户名
* /spanspan style="color: rgba(128, 128, 128, 1)"@param/spanspan style="color: rgba(0, 128, 0, 1)" pwd 密码
* /spanspan style="color: rgba(128, 128, 128, 1)"@throws/spanspan style="color: rgba(0, 128, 0, 1)" Exception
/spanspan style="color: rgba(0, 128, 0, 1)"*//span
span style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span MapString, String simulateLogin(String userName, String pwd) span style="color: rgba(0, 0, 255, 1)"throws/spanspan style="color: rgba(0, 0, 0, 1)" Exception {
/spanspan style="color: rgba(0, 128, 0, 1)"/*/spanspan style="color: rgba(0, 128, 0, 1)"
* 第一次请求 grab login form page first 获取登陆提交的表单信息,及修改其提交data数据(login,password)
/spanspan style="color: rgba(0, 128, 0, 1)"*//span
span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" get the response, which we will post to the action URL(rs.cookies())/span
Connection con = Jsoup.connect(LOGIN_URL); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取connection/span
con.header(USER_AGENT, USER_AGENT_VALUE); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 配置模拟浏览器/span
Response rs = con.execute(); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取响应/span
Document d1 = Jsoup.parse(rs.body()); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 通过Jsoup将返回信息转换为Dom树/span
ListElement eleList = d1.select("#casLoginForm"); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取提交form表单,可以通过查看页面源码代码得知
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取cooking和表单属性
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" lets make data map containing all the parameters and its values found in the
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" form/span
MapString, String datas = span style="color: rgba(0, 0, 255, 1)"new/span HashMapspan style="color: rgba(0, 0, 0, 1)"();
/spanspan style="color: rgba(0, 0, 255, 1)"for/span (Element e : eleList.get(0span style="color: rgba(0, 0, 0, 1)").getAllElements()) {
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 注意问题2:设置用户名 注意equals(这个username和password也是要去自己的登录界面input里找name值)/span
span style="color: rgba(0, 0, 255, 1)"if/span (e.attr("name").equals("username"span style="color: rgba(0, 0, 0, 1)")) {
e.attr(/span"value"span style="color: rgba(0, 0, 0, 1)", userName);
}
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 设置用户密码/span
span style="color: rgba(0, 0, 255, 1)"if/span (e.attr("name").equals("password"span style="color: rgba(0, 0, 0, 1)")) {
e.attr(/span"value"span style="color: rgba(0, 0, 0, 1)", pwd);
}
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 排除空值表单属性/span
span style="color: rgba(0, 0, 255, 1)"if/span (e.attr("name").length() > 0) {
datas.put(e.attr("name"), e.attr("value"));
}
}
/*
* 第二次请求,以post方式提交表单数据以及cookie信息
*/
Connection con2 = Jsoup.connect(
"http://authserver.tjut.edu.cn/ ... 6quot;);
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));
// }
return map;
}
// 实现切割某两个字之间的字符串
public static String findstr(String str1, String strstrat, String strend) {
String finalstr = new String();
int strStartIndex = str1.indexOf(strstrat);
int strEndIndex = str1.indexOf(strend);
finalstr = str1.substring(strStartIndex, strEndIndex).substring(strstrat.length());
return finalstr;
}
// 第一个,完整爬虫爬下来内容
public static void get_html_num(String url) throws Exception {
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爬虫(六)analyze AJAX接口获取网页动态内容 查看全部
一、实现原理
登录后,进行数据分析,准确抓取数据。
根据上一篇文章的代码,我们不仅获得了cookies,还获得了登录后返回的网页源代码。这时候有以下几种情况:
(1)如果我们需要的数据在登陆后返回的源码中,那么我们可以直接通过Jsoup解析源码,然后利用Jsoup的selector函数过滤掉我们需要的信息;<//p
p(2)如果需要通过请求源码中的链接获取需要的数据,那么我们会先解析源码找出url,然后带上cookie来模拟对这个url的请求。/p
p(3)如果源代码中根本没有我们需要的数据,那么我们可以忽略源代码。我们看浏览器,打开谷歌的网络,搜索分析所有的URL请求和响应结果,在一般接下来总能找到那个url(一般这个url是固定的url,参数可能不同),返回的数据就是我们期望的,然后我们模拟请求这个url,我们就可以用cookies请求了./p
p第一次写模拟登录的时候,总觉得数据必须在网页的源码中获取,所以当一个网页是一堆js组成的时候,傻眼了。那么我希望得到渲染网页的源码,你可以试试selenium,以后学习使用。/p
p二、详细实现过程/p
pprespan style="color: rgba(0, 0, 255, 1)"package/spanspan style="color: rgba(0, 0, 0, 1)" debug;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.util.HashMap;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.util.List;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.util.Map;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Connection;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Connection.Method;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Connection.Response;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Jsoup;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.nodes.Document;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.nodes.Element;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.io.IOException;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.select.Elements;
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"class/spanspan style="color: rgba(0, 0, 0, 1)" test {
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span String LOGIN_URL = "http://authserver.tjut.edu.cn/ ... Bspan style="color: rgba(0, 0, 0, 1)";
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span String USER_AGENT = "User-Agent"span style="color: rgba(0, 0, 0, 1)";
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span String USER_AGENT_VALUE = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0"span style="color: rgba(0, 0, 0, 1)";
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span span style="color: rgba(0, 0, 255, 1)"void/span main(String[] args) span style="color: rgba(0, 0, 255, 1)"throws/spanspan style="color: rgba(0, 0, 0, 1)" Exception {
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 模拟登陆github的用户名和密码
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" String url = "/spanspan style="color: rgba(0, 128, 0, 1); text-decoration: underline"http://ehall.tjut.edu.cn/publi ... nspan style="color: rgba(0, 128, 0, 1)"#/consultingList";/span
String url ="http://ehall.tjut.edu.cn/publi ... Bspan style="color: rgba(0, 0, 0, 1)";
get_html_num(url);
}
/spanspan style="color: rgba(0, 128, 0, 1)"/**/spanspan style="color: rgba(0, 128, 0, 1)"
* /spanspan style="color: rgba(128, 128, 128, 1)"@param/spanspan style="color: rgba(0, 128, 0, 1)" userName 用户名
* /spanspan style="color: rgba(128, 128, 128, 1)"@param/spanspan style="color: rgba(0, 128, 0, 1)" pwd 密码
* /spanspan style="color: rgba(128, 128, 128, 1)"@throws/spanspan style="color: rgba(0, 128, 0, 1)" Exception
/spanspan style="color: rgba(0, 128, 0, 1)"*//span
span style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span MapString, String simulateLogin(String userName, String pwd) span style="color: rgba(0, 0, 255, 1)"throws/spanspan style="color: rgba(0, 0, 0, 1)" Exception {
/spanspan style="color: rgba(0, 128, 0, 1)"/*/spanspan style="color: rgba(0, 128, 0, 1)"
* 第一次请求 grab login form page first 获取登陆提交的表单信息,及修改其提交data数据(login,password)
/spanspan style="color: rgba(0, 128, 0, 1)"*//span
span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" get the response, which we will post to the action URL(rs.cookies())/span
Connection con = Jsoup.connect(LOGIN_URL); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取connection/span
con.header(USER_AGENT, USER_AGENT_VALUE); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 配置模拟浏览器/span
Response rs = con.execute(); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取响应/span
Document d1 = Jsoup.parse(rs.body()); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 通过Jsoup将返回信息转换为Dom树/span
ListElement eleList = d1.select("#casLoginForm"); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取提交form表单,可以通过查看页面源码代码得知
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取cooking和表单属性
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" lets make data map containing all the parameters and its values found in the
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" form/span
MapString, String datas = span style="color: rgba(0, 0, 255, 1)"new/span HashMapspan style="color: rgba(0, 0, 0, 1)"();
/spanspan style="color: rgba(0, 0, 255, 1)"for/span (Element e : eleList.get(0span style="color: rgba(0, 0, 0, 1)").getAllElements()) {
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 注意问题2:设置用户名 注意equals(这个username和password也是要去自己的登录界面input里找name值)/span
span style="color: rgba(0, 0, 255, 1)"if/span (e.attr("name").equals("username"span style="color: rgba(0, 0, 0, 1)")) {
e.attr(/span"value"span style="color: rgba(0, 0, 0, 1)", userName);
}
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 设置用户密码/span
span style="color: rgba(0, 0, 255, 1)"if/span (e.attr("name").equals("password"span style="color: rgba(0, 0, 0, 1)")) {
e.attr(/span"value"span style="color: rgba(0, 0, 0, 1)", pwd);
}
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 排除空值表单属性/span
span style="color: rgba(0, 0, 255, 1)"if/span (e.attr("name").length() > 0) {
datas.put(e.attr("name"), e.attr("value"));
}
}
/*
* 第二次请求,以post方式提交表单数据以及cookie信息
*/
Connection con2 = Jsoup.connect(
"http://authserver.tjut.edu.cn/ ... 6quot;);
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));
// }
return map;
}
// 实现切割某两个字之间的字符串
public static String findstr(String str1, String strstrat, String strend) {
String finalstr = new String();
int strStartIndex = str1.indexOf(strstrat);
int strEndIndex = str1.indexOf(strend);
finalstr = str1.substring(strStartIndex, strEndIndex).substring(strstrat.length());
return finalstr;
}
// 第一个,完整爬虫爬下来内容
public static void get_html_num(String url) throws Exception {
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爬虫(六)analyze AJAX接口获取网页动态内容 查看全部
抓取ajax动态网页java(谷歌的network模拟请求和实现原理登录之后返回的网页源码)
一、实现原理
登录后,进行数据分析,准确抓取数据。
根据上一篇文章的代码,我们不仅获得了cookies,还获得了登录后返回的网页源代码。这时候有以下几种情况:
(1)如果我们需要的数据在登陆后返回的源码中,那么我们可以直接通过Jsoup解析源码,然后利用Jsoup的selector函数过滤掉我们需要的信息;<//p
p(2)如果需要通过请求源码中的链接获取需要的数据,那么我们会先解析源码找出url,然后带上cookie来模拟对这个url的请求。/p
p(3)如果源代码中根本没有我们需要的数据,那么我们可以忽略源代码。我们看浏览器,打开谷歌的网络,搜索分析所有的URL请求和响应结果,在一般接下来总能找到那个url(一般这个url是固定的url,参数可能不同),返回的数据就是我们期望的,然后我们模拟请求这个url,我们就可以用cookies请求了./p
p第一次写模拟登录的时候,总觉得数据必须在网页的源码中获取,所以当一个网页是一堆js组成的时候,傻眼了。那么我希望得到渲染网页的源码,你可以试试selenium,以后学习使用。/p
p二、详细实现过程/p
pprespan style="color: rgba(0, 0, 255, 1)"package/spanspan style="color: rgba(0, 0, 0, 1)" debug;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.util.HashMap;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.util.List;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.util.Map;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Connection;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Connection.Method;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Connection.Response;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.Jsoup;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.nodes.Document;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.nodes.Element;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" java.io.IOException;
/spanspan style="color: rgba(0, 0, 255, 1)"import/spanspan style="color: rgba(0, 0, 0, 1)" org.jsoup.select.Elements;
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"class/spanspan style="color: rgba(0, 0, 0, 1)" test {
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span String LOGIN_URL = "http://authserver.tjut.edu.cn/ ... Bspan style="color: rgba(0, 0, 0, 1)";
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span String USER_AGENT = "User-Agent"span style="color: rgba(0, 0, 0, 1)";
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span String USER_AGENT_VALUE = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0"span style="color: rgba(0, 0, 0, 1)";
/spanspan style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span span style="color: rgba(0, 0, 255, 1)"void/span main(String[] args) span style="color: rgba(0, 0, 255, 1)"throws/spanspan style="color: rgba(0, 0, 0, 1)" Exception {
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 模拟登陆github的用户名和密码
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" String url = "/spanspan style="color: rgba(0, 128, 0, 1); text-decoration: underline"http://ehall.tjut.edu.cn/publi ... nspan style="color: rgba(0, 128, 0, 1)"#/consultingList";/span
String url ="http://ehall.tjut.edu.cn/publi ... Bspan style="color: rgba(0, 0, 0, 1)";
get_html_num(url);
}
/spanspan style="color: rgba(0, 128, 0, 1)"/**/spanspan style="color: rgba(0, 128, 0, 1)"
* /spanspan style="color: rgba(128, 128, 128, 1)"@param/spanspan style="color: rgba(0, 128, 0, 1)" userName 用户名
* /spanspan style="color: rgba(128, 128, 128, 1)"@param/spanspan style="color: rgba(0, 128, 0, 1)" pwd 密码
* /spanspan style="color: rgba(128, 128, 128, 1)"@throws/spanspan style="color: rgba(0, 128, 0, 1)" Exception
/spanspan style="color: rgba(0, 128, 0, 1)"*//span
span style="color: rgba(0, 0, 255, 1)"public/span span style="color: rgba(0, 0, 255, 1)"static/span MapString, String simulateLogin(String userName, String pwd) span style="color: rgba(0, 0, 255, 1)"throws/spanspan style="color: rgba(0, 0, 0, 1)" Exception {
/spanspan style="color: rgba(0, 128, 0, 1)"/*/spanspan style="color: rgba(0, 128, 0, 1)"
* 第一次请求 grab login form page first 获取登陆提交的表单信息,及修改其提交data数据(login,password)
/spanspan style="color: rgba(0, 128, 0, 1)"*//span
span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" get the response, which we will post to the action URL(rs.cookies())/span
Connection con = Jsoup.connect(LOGIN_URL); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取connection/span
con.header(USER_AGENT, USER_AGENT_VALUE); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 配置模拟浏览器/span
Response rs = con.execute(); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取响应/span
Document d1 = Jsoup.parse(rs.body()); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 通过Jsoup将返回信息转换为Dom树/span
ListElement eleList = d1.select("#casLoginForm"); span style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取提交form表单,可以通过查看页面源码代码得知
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 获取cooking和表单属性
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" lets make data map containing all the parameters and its values found in the
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" form/span
MapString, String datas = span style="color: rgba(0, 0, 255, 1)"new/span HashMapspan style="color: rgba(0, 0, 0, 1)"();
/spanspan style="color: rgba(0, 0, 255, 1)"for/span (Element e : eleList.get(0span style="color: rgba(0, 0, 0, 1)").getAllElements()) {
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 注意问题2:设置用户名 注意equals(这个username和password也是要去自己的登录界面input里找name值)/span
span style="color: rgba(0, 0, 255, 1)"if/span (e.attr("name").equals("username"span style="color: rgba(0, 0, 0, 1)")) {
e.attr(/span"value"span style="color: rgba(0, 0, 0, 1)", userName);
}
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 设置用户密码/span
span style="color: rgba(0, 0, 255, 1)"if/span (e.attr("name").equals("password"span style="color: rgba(0, 0, 0, 1)")) {
e.attr(/span"value"span style="color: rgba(0, 0, 0, 1)", pwd);
}
/spanspan style="color: rgba(0, 128, 0, 1)"///spanspan style="color: rgba(0, 128, 0, 1)" 排除空值表单属性/span
span style="color: rgba(0, 0, 255, 1)"if/span (e.attr("name").length() > 0) {
datas.put(e.attr("name"), e.attr("value"));
}
}
/*
* 第二次请求,以post方式提交表单数据以及cookie信息
*/
Connection con2 = Jsoup.connect(
"http://authserver.tjut.edu.cn/ ... 6quot;);
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));
// }
return map;
}
// 实现切割某两个字之间的字符串
public static String findstr(String str1, String strstrat, String strend) {
String finalstr = new String();
int strStartIndex = str1.indexOf(strstrat);
int strEndIndex = str1.indexOf(strend);
finalstr = str1.substring(strStartIndex, strEndIndex).substring(strstrat.length());
return finalstr;
}
// 第一个,完整爬虫爬下来内容
public static void get_html_num(String url) throws Exception {
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爬虫(六)analyze AJAX接口获取网页动态内容
抓取ajax动态网页java(编辑收藏所属分类:Misc0.0.0.3)
网站优化 • 优采云 发表了文章 • 0 个评论 • 70 次浏览 • 2021-09-11 10:14
抓取ajax动态网页java(编辑收藏所属分类:Misc0.0.0.3)
之前发布的Krabber在执行Javascript后已经可以抓取网页了。
例如,新浪博客上的评论是在网页加载后通过JavaScript显示的。这样普通的爬虫plus是获取不到评论信息的。 Krabber 0.0.0.2 已经可以抓取将要执行的 JavaScript 网页,并在 JavaScript 执行后返回收录所需信息的网页 HTML。
现在的问题是网页上的很多内容需要用户交互才能显示结果。例如,基于基于 JavaScript 的评论结果的翻页。直接使用Krabber0.0.0.2只能得到第一页的结果。看到下面的评论,必须点击翻页,等待JavaScript执行后才能看到结果。所以,这个版本的主要目标是实现一个系统,可以模拟用户的动作,触发一些网页上的事件,比如点击下一页,然后抓取JavaScript执行结果。
此版本的 Krabber 0.0.0.3 Preview 已实现在网页上执行 AJAX 脚本。 Krabber0.0.0.3 Pre提供脚本执行机制,让信息抽取工具提供需要执行的内容,由Krabber执行,执行后的结果由克拉伯。
当然,当前的Preview在执行后是无法返回信息的,但是已经可以展示AJAX的执行过程了。有兴趣的可以看看这个原型系统。
Krabber 0.0.0.3 预览版由 pinlin:senior 编写,
发表于 2009-12-12 10:13 高级阅读(1774)评论(0)编辑采集类别:杂项) 查看全部
之前发布的Krabber在执行Javascript后已经可以抓取网页了。
例如,新浪博客上的评论是在网页加载后通过JavaScript显示的。这样普通的爬虫plus是获取不到评论信息的。 Krabber 0.0.0.2 已经可以抓取将要执行的 JavaScript 网页,并在 JavaScript 执行后返回收录所需信息的网页 HTML。
现在的问题是网页上的很多内容需要用户交互才能显示结果。例如,基于基于 JavaScript 的评论结果的翻页。直接使用Krabber0.0.0.2只能得到第一页的结果。看到下面的评论,必须点击翻页,等待JavaScript执行后才能看到结果。所以,这个版本的主要目标是实现一个系统,可以模拟用户的动作,触发一些网页上的事件,比如点击下一页,然后抓取JavaScript执行结果。
此版本的 Krabber 0.0.0.3 Preview 已实现在网页上执行 AJAX 脚本。 Krabber0.0.0.3 Pre提供脚本执行机制,让信息抽取工具提供需要执行的内容,由Krabber执行,执行后的结果由克拉伯。
当然,当前的Preview在执行后是无法返回信息的,但是已经可以展示AJAX的执行过程了。有兴趣的可以看看这个原型系统。
Krabber 0.0.0.3 预览版由 pinlin:senior 编写,
发表于 2009-12-12 10:13 高级阅读(1774)评论(0)编辑采集类别:杂项) 查看全部
抓取ajax动态网页java(编辑收藏所属分类:Misc0.0.0.3)
之前发布的Krabber在执行Javascript后已经可以抓取网页了。
例如,新浪博客上的评论是在网页加载后通过JavaScript显示的。这样普通的爬虫plus是获取不到评论信息的。 Krabber 0.0.0.2 已经可以抓取将要执行的 JavaScript 网页,并在 JavaScript 执行后返回收录所需信息的网页 HTML。
现在的问题是网页上的很多内容需要用户交互才能显示结果。例如,基于基于 JavaScript 的评论结果的翻页。直接使用Krabber0.0.0.2只能得到第一页的结果。看到下面的评论,必须点击翻页,等待JavaScript执行后才能看到结果。所以,这个版本的主要目标是实现一个系统,可以模拟用户的动作,触发一些网页上的事件,比如点击下一页,然后抓取JavaScript执行结果。
此版本的 Krabber 0.0.0.3 Preview 已实现在网页上执行 AJAX 脚本。 Krabber0.0.0.3 Pre提供脚本执行机制,让信息抽取工具提供需要执行的内容,由Krabber执行,执行后的结果由克拉伯。
当然,当前的Preview在执行后是无法返回信息的,但是已经可以展示AJAX的执行过程了。有兴趣的可以看看这个原型系统。
Krabber 0.0.0.3 预览版由 pinlin:senior 编写,
发表于 2009-12-12 10:13 高级阅读(1774)评论(0)编辑采集类别:杂项)