Newspaper3k를 통해 Vue 및 Node를 사용하여 웹 페이지 저장

7430 단어 pythontutorialvuenode
Under Cloud은 Google Chrome에 웹 페이지의 텍스트 선택을 저장할 수 있는 확장자를 제공하지만 전체 페이지를 자동으로 저장하는 옵션이 부족합니다.분명히 웹 페이지를 저장하는 것은 작은 일이 아니다. 나는 이미 7개의 부분을 준비했고 2개의 부분을 피했다. 1개의 부분을 두려워한 지 오래되었다!
그러나 드디어 도착했습니다. Under Cloud는 Newspaper3k 를 통해 웹 페이지를 저장할 수 있습니다. 이것은 파이톤으로 작성된 다기능 패키지입니다.나는 여전히 무대 위에서 테스트를 실행하고 있기 때문에, 거의 완성되었기 때문에, 일주일 안에 생산에 들어가야 한다.
신문에 실린 문서는 매우 적고 코드 예시도 매우 적다.나는 파이톤을 어떻게 지원하는지, 데이터 형식을 어떻게 더 나쁘게 만드는지 모른다.
나는 곡선 반대편의 어떤 사람의 관점에서 이 글을 썼다. 그는 아주 긴 길을 걸어서야 이곳에 왔지만 내가 직면한 시간 제한을 감안하여 나는 차라리 장애가 없는 길을 선택했다.그래서 이 글은 지금의 내가 과거의 나를 위해 주의한 것이다.

신문지의 대체품 3K


많은 기능이 강한 서비스가 있는데 예를 들면DiffBot이다. 그러나 클라우드에서 응용되는 이 단계에 이런 서비스의 원가가 너무 높다. 그리고 솔직히 말하자면 내가 몇 단락 전에 말했지만 권한을 부여하기 전에 내가 이런 것들을 먼저 알고 싶기 때문에 나는 발생하는 일에 대해 최소한의 기술적 이해를 가지고 있다.그러나 일부 개원된 대체 방안도 있다. 예를 들어BeautifulSoup.

신문지 3K 대미 연합


어떤 사람들은 내가 왜 Beautiful Soup이 아닌 신문 3K를 선택했는지 궁금해 할 것이다.
  • 신문은 일반적인 용도의 스크랩에 집중하는 것 같다.
  • BeautifulSoup은 DOM을 대량으로 해석하는 옵션을 가지고 있지만 데이터 과학에 더 치우친다.
  • 웹 페이지의 구체적인 부분을 알아야만 BeautifulSoup에서 가장 큰 수익을 얻을 수 있다.내가 틀렸을 수도 있으니, 나는 누군가가 더 많은 정보를 제공할 수 있기를 기대한다.

    신문지로 웹 페이지 3K를 캡처하다


    나는 몇 가지 가설을 할 것이다.
  • Vue와 Node에 대해 잘 알고 계십니다.
  • 내가 설치와 설정의 전체 과정을 겪을 필요가 없다.
  • 또는 새로운 프로젝트를 실례화한다.
  • 파이톤과 뉴스페이퍼 3k 패키지가 설치되어 있음;
  • 완전한 버전이 아닌 간결한 코드 예시를 제공할 것입니다.
  • 그나저나, 나는 우리가 이곳에서 하는 일을 스크래치로 묘사하는 것을 좋아하지 않는다. 왜냐하면 그것은 무서운 의미를 가지고 있기 때문이다.이 글을 이용하여 사악한 쓰레기를 만들어 다른 사람의 작품을 표절하지 마세요.

    활용단어참조


    Under Cloud은 Java Script (또는 현재 말하는 ECMA Script) 로 작성되었지만, 내가 해야 할 첫 번째 일은 파이톤을 배워서 스크립트를 만드는 것이다. 이것은 노드로 작성된 백엔드와 파이톤으로 작성된 신문 사이의 다리로 충당할 것이다.
    import os
    import sys
    import json
    from datetime import datetime
    
    from newspaper import Article
    
    # Here, the `url` value should be something like: https://www.bbc.co.uk/sport/football/53944598
    url = sys.argv[1]
    
    template_for_exceptions = "An exception of type {0} occurred. Arguments:\n{1!r}"
    
    def get_web_page(url):
    
      try:
    
        if url and len(url) > 0:
    
          article = Article(url, keep_article_html = True)
          article.download()
          article.parse()
    
          dataForBookmarkAsJSON = json.dumps({
            'publicationDate': article.publish_date if article.publish_date is None else article.publish_date.strftime("%Y-%m-%d %H:%M:%S"),
            'title': article.title,
            'note': article.article_html,
            'authors': article.authors
          })
    
          try:
    
            sys.stdout.write(dataForBookmarkAsJSON)
            sys.stdout.flush()
            os._exit(0)
    
          except Exception as ex:
    
            message_for_exception = template_for_exceptions.format(type(ex).__name__, ex.args)
            print(message_for_exception)
            sys.exit(1)
    
      except Exception as ex:
    
        message_for_exception = template_for_exceptions.format(type(ex).__name__, ex.args)
        print(message_for_exception)
        sys.exit(1)
    
    if __name__ == '__main__':
      get_web_page(url)
    
    예를 들어 article.publish_date 변수는 내가 포맷한 날짜 문자열이거나 JSON 대상을 채울 때 처리하는 빈 값이다.네, 저는 노드의 상위권에서 이 일을 완성할 수 있었지만, 파이톤과 파이톤에 관한 지식을 배우는 데 시간이 좀 걸렸습니다.

    Vue


    전면에서 나는 다음과 같은 방법의 구성 요소를 사용한다.
    getWebPage () {
      this.$axios.get(`/newspaper`, {
        params: {
          // Params.
        }
      }).then(function(response) {
        // Handle the response.
        }
      }).catch(function(error) {
        // Handle the error.
      })
    }
    

    노트


    백엔드에서 나는 노선이 하나 있다.
    router.get('/newspaper', async (req, res) => {
      const getNewspaper = await controllerNewspaper.getWebPage(data)
      res.json(getNewspaper)
    })
    
    디렉터에서 다음과 같은 이점을 누릴 수 있습니다.
    services.getWebPage = async (params) => {
    
      let { spawn } = require('child_process')
      let processForPython = spawn(process.env.PYTHON_VERSION, [
        `${process.env.PYTHON_PATH}/get_web_page.py`, 
        params.url
      ], {
        maxBuffer: 10240000
      })
    
      let dataForBookmarkStream = []
    
      return new Promise ((resolve, reject) => {
        processForPython.stdout.on('data', (response) => {
          dataForBookmarkStream.push(response)
        })
    
        processForPython.stderr.on('data', (error) => {
          reject({
            error: `An error occurred while attempting to parse the web page: ${error.toString()}`
          })
        })
    
        processForPython.on('exit', (code) => {
          switch (code) {
            case 0:
              if ( dataForBookmarkStream ) {
                if ( dataForBookmarkStream.length > 0 ) {
                  try {
                    try {
                      dataForBookmark = JSON.parse(dataForBookmarkStream.join().toString())
                    } catch (exception) {
                      reject({
                        error: "JSON object supplied by Newspaper is invalid."
                      })
                    }
                    if (typeof dataForBookmark === 'object') {
                      const paramsForBookmark = new URLSearchParams()
                      paramsForBookmark.append('userID', params.userID)
                      // Additional parameters, using dataForBookmark...
                      instanceOfAxios.post('/assets', paramsForBookmark)
                      .then(function (response) {
                        resolve(response)
                      })
                      .catch(function (error) {
                        reject(error)
                      })
                    }
                  } catch (exception) {
                    reject({
                      error: "An error occurred while attempting to save the web page."
                    })
                  }
                } else {
                  reject()
                }
              } else {
                reject()
              }
              break
            case 1:
              reject({
                error: "Web page couldn't be saved."
              })
              break
          }
        })
    
      }).catch(error => {
        return {
          error: "Web page couldn't be saved."
        }
      })
    
    }
    
    네, 알아야 할 게 많으니까 디테일을 보여드릴게요...
    우선 파이톤의 버전을 찾아내고 process.env.PYTHON_VERSION와 같은 환경 변수를 만듭니다.
    그 다음에 파이톤의 경로를 찾아내고 process.env.PYTHON_PATH와 같은 환경 변수를 만듭니다.
    그리고 적응하기 위해 마음대로 조정maxBuffer하세요.그나저나, 나는 확실히 maxBuffer 버전의 코드만 사용해 보았지만, 일부 웹 페이지는 너무 커서 JSON 대상이 해석할 수 없어서 모든 것이 엉망이 되었다.
    파이썬 스크립트를 호출하면 JSON 대상을 processForPython.stdout.on('data') 로 전송하기 시작합니다. dataForBookmarkStream 변수를 통해 블록을 가져옵니다.
    이 과정이 성공했다고 가정하면, 우리는 processForPython.on('exit') 에서 스위치 블록을 누르고, 코드가 0일 때 종료합니다.여기서 우리는 다음과 같은 방법으로 dataForBookmarkStream의 인코딩 데이터를 유용한 데이터로 변환합니다.dataForBookmark = JSON.parse(dataForBookmarkStream.join().toString())그런 다음 API를 통해 애플리케이션의 다른 위치로 데이터를 전송합니다.
    우리는 일부 노드와 파이톤의 사람들이 실망한 표정을 지으며 단체로 고개를 저은 적이 있는가?그렇다면 어떤 부분을 개선할 수 있는지 공유해 주세요!
    우리의 뇌는 하드디스크가 아니다. 우리가 사물을 어떻게 기억하고 그들 사이에서 관계를 맺는지는 개인의 일이다. 이것Under Cloud은 연구 발전 과정에서 잃어버린 일환이다.

    좋은 웹페이지 즐겨찾기