爬虫简介

  1. 娱乐头条结构

  2. 爬虫的基础的概念
    2.1 什么是爬虫?

​ 网络爬虫本质上就是一个程序 或者 脚本, 网络爬虫按照一定规则获取互联网中信息(数据), 一般来说爬虫被分为三大模块: 获取数据 解析数据 保存数据
2.2 爬虫价值:
爬虫的价值本质就是获取数据的价值. 数据的价值越高, 爬虫的价值越高
•数据的价值: 一切皆为数据
•例如: 获取到了大量的用户信息(基本信息, 购物信息, 浏览信息):
–广告推荐 用户行为分析(用户画像)
•例如: 获取到了大量的商品的信息(基本信息, 价格):
–比价网
2.3 爬虫的分类:
常见分类有两种:
•通用爬虫: 指的获取互联网中所有的数据, 不局限于网站, 行业, 分类
•百度 谷歌
•垂直爬虫: 指的获取互联网中某一个网站, 某一个行业, 某一个分类下的数据
•慢慢买 笔趣阁
实际开发中: 一般书写那种爬虫
​ 垂直爬虫(数据分析处理)
2.4 爬虫的开发流程

•爬虫的执行流程:
•确定首页URL
•发送请求, 获取数据
•解析数据
•保存数据
3. 爬虫的三大模块:
3.1 发送请求, 获取数据
•回顾http请求:
•请求相关内容:
–请求行 : 请求方式 请求的URL 协议版本
–get 和 post 区别:
•get将请求参数放置在url的后面, 而 post将请求参数放置请求体中
•get请求不能无限制的拼接参数, post是没有限制的
•post相对而言要比get安全
–请求头:
–user-agent : 指定浏览器的内核版本
–cookie : 携带当前网站在浏览器中保存的cookie信息
–referer : 防盗链
–请求体
–只有post才有请求体, 请求参数
•响应相关内容:
–响应行: 状态码
–200
–302
–304
–404
–500
–响应头 :
–set-cookie : 服务器向浏览器写入cookie信息
–location : 指定重定向的URL路径
–响应体
–爬虫获取数据就是获取的响应体的内容
3.1.1 如何请求请求 ----> 原生jdk发送
•原生jdk发送get请求
//演示: 原生jdk发送get请求
public class JDKRequest {

public static void main(String[] args) throws Exception {
    //1.确定url
    String indexUrl = "http://www.ujiuye.com";

    //2.发送请求获取数据。
    //封装URL对象
    URL url = new URL(indexUrl);
    //获取连接
    HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();

    //设置请求方式
    urlConnection.setRequestMethod("GET");

    InputStream in = urlConnection.getInputStream();

    InputStreamReader inputStreamReader = new InputStreamReader(in, "GB2312");
    //字符缓冲流
    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    //字符串缓冲区
    StringBuilder stringBuilder = new StringBuilder();

    String len = null;
    //按行读
    while((len=bufferedReader.readLine())!=null){
        //追加到字符串缓冲区存放
        stringBuilder.append(len);
    }
    System.out.println(stringBuilder.toString());

    in.close();
}

}

•原生jdk发送post请求
// 模拟 原生jdk发送post请求
public class JDKPost {

public static void main(String[] args) throws Exception {
    //确定URL
    String indexUrl = "https://www.douban.com/";
    //发送请求获取数据
    //封装URL对象
    URL url = new URL(indexUrl);
    //获取连接
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    //设置请求方式
    connection.setRequestMethod("POST");
    //打开输出流
    connection.setDoOutput(true);
    //设置请求参数
    OutputStream out = connection.getOutputStream();
    out.write("username=liang&password=123".getBytes());

    //获取字节流
    InputStream in = connection.getInputStream();

    InputStreamReader inputStreamReader = new InputStreamReader(in, "UTF-8");
    //字符缓冲流
    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);``
    //字符串缓冲区
    StringBuilder stringBuilder = new StringBuilder();
    String len = null;
    //按行读
    while((len=bufferedReader.readLine())!=null){
        //追加到字符串缓冲区存放
        stringBuilder.append(len);
    }
    System.out.println(stringBuilder.toString());

    in.close();
}

}

3.1.2 使用httpClient发送请求

​ httpClient专为java发送http请求而生的, 如果要httpClient ,需要先进行导包

org.apache.httpcomponents
httpclient
4.5.6

•httpClient发送 get请求
//模拟 httpClient发送get请求
public class HttpClientGet {

public static void main(String[] args) throws Exception {
    //确定首页url
    String indexUrl = "http://www.ujiuye.com";

    //发送请求,获取数据
    //创建HttpClient对象
    CloseableHttpClient httpClient = HttpClients.createDefault();
    //创建http方法对象
    HttpGet httpGet = new HttpGet(indexUrl);
    //设置请求头
    httpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36");
    //发送请求,获取响应的数据
    CloseableHttpResponse response = httpClient.execute(httpGet);

    //获取请求的响应码
    if(response.getStatusLine().getStatusCode()==200){
        Header[] headers = response.getHeaders("Content-Type");
        //System.out.println(headers[0].getValue());
        //获取响应体
        HttpEntity httpEntity = response.getEntity();
        System.out.println(EntityUtils.toString(httpEntity,"GB2312"));
    }


}

}

•使用httpClient发送post请求
// 模拟httpClient发送post请求
public class HttpClientPost {

public static void main(String[] args) throws Exception{
    //1.确定URL
    String indexURl = "https://www.chsi.com.cn/";
    //2.发送请求,获取数据
    //创建请求方法对象
    HttpPost httpPost = new HttpPost(indexURl);
    //设置请求头
    httpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36");
    //设置请求体
    List list = new ArrayList();
    list.add(new BasicNameValuePair("username","liang"));
    list.add(new BasicNameValuePair("password","123"));
    HttpEntity requestEntity = new UrlEncodedFormEntity(list);
    httpPost.setEntity(requestEntity);
    //创建请求对象
    CloseableHttpClient httpClient = HttpClients.createDefault();
    //发送请求获取数据
    CloseableHttpResponse response = httpClient.execute(httpPost);
    //判断是否请求成功
    System.out.println(response.getStatusLine().getStatusCode());
    if(response.getStatusLine().getStatusCode()==200){
        HttpEntity entity = response.getEntity();
        System.out.println(EntityUtils.toString(entity,"UTF-8"));
    }
}

}

总结: httpClient使用步骤:
•导包
•确定首页URL
•创建httpClient对象: HttpClients.createDefault();
•4)设置请求方式: HttpGet HttpPost
•设置请求参数 和 请求头
•post设置参数:

      list.add(new BasicNameValuePair("username","rose"));
      list.add(new BasicNameValuePair("password","123"));
      HttpEntity entity = new UrlEncodedFormEntity(list);
      httpPost.setEntity(entity);

•发送请求, 获取响应对象CloseableHttpResponse response = httpClient.execute(get/post)
•获取数据:
•响应行 响应头 响应体
3.2 解析数据(HTML)
解析数据本质上就是在解析HTML文档,
•如何解析HTML文档呢?
•js 和 jQuery 就可以解析HTML文档, 但是js 和jQuery是前端的技术, 而目前HTML代码存储在java代码中, 故无法使用js和jQuery来解析HTML文档
•那么需要使用一种可以在java客户端来解析HTML文档的技术 —>jsoup

​ jsoup是一款java解析HTML文档的工具, 如果要使用jsoup 需要先进行导包

org.jsoup
jsoup
1.10.3

•jsoup在使用之前必须先获取到document对象
如何获取document对象
// 通过jsoup获取document的方式
public class JsoupDocument {

public static void main(String[] args) throws Exception {
    //1. 确定首页URL
    String indexUrl = "http://www.itcast.cn";

    //2. 发送请求获取数据

    //3. 解析数据:
    //3.1 获取document的方式一: 最常用的方式
    String html = "\n" +
            "\n" +
            "\n" +
            "    \n" +
            "    获取document的方式一\n" +
            "\n" +
            "\n" +
            "\n" +
            "\n" +
            "";
    Document document1 = Jsoup.parse(html);
    String title = document1.title();
    System.out.println(title);

    //3.2 获取document的方式二: 最简单的方式
    Document document2 = Jsoup.connect(indexUrl).get();
    //System.out.println(document2);

    //3.3 获取本地的HTML文件,转换document对象
    //Document document3 = Jsoup.parse(new File(""), "UTF-8");

    //3.4 指定一个HTML的片段, 获取document对象
    html = "获取document的第四种方式";
    Document document4 = Jsoup.parseBodyFragment(html);
    //Document document4 = Jsoup.parse(html);
    System.out.println(document4.text());
}

}
3.2.1 如何解析数据:
需求: 获取优就业首页中目前开设的所有的课程内容
•jsoup在进行解析HTML文档的时候提供了两套API:
•基于js的方式来解析HTML文档: 需要程序员熟悉js的API. 大大提高程序员的学习成本
•基于css或者jQuery的选择器来解析HTML文档:
–常用的选择器: id选择器 类选择器 元素选择器 层级选择器 属性选择器
•使用原生js的方式解析HTML文档
public class JsoupParse {
@Test
public void test1() throws Exception {
//获取文档对象
Document document = Jsoup.connect(“http://www.ujiuye.com”).get();
//获取所有的学科
//获取页面中的ul元素
Element ulEl = document.getElementsByClass(“nav_left”).get(0);
//获取ul下的所有的li
Elements lis = ulEl.getElementsByTag(“li”);
//循环lis
for (Element li : lis) {
Element a = li.getElementsByTag(“a”).get(0);
System.out.println(a.text());
}
}

•使用选择器的方式解析数据
@Test
public void test2() throws Exception {
//获取文档对象
Document document = Jsoup.connect(“http://www.ujiuye.com”).get();
//获取所有的学科
Elements elements = document.select(".nav_left>li>a>span");
for (Element element : elements) {
System.out.println(element.text());
}
}

总结: jsoup常用方法
•parse(String html) ; 获取document对象
•select(“选择器”); 根据指定的选择器获取元素
•text()/html(); 获取内容体的数据, text方法获取文本内容 html方法主要使用用来获取文本+html内容
•跳转首页
•attr(String key); 根据指定属性名称获取属性值
3.3 保存数据
目前将数据保存到MySQL 或者 文件中 , 后期数据保存到hadoop hbase
•如何保存到MySQL中:
•JDBC
•mybatis
•spring中JDBCTemplate

你可能感兴趣的:(爬虫)