반응형
반응형

예전 방식이라 잘되지 않는다. 

다른 url로 했을때 데이터는 잘 가져왔다. 

css 보안이 걸려있는듯. 

 

##  인스타그램 이미지 크롤링
#    
##
import os
import sys
import konlpy
import pandas as pd
import numpy as np
os.environ['JAVA_OPTS'] = 'Xmx4096M'
    
## 시간 표시  ##################################### 
import time
import datetime
now = datetime.datetime.now()

timeserise = time.time()
timeserise = str(int(timeserise))
print(timeserise)
print(now)
#################################################  


#작업하는 경로(위치)가 어디인지 확인
print(os.getcwd())

prePath = "./Project/instagram_cr/"
file_name = prePath + "outputfile0.txt" 

# 라이브러리 추가
from bs4 import BeautifulSoup  #불러온 데이터를 구분지어 원라는 데이터 출력
from selenium import webdriver #Chromedriver를 사용하여, 자동화 시스템 구동
## chrome 버전 안맞으면 아래와 같은 에러 발생함. chromedriver 버전 확인 필수
#  selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 94
# Current browser version is 105.0.5195.102 with binary path C:\Program Files\Google\Chrome\Application\chrome.exe
# 
# GoUrl : https://chromedriver.storage.googleapis.com/index.html?path=105.0.5195.52/
##


from urllib.request import urlopen
from urllib.parse  import quote_plus # ASCII 형태로 자동 변형
import requests
import shutil
 


testurl_01 = "https://www.instagram.com/explore/tags/"
testurl_02 = input("Please input the word to search for : ")
testurl_03 = testurl_01 + quote_plus(testurl_02)


print(testurl_03)

## 아래 오류때문에 추가함. options
#  USB: usb_device_handle_win.cc:1048 Failed to read descriptor from node connection: 시스템에 부착된 장치가 작동하지 않습니다. 
## options start
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-logging"])
#browser = webdriver.Chrome(options=options)
## options end 

#driver_01 = webdriver.Chrome()
driver_01 = webdriver.Chrome(options=options)
driver_01.get(testurl_03)

html_01 = driver_01.page_source
#print(html_01)

Source_01 = BeautifulSoup(html_01,"html.parser")
#Source_01 = BeautifulSoup(html_01,"lxml")
#Source_01 = BeautifulSoup(html_01)

time.sleep(5)

#print(Source_01)
print(Source_01.prettify())
 
o = open(prePath +'result_list.txt', 'w', encoding='utf-8')
o.write("")
o.write(Source_01.prettify())
o.close()    




var_list = [1, 3, 5, 7, 9]
for ii in var_list:
    print("----------------------------------------")


Demo_insta = Source_01.select('._a3wf._-kb.segoe') 
print(Demo_insta)

for each_div in Source_01.findAll('div',{'class':'list'}):
    print(each_div)


"""
x_1 = 1

for i in Demo_insta:
    print("https://www.instagram.com/" + i.a['href'])
    #img_01 = i.select_one('_aagt').img['src']
    #print(img_01)
"""

driver_01.close()
반응형
반응형

로컬 크롬 버전 확인 : chrome://version/

 

크롬드라이브 다운로드       https://sites.google.com/a/chromium.org/chromedriver/downloads  

 

반응형
반응형

[React] DnD - Drag andDrop for React 

https://react-dnd.github.io/react-dnd/about

 

React DnD

 

react-dnd.github.io

React DnD is a set of React utilities to help you build complex drag and drop interfaces while keeping your components decoupled. It is a perfect fit for apps like Trello and Storify, where dragging transfers data between different parts of the application, and the components change their appearance and the application state in response to the drag and drop events.

Installation

npm install react-dnd react-dnd-html5-backend

The second package will allow React DnD the HTML5 drag and drop API under the hood. You may choose to use a third-party backend instead, such as the touch backend.

// Let's make <Card text='Write the docs' /> draggable!

import React from 'react'
import { useDrag } from 'react-dnd'
import { ItemTypes } from './Constants'

/**
 * Your Component
 */
export default function Card({ isDragging, text }) {
  const [{ opacity }, dragRef] = useDrag(
    () => ({
      type: ItemTypes.CARD,
      item: { text },
      collect: (monitor) => ({
        opacity: monitor.isDragging() ? 0.5 : 1
      })
    }),
    []
  )
  return (
    <div ref={dragRef} style={{ opacity }}>
      {text}
    </div>
  )
}

 

 

https://codesandbox.io/s/github/react-dnd/react-dnd/tree/gh-pages/examples_js/01-dustbin/multiple-targets?from-embed=&file=/package.json 

 

react-dnd-example-3 - CodeSandbox

auto-generated package for codesandbox import

codesandbox.io

Backends

HTML5
Touch
Test
반응형
반응형

Node.js 패키지 생성 및 실행 - Node.js package, npm init, npm run 

 

 

Node.js의 패키지 만들기
 - 폴더 생성
 - 콘솔에서 생성된 폴더로 이동
 - 패키지를 생성하기 위해 npm init 명령어를 실행
 - 폴더에 package.json 파일이 생성됩니다.
D:\_nodejs\nodePjt>
D:\_nodejs\nodePjt>npm init

{
  "name": "test1",
  "version": "1.0.0",
  "description": "test",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "carrotweb",
  "license": "ISC"
}



* 패키지를 설치하는 명령어입니다.
  Express.js 설치하기
  Express.js는 Node.js에서 HTTP와 관련된 컴포넌트를 기반으로 하는 웹 애플리케이션 프레임워크입니다.
  현재 패키지(애플리케이션)에 Express.js를 설치하기 위해 콘솔에서 npm install 명령어를 실행합니다.
  npm install에 옵션으로 --save를 추가하면 자동으로 package.json 파일의 "dependencies"에 "express" 항목이 추가됩니다.

D:\_nodejs\nodePjt>
D:\_nodejs\nodePjt>npm install express --save

{
  "name": "test1",
  "version": "1.0.0",
  "description": "test",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "carrotweb",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1" --> 추가
  }
}





 * Node.js의 패키지(애플리케이션) 실행하기
 * Node.js를 종료는 콘솔에서 Ctrl + C를 누르면 됩니다.

D:\_nodejs\nodePjt>
D:\_nodejs\nodePjt>node index.js
Listening...
^C
D:\_nodejs\nodePjt>^C
D:\_nodejs\nodePjt>



=========================================================


접속 : http://localhost:8080/index.html


* npm으로 실행하기 위해 Script 추가하기
* 콘솔에서 npm start를 실행합니다.
  종료하려면 콘솔에서 Ctrl + C를 누르고 "Y"를 입력하고 엔터키를 누르면 됩니다.

D:\_nodejs\nodePjt>npm run start
npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.

> nodepjt@1.0.0 start
> node index.js

Listening...



* Express 정적 파일 적용하기
 - index.js를 오픈하여 이미지 파일이나 CSS 파일, JavaScript 파일 등과 같은 정적 파일을 제공하기 위해 
   Express.js의 express.static() 메서드를 추가합니다. 정적 파일들이 들어있는 폴더로 public 폴더를 설정하였습니다.
 - 폴더에 public 폴더를 생성합니다.
 - public 폴더에 index.html 파일을 생성합니다.
 - npm start를 실행합니다.
  

   D:\_nodejs\nodePjt>npm run start



 - 브라우저에서 "http://localhost:8080/index.html"를 입력


반응형
반응형

협업(Cooperation)과 경쟁(Competition)을 합쳐 Coopetition 협쟁(協爭)이라는 표현을 처음 쓴 것으로 알려진 인물은 에릭 슈미트 전 구글 최고경영자(CEO)입니다. 그는 삼성과 애플이 오랫동안 앙숙으로 지냈지만 결국 협력할 것은 협력하고 경쟁할 것은 경쟁하는 관계로 진화를 했듯이, 패권을 놓고 미국과 중국 역시 그렇게 가야한다고 말한바 있습니다. 또 하버드대의 그레이엄 앨리슨은 11세기 중국의 송나라와 요나라의 관계를 친구이자 적인 우적(Frenmity)으로 묘사하기도 했고요.

 

경쟁자끼리 협력하는 이유는 무엇일까요. 두 가지만 꼽는다면 (1) 경쟁 비용이 너무 많이 든다 (2) 프로젝트를 한 회사에서 관리하기에는 너무 크다. 하버드비즈니스리뷰의 설명입니다.

 

예를 들어 IT업계에는 스마트홈 표준 규격인 매터(Matter)를 도입할 움직임이 있는데요. 구글 아마존 삼성 LG 애플 필립스 등 수많은 기업들이 참여를 선언했어요. 스마트홈 디바이스 표준이 제각각이라 고객은 늘 불만이죠. 삼성 갤럭시폰으로 LG 디오스냉장고를 조작 못하니까요. 한 회사가 스마트홈 전체 시장을 독점할 수 없으니 협쟁이 필요할 것입니다. 예를 더 들어 보겠습니다.

 

독일 물류업체인 DHL은 미국의 물류업체인 UPS를 향해 이런 제안을 했어요.

 

🛺DHL: 미국 내에서 물류 배송을 UPS 네가 해주면 안 될까? 너희가 해주면 우리 회사는 약 10억달러를 아낄 수 있을 것 같아.

🚌UPS: (경쟁사 좋은 걸 내가 왜 해야하지??? 한데 내가 거절하면 FedEx에 달려가 제안을 하겠지?) 콜!

 

UPS 입장에선 DHL의 제안을 거절했다면, 아마 미국내 배송이라는 추가 수익을 FedEx에 빼앗길 수 있었겠죠? 이는 단적인 사례입니다. 애플은 사실 삼성과 LG의 경쟁자인데요. 하지만 삼성과 애플은 디스플레이 패널, 적층세라믹콘덴서, 카메라 모듈 등을 판매합니다. 왜? 두 회사 부품이 우수하지만, 꼭 삼성과 LG만 파는 것은 아니거든요.

 

🔎크게보기

협쟁이 이뤄지려면 경쟁사간에 두 가지가 필요합니다. 각각 자신의 분야에서 최고일 것. 기울어진 운동장이 아닐 것. 예를 들어 포드는 자신이 투자한 자율주행 업체인 아르고AI를 폭스바겐에 소개를 시켜서 투자를 받도록 했어요. 이유는? 어차피 폭스바겐 역시 자율주행 업체들을 찾고 있을 텐데, 그럴 바엔 포드가 투자한 자율주행 기술이 표준이 되도록 하는 것이 옳다고 생각한 것입니다. GM 넌 안 돼! 중요한 점은 협쟁을 하려면 CEO의 사고방식이 매우 유연해야합니다. 욕먹어도 괜찮다는 태세전환이 필요합니다. 애플의 스티브 잡스는 1997년 마이크로소프트가 더 이상 적이 아니라고 선언을 하고, 1억5000만 달러에 달하는 투자를 받습니다. 하지만 스티브 잡스나 빌 게이츠 모두 야유 세례를 받은 바 있습니다.

반응형
반응형

Generate Doxygen Comments in VS Code

This VS Code Extensions provides Doxygen Documentation generation on the fly by starting a Doxygen comment block and pressing enter.

 

 

 

Table of Contents

Features

Alignment

For how this works, see the CHANGELOG.md

Attributes

Con- and Destructors

 

Extensive customization

 

 

File descriptions

Function pointers

Operators

 

Parameters

 

Return types

 

Smart text

 

 

Supported smart text snippets:

  • Constructors
  • Destructors
  • Getters
  • Setters
  • Factory methods

Each of them can be configured with its own custom text and you can decide if the addon should attempt to split the name of the method according to its case.

Trailing

Templates

 

Auto-complete doxygen commands

Config options

// The prefix that is used for each comment line except for first and last.
"doxdocgen.c.commentPrefix": " * ",

// Smart text snippet for factory methods/functions.
"doxdocgen.c.factoryMethodText": "Create a {name} object",

// The first line of the comment that gets generated. If empty it won't get generated at all.
"doxdocgen.c.firstLine": "/**",

// Smart text snippet for getters.
"doxdocgen.c.getterText": "Get the {name} object",

// The last line of the comment that gets generated. If empty it won't get generated at all.
"doxdocgen.c.lastLine": " */",

// Smart text snippet for setters.
"doxdocgen.c.setterText": "Set the {name} object",

// Doxygen comment trigger. This character sequence triggers generation of Doxygen comments.
"doxdocgen.c.triggerSequence": "/**",

// Smart text snippet for constructors.
"doxdocgen.cpp.ctorText": "Construct a new {name} object",

// Smart text snippet for destructors.
"doxdocgen.cpp.dtorText": "Destroy the {name} object",

// The template of the template parameter Doxygen line(s) that are generated. If empty it won't get generated at all.
"doxdocgen.cpp.tparamTemplate": "@tparam {param} ",

// File copyright documentation tag. Array of strings will be converted to one line per element. Can template {year}.
"doxdocgen.file.copyrightTag": [
"@copyright Copyright (c) {year}"
],

// Additional file documentation. One tag per line will be added. Can template `{year}`, `{date}`, `{author}`, `{email}` and `{file}`. You have to specify the prefix.
"doxdocgen.file.customTag": [],

// The order to use for the file comment. Values can be used multiple times. Valid values are shown in default setting.
"doxdocgen.file.fileOrder": [
"file",
"author",
"brief",
"version",
"date",
"empty",
"copyright",
"empty",
"custom"
],

// The template for the file parameter in Doxygen.
"doxdocgen.file.fileTemplate": "@file {name}",

// Version number for the file.
"doxdocgen.file.versionTag": "@version 0.1",

// Set the e-mail address of the author. Replaces {email}.
"doxdocgen.generic.authorEmail": "you@domain.com",

// Set the name of the author. Replaces {author}.
"doxdocgen.generic.authorName": "your name",

// Set the style of the author tag and your name. Can template {author} and {email}.
"doxdocgen.generic.authorTag": "@author {author} ({email})",

// If this is enabled a bool return value will be split into true and false return param.
"doxdocgen.generic.boolReturnsTrueFalse": true,

// The template of the brief Doxygen line that is generated. If empty it won't get generated at all.
"doxdocgen.generic.briefTemplate": "@brief {text}",

// The format to use for the date.
"doxdocgen.generic.dateFormat": "YYYY-MM-DD",

// The template for the date parameter in Doxygen.
"doxdocgen.generic.dateTemplate": "@date {date}",

// Decide if you want to get smart text for certain commands.
"doxdocgen.generic.generateSmartText": true,

// Whether include type information at return.
"doxdocgen.generic.includeTypeAtReturn": true,

// How many lines the plugin should look for to find the end of the declaration. Please be aware that setting this value too low could improve the speed of comment generation by a very slim margin but the plugin also may not correctly detect all declarations or definitions anymore.
"doxdocgen.generic.linesToGet": 20,

// The order to use for the comment generation. Values can be used multiple times. Valid values are shown in default setting.
"doxdocgen.generic.order": [
"brief",
"empty",
"tparam",
"param",
"return",
"custom",
"version",
"author",
"date",
"copyright"
],

// Custom tags to be added to the generic order. One tag per line will be added. Can template `{year}`, `{date}`, `{author}`, `{email}` and `{file}`. You have to specify the prefix.
"doxdocgen.generic.customTags": [],

// The template of the param Doxygen line(s) that are generated. If empty it won't get generated at all.
"doxdocgen.generic.paramTemplate": "@param {param} ",

// The template of the return Doxygen line that is generated. If empty it won't get generated at all.
"doxdocgen.generic.returnTemplate": "@return {type} ",

// Decide if the values put into {name} should be split according to their casing.
"doxdocgen.generic.splitCasingSmartText": true,

// Array of keywords that should be removed from the input prior to parsing.
"doxdocgen.generic.filteredKeywords": [],

// Substitute {author} with git config --get user.name.
"doxdocgen.generic.useGitUserName": false,

// Substitute {email} with git config --get user.email.
"doxdocgen.generic.useGitUserEmail": false

// Provide intellisense and snippet for doxygen commands
"doxdocgen.generic.commandSuggestion": true

// Add `\\` in doxygen command suggestion for better readbility (need to enable commandSuggestion)
"doxdocgen.generic.commandSuggestionAddPrefix": false

Contributors

Christoph Schlosser

Rowan Goemans

Known Issues

See open bugs

What's to come

See open features

반응형

+ Recent posts