今天突发奇想,由于自己开发的项目是一个死的,任何东西都是自己发布的,因此是否可以实现一个简单爬虫,来让程序执行呢?
使用Jsoup来实现简单java网络爬虫。
Jsoup是一款Java的HTML解析器,主要用来对HTML代码的。他可以让你的java程序想JavaScript一样可以按标签查找你所需要的信息,Jsoup非常好的一点是即使网页中源码布局非常不规整,Jsoup都可以自动将HTML程序布局规整。Jsoup缺点就是,它只支持静态页面的爬取,比如今日头条,它是用js渲染得到的,就无法使用Jsoup来进行爬取了,这时需要使用Jsoup+HttpUnit来实现。 Jsoup使用文档:Jsoup开发指南
今天以搜狐新闻为例来爬取信息。
第一步导入Maven依赖:
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.2</version>
</dependency>
接下来示范代码,爬取的是搜狐新闻一部分的信息(并没有全部爬下来),主要是用法,实现代码如下(其中夹杂一下我的过程处理代码,比如for循环中的各个if语句,可以根据自己需求来设置):
package com.jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.*;
// 爬取搜狐新闻部分信息
public class JsoupTest {
public static void main(String[] args) throws IOException {
Document doc = Jsoup.connect("http://news.sohu.com/").get();
// 2.jsoup获取新闻<a>标签
Elements newsATags = doc.select("div.main-right")
.select("div.list16")
.select("ul")
.select("li")
.select("a");
for (Element element:newsATags){
String url=element.attr("href");
if(url.indexOf("//")==0 || url.indexOf("http://www.sohu.com/a/")<0)
continue;
String title=element.attr("title");
Document dm=Jsoup.connect(url).get();
Elements em=dm.select("p").select("img");
if(em==null || em.size()<1)
continue;
String img=em.get(0).attr("src");
if(img.indexOf("//")==0){
img=img.substring(2);
}
System.out.println("url: "+url+" title: "+title+" image: "+img);
}
}
}
输出结果如下:
url: http://www.sohu.com/a/335820336_123753 title: 港媒列示威者“十宗罪” 追问港铁为何“双标”对待 image: http://5b0988e595225.cdn.sohucs.com/images/20190823/bbd7b2428b4140bbbcd5700a8586d4f8.jpeg
url: http://www.sohu.com/a/335822258_162522 title: 内地游客在香港当街被抢 手及腹部受伤损失1万余元人民币 image: http://5b0988e595225.cdn.sohucs.com/images/20190823/75a02160ae204190aac9e9b0da421462.png
url: http://www.sohu.com/a/335777751_115479 title: 紧随脸书推特 YouTube删除210个涉港账号 image: http://5b0988e595225.cdn.sohucs.com/images/20190823/bcf3e8b456764af6a304fec6cc7dc9f2.jpeg
url: http://www.sohu.com/a/335802361_255783 title: 31省份低保标准公布:上海、北京、天津位居前三 image: http://5b0988e595225.cdn.sohucs.com/images/20190823/ea2815c332c3467abfec544afcf81404.jpeg
url: http://www.sohu.com/a/335758053_114988 title: 工信部:达量限速套餐等影响网速 4G至少还能用10年 image: http://5b0988e595225.cdn.sohucs.com/images/20190823/7e294992779f492e9de2d90be4195971.png
url: http://www.sohu.com/a/335694211_114731 title: 浦东新区消保委:上海迪士尼不接受调解 坚持翻包检查 image: http://5b0988e595225.cdn.sohucs.com/images/20190822/ac4b1e3ff1dd4808953bcc0901a85540.jpeg
url: http://www.sohu.com/a/335849077_260616 title: 大学老师不写论文都可以评教授?高校回应 image: http://5b0988e595225.cdn.sohucs.com/images/20190823/9514475ee6704639a893339e3408dcc0.jpeg
url: http://www.sohu.com/a/335820714_114988 title: 任正非:不会求美国放华为一马 不在贸易协议中委曲求全 image: http://5b0988e595225.cdn.sohucs.com/images/20190823/1926f19b3f514acfb66912476de88414.jpeg
url: http://www.sohu.com/a/335842974_313745 title: 河南被性侵坠亡女生家属:对方曾称愿赔200万了事 image: http://5b0988e595225.cdn.sohucs.com/images/20190823/eb81c99ce8ab45d093e0d065837ef1f3.jpeg
url: http://www.sohu.com/a/335818093_162522 title: 加拿大驻香港总领事馆:暂停本地雇员去中国内地 image: http://5b0988e595225.cdn.sohucs.com/images/20190823/32f8257bbbfd4e9f92acab71cb36133e.png
url: http://www.sohu.com/a/335826307_114988 title: “亚马孙雨林要烧没了” 一场虚假传播如何在全球掀起? image: http://5b0988e595225.cdn.sohucs.com/images/20190823/0b90fadb707440728375a352b99fc951.png
url: http://www.sohu.com/a/335789284_115376 title: 英国首相踩桌子让马克龙擦鞋?这张照片让网友吵翻了(图) image: http://5b0988e595225.cdn.sohucs.com/images/20190823/e7268e7ad6494ba6b6e38fb73734a940.jpeg
url: http://www.sohu.com/a/335751943_260616 title: 特朗普为何要购买格陵兰岛?或看上其军事价值和稀土 image: http://5b0988e595225.cdn.sohucs.com/images/20190823/0832d2f89b814eca865bd48a5263842a.jpeg
url: http://www.sohu.com/a/335726075_120044203 title: 哈尔滨一街道多个仓库被淹 商户:未接到水库泄洪通知 image: http://5b0988e595225.cdn.sohucs.com/images/20190823/8f6eb19b7578486c9f487f5fca0027c4.jpeg
url: http://www.sohu.com/a/335840681_260616 title: 四川丹巴警方通报“女子深夜当街遭男子踢打”:涉案人已到案 image: http://5b0988e595225.cdn.sohucs.com/images/20190823/51bd5080a5314c24ab0fb97266674db9.jpeg
等等。。。。。
在来一段爬取搜狐娱乐的爬虫代码(和上面一样只爬取一部分代码),实现如下:
package com.jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.*;
public class JsoupTest2 {
public static void main(String[] args) throws IOException {
Document document= Jsoup.connect("http://yule.sohu.com/").get();
Elements elements=document.select("div.passage-info");
for (Element element:elements){
String url=element.select("div.passage-content").select("a").attr("href");
if(url.indexOf("//")==0) url=url.substring(2);
url="http://"+url;
String title=element.select("div.passage-content").select("a").text();
String image=element.select("div.passage-image").select("img").attr("src");
if(image.indexOf("//")==0) image=image.substring(2);
int firstDot=image.indexOf("/");
String pre=image.substring(0,firstDot);
int lastDot=image.indexOf("images");
String end=image.substring(lastDot);
image="http://"+pre+"/"+end;
System.out.println("url: "+url+" title: "+title+" image: "+image);
}
System.out.println("OK...");
}
}
输出结果如下:
url: http://www.sohu.com/a/193472498_103758 title: 淡出谢娜晒照刷存在脖子戴金锁,但金锁范冰冰戴鸽子蛋,对比寒酸 image: http://5b0988e595225.cdn.sohucs.com/images/20190822/75529fb0f1004fc59a74e3cdc76ae204.jpg
url: http://www.sohu.com/a/335784170_220938 title: 为张翰减肥,把胡彦斌写在书里的郑爽,这次直接把张恒带进了节目 image: http://5b0988e595225.cdn.sohucs.com/images/20190823/52e6e3292ad54212aa6fac6c0bac3d7b.jpeg
url: http://www.sohu.com/a/335692224_424446 title: 郑爽与张翰同框是男友张恒特意安排,昔日感情如今已经彻底放下 image: http://5b0988e595225.cdn.sohucs.com/images/20190822/4295a9ef311547b7a247a7b87639da37.jpg
url: http://www.sohu.com/a/335763327_433773 title: 沈腾为儿子办周岁,“小狮子”可爱呆萌,老婆王琦发福似贾玲 image: http://5b0988e595225.cdn.sohucs.com/images/20190823/39b3112246924d6a8f5cd65c576607fb.jpeg
url: http://www.sohu.com/a/335627609_424446 title: 徐峥在线撒糖,表白妻子陶虹:陶虹是大家的,但我是她的私有财产 image: http://5b0988e595225.cdn.sohucs.com/images/20190822/2d3c77b52bff4033ab045d155ddddcf4.jpeg
等等。。。
OK,以上就是使用Jsoup实现的java爬虫,项目代码没办法在这展示,这里就用两个test类来简单实现一下。