什么是网络爬虫?
维基百科
网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人。其目的一般为编纂网络索引。
百度百科
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
java网络爬虫练习项目
一个比较简单的java练习项目。
需要知识
- 什么是网络爬虫
- Java基础
- 正则表达式
项目思路
在慕课网的猿问页面,寻找一个你喜欢的问题页面,利用http请求获取问题页面的源码,然后通过正则表达式,不断爬取相关问题页面。
项目介绍
该项目存在三个类
Imooc.java :
imooc问题bean类
Spider.java:
封装用来爬取页面的方法类
Main.java:
运行起始页面
- Imooc.java类是要爬取内容的对象类,属性成员有问题,问题链接,问题描述,答案列表和下一个问题链接。
package bean;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import spider.Spider;
/**
* 单个问题页面对象
* @author hjy
*
*/
public class Imooc {
public String question;
public String quesUrl;
public String quesDescription;
public Map<String,String> answers;
public String nextUrl;
public Imooc(String url) {
question="";
quesUrl=url;
quesDescription="";
answers = new HashMap<String,String>();
nextUrl="";
// 获取单个问题页面源码
String codeSource = Spider.getSource(url);
// 正则表达式获取question
Pattern pattern=Pattern.compile("js-qa-wenda-title.+?>(.+?)</h1>");
Matcher matcher=pattern.matcher(codeSource);
if(matcher.find()){
question = matcher.group(1);
}
// 正则表达式获取问题描述
pattern=Pattern.compile("js-qa-wenda.+?rich-text\">(.+?)</div>");
matcher=pattern.matcher(codeSource);
if(matcher.find()){
quesDescription = matcher.group(1).replace("<p>", "").replace("</p>", "");
}
// 正则表达式获取答案列表
pattern=Pattern.compile("detail-name.+?>(.+?)</a>.+?answer-content.+?>(.+?)</div>");//获取回答者name
matcher=pattern.matcher(codeSource);
while(matcher.find()){
String answer = matcher.group(2).replace("<p>", "");
answer = answer.replace("</p>", "");
answer = answer.replace("<br />", "");
answers.put(matcher.group(1),answer);
}
// 正则表达式获取下一个url 爬取获取相关问题的url
pattern=Pattern.compile("class=\"relwenda\".+?href=\"(.+?)\".+?</a>");//获取回答者name
matcher=pattern.matcher(codeSource);
while(matcher.find()){
nextUrl="http://www.imooc.com"+matcher.group(1);
// 防止相关文题是本问题无线循环下去
if(!nextUrl.equals(quesUrl)){
break;
}
}
}
@Override
public String toString() {
return "问题为:"+ question +"\n问题地址为:"+quesUrl+
"\n问题的表述为:"+quesDescription+"\n"
+ "回答的内容为:"+answers+"\n指向下一个链接地址为:"+nextUrl+"\n";
}
// 测试方法
public static void main(String[] args) {
String url = "http://www.imooc.com/wenda/detail/345010";
Imooc imooc = new Imooc(url);
System.out.println(imooc);
}
}
- Spider.java类封装了2个可能用到的方法,getSource方法获取网页源代码和getImoocPage获取页面Url列表。
package spider;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import bean.Imooc;
/**
* 1.获取网页源码
*
*/
public class Spider {
/**
* 获取网页源代码
* @param url 网址
* @return
*/
public static String getSource(String url){
BufferedReader reader=null;
String result = "";
try {
URL realUrl = new URL(url);
// 打开和url之间的连接
URLConnection conn = realUrl.openConnection();
reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line="";
while((line=reader.readLine())!=null){
result+=line;
}
// System.out.println(result);
if(reader!=null)
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
// 测试是否获得慕课问答页面源码
// 测试是否获取问题的url
public static void main(String[] args) {
String url = "http://www.imooc.com/wenda";
String regex = "class=\"content\".+?href=\"(.+?)\".+?</a>";
String result = getSource(url);
List<String> wendaUrl = getImoocPage(result,regex);
System.out.println(wendaUrl);
}
// 没有用到
/**
* 获取问题页面url
* @param quesSource 页面源码
* @param regex 匹配正则表达式
* @return
*/
public static List<String> getImoocPage(String quesSource,String regex){
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(quesSource);
List<String> quesUrl = new ArrayList<String>();
while(matcher.find()){
String url = "http://www.imooc.com"+matcher.group(1);
quesUrl.add(url);
}
// System.out.println(quesUrl);
return quesUrl;
}
}
- Main.java类
package main;
import java.util.ArrayList;
import java.util.List;
import bean.Imooc;
public class Main {
public static void main(String[] args) {
String url = "http://www.imooc.com/wenda/detail/345252";
// List<Imooc> imoocs = new ArrayList<Imooc>();
Imooc imooc;
// 限定爬取数量
for(int i=0; i<5;i++){
imooc = new Imooc(url);
// imoocs.add(imooc);
url = imooc.nextUrl;
System.out.println(imooc);
}
}
}
项目源码
IMOOCSpider项目已上传到我的github上----传送门
欢迎Star
下载下来后导入eclipse即可运行。
热门评论
你好,我导入MyEclipce中出现了两个错误在main中....(1)new Imooc(url),错误提示The constructor Imooc(String) is undefined (2)imooc.nextUrl 错误提示nextUrl cannot be resolved or is not a field