1.基于Jsoup的爬虫实现:
Jsoup是一个不错的Html网页爬取和解析工具,根据其强大的功能和简洁的API实现很多功能,总结一下相关示例:
(1) 引入pom资源:
<!--jsoup 组件-->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.7.3</version>
</dependency>
(2) 页面抓取:
public class JsoupUtil {
/**
* 通过Jsoup获取文档信息
* @param url
* @return
* @throws IOException
*/
public static Document getDocument(String url) throws IOException {
return Jsoup.connect(url).timeout(3000).get();
}
public static Document getDocument(String url,boolean isIgnoreContentType) throws IOException {
return Jsoup.connect(url).ignoreContentType(isIgnoreContentType).timeout(5000).get();
}
/**
* 可以设置头信息
* @param url
* @param header
* @return
* @throws IOException
*/
public static Document getDocument(String url,Map<String,String> header) throws IOException {
Connection conn = Jsoup.connect(url);
for(Map.Entry<String, String> entry : header.entrySet()) {
conn.header(entry.getKey(), entry.getValue());
}
return conn.ignoreContentType(true).timeout(5000).get();
}
}
简述:一个页面抓取的工具类,比较简单,主要涉及页面的http访问以及解析。待爬取的页面情况很多在爬取的过程中遇到的问题总结如下:a.有些页面爬取有一些限制条件,比如http必须设置refer,或者必须设置cookie,这个需要分析浏览器的请求,补充相关http字段即可模拟浏览器的请求。b.有些文档的返回类型不能支持比如返回一个json类型的文档,这个时候就要设置ignoreContentType字段,才不会报错。
(3)页面的解析:
针对页面的解析,这就要求熟悉DOM的API结构了。主要是Xpath的语法。
//爬取 id=team_fight_table 的table标签,并且获取包含matchid的tr列表
Elements trList = doc.select("table[id=team_fight_table]").select("tr[matchid]");
//获取包含class=table_type 所有table信息,并且获取tbody子标签。
Elements tbodyList = doc.select("table[class=tab_style]").select("tbody");
//获取包含class=livejstjtable newlivetable 这2个class的div的标签信息。
List<String> tsInfo = doInternalParseTeam(doc,season,"div[class=livejstjtable newlivetable]")
//根据tag获取标签信息
Elements trList = doc.getElementsByTag("tr");
2.基于HTMLUnit爬虫的实现:
有些页面通过Jsoup是爬取不到的,比如微博的数据,因为有些页面是通过异步JS渲染的,即数据被爬取到之后需要在浏览器端执行一定的js逻辑才能将数据补充到页面上。因为JSOUP没有继承js执行引擎,所以异步的数据即使被抓回来也不能也不能用js渲染。所以需要用到更高级的HTMLUnit工具才行,HTMLUNIT是一个比较完备的组件,相当于java端的浏览器,其中包含了一个js和css执行引擎。具体实例代码如下:
package spider.common
import com.gargoylesoftware.htmlunit.html.HtmlPage
import com.gargoylesoftware.htmlunit.{BrowserVersion, WebClient}
import com.gargoylesoftware.htmlunit.util.Cookie
/**
* Created by jianying.wcj on 2015/1/9 0009.
*/
object HtmlUnit {
val wc = new WebClient(BrowserVersion.CHROME)
def init(cookie: Map[String,String]) {
for((k,v) <- cookie) {
wc.getCookieManager.addCookie(new Cookie("weibo.com",k,v))
}
wc.getCookieManager.setCookiesEnabled(true)
wc.getOptions.setJavaScriptEnabled(true)
wc.getOptions.setCssEnabled(true)
wc.getOptions.setRedirectEnabled(true)
wc.getOptions.setThrowExceptionOnScriptError(false)
wc.getOptions.setTimeout(5000)
//让js执行一会
wc.waitForBackgroundJavaScript(5000)
}
def getResponse(url : String) : HtmlPage = {
val page = wc.getPage(url).asInstanceOf[HtmlPage]
//wc.closeAllWindows()
page
}
}
pom地址:
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.15</version>
</dependency>
3.以上Jsoup和HtmlUnit两个爬去页面的部分示例代码,涉及的语言分别是java和scala。但是要是对爬虫的支持还是Python比较强大,Python的scrapy框架对爬虫做了很强大的支持,但是考虑到python在公司部署不叫苦难就没有,示例:http://blog.csdn.net/lantian0802/article/details/42687173