简单的说,爬虫的意思就是根据url访问请求,然后对返回的数据进行提取,获取对自己有用的信息。然后我们可以将这些有用的信息保存到数据库或者保存到文件中。如果我们手工一个一个访问提取非常慢,所以我们需要编写程序去获取有用的信息,这也就是爬虫的作用。
一、概念:
网络爬虫,也叫网络蜘蛛(Web Spider),如果把互联网比喻成一个蜘蛛网,Spider就是一只在网上爬来爬去的蜘蛛。网络爬虫就是根据网页的地址来寻找网页的,也就是URL。举一个简单的例子,我们在浏览器的地址栏中输入的字符串就是URL,例如:https://www.baidu.com/
URL就是同意资源定位符(Uniform Resource Locator),它的一般格式如下(带方括号[]的为可选项):
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
URL的格式由三部分组成:
(1)protocol:第一部分就是协议,例如百度使用的就是https协议;
(2)hostname[:port]:第二部分就是主机名(还有端口号为可选参数),一般网站默认的端口号为80,例如百度的主机名就是www.baidu.com,这个就是服务器的地址;
(3)path:第三部分就是主机资源的具体地址,如目录和文件名等。
网络爬虫就是根据这个URL来获取网页信息的。
二、java开发简单的爬虫:
1.利用httpclient访问url
maven地址:
<dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> <version>3.1</version> </dependency>
代码测试:
package cn.qlq.craw.httpClient; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.PostMethod; public class HttpClientCraw { public static void main(String[] a) throws Exception { HttpClient client = new HttpClient(); PostMethod postMethod = new PostMethod("http://qiaoliqiang.cn/"); // 防止中文乱码 postMethod.getParams().setContentCharset("utf-8"); // 3.设置请求参数 postMethod.setParameter("mobileCode", "13834786998"); postMethod.setParameter("userID", ""); // 4.执行请求 ,结果码 int code = client.executeMethod(postMethod); // 5. 获取结果 String result = postMethod.getResponseBodyAsString(); System.out.println("Post请求的结果:" + result); } }
结果:
Post请求的结果:<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>XXXXXXXXXXX</title>
<script src="JS/jquery-1.8.3.js"></script>
..........
关于httpclient的用法参考:http://www.cnblogs.com/qlqwjy/p/7554535.html
2.利用Jsoup简单的爬虫:
Jsoup是一个强大的HTML后端解析插件,利用它我们可以将获取到的内容转换成DOM树,然后像jQuery操作DOM一样进行选择以及修改DOM,我们可以非常方便的利用它的选择器方便的提取我们想要的信息并保存到数据库或者文本文件中。
在这篇只是简单的介绍一下其获取URL数据,下篇继续介绍利用选择器处理数据。
maven地址:
<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.9.2</version> </dependency>
代码测试:
package cn.qlq.craw.Jsoup; import java.io.IOException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; /** * 一个简单的利用Jsoup获取网站数据的信息 * @author liqiang * */ public class JsoupCraw { public static void main(String[] args) throws IOException { String url = "http://www.cnblogs.com/qlqwjy/p/7531579.html"; //直接获取DOM树 Document document = Jsoup.connect(url).get(); System.out.println(document.toString()); } }
结果:
<!doctype html> <html lang="zh-cn"> <head> ...
关于Jsoup的用法参考:http://www.cnblogs.com/qlqwjy/p/7531579.html
3.手工的一个爬虫,这个获取的页面的信息比较全:(HttpURLConnection 的使用)
package cn.qlq.craw.JsoupBoke; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class UrlCrawBoke { public static void main(String urlstr[]) throws IOException { InputStream is = doGet("http://www.cnblogs.com/qlqwjy/p/8721867.html"); String pageStr = inputStreamToString(is, "UTF-8"); is.close(); System.out.println(pageStr); } public static InputStream doGet(String urlstr) throws IOException { URL url= new URL(urlstr); HttpURLConnection conn= (HttpURLConnection) url.openConnection(); conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"); InputStream inputStream= conn.getInputStream(); return inputStream; } public static String inputStreamToString(InputStream is, String charset) throws IOException { byte[] bytes = new byte[1024]; int byteLength = 0; StringBuffer sb = new StringBuffer(); while((byteLength = is.read(bytes)) != -1) { sb.append(new String(bytes, 0, byteLength, charset)); } return sb.toString(); } }