PROGRAMMING/Web
[Chrome Extension] URL에서 Crawling하기 (1)
yuujoeng
2023. 3. 15. 16:17
0. 패키지 설치
- 크롤링에 사용할 axios, cheerio, iconv-lite 라이브러리 설치
- iconv-lite : 유니코드 문자열이 깨지지 않도록 하는 라이브러리
- puppeteer : 헤드리스 브라우저를 프로그래밍 방식으로 조작하는 라이브러리
- loadsh : 자바스크립트에 기본으로 제공되지 않는 유틸리티 함수를 제공하는 라이브러리
npm i axios cheerio iconv-lite
npm i puppeteer@9.1.1 lodash@4.17.20 date-fns@2.21.1 date-fns-tz@1.1.4
1. Cheerio와 axios를 사용한 크롤링
const axios = require('axios');
const iconv = require('iconv-lite');
// URL 불러오기
function getTabUrl(callback) {
var queryInfo = {
active : true,
currentWindow : true
};
chrome.tabs.query(queryInfo, function(tabs) {
var tab = tabs[0];
var url = tab.url;
callback(url);
});
}
// URL 크롬 확장 프로그램 상에 뿌려주기
function renderUrl(statusText) {
document.getElementById('result').textContent = statusText;
}
//버튼이 눌렸을 때
document.addEventListener('DOMContentLoaded', function() {
var link = document.getElementById('getUrl');
link.addEventListener('click', function() {
getTabUrl(function(url) {
renderUrl(url);
});
// URL로 axios의 get 요청을 보내 화면을 구성하는 데이터 받아오기
axios({
url : link,
method: 'GET',
responseType: 'arraybuffer',
})
.then(response => {
const content = iconv.decode(response.data, 'EUC-KR');
console.log(content);
})
.catch(err => {
console.error(err);
});
});
});
- 이 방법을 사용하면 Network 오류가 발생 !
- axios에서 get하기 위해 사용한 link 변수에 문자열이 아닌 <button> 태그 요소가 들어가서라고 🖤팀원분이 알려주셨다
- URL을 담는 변수를 따로 선언하고 해당 값을 전달하여 오류를 해결했으나
- console에는 여전히 출력값이 찍히지 않는다 :<
let globalUrl = '';
...
axios({
url: globalUrl,
method: 'GET',
responseType: 'arraybuffer',
})
...
2. HTML을 파싱하여 DOM에서 CSS로 원하는 값 추출하기
- 오류는 나지 않지만 콘솔 역시 출력되지 않는다.
import axios from 'axios';
import iconv from 'iconv-lite';
import * as cheerio from 'cheerio';
let globalUrl = '';
function getTabUrl(callback) {
var queryInfo = {
active : true,
currentWindow : true
};
chrome.tabs.query(queryInfo, function(tabs) {
var tab = tabs[0];
globalUrl = tab.url;
callback(globalUrl);
});
}
function renderUrl(statusText) {
document.getElementById('result').textContent = statusText;
}
// 함수 추가
async function renderHTML(statusText) {
// axios로 HTML 로드하기
const resp = await axios.get(statusText);
// HTML을 파싱하고 DOM 생성하기
const $ = cheerio.load(resp.data);
// CSS 셀렉터로 원하는 요소 찾기
const elements = $('#sc-1cpbr6m-0 dNgyLy');
elements.each((idx, el) => {
console.log($(el).text());
});
}
document.addEventListener('DOMContentLoaded', function() {
var link = document.getElementById('getUrl');
link.addEventListener('click', function() {
getTabUrl(function(url) {
renderUrl(url);
renderHTML(url);
console.log('check1');
});
});
});