1. html

ctrl+u -> ctrl +a 로 복사 -> 블로그글쓰기에서 기본모드말고 html로 변경 ->복붙 ->끝

 

2. pdf

구글드라이브에서 pdf선택 -> 오른쪽클릭 -> 고급 -> 비공개에서 모든웹사용자에게 허용으로 바꾸기 -> 다시 파일에 오른쪽탭누르고 공유눌러서 링크 복사

drive.google.com/file/d/1vu-9Qfsji7Tzh3M~~~~~nlnCGNS/view?usp=sharing

 

이런식으로 나올텐데 뒤에꺼  view~ 지우고  /preview로 바꿔준다음

아래처럼 고쳐주고 글쓰기 html 모드에 복붙해주기

 

 

<p><iframe src="https://drive.google.com/file/d/118mnuF1-YCjps~~~~~1jEOkjAfd6XN/preview" width="700" height="800"></iframe></p> 
<p><a href="https://drive.google.com/open?id=118mnuF1-YC~~~~~~~OkjAfd6XN" target="_blank" rel="noopener">새 창에서 열기</a></p>

 

키바나 대시보드 만드는 큰순서

  1. Discover -> change index pattern에서 대시보드를 만들 index설정 ->show dates에서 적절한 date범위 조절
  2. Visualization -> create visualization ->시각화하고싶은 방법선택(ex:수직바차트,파이차트) -> data index 를 선택한다> 보이고 싶은 조건에 맞추어 구성
  3. Dashboard -> create dashboard -> create new버튼으로 visualization 새로 생성 or add 버튼눌러서 만들어둔 visualization들 중 선택

Visualization 구성방법

데이터 시각화를 시작하려면 사이드 탐색 메뉴에서 시각화 를 클릭합니다.

시각화 툴을 사용하여 데이터를 다양한 방식으로 볼 수 있습니다.

Pie chart를 사용하여 데이터를 살펴보도록 하겠습니다.

시작하려면 시각화 목록에서 Pie 를 클릭합니다. 기본 검색은 모든 문서에 대해 일치 여부를 비교합니다. 처음에는 하나의 "슬라이스"가 전체 파이를 보여줍니다.

차트에 표시할 슬라이스를 나누려면 Elasticsearch Bucket 집계를 사용합니다. 예를 들어 포트번호 분포를 파이차트로 나눠서 볼수있습니다.
각 포트번호별로 슬라이스하기 위해 다음을 수행합니다.

  1. Aggregation을 선택합니다 개수로 분포를 나누기위해서는 Terms를 사용합니다.
  2. 필드 목록에서 포트번호 필드를 선택합니다.
  3. Order 부분에서 Metric:Count를 사용하여 Count를 선택합니다 (개수를 기준으로 삼기 때문)
  4. Order에서 오름차순과 내림차순을 선택해주고 바차트에 보여줄 개수를 고릅니다. 만약 Descending : 5로 선택하면 큰수에서 작은수로 내림차순으로 5개의 프로토콜이 보여지게 됩니다.
  5. 만약 뚫린 파이차트가 싫다면 OPtions - Donut부분을 선택해제 해주면 꽉찬 동그라미모양의 파이차트가 됩니다.
    또 파이차트옆 내림차순으로 포트번호5개리스트 위치를 바꾸고 싶다면 Legend position - bottom으로 상하좌우 위치를 선택해주면 됩니다.

내림차순이나 오름차순이 아니라 직접 범위를 지정한 버킷을 지정해주고싶다면,

  1. 분할 슬라이스 버킷 유형을 클릭합니다.
  2. 집계 목록에서 범위 를 선택합니다.
  3. 필드 목록에서 해당필드를 선택합니다.
  4. 범위 추가로 범위를 직접 지정해줍니다.

.이번엔 Vertical Bar을 사용하여 데이터를 살펴보도록 하겠습니다.(Pie chart의 슬라이스 = x axis 으로 조건을 나누는부분은 동일합니다)

  1. 새로 만들기 를 클릭하고 'Vertical Bar’를 선택합니다.
  2. Index 패턴을 선택합니다. 아직 어떤 버킷도 정의하지 않았으므로 커다란 하나의 바가 나타나 총 문서 수를 표시합니다.
  3. Metric 집계의 y-axis에서 개수가 디폴트로 지정되어 있습니다. 만약 Max, Average, Min등 갯수가아닌 기준으로 바차트를 보이고싶다면 선택해줍니다. 예시에서는 count를 선택하였습니다.
  4. X축을 설정해주기위해서는 Bucket -> X-axis을 선택한다음 agrregation에서 Terms을 선택해줍니다. 파이차트와 바차트에서는 주로 갯수를 보기위해 많이쓰이므로 대부분 Terms를 사용합니다.
  5. 앞서 보았던 파이차트와 동일하게 Order by, Order를 지정해줍니다.
    (만약 갯수가 아니라 알파벳순으로 나열하고싶다면 order by: Alphabetical로 설정해줍니다.

만약 , 바차트에서 두가지 필드를 보고싶다면 , 예를들어 목적지 포트번호를 내림차순으로 5개가 있는데 80번포트번호의 attatckType 구성을 보고싶다면

  1. Buckets 에서 추가버튼클릭 -> Split series -> Terms -> AccidentType필드선택 -> order by: count-> 내림차순 으로 원하는 갯수 지정해주면 됩니다.

.데이터 총갯수나, 필드값에서 가장많은 값을 단편적으로 알고싶다면 gauge를 활용합니다.

생성하기를 누르면 디폴트로 해당 index의 총 데이터 갯수가 나타나게 됩니다.

이것은 데이터의 총 개수나 퍼센테이지를 나타내는데 주로 쓰입니다.
만약, 간단하게 어떤 필드값이 가장 많은지 단편적으로 보고싶다면

  1. Metric -> aggregtaion : Max로 설정해준다음
  2. 필드를 선택합니다 (attackType)
  3. 옵션에서 Range를 설정해줍니다.

또 각 필드별로 퍼센티지를 보고싶다면

  1. Metric -> aggregtaion : Max로 설정해준다음
  2. 필드를 선택합니다 (attackType)
  3. 옵션에서 Range를 설정해줍니다.
  4. Buckets 에서 agrregtaion: Terms 선택
  5. 필드는 같은것으로 선택 (attackType)
  6. Order by 의 size개수를 변경하여 보여질 Guage 갯수를 지정

Tag Cloud는 가장 많은 필드들을 추려 보여줍니다.

  1. Metrics : count
  2. Buckets에서 Tag를 추가
  3. Aggregation을 terms로 지정해준다음 필드를 선택
  4. 가장많은 5가지 내용을 보고싶다면 Descending : 5를 선택

Line 과 Area는 채워져있나 안채워있나의 차이로 생긴것이 매우 흡사합니다. (Line 옵션- Metric -Char type 에서 area로 변경해주면 Area와 Line의 차이가 거의 없습니다.Timestamp별로 데이터 입력 흐름을 볼때 , 전체적인 붆포도를 볼떄 주로 쓰입니다.

Area에서 전체적인 분포도를 살펴보고 싶다면

  1. Metrics : count
  2. Buckets에서 x-axis추가
  3. Histogram선택
  4. 필드선택 ( sourcePort)
  5. interval을 적절히 설정

Line에서 Timestamp별로 발생한 이벤트의 수를 시간대별로 보고싶다면

  1. Metrics : count
  2. Buckets 의 x-axis 누르고 aggregation : Date Histogram선택
  3. 필드는 @timestamp로 지정
  4. Minimum interval은 데일리,위클리 적절한것으로 선택.

Lined에서 실시간 음원차트처럼 만들수도 있다. 실시간 input되는 데이터중 attackType이 0,1인경우를 나누어서 보입니다. (attackType은 가짓수가 적지만 가짓수가 많을경우 range말고 내림차순으로해도 괜찮습니다.)

  1. Metrics : count
  2. Bucket X-axis 의 aggregation에서 Date Histogram선택
  3. 필드는 @timestamp선택
  4. interval은 시간별,날짜별,주별 선택해준다. 시간별로 세부적으로 보고싶다면 하루날짜를 필터링하여 시간별로 나눌수도 있습니다.
  5. Bucket에 Split series를 추가.
  6. Sub aggregation : Range 설정후 필드도 설정(attackType선택)
  7. Range 범위정하기.

'<프론트>' 카테고리의 다른 글

장고 로그아웃 (django logout)  (0) 2021.01.13
장고 비로그인시 접근제한  (0) 2021.01.13

html부분 로그아웃칸에다 onclick으로 logout url로연결해준다. (누르면 logout url로 가게해놨다.)

<li>
<a class="gn-icon gn-icon-archive" onclick="location.href='http://~~~~~~2.139:38080/Logout'">Logout</a>
</li>

Logout.html 생성

(사실 의미가없다 , 로그아웃버튼 누르자마자 로그인페이지로 가게해놔서 보여지지도않는다. 근데 없으면 url에서 에러가 나서 존재에 의의를 두기로했다)

{% load static %}
<!DOCTYPE html>
<html>
        <head>
                <meta charset="utf-8">
                <title>Login</title>
                <link rel="stylesheet" href="{% static 'css/loginstyle.css' %}" >
                <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.1/css/all.css"><!--아이콘두개-->
        </head>
        <body>
                 <div class="logo-bar">
                        <img class="logo" src="{% static "img/main_logo.png" %}" height="150px" align="center" />
                  </div>
                <div class="login">
                        <h1>Logout</h1>
                        <form class="form-signin" method="POST" action="/">{% csrf_token %}
                                <input type="submit" value="Submit" class="btn btn-lg btn-primary btn-block">
                        </form>
                </div>
        </body>
</html>

urls.py에 path(Logout~~ 한줄추가해주기

from . import views 
from django.urls import path
from django.contrib import admin

urlpatterns = [

    path('Logout/',views.Logout),
]

views.py에 추가해줄것. 

from django.contrib.auth import authenticate
from django.shortcuts import render
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth import logout
from django.shortcuts import redirect
from django.contrib.auth.models import User
from django.contrib.auth import login

def Logout(request):
    logout(request)
    return render(request, 'mainapp/Login.html')

 

'<프론트>' 카테고리의 다른 글

kibana dashboard 구성 가이드라인  (0) 2021.01.13
장고 비로그인시 접근제한  (0) 2021.01.13

html 추가할부분

<!--비로그인 실행할부분에 로그인html을 넣어줬다/ 비로그인상태면 로그인창으로 이동시켜줌.
로그인html에서 Post request가 발생하면 view에서 받아오는걸로 해놨기 때문에 로그인html만 추가하면끝이다 간단하다-->

{% if user.is_authenticated %}
로그인상태일때 실행할부분
{%else%}
비로그인시 실행할부분
{%endif%}

views.py에서 추가할부분

(로그인 함수 부분에서 login(reqest,result) 추가해줘야한다)

(추가안하면 인증만 하는거고 render해서 다른 html넘어갈때 비로그인상태다. 저거 추가하면 로그인상태로 쭉 유지해준다, ~/admin에서 로그인한거랑 똑같아짐)

(로그아웃하고싶을땐 전 포스팅 로그아웃 참조하기)

def Login(request):

    if request.method == 'POST':
        id = request.POST.get('userid','')
        pw = request.POST.get('userpw', '')

        result = authenticate(username=id, password=pw)

        if result :
            print("로그인 성공!")
            login(request, result)
            return render(request, 'mainapp/index.html')

        else:
            print("실패")
            return render(request, 'mainapp/Login.html')

    return render(request, 'mainapp/Login.html')

views.py에서 에러나면 저것들을 import해주자.

from django.contrib.auth import authenticate
from django.shortcuts import render
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth import logout
from django.shortcuts import redirect
from django.contrib.auth.models import User
from django.contrib.auth import login

 

'<프론트>' 카테고리의 다른 글

kibana dashboard 구성 가이드라인  (0) 2021.01.13
장고 로그아웃 (django logout)  (0) 2021.01.13

스킨을 바꿔서 사용해주던중... 블로그 스킨내 글쓰기 아이콘을 누르면 티스토리 구 에디터로 뜨길래 신에디터로 바로 뜰수있게 변경해주었다.

 

우선 크롬에서 글쓰기 버튼 오른쪽마우스클릭하고 검사를 눌러서 살펴본다. 다음과 같이 구 에디터는 주소가 ~~admin/entry/post 이다. 반면 신에디터는 ~manage/newpost블라블라 이렇게 뜬다 

 

 

 

확인했으니 티스토리 설정 들어가서 -[스킨편집] - [HTML] 들어간다음 ctrl-f 로 admin/entry/post 을 검색해서 위치를 찾아낸다. 

아래 사진에서 보라색 부분임을 확인할수있다. 이부분을 위에 신에디터 주소로(/manage/newpost/~~~ 이부분)  복붙해서 바꿔준다.

 

 

이제 글쓰기 버튼을 눌러도 구 에디터가 아니라 신에디터로 사용할수있다!

 

반대로 신에디터에서 구 에디터로 사용하고 싶은 사람은 저 manage/newpost ~~ 이부분을 admin/entry/post 로 바꿔주면 된다!

<실행순서>

  1.  와디즈 상품 하나하나 클릭해보는 방식으로 열고닫고 방식으로 제목+내용+카테고리 긁어오기 (상품30개만)
  2. 와디즈가 무한 스크롤 방식이라 총 상품개수를 알수 없음. -> 클릭은 하지 않고 해당 카테고리 상품리스트를 훝는 방식으로 제목+ 상품url 긁어와서 전체 상품 리스트를 만듬(총몇개인가 확인) 
  3. 스크롤을 바닥까지 끌어온다음(30초) 1번 방식으로 하나하나 클릭했다 뒤로갔다 반복하면서 전체 긁어오기 --> (치명적인 문제점 발생 )미친듯이 느리다
  4. 속도개선 -> (((((((((((( IP 차단당함 ))))))))))))))      (ip 우회전에는 120개쯤 긁어오면 귀신같이 연결이 끊어졌는데 ip우회 후에는 300-500개쯤 긁어오면 끊겼다...)
  5. IP우회 + 멀티프로세서 사용 + (2)에서 만든 상품리스트 url을 리스트로 불러와 차례차례 접근 +속도 개선조건들 추가  
  6. time.sleep()을 0.3초로 빨리 하면 빨리 긁어오는데 미처 못긁어온 결측치 데이터가 많이지고(3000개중 1000개 title,body 군데군데 누락) 1분정도로 하면 놓치는 데이터가 현저히 줄어드는대신 속도가 많이 느려진다... 누락된데이터를 다시 모아서 마지막으로 한번더 돌려준다.

 

 

 

 

1. 와디즈 상품 하나하나 열어서 제목+내용+카테고리 긁어오기 (상품30개만)

- 패션/잡화 카테고리 부분 하나하나 클릭해서 열고 제목/본문/카테고리 긁어오기 

!pip install selenium
from selenium import webdriver
driver = webdriver.Chrome(executable_path= r"C:\chromedriver_win32\chromedriver.exe") #다운받은 크롬드라이버.exe위치
driver.get("https://www.wadiz.kr/web/wreward/category/288?keyword=&endYn=ALL&order=recommend") #크롤링할사이트

import time
wadiz_body=[]
wadiz_title=[]
wadiz_category=[]

table = driver.find_element_by_class_name('ProjectCardList_container__3Y14k') #상품들을 포함하는 껍데기 클래스(위사진참조)
rows = table.find_elements_by_class_name("ProjectCardList_item__1owJa") # 열 하나=상품하나 (위사진참조)
#똑같은 클래스네임가진 열들 줄줄이 많이존재(위사진참조)

for i in range(1,31): #30번만 실행
    table = driver.find_element_by_class_name('ProjectCardList_container__3Y14k') #표 전체
    rows = table.find_elements_by_class_name("ProjectCardList_item__1owJa")
    rows = table.find_elements_by_class_name("ProjectCardList_item__1owJa")[i]
    rows.click()
    time.sleep(3) 
    
    # 본문내용 긁어서 list인 wadiz_body에 집어넣기
    #https://stackoverflow.com/questions/49900117/python-selenium-list-object-has-no-attribute-text-error?noredirect=1&lq=1
    body = driver.find_elements_by_xpath(f'//*[@id="introdetails"]/div') #본문내용 xpath, 마우스 우클릭 copy-xpath복사
    for value in body:  #body가 <P></P>형태로 굉장히 줄줄이 있어서 for문으로 해결
        #print(value.text)
        wadiz_body.append(value.text) #리스트에 줄줄이 집어넣기
        
    # 제목내용 긁어서 wadiz_title에 집어넣기
    title = driver.find_element_by_xpath(f'//*[@id="container"]/div[3]/h2/a')  #제목 xpath
    wadiz_title.append(title.text)
    
    #카테고리 긁어서 wadiz_category에 집어넣기
    category = driver.find_element_by_xpath(f'//*[@id="container"]/div[3]/p') #카테고리 Xpath
    wadiz_category.append(category.text)
    
    time.sleep(2) 
        
    button = driver.find_element_by_class_name('back-btn')
    button.click()
    time.sleep(2) 

timesleep(3)으로 했더니 너무 느려서 0.3이나 0.2정도 해주는것이 적당하다.

import pandas as pd
import numpy as np
df1=pd.DataFrame({'title':wadiz_title,'body':wadiz_body,'category':wadiz_category})
# wadiz_title, wadiz_body, wadiz_category이렇게 3개의 열을 가진 표를 dataFrame으로 만든다
df1
len(df1) #총 몇갠지 출력
import csv
df1.to_csv("wadiz.csv", mode='w',encoding='utf-8-sig')
#쥬피터로 실행하면 실행하는 파일안에 csv파일 생성됨/ utf안해주면 한글깨짐

 

기타 연습한것~~!!

import time
title = driver.find_element_by_class_name('ProjectCardList_item__1owJa')
print(title.text)
title.click() #클릭
body = driver.find_element_by_class_name('inner-contents')
print(body.text) #본문내용출력
button = driver.find_element_by_class_name('back-btn')
button.click() #뒤로가기
driver.back() #뒤로가기2
table = driver.find_element_by_class_name('ProjectCardList_list__1YBa2') 
print(table.text)
# 현제 웹페이지 url추출
url = driver.current_url
print(url)

핵심!!

table = driver.find_element_by_class_name('ProjectCardList_container__3Y14k') #표 전체
rows = table.find_elements_by_class_name("ProjectCardList_item__1owJa")[5] 
#똑같은 클래스 이름 가진 열들중 6번째 열, 즉 6번째 상품 클릭
rows.click()

 

2. 무한 스크롤 돌리기 (총상품개수 제목+url만 리스트로 뽑기)

0.3초 간격으로 for문돌리면 1분도 안되서 바닥까지 도달한다.

 

와디즈는 스크롤 방식이지만, 잘 뜯어보면 아래 분명히 더보기 버튼이 숨겨져있다. 

::after로 숨겨져있는 부분이 스크롤을 하면 뒤에 주르륵 새롭게 나타나는 방식이다. 

 

어느순간 클릭이 안된다고 에러가 난다. 바닥에 도착한것이다

(끝나고 스크롤을 맨 밑으로 내려서 더보기버튼을 누르면 눌리지않고 반응도 없다)

 

from selenium import webdriver
driver = webdriver.Chrome(executable_path= r"C:\chromedriver_win32\chromedriver.exe") #다운받은 크롬드라이버.exe위치
driver.get("https://www.wadiz.kr/web/wreward/category/288?keyword=&endYn=ALL&order=recommend") #크롤링할사이트
import time
try:
    for i in range(1000000000000):
        button = driver.find_element_by_xpath(f'//*[@id="main-app"]/div[2]/div/div[5]/div[2]/div[2]/div/button') #더보기버튼 xpath
        time.sleep(0.3)
        driver.execute_script("arguments[0].click();", button) #click()으로 에러가나서 써줌
        
except : 
    button = driver.find_element_by_class_name
    button.click()  
#다된거같은데 끝이안나면 그냥 중지눌러주면 된다
table = driver.find_element_by_class_name('ProjectCardList_container__3Y14k') #표 전체
rows = table.find_elements_by_class_name("ProjectCardList_item__1owJa")

for index, value in enumerate(rows):  #enumerate는 리스트가 있는 경우 순서와 리스트의 값을 전달하는 기능
    title=value.find_element_by_class_name("CommonCard_title__1oKJY")
    wadiz_title.append(title.text) 

    url=value.find_element_by_class_name("CardLink_link__1k83H")
    url1=value.get_attribute('href')
    wadiz_url.append(url1)
    time.sleep(0.3)
import pandas as pd
import numpy as np
df1=pd.DataFrame({'title':wadiz_title})  # 열이름을 title로 해주고 표형식으로 보기좋게 만듬
len(df1) #총상품개수 몇갠지 출력
import csv
df1.to_csv("wadiz.csv", mode='w',encoding='utf-8-sig')  #csv파일로 내보냄 앞에도 설명똑같은거있음

 

3. 무한 스크롤 돌린다음 모든상품 제목+내용+url 긁어오기 (하나하나 클릭해서 열고닫는 방식 ->무지무지 느림)

import time
# 바닥까지 무한 스크롤
try:
    for i in range(1000000000000):
        button = driver.find_element_by_xpath(f'//*[@id="main-app"]/div[2]/div/div[5]/div[2]/div[2]/div/button')
        time.sleep(0.3)
        driver.execute_script("arguments[0].click();", button)
except : 
    button = driver.find_element_by_class_name
    button.click()
   
import time
wadiz_body=[]
wadiz_title=[]
wadiz_url=[]

table = driver.find_element_by_class_name('ProjectCardList_container__3Y14k') #표 전체
rows = table.find_elements_by_class_name("ProjectCardList_item__1owJa") # 열 하나
#똑같은 클래스네임가진 열들 줄줄이 많이존재

for i in range(1,4000): 
    table = driver.find_element_by_class_name('ProjectCardList_container__3Y14k') #표 전체
    rows = table.find_elements_by_class_name("ProjectCardList_item__1owJa")
    rows = table.find_elements_by_class_name("ProjectCardList_item__1owJa")[i]
    rows.click()
    time.sleep(4) 
    
    # 본문내용
    #https://stackoverflow.com/questions/49900117/python-selenium-list-object-has-no-attribute-text-error?noredirect=1&lq=1
    body = driver.find_elements_by_xpath(f'//*[@id="introdetails"]/div')
    for value in body:
        #print(value.text)
        wadiz_body.append(value.text)
        
    # 제목
    title = driver.find_element_by_xpath(f'//*[@id="container"]/div[3]/h2/a')
    wadiz_title.append(title.text)
    
    #카테고리
    #category = driver.find_element_by_xpath(f'//*[@id="container"]/div[3]/p')
    #wadiz_category.append(category.text)
    
    url = driver.current_url
    wadiz_url.append(url)
    
    time.sleep(0.3) 
        
    button = driver.find_element_by_class_name('back-btn')
    button.click()
    time.sleep(5) 

**time.sleep은 알아서 바꿔주기

 

4. 앞서 2번에서 뽑은 전체상품 리스트 url로 접근해서 긁어오기 + 멀티프로세싱 + 속도 최적화 + IP우회

 

속도개선을 위한 조건을 추가해줬다 

from selenium import webdriver
# from selenium.webdriver.common.keys import Keys
# from selenium.webdriver.common.action_chains import ActionChains

options = webdriver.ChromeOptions() # 크롬 옵션 객체 생성
options.add_argument('headless') # headless 모드 설정
options.add_argument("window-size=1920x1080") # 화면크기(전체화면)
options.add_argument("disable-gpu") 
options.add_argument("disable-infobars")
options.add_argument("--disable-extensions")

# 속도 향상을 위한 옵션 해제
prefs = {'profile.default_content_setting_values': {'cookies' : 2, 'images': 2, 'plugins' : 2, 'popups': 2, 'geolocation': 2, 'notifications' : 2, 'auto_select_certificate': 2, 'fullscreen' : 2, 'mouselock' : 2, 'mixed_script': 2, 'media_stream' : 2, 'media_stream_mic' : 2, 'media_stream_camera': 2, 'protocol_handlers' : 2, 'ppapi_broker' : 2, 'automatic_downloads': 2, 'midi_sysex' : 2, 'push_messaging' : 2, 'ssl_cert_decisions': 2, 'metro_switch_to_desktop' : 2, 'protected_media_identifier': 2, 'app_banner': 2, 'site_engagement' : 2, 'durable_storage' : 2}}   
options.add_experimental_option('prefs', prefs)

driver = webdriver.Chrome(executable_path= r"C:\chromedriver_win32\chromedriver.exe", options=options)
driver.get("https://www.wadiz.kr/web/wreward/category/288?keyword=&endYn=ALL&order=recommend")
driver.maximize_window()

 

 

속도는 개선됬는데 와디즈에서 차단당했다...... 

몇시간을 구글링하고 플러그인 결제까지해서 뻘짓을 해본 결과 제일 빠르고 안정적인 우회1방법을 찾았다 ( 윈도우 기준)

blog.naver.com/PostView.nhn?blogId=zzz90zzz&logNo=222026663292참조

 

 

The Tor Project | Privacy & Freedom Online

Defend yourself against tracking and surveillance. Circumvent censorship.

www.torproject.org

여기서 tor다운받고 실행해주고 + 아래코드를 활용할것이다. 

어째 tor을 쓰고나서 네트워크가 더 안정적이어진것같다

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
for i in range(1):
    chrome_options = Options()
    chrome_options.add_argument("--proxy-server=socks5://127.0.0.1:9150")
    driver = webdriver.Chrome(executable_path=' 내 PATH ', options=chrome_options)
    driver.get('웹사이트')

 

 

(2)에서 받아와 저장해둔 url.csv를 다시 불러와서 리스트로 만들어준다.

import pandas as pd
from pandas import Series,DataFrame
import numpy as np
data = pd.read_csv("./wadiz_title_url_f.csv")
data2=data['url']
one = data2.values.tolist() 

# one이라는 이름의 url 리스트 생성완료 / one 치고 실행해보면 리스트안에 url들 잘들어갔나 확인가능하다
len(one)  #3000여개가 나온다
#이부분은 한꺼번에가 아닌 나눠서 크롤링하려고 만들었다. 
#네트워크 상태에 따라서 120개 긁고 멈출때도 있고 500여개 긁고 멈춘일이 매우 다반사라서
#구간을 정해놓고 긁어오기를 시도한다. 중간에 끊기면 Two 리스트 구간만 바꿔서 다시 시도해주면 된다
#중간중간 끊어서 실행해주면 봇으로 의심받아서 차단당할 확률도 줄어든다

two=[]
two=one[464:900]
# 아이피우회 + 최적화...
# headless옵션을 주면 속도는 확실히 빠른데 오류가 잦아져서 뺐다.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

for i in range(1):
    chrome_options = Options()
    chrome_options.add_argument("--proxy-server=socks5://127.0.0.1:9150")   
    prefs = {'profile.default_content_setting_values': { 'images': 2, 'popups': 2, 'geolocation': 2, 'notifications' : 2, 'auto_select_certificate': 2, 'fullscreen' : 2, 'mouselock' : 2, 'mixed_script': 2, 'media_stream' : 2, 'media_stream_mic' : 2, 'media_stream_camera': 2, 'protocol_handlers' : 2, 'ppapi_broker' : 2, 'automatic_downloads': 2, 'midi_sysex' : 2, 'push_messaging' : 2, 'ssl_cert_decisions': 2, 'metro_switch_to_desktop' : 2, 'protected_media_identifier': 2, 'app_banner': 2, 'site_engagement' : 2, 'durable_storage' : 2}}   
    chrome_options.add_experimental_option('prefs', prefs)
    driver = webdriver.Chrome(executable_path=r"C:\chromedriver_win32\chromedriver.exe", chrome_options=chrome_options)
    driver.get("https://www.wadiz.kr/web/wreward/category/288?keyword=&endYn=ALL&order=recommend")
wbody=[]
wtitle=[]
wurl=[]
import requests
import time
from multiprocessing import Pool # Pool import하기


def mul():
    for i in two :
        driver.get(i)
        time.sleep(0.4) 
        # 본문내용
        #https://stackoverflow.com/questions/49900117/python-selenium-list-object-has-no-attribute-text-error?noredirect=1&lq=1
        body = driver.find_elements_by_xpath(f'//*[@id="introdetails"]/div')
        for value in body:
            #print(value.text)
            wbody.append(value.text)
        
        # 제목
        title = driver.find_element_by_xpath(f'//*[@id="container"]/div[3]/h2/a')
        wtitle.append(title.text)
        
        #카테고리
        #category = driver.find_element_by_xpath(f'//*[@id="container"]/div[3]/p')
        #wadiz_category.append(category.text)
    
        url = driver.current_url
        wurl.append(url)
    
    
if __name__=='__main__':
    pool = Pool(processes=32) # 32개의 프로세스를 사용합니다.
    pool.map(mul()) # mul 함수를 넣어줍시다.
len(wurl)
len(wbody)
len(wtitle)
#세명령어로 3개숫자가 같은지 확인 -> 숫자가 같지않으면 표가 만들어지지않음
# csv파일로 저장저장~

import pandas as pd
import numpy as np
import csv
df1=pd.DataFrame({'title':wtitle,'body':wbody,'url':wurl})
df1.to_csv("wadiz_1.csv", mode='w',encoding='utf-8-sig')

5. 결측치데이터 모아서 다시 돌려주기

import pandas as pd
from pandas import Series,DataFrame
import numpy as np

data1 = pd.read_csv("./wadiz_1.csv")
data2 = pd.read_csv("./wadiz_2.csv")
data3 = pd.read_csv("./wadiz_3.csv")
data4 = pd.read_csv("./wadiz_4.csv")

온전한 데이터들 모아서 하나로 합쳐주기

data1.info() #결측치값 확인
data1.dropna(inplace=True) #결측치 포함된 열 지워버리기
f=[data1,data2,data3,data4]
dt = pd.concat(f)
import csv
dt.to_csv("wadiz_11.csv", mode='w',encoding='utf-8-sig') #온전한 데이터들 다시모아서 하나로 합치기

 

결측치값 모아서 url리스트로 바꿔줘서 다시 돌리기

data1=data1.fillna("miss") #결측치 miss 스트링열로 바꿔치기
d1=data1[data1['body'] == 'miss'] ## df[조건식] 
d1=data1[data1['title'] == 'miss'] ## df[조건식]  # 내용, 제목 결측치 합친건데 교집합 안뺀 합집합

d1 = d1.drop_duplicates('url', keep='first')   #교집합 뺴주기
d2 = d2.drop_duplicates('url', keep='first')

d1=d1['url']
one = d1.values.tolist() #url만 뽑아서 리스트로 만들어주기

miss_list = one + two + thr + fou #리스트 하나로 합치기

그리고 나서 3번이랑 똑같이 셀레니움 새창 띄우고 리스트를 돌려서 다시긁어주고 반복!

+ Recent posts