Newspaper3k를 통해 Vue 및 Node를 사용하여 웹 페이지 저장
그러나 드디어 도착했습니다. Under Cloud는 Newspaper3k 를 통해 웹 페이지를 저장할 수 있습니다. 이것은 파이톤으로 작성된 다기능 패키지입니다.나는 여전히 무대 위에서 테스트를 실행하고 있기 때문에, 거의 완성되었기 때문에, 일주일 안에 생산에 들어가야 한다.
신문에 실린 문서는 매우 적고 코드 예시도 매우 적다.나는 파이톤을 어떻게 지원하는지, 데이터 형식을 어떻게 더 나쁘게 만드는지 모른다.
나는 곡선 반대편의 어떤 사람의 관점에서 이 글을 썼다. 그는 아주 긴 길을 걸어서야 이곳에 왔지만 내가 직면한 시간 제한을 감안하여 나는 차라리 장애가 없는 길을 선택했다.그래서 이 글은 지금의 내가 과거의 나를 위해 주의한 것이다.
신문지의 대체품 3K
많은 기능이 강한 서비스가 있는데 예를 들면DiffBot이다. 그러나 클라우드에서 응용되는 이 단계에 이런 서비스의 원가가 너무 높다. 그리고 솔직히 말하자면 내가 몇 단락 전에 말했지만 권한을 부여하기 전에 내가 이런 것들을 먼저 알고 싶기 때문에 나는 발생하는 일에 대해 최소한의 기술적 이해를 가지고 있다.그러나 일부 개원된 대체 방안도 있다. 예를 들어BeautifulSoup.
신문지 3K 대미 연합
어떤 사람들은 내가 왜 Beautiful Soup이 아닌 신문 3K를 선택했는지 궁금해 할 것이다.
신문지로 웹 페이지 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은 연구 발전 과정에서 잃어버린 일환이다.
Reference
이 문제에 관하여(Newspaper3k를 통해 Vue 및 Node를 사용하여 웹 페이지 저장), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/octaneinteractive/saving-web-pages-with-vue-and-node-via-newspaper3k-5ahn텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)