iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0
Software Development

我命由我不由語言 java爬蟲挑戰系列 第 11

java爬蟲挑戰 Day 11 - 爬蟲模組完成

  • 分享至 

  • xImage
  •  

今天把剩餘的動作進行完成、收尾。

主要就剩過濾重複資料分頁處理

過濾重複資料

要過濾重複資料,就需要找到這些資料的唯一值,我選用的是網址

昨天我們安裝了H2資料庫,只要網址不在資料庫中,就寫入。反之,則代表是舊的物件,則跳過。

下面實作:

JpaRepository

JpaRepository 是 Spring Data JPA 提供的一個介面,它為你的資料庫操作提供了一個簡化的方法。當你定義一個 Repository 介面時,這個介面通常會繼承 JpaRepository,並且需要與一個 Entity 類別對應。

RentalDetailRepository

那JpaRepository本身已經含基礎的CRUD了,我額外需要查找是否有重複的物件查詢,所以增加了findByLink,我的條件就是網址。

package tw.grass.rental_crawler.repositories;

import org.springframework.data.jpa.repository.JpaRepository;

import tw.grass.rental_crawler.entity.RentalDetail;

public interface RentalDetailRepository extends JpaRepository<RentalDetail, Long> {
    RentalDetail findByLink(String link);
}

RentalCrawlerServiceImpl-過濾重複資料

先在Service引入Repository

@Autowired
private RentalDetailRepository rentalDetailRepository;

邏輯處理

//確認是否有重複資料
RentalDetail findByLink = rentalDetailRepository.findByLink(link);

//無重複就寫入,有就跳過
if (findByLink == null) {
    RentalCatalogDTO rentalIfo = new RentalCatalogDTO();
    setRentalCatalogValue(title, link, address, price, floorAndArea, distanceToMrtName, distanceToMRT, rentalIfo);
    list.add(rentalIfo);

    //寫入資料庫
    RentalDetail entity = new RentalDetail();
    entity.setLink(link);
    rentalDetailRepository.save(entity);
    log.info("寫入:{}", title);
} else {
    log.info("重複:{}", title);
}

執行結果如下:
https://ithelp.ithome.com.tw/upload/images/20240828/20168635ELpUZ4kGT0.png

RentalCrawlerServiceImpl 分頁處理

591條件都是get,所以換頁只要在url參數增加&page=2即可

// 591一頁為30個租屋資訊,所以當有30筆新資料時,去第二頁再做一次
if (rentaCatalogList.size() == 30) {
    log.info("第一頁皆為新資料,去第二頁進行爬去");
    doc = getJsoupDoc("https://rent.591.com.tw/list?other=newPost&sort=posttime_desc&page=2");
    rentaCatalogList.addAll(parseRentalCatalog(doc));
}

執行結果如下:
https://ithelp.ithome.com.tw/upload/images/20240828/2016863579ciwIEKG4.png

理論上應該使用While迴圈,撈完30筆就去下一頁,直到最尾頁。但是我怕造成591 Server的負擔,就取最新的60筆即可(我也怕我被黑單XD)。


取得詳細資料這邊,我也有限制筆數,執行一次最多取得三筆詳細資料。
因為一筆就會打591的網址一次,開發階段,先打少次一點,怕黑單XD
後面有機會再來研究如何避開這問題。

rentaCatalogList = rentaCatalogList.stream().limit(3).collect(Collectors.toList());

以上就是爬蟲模組的開發,爬蟲模組完成!

https://ithelp.ithome.com.tw/upload/images/20240828/20168635i1SQzgCMZo.png

git現狀

https://ithelp.ithome.com.tw/upload/images/20240828/201686352unYzsIxrB.png

沒意外的話,明天開發排程模組。


上一篇
java爬蟲挑戰 Day 10 - H2 資料庫 & JPA 引入
下一篇
java爬蟲挑戰 Day 12 - Spring Scheduler 排程控制
系列文
我命由我不由語言 java爬蟲挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言