临近寒假,又有许多公司发布招聘信息。应用Jsoup可以轻松爬取得到招聘网的信息。
准备工具:
- Eclipse
- jsoup jar包
- 谷歌浏览器
jsoup的中文网:http://www.open-open.com/jsoup/
准备爬取的网址选好后,开启我们的工具Eclipse,新建一个项目。
新建一个包,然后新建一个Class。
将我们的jsoup包导入到工程中。
在main方法中加入以下代码。
String url = "https://www.liepin.com/zhaopin/"
+ "?init=-1&headckid=54e7fd2426d5126f&fromSea"
+ "rchBtn=2&sfrom=click-pc_homepage-centre_searchbo"
+ "x-search_new&ckid=54e7fd2426d5126f°radeFlag=0&key=java"
+ "&siTag=k_cloHQj_hyIn0SLM9IfRg~fA9rXquZc5IkJpXC-Ycixw&d_sfrom="
+ "search_fp&d_ckId=2bba84c7562115663835f8d46ae681f4&d_curPage=0&"
+ "d_pageSize=40&d_headId=2bba84c7562115663835f8d46ae681f4&curPage=0";
Document doc;
try {
doc = Jsoup.connect(url).get();//解析一个url并且返回该页面的html给doc
System.out.println(doc);
} catch (IOException e) {
e.printStackTrace();
}
运行之后会得到url页面的html。我们现在要做的就是从html中提取出我们想要的内容。
在谷歌浏览器中,打开url的页面,打开开发者工具(F12)。在左上角有个选择工具,点击后在页面上选择要提取的部分,点击后会定位到相应的html位置。
比如这里我要提取每个岗位的名字。
点击第一个,定位到的html如下
很明显,我们要提取的位置是红色箭头所指的位置。其所对应的标签是<h3 title=""…>这个标签。我们右键这一行
得到一串字符,这段字符表示的是这个标签的选择器
#sojob > div:nth-child(8) > div > div.job-content > div:nth-child(1) > ul > li:nth-child(1) > div > div.job-info > h3
虽然是一长串,但是要我们要用到的只有最后的div.job-info > h3
具体要怎么选择,如果不太了解HTML的话,可以把复制的选择器一个一个删除直到得到自己想要的内容。
但最好还是学习下html标签,这样可以快速定位到自己想要的标签。
我们回到Eclipse`,修改之前的代码为
String url = "https://www.liepin.com/zhaopin/"
+ "?init=-1&headckid=54e7fd2426d5126f&fromSea"
+ "rchBtn=2&sfrom=click-pc_homepage-centre_searchbo"
+ "x-search_new&ckid=54e7fd2426d5126f°radeFlag=0&key=java"
+ "&siTag=k_cloHQj_hyIn0SLM9IfRg~fA9rXquZc5IkJpXC-Ycixw&d_sfrom="
+ "search_fp&d_ckId=2bba84c7562115663835f8d46ae681f4&d_curPage=0&"
+ "d_pageSize=40&d_headId=2bba84c7562115663835f8d46ae681f4&curPage=0";
Document doc;
try {
doc = Jsoup.connect(url).get();//解析一个url并且返回该页面的html给doc
Elements name;//新建一个元素数组,放置的是每一个选择器的标签 内容
name = doc.select("#sojob > div:nth-child(8) > div > div.job-content > "
+ "div.job-info > h3");
System.out.println(name);
} catch (IOException e) {
e.printStackTrace();
}
运行后可以看到依旧是html语言,但是已经是得到我们想到的标签内容了,而不是全部页面的HTML语言。
我们要怎么得到我们想要的title中的内容呢?
很简单,这些标签内容都放置在name中,name是一个数组,每一行的html是数组里面的一项。
那么第一项就是name.get(0)
运行打印出发现还不是我们要的结果,我们要的结果是h3标签中的属性title中的文本。
Jsoup中的Document对象有个方法是取它对应的属性.attr("属性名")
那么修改成name.get(0).attr("title")
重新打印,是不是出现title中的文本信息了?
接着我们用一个循环就可以把全部信息打出来了。
public static void main(String[] args) {
String url = "https://www.liepin.com/zhaopin/"
+ "?init=-1&headckid=54e7fd2426d5126f&fromSea"
+ "rchBtn=2&sfrom=click-pc_homepage-centre_searchbo"
+ "x-search_new&ckid=54e7fd2426d5126f°radeFlag=0&key=java"
+ "&siTag=k_cloHQj_hyIn0SLM9IfRg~fA9rXquZc5IkJpXC-Ycixw&d_sfrom="
+ "search_fp&d_ckId=2bba84c7562115663835f8d46ae681f4&d_curPage=0&"
+ "d_pageSize=40&d_headId=2bba84c7562115663835f8d46ae681f4&curPage=0";
Document doc;
try {
doc = Jsoup.connect(url).get();//解析一个url并且返回该页面的html给doc
Elements name;//新建一个元素数组,放置的是每一个选择器的标签 内容
name = doc.select("div.job-info > h3");
for (int i = 0; i < name.size(); i++) {
System.out.println(name.get(i).attr("title"));
}
} catch (IOException e) {
e.printStackTrace();
}
}
至此,便全部完成了。如果需要爬取别的信息,只需要修改标签即可,不过有些网站用这种方法爬取是不行的,大部分还是可以的。
最后完整代码以及爬取的效果如下。
package main;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
public class Demo01 {
public static void main(String[] args) {
String url = "https://www.liepin.com/zhaopin/"
+ "?init=-1&headckid=54e7fd2426d5126f&fromSea"
+ "rchBtn=2&sfrom=click-pc_homepage-centre_searchbo"
+ "x-search_new&ckid=54e7fd2426d5126f°radeFlag=0&key=java"
+ "&siTag=k_cloHQj_hyIn0SLM9IfRg~fA9rXquZc5IkJpXC-Ycixw&d_sfrom="
+ "search_fp&d_ckId=2bba84c7562115663835f8d46ae681f4&d_curPage=0&"
+ "d_pageSize=40&d_headId=2bba84c7562115663835f8d46ae681f4&curPage=0";
Document doc;
try {
doc = Jsoup.connect(url).get();//解析一个url并且返回该页面的html给doc
Elements name;//新建一个元素数组,放置的是每一个选择器的标签 内容
Elements sal;
Elements address;
Elements href;
name = doc.select("div.job-info > h3");
sal = doc.select("div.job-info > p.condition.clearfix > span.text-warning");
address = doc.select("div.job-info > p.condition.clearfix > a");
href = doc.select("div.job-info > h3 > a");
for (int i = 0; i < name.size(); i++) {
System.out.println(name.get(i).attr("title")
+" "+sal.get(i).text()
+" "+address.get(i).text()
+" "+href.get(i).attr("href"));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}