您的位置:首页 > 编程语言 > Python开发

Java爬虫爬取python百度百科词条及相关词条页面

2017-05-01 10:34 676 查看


Java爬虫爬取python百度百科词条及相关词条页面

本实例爬取关于python词条页面及关联词条页面的简介,把词条的简介写入txt文本中, 本实例效果:




实例基于使用第三方jar包Jsoup


1首先分析python词条页面:






可以发现其他词条的超链接都带有"/item"以及词条的简介都包含在class为lemma-summary的div里面。 超链接里面"/item"后面的字符串就是代表了那个词条的地址,所以处理的时候是这样:"https://baike.baidu.com"加上提取出来的字符串。
所以要想取得超链接以及简介的内容,可以有这两个处理方法:

处理超链接:
public  void parse_a(Document document,List<String> urls) throws IOException {
/*提取出href属性里面/item以及后面的字符*/
Elements links = document.select("[href*=/item]");
/*迭代输出,并且加入到url集合里面*/
for (Element link : links) {
String url  = "https://baike.baidu.com"+link.attr("href");
/*过滤掉重复的url地址*/
if (!urls.contains(url)) {
urls.add(url);
}
}
}


提取简介里面的内容:
public void parse_content(Document document,List<String> contents ) {
/*使用Jsoup里面的选择器,详细用法可以查看jsoup的官方文档*/
Elements links = document.select("div.lemma-summary");
for(Element link:links){
contents.add(link.text());
}

}


关于jsoup可以查看官方文档,简单易上手。

2通过url获取页面用于解析:


利用jsoup的Jsoup.connect(url).get()。

代码:
public static Document getDom(String url) throws IOException {
Document document = Jsoup.connect(url).get();
return document;
}


3URL管理器,本实例需要从当前页面获取超链接并且不断获取新的词条页面的URL

/*设置迭代顺序,从第一个开始迭代*/
int i=0;
public  void getNewURL(List<String> urls) throws IOException {
/*从url集合里面获取一个并且进行解析*/
Document document = ConnectNet.getDom(urls.get(i));
i+=1;
Elements links = document.select("[href*=/item]");
/*通过迭代循环,不断往url集合里面添加新的URL*/
for (Element link : links) {
String url  = "https://baike.baidu.com"+link.attr("href");
if(!urls.contains(url)) {
urls.add(url);
}
}

}


4储存数据,把获得的简介数据添加进txt文本中

public void store_contents(List<String> contents) throws IOException {
File file = new File("my6.txt");
FileWriter fileWriter = new FileWriter(file);
for(int i=0;i<contents.size();i++) {
fileWriter.write(contents.get(i));
/*换行和分隔*/
fileWriter.write("\r\n");
fileWriter.write("-----------");
fileWriter.write("\r\n");
fileWriter.flush();
}

}


下面贴出完整代码:


URL管理器:

package myspyder;

import java.io.IOException;
import java.util.List;

import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class URLManager {
/*设置迭代顺序,从第一个开始迭代*/ int i=0; public void getNewURL(List<String> urls) throws IOException { /*从url集合里面获取一个并且进行解析*/ Document document = ConnectNet.getDom(urls.get(i)); i+=1; Elements links = document.select("[href*=/item]"); /*通过迭代循环,不断往url集合里面添加新的URL*/ for (Element link : links) { String url = "https://baike.baidu.com"+link.attr("href"); if(!urls.contains(url)) { urls.add(url); } } }
}


存储类:

package myspyder;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

public class Store {

public void store_contents(List<String> contents) throws IOException { File file = new File("my6.txt"); FileWriter fileWriter = new FileWriter(file); for(int i=0;i<contents.size();i++) { fileWriter.write(contents.get(i)); /*换行和分隔*/ fileWriter.write("\r\n"); fileWriter.write("-----------"); fileWriter.write("\r\n"); fileWriter.flush(); } }
}


获取DOM对象类:

package myspyder;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class ConnectNet {

public static Document getDom(String url) throws IOException { Document document = Jsoup.connect(url).get(); return document; }

}


网页解析类:

package myspyder;

import java.io.IOException;
import java.net.CookieHandler;
import java.util.List;
import java.util.Set;

import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class ParseHtml {
int num=1;
public void parse_a(Document document,List<String> urls) throws IOException { /*提取出href属性里面/item以及后面的字符*/ Elements links = document.select("[href*=/item]"); /*迭代输出,并且加入到url集合里面*/ for (Element link : links) { String url = "https://baike.baidu.com"+link.attr("href"); /*过滤掉重复的url地址*/ if (!urls.contains(url)) { urls.add(url); } } }

public void parse_content(Document document,List<String> contents ) { /*使用Jsoup里面的选择器,详细用法可以查看jsoup的官方文档*/ Elements links = document.select("div.lemma-summary"); for(Element link:links){ contents.add(link.text()); } }

}


启动类:

package myspyder;

import java.io.IOException;
import java.net.URLStreamHandler;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class StartSpyder {

public static void main(String[] args) throws IOException {
/*根url,python词条页面*/
String rooturl = "http://baike.baidu.com/link?url=y9cRcLYxzn5I12dTAXUqJJuY50B0TVvsdkeqmHetkVfkRlXGxUa0tFL53dQwpSQaF7js4yRmTwLjqXyJN-hWWK";
Document rootdocument = Jsoup.connect(rooturl).get();
int index=1;
ParseHtml parseHtml = new ParseHtml();
ConnectNet connectNet = new ConnectNet();
Store store = new Store();
/*放置要迭代的url*/
List<String> urls = new ArrayList<>();
/*放置简介字符串*/
List<String> contents = new ArrayList<>();

parseHtml.parse_a(rootdocument, urls);
URLManager urlManager = new URLManager();
/*纯粹用来计数*/
int flag=1;
/*
* 首先判断url集合里面是否还有可以爬取的url,然后从中按照顺序获取一个URL
* 然后URL管理器继续进行添加新的url,从提取出的URL获取dom对象,进行解析,存入txt文本,
* 循环进行,直到没有新的url可以爬取。
*/
while(urls!=null) {
String url = urls.get(index-1);
index+=1;
urlManager.getNewURL(urls);
Document document = connectNet.getDom(url);
parseHtml.parse_content(document, contents);
store.store_contents(contents);
System.out.println("StartSpyder.main()");
System.out.println(flag);
flag+=1;
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: