使用Jsoup库编写java爬虫

  • Jsoup库能干什么?
  • Java类似的网络请求库
  • Jsoup库的常用命令
  • get
  • post
  • body/toString
  • execute
  • ignoreContentType
  • timeout
  • cookies


Jsoup库能干什么?

  • 从URL,文件或字符串中刮取并解析HTML
  • 查找和提取数据,使用DOM遍历或CSS选择器
  • 操纵HTML元素,属性和文本
  • 根据安全的白名单清理用户提交的内容,以防止XSS攻击
  • 输出整洁的HTML

Jsoup库是可以用于防止用户进行XSS的,但是本文主要讲爬虫相关,所以会跳过具体防止XSS攻击的代码

Java类似的网络请求库

  • java.net.URL Java自带的url链接库,简单的网页访问获取是没有问题的
  • org.apache.http.client 里面的方法比Jsoup全,但是Jsoup比较轻量化
  • com.squareup.okhttp…

至于为什么选择Jsoup: Java是有很多网络请求库的,写爬虫就是获取到别人网站的内容,然而到底选择哪个库的重要程度往往没有"懂得如何绕过防爬"这个思想重要的…但是本文属于如何编写简单的爬虫,所以选择的就是比较轻量级,容易入手的刚需型库

Jsoup库的常用命令

Jsoup真的很轻量级,他在入手的时候只需要了解他的入口命令就行了.然后从他的入口命令进行扩展就可以写出成熟的爬虫了:)

String res = Jsoup.connect(url)//get
				  .header(headers)//这里存放的可以是map也可以直接headers("user-agent","ua")
				  .timeout(5000)
				  .get()
				  .toString();
String res = Jsoup.connect(url)//post
	               .requestBody(json)
	               .ignoreContentType(true)
	               .cookie("toekn","gbfdlkglkdsflkdngdffxcv13")
	               .post()
	               .body()
	               .text();

这就是简单的获取到url的html了.然而爬虫要做的是对其进行筛选.这里有一个方便的方法,大家在用idea里面这个命令的时候,在入口方法 connect后面按一下提示,后面就是他的常用方法了.大家看一遍之后大概也能找到自己想用的功能.
从connect命令我们可以扩展到比较常用的(get/post/body/execute/timeout/cookie)

get

直接获取html.返回Docment类型,可以对返回值进行html解析.

Document res = Jsoup.connect(url).get();//根据实际情况,添加header与timeout
Element content = res .getElementById("text");//获取id为text的Element
Elements links = content.getElementsByTag("a");//获取所有a标签的Element,返回值可以直接foreach处理

post

get可以实现的post也可以实现,不过post要注意的是:post传值是通过"data"或者"requestBody"传的,直接看代码

Document doc = Jsoup.connect(url)//1.普通传参是键值对
  .data("param", "1")
  .post();
  Document doc = Jsoup.connect(url)//另类就是json了
 .requestBody(json)//json的字符串String
 .post();

body/toString

如果是希望通过正则解析网站的话,可以直接在get/post之后加上".body"或者"toString()"方法.返回的就是html的字符串类型.
万能正则表达式可以看下我的这篇 万能正则公式 获取两个字符串之间的字符串 适应大多数场景

execute

如果返回的是json建议用execute() 去执行.如果用get 去执行的话,返回来是一个 HTML 页面包裹的json.那挺麻烦的了

ignoreContentType

顾名思义 无视请求类型,如果你的Jsoup报错了,里面有concent type 相关的字眼,无脑加上这个方法就会完美解决了.

timeout

在任何地方编写的爬虫,都会出现timeout的报错,这个时候你可以选择:

  1. 延长超时的时间设置timeout(60),一分钟超时
  2. 自己造个轮子,timeout(5),超时后重试,设定重试次数
Integer retry = 2;//设定重试次数
Integer delay = 5;//设定重试等待时间
for(i=0;i<retry;i++){
	try{
	//Jsoup连接代码.....timeout(5)
	}catch{
	sleep(delay)//等待X秒
	}
}

cookies

部分网站会采取cookie的形式对访问者进行各种限制.
在编写爬虫的过程中,我们一般不会手动获取cookie,这太傻了.当然如果你的对手是淘宝,当我没说
cookie获取的场景有两种:

  1. 一般第一次get网站的时候会自动返回cookie.你用map将他保存起来,下次访问的时候传回去就行
  2. js生成的cookie,这种需要根据实际情况,逆向或者重现js进行破解了
    我们玩比较简单的,第一种场景
Map<String, String> cookies = null;
Response res = Jsoup.connect(url)//初次访问
					.timeout(30000)
					.execute();
cookies = res.cookies();
Response res2 = Jsoup.connect(url2)//访问需要cookie的地方那个
					.timeout(30000)
					.cookies(cookies)
					.execute();
}

就是那么简单.就是那么轻量.写你的爬虫吧 886