[Javaコード]Jingdong製品のすべての分類データ(テーブル構築ステートメント+ Jarパッケージ依存関係+ツリー構造パッケージング+クローラーソースコード)を取得します。これには、csvおよびsql形式のデータダウンロードが含まれます。

この記事は、「新人クリエーションセレモニー」イベントに参加し、一緒にゴールドクリエーションの道を歩み始めました。

【リソースリンク】

リンク:pan.baidu.com/s/15fuerPIQ…

抽出コード:6psl

【ファイルを含める】

ここに画像の説明を挿入

1.説明

現在のプロジェクトでは製品分類データを使用する必要があります。インターネットで淘宝網とJingdongのホームページを確認したところ、Jingdongwww.jd.com /allSort.asp…のデータを入手しやすくなっています。

ここに画像の説明を挿入

2.実現する

2.1テーブルステートメントの作成

プロジェクトはGreenPlumデータベースを使用し、他のタイプのデータベーステーブル作成パートナーは自分でそれを行うことができます:smile:

-- 建表
CREATE TABLE "data_commodity_classification" ( 
"id" VARCHAR ( 32 ), 
"parent_id" VARCHAR ( 32 ), 
"level" int2, 
"name" VARCHAR ( 64 ), 
"merger_name" VARCHAR ( 255 ) 
);
-- 注释
COMMENT ON TABLE "data_commodity_classification" IS '3级商品分类数据表';
COMMENT ON COLUMN "data_commodity_classification"."level" IS '类别等级';
COMMENT ON COLUMN "data_commodity_classification"."name" IS '商品分类';
COMMENT ON COLUMN "data_commodity_classification"."merger_name" IS '商品类别组合名';
复制代码

2.2Jarパッケージの依存関係

jsoup必須です。プロジェクトはmybatis-plus、オブジェクトを保存するときに呼び出すことができるメソッドを使用します。必須で.saveBatch()はありません。

<!--不用纠结于版本-->
<dependency>
	<groupId>org.jsoup</groupId>
	<artifactId>jsoup</artifactId>
	<version>1.10.2</version>
</dependency>
<!--不是必须的-->
<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-boot-starter</artifactId>
	<version>3.3.0</version>
</dependency>
复制代码

2.3オブジェクトのカプセル化

lombokこれは、オブジェクトを作成builderするときにコードを単純化するために使用されます。

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="DataCommodityClassification对象", description="")
@Builder
public class DataCommodityClassification implements Serializable {
    private static final long serialVersionUID=1L;
    private String id;
    private String parentId;
    @ApiModelProperty(value = "类别等级")
    private Integer level;
    @ApiModelProperty(value = "商品分类")
    private String name;
    @ApiModelProperty(value = "商品类别组合名")
    private String mergerName;
}
复制代码

2.4クローラーのソースコード

htmlページタグ:

ここに画像の説明を挿入

データ取得ロジック:履歴データをクリアし、最新のデータを>クロールカプセル化し、>最新のデータを保存します。

	public boolean getCommodityClassificationData() throws IOException {
 		
 		// 首先清除历史数据
        LambdaQueryWrapper<DataCommodityClassification> lambdaQuery = Wrappers.lambdaQuery(DataCommodityClassification.class);
        dataCommodityClassificationService.remove(lambdaQuery);

        // 处理树结构ID【随手就写了 不知道有没有更好的方法】
        AtomicInteger atomicIntegerOne = new AtomicInteger();
        AtomicInteger atomicIntegerTwo = new AtomicInteger();
        AtomicInteger atomicIntegerThree = new AtomicInteger();

        // 结果数据
        List<DataCommodityClassification> dataCommodityClassificationList = new ArrayList<>();
        
        // ************* 以下是爬虫代码 *************
		// 地址信息
        String url = "https://www.jd.com/allSort.aspx";
        Document document = Jsoup.parse(new URL(url), 300000);
        // 获取包含所有分类数据的根元素
        Element root = document.getElementsByClass("category-items clearfix").get(0);
        // 获取一级分类标签数据
        Elements levelOne = root.getElementsByClass("category-item m");
        levelOne.forEach(one -> {
            String levelOneData = one.getElementsByClass("item-title").get(0).child(2).text();
            String oneId = "" + atomicIntegerOne.getAndIncrement();
            dataCommodityClassificationList.add(DataCommodityClassification.builder().id(oneId).parentId(null).level(0).name(levelOneData).build());
            // 获取二级分类标签数据
            Elements levelTwo = one.getElementsByClass("items").get(0).getElementsByTag("dl");
            levelTwo.forEach(two -> {
                String levelTwoData = two.getElementsByTag("dt").text();
                String twoId = oneId + atomicIntegerTwo.getAndIncrement();
                String mergerNameTwo = levelOneData + "," + levelTwoData;
                dataCommodityClassificationList.add(DataCommodityClassification.builder().id(twoId).parentId(oneId).level(1).name(levelTwoData).mergerName(mergerNameTwo).build());
                // 获取三级级分类标签数据
                Elements levelThree = two.getElementsByTag("dd").get(0).children();
                levelThree.forEach(three -> {
                    // 获取三级分类信息
                    String levelThreeData = three.text();
                    String threeId = twoId + atomicIntegerThree.getAndIncrement();
                    String mergerNameThree = mergerNameTwo + "," + levelThreeData;
                    dataCommodityClassificationList.add(DataCommodityClassification.builder().id(threeId).parentId(twoId).level(2).name(levelThreeData).mergerName(mergerNameThree).build());
                });
            });
        });

        // 保存最新数据
        boolean isSaveSuccess = dataCommodityClassificationService.saveBatch(dataCommodityClassificationList);
        return isSaveSuccess;
	}
复制代码

3.結果

第1レベルの分類のparent_id合計は処理されてmerger_nameおらず、業務利用の過程で問題があるかどうかはわかりません。

ここに画像の説明を挿入csvおよびsql形式のデータが提供されます。クロール日は20220310です。最新のデータが必要な場合は、クローラーコードを実行して取得する必要があります。

おすすめ

転載: juejin.im/post/7087402591381880862