一个简单的爬虫(1)
2016-01-11 21:01
309 查看
在学习了简单的java语法之后,练习使用java做一个简单的爬虫,将一个电影网页的电影介绍爬下来,首先需要了解爬虫是什么!
网络爬虫(简称爬虫,又名网页蜘蛛、网络机器人),是一种按照按照一定的规则,自动地抓取万维网信息的程序或者脚本。
在了解了网络爬虫的概念之后,我们需要知道如何去爬,首先我们需要获取到这些信息,如同我们访问网页请求链接返回我们需要的数据一样,我们需要首先获取到网页的信息,这里我们使用的是jsoup中从一个URL加载一个Document,这里的可以参考jsoup使用手册,事实上我们这里通过jsoup获取到的就是整个网页的源码,同时jsoup有许多处理此源码的方法,在这篇中用的是正则匹配来进行爬虫操作。
首先使用Document 的toString方法将Document文档全部转化为字符串,然后使用字符串进行相应的片段匹配。这里要用到了以下的匹配规则:Pattern reg_htm = Pattern.compile("<[^>]+>"); //用来匹配html标签,当我们匹配到一段主要信息之后,该短信息往往是包含一些html标签的,我们需要将这些html标签替换为空(即删除这些html标签) Pattern reg_name_ = Pattern.compile("·"); //用来匹配演员英文名称中的姓氏与名字之间的点,由于名字中间的点在html源码中是使用转义的字符的,所以得到的字符串也是·;所以我们仍需要对它进行替换回去 Pattern p = Pattern.compile("<span property=\"v:itemre.*</span>"); //该项目的匹配是采用html标签以及标签内的内容组合的方式进行匹配,匹配的内容是电影的名字,往往每一个字段对会有特殊的class或id以及一些特殊的属性,所以可以根据这些属性进行匹配。
上面是要进行匹配的一些正则及其用处,是一些要进行匹配的规则,接下来我们要对匹配的字符串进行处理,第一个处理就是摘取出匹配的部分,使用Pattern.match(String)进行匹配的查找,得到所有能够匹配的位置(实质上该方法返回值为Boolean类型,表明匹配成功或者匹配失败),然后使用.find()方法判断是否存在匹配的结果,然后依次取该结果,输出,当需要进行替换或者html代码需要进行删除时分别再次使用不同的正则进行匹配替换,最后输出结果,同时,还可利用Java I/O操作,将要输出的内容存成文件,方便下次查看。
下面是一个简单的豆瓣电影介绍的爬虫示例:package Jsoup; import org.jsoup.*; import org.jsoup.nodes.*; import javax.sound.midi.SysexMessage; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by zhuxinquan on 15-12-15. */ public class Test { public static void main(String[] args) throws IOException { Document doc = Jsoup.connect("http://movie.douban.com/subject/25809384/?from=showing").timeout(5000).get(); String html = doc.toString(); String s = ""; Pattern reg_htm = Pattern.compile("<[^>]+>"); Pattern reg_name_ = Pattern.compile("·"); Pattern p = Pattern.compile("<span property=\"v:itemre.*</span>"); Matcher m = p.matcher(html); while(m.find()){ s = m.group(0); } m = reg_htm.matcher(s); s = m.replaceAll(""); System.out.println(s); p = Pattern.compile("(?s)<span class=\"pl\">.*?</span></span>.*?<br />"); m = p.matcher(html); while (m.find()) { s = m.group(0); Matcher m1 = reg_htm.matcher(s); s = m1.replaceAll(""); m1 = reg_name_.matcher(s); s = m1.replaceAll("·"); System.out.println(s); } //System.out.println(html); p = Pattern.compile("(?s)(<span class=\"pl\">.*?<span property=\"v:genre\">.*?</span>\n" + " <br />)"); m = p.matcher(html); while (m.find()) { s = m.group(0); Matcher m1 = reg_htm.matcher(s); s = m1.replaceAll(""); m1 = reg_name_.matcher(s); s = m1.replaceAll("·"); System.out.println(s); } } }
!!初次尝试,错误之处望指正!!
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Python3写爬虫(四)多线程实现数据爬取
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- Scrapy的架构介绍
- PropertyChangeListener简单理解
- 爬虫笔记
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序