5 HttpClient + Jsoup 爬虫案例一:环境搭建

  • HttpClient:抓取数据
  • Jsoup:解析数据

案例:抓取京东手机数据

1 需求分析

首先访问京东,搜索手机,分析页面,我们抓取以下的商品数据:商品图片、价格、标题、商品详情页

SPUSKU

  • SPU:标准产品单位。
    是商品信息聚合的最小单位,是一组可复用、易检索的标准信息的集合,该集合描述来一个产品的特性。
    例如:苹果8手机,就是一个 SPU
  • SKU:库存量单位。
    即库存进出计量的单位,可以是件、盒等为单位。
    例如:红色苹果8,就是一个 SKU

2 环境准备

2.1 数据库表

存储爬虫出来的数据:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for jd_item
-- ----------------------------
DROP TABLE IF EXISTS `jd_item`;

CREATE TABLE `jd_item` (
  `id` BIGINT(10) NOT NULL AUTO_INCREMENT COMMENT '主键id',
	`spu` BIGINT(15) DEFAULT NULL COMMENT '商品集合id',
	`sku` BIGINT(15) DEFAULT NULL COMMENT '商品最小品类单元id',
	`title` VARCHAR(100) DEFAULT NULL COMMENT '商品标题',
	`price` DOUBLE(10,2) DEFAULT NULL COMMENT '商品价格',
	`pic` VARCHAR(200) DEFAULT NULL COMMENT '商品图片',
	`url` VARCHAR(200) DEFAULT NULL COMMENT '商品详情地址',
	`created` DATETIME DEFAULT NULL COMMENT '创建时间',
	`updated` DATETIME DEFAULT NULL COMMENT '更新时间',
	PRIMARY KEY (`id`),
	KEY `sku` (`sku`) USING BTREE
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='京东商品表';

注意:建表语句里面的字段名 不是单引号,而是 `

2.2 添加依赖

使用 Spring Boot + Spring Data JPA + 定时任务 进行开发:


<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>

    <groupId>cn.ysgroupId>
    <artifactId>crawler-jdartifactId>
    <version>1.0-SNAPSHOTversion>

    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.0.1.RELEASEversion>
    parent>

    <dependencies>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>

        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-data-jpaartifactId>
        dependency>

        
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
        dependency>

        
        <dependency>
            <groupId>org.apache.httpcomponentsgroupId>
            <artifactId>httpclientartifactId>
        dependency>

        
        <dependency>
            <groupId>org.jsoupgroupId>
            <artifactId>jsoupartifactId>
            <version>1.11.3version>
        dependency>

        
        <dependency>
            <groupId>org.apache.commonsgroupId>
            <artifactId>commons-lang3artifactId>
        dependency>
        
        
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <scope>providedscope>
        dependency>
    dependencies>

project>

2.3 配置文件 application.yml

spring:
  datasource: # MySQL 配置
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://120.78.134.111:3306/crawler?useUnicode=true&characterEncoding=utf-8
    username: root
    password: 123456
  jpa: # JPA 配置
    database: mysql
    show-sql: true

2.4 编写 启动项、pojo、dao、service

package cn.ys.jd;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
//使用定时任务需要开启注解
@EnableScheduling
public class JdApp {
    
    public static void main(String[] args) {
        SpringApplication.run(JdApp.class);
    }
}

package cn.ys.jd.pojo;

import lombok.Data;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;

/**
 * jd_item 对应的实体类
 *
 * @author yangshuo
 */
@Entity
@Table(name = "jd_item")
@Data
public class Item implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private Long spu;
    private Long sku;
    private String title;
    private Double price;
    private String pic;
    private String url;
    private Date created;
    private Date updated;
}

package cn.ys.jd.dao;

import cn.ys.jd.pojo.Item;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ItemDao extends JpaRepository<Item, Long> {
}

package cn.ys.jd.service;

import cn.ys.jd.pojo.Item;

import java.util.List;

public interface ItemService {

    /**
     * 保存商品
     * @param item
     */
    public void save(Item item);

    /**
     * 根据条件查询商品
     * @param item
     * @return
     */
    public List<Item> findAll(Item item);
}

package cn.ys.jd.service.impl;

import cn.ys.jd.dao.ItemDao;
import cn.ys.jd.pojo.Item;
import cn.ys.jd.service.ItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class ItemServiceImpl implements ItemService {

    @Autowired
    private ItemDao itemDao;

    @Override
    @Transactional
    public void save(Item item) {
        itemDao.save(item);
    }

    @Override
    public List<Item> findAll(Item item) {
        //声明查询条件
        Example<Item> example = Example.of(item);

        //根据查询条件进行查询
        List<Item> list = itemDao.findAll(example);

        return list;
    }
}

测试:启动程序,不报错!

你可能感兴趣的:(#,4,网络爬虫)