使用jsoup抓取分页的问题 100
我想用jsoup抓取网页上指定的内容,一开始以为做好了,后面一看这个内容是分批加载网页显示的,也就是说我抓取的只是其中一部分,用jsoup或者其他工具能把其他分页的内容同...
我想用jsoup抓取网页上指定的内容,一开始以为做好了,后面一看这个内容是分批加载网页显示的,也就是说我抓取的只是其中一部分,用jsoup或者其他工具能把其他分页的内容同样抓取么?
如图,第一页的根据网页地址就可以直接抓取了,但是下一页呢,下下页呢? 展开
如图,第一页的根据网页地址就可以直接抓取了,但是下一页呢,下下页呢? 展开
5个回答
展开全部
这几天正在研究。废话不多说,直接上代码,自己研究的,通过迭代抓取。pageList就是抓取的分页页面的全部链接地址 。
其中Document doc = NetUtils.getDocument(url);是jsoup抓取页面的基本操作。
public class HtmlAnalsysTest3 {
static String url = "http://www.win4000.com/mt/huge.html";
public static void main(String[] args) {
analsysPage(url);
for(String hurl : pageList){
System.out.println(" hurl-->"+hurl);
}
}
//已经抓取的用来迭代过滤
static List<String> hisurl = new ArrayList<String>();
//所需要分页链接集合
static List<String> pageList = new ArrayList<String>();
private static void analsysPage(String url){
if(hisurl.contains(url)){
System.out.println("hisurl :"+hisurl.size());
return;
}
Document doc = NetUtils.getDocument(url);
if(doc==null){
System.out.println("doc is null "+url);
return;
}
hisurl.add(url);
String tag = "body a";
String attr = "abs:href";
String herfcontent = "mt/huge";//只筛选胡歌的连接
Elements elemens = doc.select(tag);
for(Element e : elemens){
String href = e.attr(attr);
if(!href.contains(herfcontent)){
continue;
}
//System.out.println("页面page :"+ href);
if(!pageList.contains(href)){
pageList.add(href);
}
analsysPage(href);//迭代抓取,迭代过程会自动找后后续的页面
}
}
}
最终结果输出:
hurl-->http://www.win4000.com/mt/huge_2.html
hurl-->http://www.win4000.com/mt/huge_1.html
hurl-->http://www.win4000.com/mt/huge_3.html
hurl-->http://www.win4000.com/mt/huge_4.html
hurl-->http://www.win4000.com/mt/huge_5.html
hurl-->http://www.win4000.com/mt/huge.html
其中Document doc = NetUtils.getDocument(url);是jsoup抓取页面的基本操作。
public class HtmlAnalsysTest3 {
static String url = "http://www.win4000.com/mt/huge.html";
public static void main(String[] args) {
analsysPage(url);
for(String hurl : pageList){
System.out.println(" hurl-->"+hurl);
}
}
//已经抓取的用来迭代过滤
static List<String> hisurl = new ArrayList<String>();
//所需要分页链接集合
static List<String> pageList = new ArrayList<String>();
private static void analsysPage(String url){
if(hisurl.contains(url)){
System.out.println("hisurl :"+hisurl.size());
return;
}
Document doc = NetUtils.getDocument(url);
if(doc==null){
System.out.println("doc is null "+url);
return;
}
hisurl.add(url);
String tag = "body a";
String attr = "abs:href";
String herfcontent = "mt/huge";//只筛选胡歌的连接
Elements elemens = doc.select(tag);
for(Element e : elemens){
String href = e.attr(attr);
if(!href.contains(herfcontent)){
continue;
}
//System.out.println("页面page :"+ href);
if(!pageList.contains(href)){
pageList.add(href);
}
analsysPage(href);//迭代抓取,迭代过程会自动找后后续的页面
}
}
}
最终结果输出:
hurl-->http://www.win4000.com/mt/huge_2.html
hurl-->http://www.win4000.com/mt/huge_1.html
hurl-->http://www.win4000.com/mt/huge_3.html
hurl-->http://www.win4000.com/mt/huge_4.html
hurl-->http://www.win4000.com/mt/huge_5.html
hurl-->http://www.win4000.com/mt/huge.html
展开全部
觉得吧~如果你想抓取网页分页信息可以使用第三方工具进行抓取,但是问题就来了,加入你是要自己程序实现的话,这样就很麻烦。所以建议自己实现比较好。因为分页内容,每一页都有一个特定的链接,而且很相似,就只有那个指定页数的参数不同而已。所以你可以先用遍历方式将每个网页抓取后解析,然后再存起来,这样比较实际点。
但是我建议你可以在客户端也使用分页模式,这样的话,根据需求去获取,就不会一下子请求的数据量太大。
但是我建议你可以在客户端也使用分页模式,这样的话,根据需求去获取,就不会一下子请求的数据量太大。
更多追问追答
追问
我也想这样,但是有些那些页面的页数不是固定的,有些10几页,有些45页,他们不固定,这不好搞 啊,一不小心就nullpoint了.我不知道这些网页是用什么语言生成的shtml文件,当我们访问时,服务器就给我们返回了结果,而且是它已经分页好的了.是否可以从服务器那边的找问题呢?
追答
这样其实很好解决的,你每次抓到网页后进行判断,假如说里面有你要的内容,就是说明这个网页是有数据的,假如说下个网页里面没有你要的东西,一般就是说明当前已经到了最后一页了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以这样,第一页的URL肯定是xxx/page_index=1这样的URL的,这个page_index就代表不同的页,所以只需要动态修改这个page_index就行了。
对于空指针的问题,可以考虑看看jsoup能否拿到状态码,只有等于200的时候才可以进行解析,或者捕捉异常、
对于空指针的问题,可以考虑看看jsoup能否拿到状态码,只有等于200的时候才可以进行解析,或者捕捉异常、
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
觉得吧~如果你想抓取网页分页信息可以使用第三方工具进行抓取,但是问题就来了,加入你是要自己程序实现的话,这样就很麻烦。所以建议自己实现比较好。因为分页内容,每一页都有一个特定的链接,而且很相似,就只有那个指定页数的参数不同而已。所以你可以先用遍历方式将每个网页抓取后解析,然后再存起来,这样比较实际点。
但是我建议你可以在客户端也使用分页模式,这样的话,根据需求去获取,就不会一下子请求的数据量太大。
但是我建议你可以在客户端也使用分页模式,这样的话,根据需求去获取,就不会一下子请求的数据量太大。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
{public List<String> analysePage(String url, int startPage, int endpage) throws Exception { int endPage = 0;
List<String> links = new ArrayList<String>(); try { if (startPage<=1) {
url = "http://land.fang.com/market/________1_0_1.html";
}else {
url = "http://land.fang.com/market/________1_0_"+startPage+".html";
} // 通过过滤器过滤出<A>标签 Parser parser = new Parser(url);
NodeList nodeList = parser
.extractAllNodesThatMatch(new NodeFilter()
{ // 实现该方法,用以过滤标签 public boolean accept(Node node)
{ if (node instanceof LinkTag)// 标记 return true; return false;
}
}); // 打印 String tempPage =""; for (int i = 97; i < nodeList.size(); i++)
{
LinkTag n = (LinkTag) nodeList.elementAt(i); // System.out.print(n.getStringText() + " ==>> "+n.extractLink().length()+"=="+i+"=="); if(n.extractLink().length()==69&&n.extractLink().contains("http://land.fang.com/market/")){
links.add(n.extractLink());
System.out.println(n.extractLink());
}
String title = n.getStringText(); if(isNumeric(title)){
endPage = Integer.parseInt(title)+1;
} if(isNumeric(tempPage)&&!isNumeric(title)){ break;
}
tempPage = title;
} //System.out.print(endPage+"--2222--"+links.size()); } catch (Exception e)
{
e.printStackTrace();
} if (startPage < endpage&& endpage<=endPage) {
links.addAll(analysePage(url, startPage + 1, endpage));
} for (int i=0;i<links.size();i++){ getData(links.get(i));
} return links;
} public static void getData(String introUrl){ try {
Document doc = Jsoup.connect(introUrl).get();
Elements newsHeadlines = doc.getElementsByClass("tablebox02 mt10");
Elements bianhao = doc.getElementsByClass("menubox01 mt20");
System.out.println(getSplitValue(bianhao.get(0).getElementsByTag("span").text(),":",1));
Element element = newsHeadlines.get(0).child(0);
System.out.println(element.child(0).child(0).child(1).text()); //地区 System.out.println(element.child(0).child(1).child(1).text()); //所在地 System.out.println(element.child(1).child(0).child(1).text()); //总面积 System.out.println(element.child(1).child(1).child(1).text()); // 建设用地面积 System.out.println(element.child(2).child(0).child(1).text()); //规划建筑面积 System.out.println(element.child(2).child(1).child(1).text()); //代征面积 System.out.println(getSplitValue(element.child(3).child(0).text(),":",1)); //容积率 System.out.println(getSplitValue(element.child(3).child(1).text(),":",1)); //绿化率 System.out.println(getSplitValue(element.child(4).child(0).text(),":",1)); //商业比例 System.out.println(getSplitValue(element.child(4).child(1).text(),":",1)); // 建筑密度 System.out.println(getSplitValue(element.child(5).child(0).text(),":",1)); //限制高度 System.out.println(getSplitValue(element.child(5).child(1).text(),":",1)); //出让形式 System.out.println(getSplitValue(element.child(6).child(0).text(),":",1)); //出让年限 System.out.println(getSplitValue(element.child(6).child(1).text(),":",1)); //位置 System.out.println(getSplitValue(element.child(7).child(0).getElementsByAttribute("title").text(),":",1)); //标题 System.out.println(getSplitValue(element.child(7).child(1).child(1).text(),">>",0)); //规划用途 System.out.println("=========================");
} catch (IOException e) {
e.printStackTrace();
}
} public static void main(String[] args) throws Exception { new test().analysePage("http://land.fang.com/market/________1_0_1.html",1,1); // getDownloadUrl("http://land.fang.com/market/37eae58c-c701-4e4f-b1af-3e0c8e3be1c6.html"); } public static String getSplitValue(String value,String cha,int index){
String [] strings = value.split(cha); if (strings.length>index){ return strings[index].trim();
}else { return strings[0].trim();
}
}
}
List<String> links = new ArrayList<String>(); try { if (startPage<=1) {
url = "http://land.fang.com/market/________1_0_1.html";
}else {
url = "http://land.fang.com/market/________1_0_"+startPage+".html";
} // 通过过滤器过滤出<A>标签 Parser parser = new Parser(url);
NodeList nodeList = parser
.extractAllNodesThatMatch(new NodeFilter()
{ // 实现该方法,用以过滤标签 public boolean accept(Node node)
{ if (node instanceof LinkTag)// 标记 return true; return false;
}
}); // 打印 String tempPage =""; for (int i = 97; i < nodeList.size(); i++)
{
LinkTag n = (LinkTag) nodeList.elementAt(i); // System.out.print(n.getStringText() + " ==>> "+n.extractLink().length()+"=="+i+"=="); if(n.extractLink().length()==69&&n.extractLink().contains("http://land.fang.com/market/")){
links.add(n.extractLink());
System.out.println(n.extractLink());
}
String title = n.getStringText(); if(isNumeric(title)){
endPage = Integer.parseInt(title)+1;
} if(isNumeric(tempPage)&&!isNumeric(title)){ break;
}
tempPage = title;
} //System.out.print(endPage+"--2222--"+links.size()); } catch (Exception e)
{
e.printStackTrace();
} if (startPage < endpage&& endpage<=endPage) {
links.addAll(analysePage(url, startPage + 1, endpage));
} for (int i=0;i<links.size();i++){ getData(links.get(i));
} return links;
} public static void getData(String introUrl){ try {
Document doc = Jsoup.connect(introUrl).get();
Elements newsHeadlines = doc.getElementsByClass("tablebox02 mt10");
Elements bianhao = doc.getElementsByClass("menubox01 mt20");
System.out.println(getSplitValue(bianhao.get(0).getElementsByTag("span").text(),":",1));
Element element = newsHeadlines.get(0).child(0);
System.out.println(element.child(0).child(0).child(1).text()); //地区 System.out.println(element.child(0).child(1).child(1).text()); //所在地 System.out.println(element.child(1).child(0).child(1).text()); //总面积 System.out.println(element.child(1).child(1).child(1).text()); // 建设用地面积 System.out.println(element.child(2).child(0).child(1).text()); //规划建筑面积 System.out.println(element.child(2).child(1).child(1).text()); //代征面积 System.out.println(getSplitValue(element.child(3).child(0).text(),":",1)); //容积率 System.out.println(getSplitValue(element.child(3).child(1).text(),":",1)); //绿化率 System.out.println(getSplitValue(element.child(4).child(0).text(),":",1)); //商业比例 System.out.println(getSplitValue(element.child(4).child(1).text(),":",1)); // 建筑密度 System.out.println(getSplitValue(element.child(5).child(0).text(),":",1)); //限制高度 System.out.println(getSplitValue(element.child(5).child(1).text(),":",1)); //出让形式 System.out.println(getSplitValue(element.child(6).child(0).text(),":",1)); //出让年限 System.out.println(getSplitValue(element.child(6).child(1).text(),":",1)); //位置 System.out.println(getSplitValue(element.child(7).child(0).getElementsByAttribute("title").text(),":",1)); //标题 System.out.println(getSplitValue(element.child(7).child(1).child(1).text(),">>",0)); //规划用途 System.out.println("=========================");
} catch (IOException e) {
e.printStackTrace();
}
} public static void main(String[] args) throws Exception { new test().analysePage("http://land.fang.com/market/________1_0_1.html",1,1); // getDownloadUrl("http://land.fang.com/market/37eae58c-c701-4e4f-b1af-3e0c8e3be1c6.html"); } public static String getSplitValue(String value,String cha,int index){
String [] strings = value.split(cha); if (strings.length>index){ return strings[index].trim();
}else { return strings[0].trim();
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询