Skip to content

Feature : Oliveyoung scrapper - #22

Open
seoyeong200 wants to merge 31 commits into
brickstudy:mainfrom
seoyeong200:feature-oliveyoung
Open

Feature : Oliveyoung scrapper#22
seoyeong200 wants to merge 31 commits into
brickstudy:mainfrom
seoyeong200:feature-oliveyoung

Conversation

@seoyeong200

@seoyeong200seoyeong200 commented Nov 11, 2024

Copy link
Copy Markdown
Collaborator

올리브영 수집 코드 개발스펙 추가

TODO

  • refactor. requests & beautiful soup to webdriver via selenium
    - driver class / method
  • refactor. apply item list paginating) collect items of each brand
  • add. review data scrapping
    - need to collect each items' url
    - in each url, collect review data
    - click event # 1. order by date
    - click event # 2. paginating
  • need to add dockeroperator in airflow - remote webdriver

데이터 구조 수정

ASIS

{
"듀오":
{"query_keyword":["DUO"],
"brand_shop_detail_url":"https://www.oliveyoung.co.kr/store/display/getBrandShopDetail.do?onlBrndCd=A002348",
"category":["미용소품_아이소품"],
"items":{"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 14g":false,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 다크 튜브 7g":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 7g (다크, 클리어) 튜브 타입 택1":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 14g ( 다크, 클리어 ) 튜브 타입 택 1":false,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 5g ( 다크, 클리어 ) 팁 타입 택 1":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 7g":true},
"released_date":"2024-08-19"}
}

TOBE
items 필드 수정

  • "items" 필드
    • asis : {제품명|str : 할인여부|bool}
      1. id key 값으로 주고 name, url, is_promotion 리스트로 그냥 묶어서 value로
      • {id|str : [name|str, url|str, is_promotion|bool]}
      1. items dataclass 안에 또 들어가기
      1. 아예 클래스 분리하기
        Brand
  • 최초 한번만 모아서 적재해놓고
  • 아이템 일주일 단위로 최신화할때 이 데이터 블러서 url 뽑아서 아이템, 리뷰 크롤링
{
"brand_id":
{
"brand_name":"듀오"
"query_keyword":["DUO"],
"brand_shop_detail_url":"https://{domain}/store/display/getBrandShopDetail.do?onlBrndCd=A002348",
"category":["미용소품_아이소품"],
"released_date":"2024-08-19"}
}

Items

{
"itemID":
{"brand_id": "#####",
"name": "브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 14g",
"url": "https://{domain}/store/display/getBrandShopDetail.do?onlBrndCd=A002820&t_page=%EC%83%81%ED%92%88%EC%83%81%EC%84%B8&t_click=%EB%B8%8C%EB%9E%9C%EB%93%9C%EA%B4%80_%EC%83%81%EB%8B%A8&t_brand_name=%ED%86%A0%EB%A6%AC%EB%93%A0",
"reviews": []
"is_in_promotion": True/False
}
}

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@seoyeong200
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Feature : Oliveyoung scrapper by seoyeong200 · Pull Request #22 · brickstudy/ETL · GitHub
Skip to content

Feature : Oliveyoung scrapper - #22

Open
seoyeong200 wants to merge 31 commits into
brickstudy:mainfrom
seoyeong200:feature-oliveyoung
Open

Feature : Oliveyoung scrapper#22
seoyeong200 wants to merge 31 commits into
brickstudy:mainfrom
seoyeong200:feature-oliveyoung

Conversation

@seoyeong200

@seoyeong200seoyeong200 commented Nov 11, 2024

Copy link
Copy Markdown
Collaborator

올리브영 수집 코드 개발스펙 추가

TODO

  • refactor. requests & beautiful soup to webdriver via selenium
    - driver class / method
  • refactor. apply item list paginating) collect items of each brand
  • add. review data scrapping
    - need to collect each items' url
    - in each url, collect review data
    - click event # 1. order by date
    - click event # 2. paginating
  • need to add dockeroperator in airflow - remote webdriver

데이터 구조 수정

ASIS

{
"듀오":
{"query_keyword":["DUO"],
"brand_shop_detail_url":"https://www.oliveyoung.co.kr/store/display/getBrandShopDetail.do?onlBrndCd=A002348",
"category":["미용소품_아이소품"],
"items":{"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 14g":false,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 다크 튜브 7g":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 7g (다크, 클리어) 튜브 타입 택1":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 14g ( 다크, 클리어 ) 튜브 타입 택 1":false,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 5g ( 다크, 클리어 ) 팁 타입 택 1":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 7g":true},
"released_date":"2024-08-19"}
}

TOBE
items 필드 수정

  • "items" 필드
    • asis : {제품명|str : 할인여부|bool}
      1. id key 값으로 주고 name, url, is_promotion 리스트로 그냥 묶어서 value로
      • {id|str : [name|str, url|str, is_promotion|bool]}
      1. items dataclass 안에 또 들어가기
      1. 아예 클래스 분리하기
        Brand
  • 최초 한번만 모아서 적재해놓고
  • 아이템 일주일 단위로 최신화할때 이 데이터 블러서 url 뽑아서 아이템, 리뷰 크롤링
{
"brand_id":
{
"brand_name":"듀오"
"query_keyword":["DUO"],
"brand_shop_detail_url":"https://{domain}/store/display/getBrandShopDetail.do?onlBrndCd=A002348",
"category":["미용소품_아이소품"],
"released_date":"2024-08-19"}
}

Items

{
"itemID":
{"brand_id": "#####",
"name": "브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 14g",
"url": "https://{domain}/store/display/getBrandShopDetail.do?onlBrndCd=A002820&t_page=%EC%83%81%ED%92%88%EC%83%81%EC%84%B8&t_click=%EB%B8%8C%EB%9E%9C%EB%93%9C%EA%B4%80_%EC%83%81%EB%8B%A8&t_brand_name=%ED%86%A0%EB%A6%AC%EB%93%A0",
"reviews": []
"is_in_promotion": True/False
}
}

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@seoyeong200
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Feature : Oliveyoung scrapper by seoyeong200 · Pull Request #22 · brickstudy/ETL · GitHub
Skip to content

Feature : Oliveyoung scrapper - #22

Open
seoyeong200 wants to merge 31 commits into
brickstudy:mainfrom
seoyeong200:feature-oliveyoung
Open

Feature : Oliveyoung scrapper#22
seoyeong200 wants to merge 31 commits into
brickstudy:mainfrom
seoyeong200:feature-oliveyoung

Conversation

@seoyeong200

@seoyeong200seoyeong200 commented Nov 11, 2024

Copy link
Copy Markdown
Collaborator

올리브영 수집 코드 개발스펙 추가

TODO

  • refactor. requests & beautiful soup to webdriver via selenium
    - driver class / method
  • refactor. apply item list paginating) collect items of each brand
  • add. review data scrapping
    - need to collect each items' url
    - in each url, collect review data
    - click event # 1. order by date
    - click event # 2. paginating
  • need to add dockeroperator in airflow - remote webdriver

데이터 구조 수정

ASIS

{
"듀오":
{"query_keyword":["DUO"],
"brand_shop_detail_url":"https://www.oliveyoung.co.kr/store/display/getBrandShopDetail.do?onlBrndCd=A002348",
"category":["미용소품_아이소품"],
"items":{"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 14g":false,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 다크 튜브 7g":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 7g (다크, 클리어) 튜브 타입 택1":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 14g ( 다크, 클리어 ) 튜브 타입 택 1":false,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 5g ( 다크, 클리어 ) 팁 타입 택 1":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 7g":true},
"released_date":"2024-08-19"}
}

TOBE
items 필드 수정

  • "items" 필드
    • asis : {제품명|str : 할인여부|bool}
      1. id key 값으로 주고 name, url, is_promotion 리스트로 그냥 묶어서 value로
      • {id|str : [name|str, url|str, is_promotion|bool]}
      1. items dataclass 안에 또 들어가기
      1. 아예 클래스 분리하기
        Brand
  • 최초 한번만 모아서 적재해놓고
  • 아이템 일주일 단위로 최신화할때 이 데이터 블러서 url 뽑아서 아이템, 리뷰 크롤링
{
"brand_id":
{
"brand_name":"듀오"
"query_keyword":["DUO"],
"brand_shop_detail_url":"https://{domain}/store/display/getBrandShopDetail.do?onlBrndCd=A002348",
"category":["미용소품_아이소품"],
"released_date":"2024-08-19"}
}

Items

{
"itemID":
{"brand_id": "#####",
"name": "브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 14g",
"url": "https://{domain}/store/display/getBrandShopDetail.do?onlBrndCd=A002820&t_page=%EC%83%81%ED%92%88%EC%83%81%EC%84%B8&t_click=%EB%B8%8C%EB%9E%9C%EB%93%9C%EA%B4%80_%EC%83%81%EB%8B%A8&t_brand_name=%ED%86%A0%EB%A6%AC%EB%93%A0",
"reviews": []
"is_in_promotion": True/False
}
}

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@seoyeong200
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Feature : Oliveyoung scrapper by seoyeong200 · Pull Request #22 · brickstudy/ETL · GitHub
Skip to content

Feature : Oliveyoung scrapper - #22

Open
seoyeong200 wants to merge 31 commits into
brickstudy:mainfrom
seoyeong200:feature-oliveyoung
Open

Feature : Oliveyoung scrapper#22
seoyeong200 wants to merge 31 commits into
brickstudy:mainfrom
seoyeong200:feature-oliveyoung

Conversation

@seoyeong200

@seoyeong200seoyeong200 commented Nov 11, 2024

Copy link
Copy Markdown
Collaborator

올리브영 수집 코드 개발스펙 추가

TODO

  • refactor. requests & beautiful soup to webdriver via selenium
    - driver class / method
  • refactor. apply item list paginating) collect items of each brand
  • add. review data scrapping
    - need to collect each items' url
    - in each url, collect review data
    - click event # 1. order by date
    - click event # 2. paginating
  • need to add dockeroperator in airflow - remote webdriver

데이터 구조 수정

ASIS

{
"듀오":
{"query_keyword":["DUO"],
"brand_shop_detail_url":"https://www.oliveyoung.co.kr/store/display/getBrandShopDetail.do?onlBrndCd=A002348",
"category":["미용소품_아이소품"],
"items":{"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 14g":false,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 다크 튜브 7g":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 7g (다크, 클리어) 튜브 타입 택1":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 14g ( 다크, 클리어 ) 튜브 타입 택 1":false,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 5g ( 다크, 클리어 ) 팁 타입 택 1":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 7g":true},
"released_date":"2024-08-19"}
}

TOBE
items 필드 수정

  • "items" 필드
    • asis : {제품명|str : 할인여부|bool}
      1. id key 값으로 주고 name, url, is_promotion 리스트로 그냥 묶어서 value로
      • {id|str : [name|str, url|str, is_promotion|bool]}
      1. items dataclass 안에 또 들어가기
      1. 아예 클래스 분리하기
        Brand
  • 최초 한번만 모아서 적재해놓고
  • 아이템 일주일 단위로 최신화할때 이 데이터 블러서 url 뽑아서 아이템, 리뷰 크롤링
{
"brand_id":
{
"brand_name":"듀오"
"query_keyword":["DUO"],
"brand_shop_detail_url":"https://{domain}/store/display/getBrandShopDetail.do?onlBrndCd=A002348",
"category":["미용소품_아이소품"],
"released_date":"2024-08-19"}
}

Items

{
"itemID":
{"brand_id": "#####",
"name": "브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 14g",
"url": "https://{domain}/store/display/getBrandShopDetail.do?onlBrndCd=A002820&t_page=%EC%83%81%ED%92%88%EC%83%81%EC%84%B8&t_click=%EB%B8%8C%EB%9E%9C%EB%93%9C%EA%B4%80_%EC%83%81%EB%8B%A8&t_brand_name=%ED%86%A0%EB%A6%AC%EB%93%A0",
"reviews": []
"is_in_promotion": True/False
}
}

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@seoyeong200
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Feature : Oliveyoung scrapper by seoyeong200 · Pull Request #22 · brickstudy/ETL · GitHub
Skip to content

Feature : Oliveyoung scrapper - #22

Open
seoyeong200 wants to merge 31 commits into
brickstudy:mainfrom
seoyeong200:feature-oliveyoung
Open

Feature : Oliveyoung scrapper#22
seoyeong200 wants to merge 31 commits into
brickstudy:mainfrom
seoyeong200:feature-oliveyoung

Conversation

@seoyeong200

@seoyeong200seoyeong200 commented Nov 11, 2024

Copy link
Copy Markdown
Collaborator

올리브영 수집 코드 개발스펙 추가

TODO

  • refactor. requests & beautiful soup to webdriver via selenium
    - driver class / method
  • refactor. apply item list paginating) collect items of each brand
  • add. review data scrapping
    - need to collect each items' url
    - in each url, collect review data
    - click event # 1. order by date
    - click event # 2. paginating
  • need to add dockeroperator in airflow - remote webdriver

데이터 구조 수정

ASIS

{
"듀오":
{"query_keyword":["DUO"],
"brand_shop_detail_url":"https://www.oliveyoung.co.kr/store/display/getBrandShopDetail.do?onlBrndCd=A002348",
"category":["미용소품_아이소품"],
"items":{"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 14g":false,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 다크 튜브 7g":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 7g (다크, 클리어) 튜브 타입 택1":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 14g ( 다크, 클리어 ) 튜브 타입 택 1":false,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 5g ( 다크, 클리어 ) 팁 타입 택 1":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 7g":true},
"released_date":"2024-08-19"}
}

TOBE
items 필드 수정

  • "items" 필드
    • asis : {제품명|str : 할인여부|bool}
      1. id key 값으로 주고 name, url, is_promotion 리스트로 그냥 묶어서 value로
      • {id|str : [name|str, url|str, is_promotion|bool]}
      1. items dataclass 안에 또 들어가기
      1. 아예 클래스 분리하기
        Brand
  • 최초 한번만 모아서 적재해놓고
  • 아이템 일주일 단위로 최신화할때 이 데이터 블러서 url 뽑아서 아이템, 리뷰 크롤링
{
"brand_id":
{
"brand_name":"듀오"
"query_keyword":["DUO"],
"brand_shop_detail_url":"https://{domain}/store/display/getBrandShopDetail.do?onlBrndCd=A002348",
"category":["미용소품_아이소품"],
"released_date":"2024-08-19"}
}

Items

{
"itemID":
{"brand_id": "#####",
"name": "브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 14g",
"url": "https://{domain}/store/display/getBrandShopDetail.do?onlBrndCd=A002820&t_page=%EC%83%81%ED%92%88%EC%83%81%EC%84%B8&t_click=%EB%B8%8C%EB%9E%9C%EB%93%9C%EA%B4%80_%EC%83%81%EB%8B%A8&t_brand_name=%ED%86%A0%EB%A6%AC%EB%93%A0",
"reviews": []
"is_in_promotion": True/False
}
}

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@seoyeong200
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Feature : Oliveyoung scrapper by seoyeong200 · Pull Request #22 · brickstudy/ETL · GitHub
Skip to content

Feature : Oliveyoung scrapper - #22

Open
seoyeong200 wants to merge 31 commits into
brickstudy:mainfrom
seoyeong200:feature-oliveyoung
Open

Feature : Oliveyoung scrapper#22
seoyeong200 wants to merge 31 commits into
brickstudy:mainfrom
seoyeong200:feature-oliveyoung

Conversation

@seoyeong200

@seoyeong200seoyeong200 commented Nov 11, 2024

Copy link
Copy Markdown
Collaborator

올리브영 수집 코드 개발스펙 추가

TODO

  • refactor. requests & beautiful soup to webdriver via selenium
    - driver class / method
  • refactor. apply item list paginating) collect items of each brand
  • add. review data scrapping
    - need to collect each items' url
    - in each url, collect review data
    - click event # 1. order by date
    - click event # 2. paginating
  • need to add dockeroperator in airflow - remote webdriver

데이터 구조 수정

ASIS

{
"듀오":
{"query_keyword":["DUO"],
"brand_shop_detail_url":"https://www.oliveyoung.co.kr/store/display/getBrandShopDetail.do?onlBrndCd=A002348",
"category":["미용소품_아이소품"],
"items":{"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 14g":false,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 다크 튜브 7g":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 7g (다크, 클리어) 튜브 타입 택1":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 14g ( 다크, 클리어 ) 튜브 타입 택 1":false,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 5g ( 다크, 클리어 ) 팁 타입 택 1":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 7g":true},
"released_date":"2024-08-19"}
}

TOBE
items 필드 수정

  • "items" 필드
    • asis : {제품명|str : 할인여부|bool}
      1. id key 값으로 주고 name, url, is_promotion 리스트로 그냥 묶어서 value로
      • {id|str : [name|str, url|str, is_promotion|bool]}
      1. items dataclass 안에 또 들어가기
      1. 아예 클래스 분리하기
        Brand
  • 최초 한번만 모아서 적재해놓고
  • 아이템 일주일 단위로 최신화할때 이 데이터 블러서 url 뽑아서 아이템, 리뷰 크롤링
{
"brand_id":
{
"brand_name":"듀오"
"query_keyword":["DUO"],
"brand_shop_detail_url":"https://{domain}/store/display/getBrandShopDetail.do?onlBrndCd=A002348",
"category":["미용소품_아이소품"],
"released_date":"2024-08-19"}
}

Items

{
"itemID":
{"brand_id": "#####",
"name": "브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 14g",
"url": "https://{domain}/store/display/getBrandShopDetail.do?onlBrndCd=A002820&t_page=%EC%83%81%ED%92%88%EC%83%81%EC%84%B8&t_click=%EB%B8%8C%EB%9E%9C%EB%93%9C%EA%B4%80_%EC%83%81%EB%8B%A8&t_brand_name=%ED%86%A0%EB%A6%AC%EB%93%A0",
"reviews": []
"is_in_promotion": True/False
}
}

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@seoyeong200
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Feature : Oliveyoung scrapper by seoyeong200 · Pull Request #22 · brickstudy/ETL · GitHub
Skip to content

Feature : Oliveyoung scrapper - #22

Open
seoyeong200 wants to merge 31 commits into
brickstudy:mainfrom
seoyeong200:feature-oliveyoung
Open

Feature : Oliveyoung scrapper#22
seoyeong200 wants to merge 31 commits into
brickstudy:mainfrom
seoyeong200:feature-oliveyoung

Conversation

@seoyeong200

@seoyeong200seoyeong200 commented Nov 11, 2024

Copy link
Copy Markdown
Collaborator

올리브영 수집 코드 개발스펙 추가

TODO

  • refactor. requests & beautiful soup to webdriver via selenium
    - driver class / method
  • refactor. apply item list paginating) collect items of each brand
  • add. review data scrapping
    - need to collect each items' url
    - in each url, collect review data
    - click event # 1. order by date
    - click event # 2. paginating
  • need to add dockeroperator in airflow - remote webdriver

데이터 구조 수정

ASIS

{
"듀오":
{"query_keyword":["DUO"],
"brand_shop_detail_url":"https://www.oliveyoung.co.kr/store/display/getBrandShopDetail.do?onlBrndCd=A002348",
"category":["미용소품_아이소품"],
"items":{"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 14g":false,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 다크 튜브 7g":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 7g (다크, 클리어) 튜브 타입 택1":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 14g ( 다크, 클리어 ) 튜브 타입 택 1":false,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 5g ( 다크, 클리어 ) 팁 타입 택 1":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 7g":true},
"released_date":"2024-08-19"}
}

TOBE
items 필드 수정

  • "items" 필드
    • asis : {제품명|str : 할인여부|bool}
      1. id key 값으로 주고 name, url, is_promotion 리스트로 그냥 묶어서 value로
      • {id|str : [name|str, url|str, is_promotion|bool]}
      1. items dataclass 안에 또 들어가기
      1. 아예 클래스 분리하기
        Brand
  • 최초 한번만 모아서 적재해놓고
  • 아이템 일주일 단위로 최신화할때 이 데이터 블러서 url 뽑아서 아이템, 리뷰 크롤링
{
"brand_id":
{
"brand_name":"듀오"
"query_keyword":["DUO"],
"brand_shop_detail_url":"https://{domain}/store/display/getBrandShopDetail.do?onlBrndCd=A002348",
"category":["미용소품_아이소품"],
"released_date":"2024-08-19"}
}

Items

{
"itemID":
{"brand_id": "#####",
"name": "브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 14g",
"url": "https://{domain}/store/display/getBrandShopDetail.do?onlBrndCd=A002820&t_page=%EC%83%81%ED%92%88%EC%83%81%EC%84%B8&t_click=%EB%B8%8C%EB%9E%9C%EB%93%9C%EA%B4%80_%EC%83%81%EB%8B%A8&t_brand_name=%ED%86%A0%EB%A6%AC%EB%93%A0",
"reviews": []
"is_in_promotion": True/False
}
}

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@seoyeong200
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Feature : Oliveyoung scrapper by seoyeong200 · Pull Request #22 · brickstudy/ETL · GitHub
Skip to content

Feature : Oliveyoung scrapper - #22

Open
seoyeong200 wants to merge 31 commits into
brickstudy:mainfrom
seoyeong200:feature-oliveyoung
Open

Feature : Oliveyoung scrapper#22
seoyeong200 wants to merge 31 commits into
brickstudy:mainfrom
seoyeong200:feature-oliveyoung

Conversation

@seoyeong200

@seoyeong200seoyeong200 commented Nov 11, 2024

Copy link
Copy Markdown
Collaborator

올리브영 수집 코드 개발스펙 추가

TODO

  • refactor. requests & beautiful soup to webdriver via selenium
    - driver class / method
  • refactor. apply item list paginating) collect items of each brand
  • add. review data scrapping
    - need to collect each items' url
    - in each url, collect review data
    - click event # 1. order by date
    - click event # 2. paginating
  • need to add dockeroperator in airflow - remote webdriver

데이터 구조 수정

ASIS

{
"듀오":
{"query_keyword":["DUO"],
"brand_shop_detail_url":"https://www.oliveyoung.co.kr/store/display/getBrandShopDetail.do?onlBrndCd=A002348",
"category":["미용소품_아이소품"],
"items":{"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 14g":false,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 다크 튜브 7g":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 7g (다크, 클리어) 튜브 타입 택1":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 14g ( 다크, 클리어 ) 튜브 타입 택 1":false,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 5g ( 다크, 클리어 ) 팁 타입 택 1":true,
"브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 7g":true},
"released_date":"2024-08-19"}
}

TOBE
items 필드 수정

  • "items" 필드
    • asis : {제품명|str : 할인여부|bool}
      1. id key 값으로 주고 name, url, is_promotion 리스트로 그냥 묶어서 value로
      • {id|str : [name|str, url|str, is_promotion|bool]}
      1. items dataclass 안에 또 들어가기
      1. 아예 클래스 분리하기
        Brand
  • 최초 한번만 모아서 적재해놓고
  • 아이템 일주일 단위로 최신화할때 이 데이터 블러서 url 뽑아서 아이템, 리뷰 크롤링
{
"brand_id":
{
"brand_name":"듀오"
"query_keyword":["DUO"],
"brand_shop_detail_url":"https://{domain}/store/display/getBrandShopDetail.do?onlBrndCd=A002348",
"category":["미용소품_아이소품"],
"released_date":"2024-08-19"}
}

Items

{
"itemID":
{"brand_id": "#####",
"name": "브랜드관^듀오_베스트^듀오 퀵셋 속눈썹 접착제 클리어 튜브 14g",
"url": "https://{domain}/store/display/getBrandShopDetail.do?onlBrndCd=A002820&t_page=%EC%83%81%ED%92%88%EC%83%81%EC%84%B8&t_click=%EB%B8%8C%EB%9E%9C%EB%93%9C%EA%B4%80_%EC%83%81%EB%8B%A8&t_brand_name=%ED%86%A0%EB%A6%AC%EB%93%A0",
"reviews": []
"is_in_promotion": True/False
}
}

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@seoyeong200