GUI TwitterUrlCrawler

설명

코드

main.py

import time
from selenium import webdriver
from selenium.webdriver import ChromeOptions, Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import csv
import re
from datetime import datetime

# ----- 입력이 필요한 값 -----
# 내 트위터 계정 아이디
MY_TWITTER_ID = "INPUT_YOUR_PASSWORD"

# 내 트위터 계정 비번
MY_TWITTER_PW = "INPUT_YOUR_PASSWORD"

# 크롤링 하려는 상대방 아이디
TARGET_ID = "INPUT_TARGET_ID" 
# ----- ----- ----- ----- -----

# 설정값들
# 크롤링 하려는 상대방 주소                       
TWITTER_TARGET_URL = f"<https://twitter.com/{TARGET_ID}>"  
# 스크롤 딜레이   
TIME_SLEEP = 3

tweet_urls = [] # 모든 트윗 주소를 담을 리스트                               
pattern = r'^https:\\/\\/x\\.com\\/' + re.escape(TARGET_ID) + r'\\/status\\/\\d+$'
now = datetime.now()
CURRENT_TIME = now.strftime("%y%m%d_%H%M%S%f")[:-3]

# ChromeDriver Option 설정.
options = ChromeOptions()
options.add_argument("headless")
options.add_experimental_option("excludeSwitches", ["enable-automation"])

# 로그인 과정
def login() :
    username = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'input[autocomplete="username"]')))
    username.send_keys(MY_TWITTER_ID)
    username.send_keys(Keys.ENTER)

    time.sleep(1)

    password = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'input[name="password"]')))
    password.send_keys(MY_TWITTER_PW)
    password.send_keys(Keys.ENTER)

    print("로그인 성공")
    time.sleep(TIME_SLEEP)

# 현재 페이지에 있는 모든 트윗을 수집.
def crawlingCurrentView() :
    tweets = driver.find_elements(By.CSS_SELECTOR, "article")

    for tweet in tweets:
        links = tweet.find_elements(By.CSS_SELECTOR, "a")
        for link in links:
            href = link.get_attribute("href")
            if href and re.match(pattern, href):
                print(href)
                tweet_urls.append(href)

# ----- ----- ----- ----- -----
# 동작하는 부분.
driver = webdriver.Chrome()
url = "<https://twitter.com/i/flow/login>"
driver.get(url)

login()

# 특정 사용자의 프로필 페이지 열기
driver.get(TWITTER_TARGET_URL)
time.sleep(TIME_SLEEP)

# 페이지의 끝까지 스크롤하면서 트윗 주소 수집
last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    crawlingCurrentView()
    print("스크롤 내리는 중...")
    # 스크롤을 페이지의 끝까지 내립니다.
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    
    time.sleep(TIME_SLEEP)

    # 스크롤 후 페이지의 높이를 다시 계산합니다.
    new_height = driver.execute_script("return document.body.scrollHeight")
    
    # 새로운 높이와 이전 높이가 같으면 더 이상 스크롤 할 필요가 없습니다.
    if new_height == last_height:
        print("스크롤 끝까지 내림 완료")
        break
    
    last_height = new_height

tweet_urls = list(set(tweet_urls))

# 트윗 주소를 CSV 파일로 저장
csv_filename = f'{TARGET_ID}_{CURRENT_TIME}.csv'
with open(csv_filename, 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(['Tweet URL'])
    for url in tweet_urls:
        writer.writerow([url])

print(f"{len(tweet_urls)}개의 트윗 주소를 수집했습니다.")

# 드라이버 종료
driver.quit()

사용법

  1. Python 설치.
  2. cmd에서 pip install selenium으로 셀레니엄 설치.
  3. 코드를 복사해서 파이썬 파일을 만들어주세요. (ex. main.py)
    1. 메모장을 이용해도 됩니다.
    2. 확장자 지정만 파인썬 확장자인 .py로 해주세요.
  4. INPUT_YOUR_ID에 본인의 트위터 계정 아이디를 입력해주세요.
  5. INPUT_YOUR_PASSWORD에 본인의 트위터 계정 비밀번호를 입력해주세요.
  6. TARGET_ID 에 크롤링을 원하는 상대방 아이디를 입력해주세요.
  7. 저장을 해서 입력한 내용을 코드에 반영하세요.
  8. cmd에서 3에서 만든 파일을 찾아서, python명령어로 실행해주세요.