Scala에서 Play 프레임워크와 Jsoup을 사용하여 RESTful 웹 캡처

최근에 나는 매우 멋진 요리 레시피 사이트를 만났는데, 그 사이트의 사용자 인터페이스가 매우 나쁘다. 특히 휴대전화를 사용할 때.당시에는 공식 API가 없었기 때문에 웹 서비스를 구축하여 내용을 추출하고 RESTful API로 발표하기로 결정했습니다.본고에서 저는 Scala, Play FrameworkJsoup을 어떻게 사용하여 이런 서비스를 구축하는지 보여 드리겠습니다.즐겨라!
네가 필요로 하다
  • Scala--버전 2.13.1
  • Sbt - 공식 website에서 설치
  • IDE 선택 - IntelliJ 또는 VS 코드,
  • 약 15분 동안
  • 빈 재생 항목 만들기
    우리는 게임 프로젝트를 만드는 것부터 시작할 것이다.물론, 당신은 처음부터 교체하는 방식으로 코드를 추가할 수 있지만, 본 강좌의 범위 내에서, 나는 이 드라마의 예시 항목을 기점으로 삼을 것을 건의합니다.
    Scala Rest API project은 우리가 필요로 하는 모든 것을 거의 가지고 있다.이 프로젝트는 우리가 사용하는 아주 좋은 주간이므로 우리는 쉽게 그것을 확장할 수 있다.
    Play Framework 샘플 라이브러리를 복제한 다음 다음과 같이 Scala Rest API 샘플을 엽니다.
    git 클론https://github.com/playframework/play-samples.git
    cd play scala restapi 예
    그 다음에 이 명령을 실행해 보십시오. 플레이 프로그램이 시작될 것입니다. http://localhost:9000에서 접근할 수 있을 것입니다.
    달리기
    만약 응용 프로그램의 구축과 실행이 정확하다면, 우리는 프로젝트 초기화를 완성할 것이다.이제 선택한 IDE로 이 폴더를 열 수 있습니다. 저는 VS 코드를 사용할 것입니다.
    Jsoup 종속성 추가
    다음은 Jsoup - Java와 JVM을 위한 소스 HTML 해상도를 추가합니다.이렇게 하려면 build.sbt 파일을 열고 libraryDependencies 블록에 다음을 추가합니다.
    “org.jsoup”%“jsoup”%“1.13.1”
    물론 가능한 한 최신 버전을 사용해야 한다. 본문을 작성할 때 1.13.1이 최신 버전이다.
    이제 sbt 의존항을 갱신하기를 기다리면 코드를 작성할 수 있습니다!
    끝점 정의하기
    인코딩의 첫 번째 단계는 단점 재생 프레임워크를 정의하는 것입니다.이것은 conf/routes 파일에 루트 정의를 추가함으로써 이루어진 것이다.우리의 예에서, 나는 v1/recipes단점을 원하는데, 그것은 RecipeRouter류로만 처리된다.다음과 같은 항목을 추가할 수 있습니다.
    ->/v1/레시피 v1.요리책리시버
    이제 URL을 클릭하는 모든 요청이 라우터로 리디렉션됩니다.
    이어서 나는 나의 식단 관련 종류인 app/v1/recipe을 위해 가방을 만들 것이다.여기서 요청을 처리하기 위한 입구점을 만듭니다: RecipeRouter포장요리책
    javax를 가져옵니다.주입부어 넣다
    수입 게임.응용 프로그램 프로그래밍 인터페이스.경로라우터노선.
    수입 게임.응용 프로그램 프로그래밍 인터페이스.경로SimpleRouter
    수입 게임.응용 프로그램 프로그래밍 인터페이스.경로선생
    클래스 RecipeRouter@Inject()(컨트롤러: RecipeControl)SimpleRouter {
    val prefix=“/v1/recipes”
    def 링크(id: 문자열):문자열={
    IO 가져오기여우 원숭이.우리야.dsl_
    val url = 접두어/id.toString
    인터넷 주소.toString()
    }
    def 라우트 무시:라우트={
    case GET(p/)=>
    제어기.인덱스
    case GET(p)/all/$id“=>
    제어기.showAll(id)
    }
    }
    웹 사이트에 연결
    더 나아가 Jsoup을 사용하여 사이트에서 일부 내용을 얻을 때가 되었다.지난 절에서 우리는 showAll 함수를 정의했는데 이것이 바로 내가 여기서 실현할 함수이다.우리는 id 파라미터를 사용할 것이다. 이것은 많은 상황에서 매우 유용하다.
    그러면 RecipeController류로 넘어가서 첫 번째 요소인 sourceUrl을 정의합시다.모든 메서드가 액세스할 수 있도록 클래스 필드로 정의하고 싶습니다.
    val sourceUrl:String=”https://kwestiasmaku.com"
    그리고 우리의 방법에서 이 사이트의 내용을 알아보자.다음과 같은 작업을 수행할 수 있습니다.
    def showAll(pageId:String):Action[AnyContent]=Action{implicit request=>
    val htmlDocument=Jsoup.연결 (s "${sourceUrl}/home przepisy? page=${pageId}")얻다
    val r:Result=Ok(htmlDocument)
    r
    }
    위의 코드 세션에서 우리는 Jsoup.connect 방법을 사용하여 우리의 사이트 b에 연결하고 정확한 URL을 문자열로 전달한다.우리가 얻은 것은 HTML 문서입니다. 우리는 지금 되돌아갑니다.우리는 다음 절에서 더욱 정교한 추출을 진행할 것이다.
    엔드포인트를 테스트하려면 브라우저나 http 클라이언트(예: curl)에서 다음 URL을 호출합니다.
    http://localhost:9000/v1/recipes/all/1
    원래 HTML 문서인 응답을 보게 될 것입니다.이제 그것을 해석하고 의미 있는 데이터를 추출합시다.
    컨텐트 추출
    이제 원본 HTML에서 특정 요소를 추출합니다.이를 위해 Jsoup의 select 방법을 사용할 수 있습니다.이러한 방법은 CSS와 유사한 선택기 문법이 필요합니다. 만약 이전에 CSS를 사용한 적이 있다면 정확한 문자열을 지정하는 것은 매우 쉽습니다. 우리의 예에서 하나의 도안 HTML 대상을 추출하려면 다음과 같은 방법을 사용하십시오.
    scala를 입력합니다.jdk.수집 변환기
    val recipes domelements=htmlDocument.선택아스칼라
    이 조회는 집합과 유사한 구조로 되돌아와 쉽게 교체할 수 있다.단일 설계도에서 특정 요소를 추출하려면 다음 방법을 사용합니다.
    마지막 사례 레시피 (제목: String, href: String, img: String)
    val recipeData=for(recipeElement<-RecipeDoMeElements)
    생산량 설계도(
    등가 원소.(.views 필드 제목 a)을 선택합니다.html(),
    sourceUrl+recipeElement.(.views 필드 제목 a)을 선택합니다.attr(“href”),
    등가 원소.선택("img").attr(“src”)
    )
    여기서 우리는 간단한 for 순환을 사용하여 이를 Recipe 케이스 클래스에 포장하여 구체적인 데이터를 생성한다.현재, 우리는 이미 데이터를 잘 정리하여, 최종적으로 그것을 JSON으로 되돌릴 수 있다.
    JSON으로 돌아가기
    마지막 단계는 Recipe개의 케이스 클래스의 집합을 JSON으로 되돌려주는 것이다.Play에 내장된 Json 클래스와 그 방법을 사용하여 다음과 같은 이점을 얻을 수 있습니다.
    암시적 val recipeWrites: OWrites[Recipe]=Json.쓰다 [레시피]
    val r:Result=Ok(Json.toJson(recipeData))
    r
    기억해야 할 중요한 것은 케이스 클래스를 JSON 표시로 바꾸기 전에 Json 클래스가 이 특정 데이터를 어떻게 작성하는지 알 수 있도록 은식 writer를 설명해야 한다는 것이다.
    이렇게!전체 RecipeController 클래스는 다음과 같습니다.
    포장요리책
    javax를 가져옵니다.주입부어 넣다
    조직을 가져옵니다.jsoup.대살기
    수입 게임.응용 프로그램 프로그래밍 인터페이스.mvc_
    수입 게임.응용 프로그램 프로그래밍 인터페이스.libs.json.{Json,OWrites}
    scala를 입력합니다.jdk.수집 변환기
    클래스 RecipeController@Inject()(val controller Components: controller Components)가BaseController{
    암시적 val recipeWrites: OWrites[Recipe]=Json.쓰다 [레시피]
    val sourceUrl:String=”https://kwestiasmaku.com"
    def index:Action[AnyContent]=Action{implicit request=>
    val r: Result=Ok("안녕하세요, 세계")
    r
    }
    def showAll(pageId:String):Action[AnyContent]=Action{implicit request=>
    val htmlDocument=Jsoup.연결 (s "${sourceUrl}/home przepisy? page=${pageId}")얻다
    val recipes domelements=htmlDocument.선택아스칼라
    val recipeData= 사용(recipeElement)
    요약
    나는 네가 이 문장이 매우 유용하다고 생각하기를 바란다.그렇다면 주저 없이 이 글을 좋아하거나 공유해 주십시오.그 밖에 만약 네가 원한다면, 너는 나의 소셜 미디어에서 나를 주목할 수 있다🙂

    좋은 웹페이지 즐겨찾기