说起网络爬虫,大家想起的估计都是 Python ,我在没有接触Java爬虫之前也是只听过python是为爬虫而生。不过俗话说的好:Java是世界最好的语言
于是我就在网上查询有关于Java爬虫的资料,不查不知道一查吓一跳,其实 Java 也能做网络爬虫并且还有专门的库,并且Java在某些复杂页面做爬虫还能做的非常好,在开源社区中有不少优秀的 Java 网络爬虫框架,例如 webmagic
Python 相对Java的优点:
- Python作为动态语言更适合初学编程者。Python可以让初学者把精力集中在编程对象和思维方法上,而不用去担心语法、类型等等外在因素。而Python清晰简洁的语法也使得它调试起来比Java简单的多。
- Python有一些Java没有的强大的架构。
- Python有非常强大的支持异步的框架如Eventlet Networking Library,而Java要实现这些功能要麻烦的多。也因此Python适合一些可扩展的后台应用。(但除此以外Python可扩展性是不如Java的)
- Python作为脚本语言,更适合开发小的应用,而且极其适合在应用发展初期时用来做原型
Python 相对Java的缺点:
- 由于Python的优点也无可避免会有牺牲------由于是动态语言,比Java还慢。
- Java很适合发展跨平台应用,几乎常见的电脑、智能机都能跑Java。而Python就不一样了——对于一般性的需求无论Java还是python都可以胜任。如需要模拟登陆、对抗防采集选择python更方便些,如果需要处理复杂的网页,解析网页内容生成结构化数据或者对网页内容精细的解析则可以选择Java。
不过我今天要讲的是Java中较为简单的爬虫方法:
1. 直接请求数据结构
2. 等网页渲染出明文内容后,从前端页面的内容抓取
直接请求数据结构
针对一些页面不复杂,数据简单并且没有加密的数据,我们可以直接通过F12查看该页面获取数据所调用的接口。然后直接请求数据结构,在爬虫中这种方法是最轻松的,例如:HttpClient、OKHttp、RestTemplate、Hutool
等网页渲染出明文内容后,从前端页面的内容抓取
Java针对于爬虫有一个专门的工具:Jsoup(官网地址:http://jsoup.org/ )。jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
示例:我们以bing的图片库为例
爬取我们哥哥的帅图
先引入jsoup依赖
<--maven 依赖-->
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.15.3</version>
</dependency>
Demo
@Test
void test() throws IOException {
//表示第几个图片开始
int current = 1;
//url地址
String url = "https://cn.bing.com/images/search?q=小黑子&first=" + current;
Document doc = Jsoup.connect(url).get();
//通过css选择器拿到数据
Elements elements = doc.select(".iuscp.isv");
List<Picture> pictures = new ArrayList<>();
for (Element element : elements) {
// 取图片地址(murl)
String m = element.select(".iusc").get(0).attr("m");
Map<String, Object> map = JSONUtil.toBean(m, Map.class);
String murl = (String) map.get("murl");
// System.out.println(murl);
// 取标题
String title = element.select(".inflnk").get(0).attr("aria-label");
// System.out.println(title);
Picture picture = new Picture();
picture.setTitle(title);
picture.setUrl(murl);
pictures.add(picture);
}
System.out.println(pictures);
}
使用在这方法主要就是先要去了解你所需要爬取的页面的css层级结构
最后:
注意,爬虫技术不能滥用,千万不要给别人的系统造成压力、不要侵犯他人权益!