크롤링 관련 실용적인 팁 및 기술

크롤링 관련 실용적인 팁 및 기술

목차- 크롤링 관련 실용적인 팁

  • PyCharm을 활용한 문자열 처리 (예: 요청 헤더에 따옴표 추가)
  • Chrome F12 디버거에서 "Debugger Paused" 해결 방법
  • 수동으로 프록시 설정 변경하기
  • User-Agent 풀 구성 및 활용
  • 프로그램 실행 시간 표시
  • 중요한 크롤링 요청 파라미터 구성
  • 문자열 날짜에 하루 더하기
  • 스레드 풀과 고정 간격의 작업 실행
  • URL 쿼리 매개변수를 딕셔너리로 변환

PyCharm을 활용한 문자열 처리

  • 필요한 문자열(예: 요청 헤더)을 복사하여 PyCharm에서 자동으로 따옴표 처리를 적용합니다.

Chrome F12 디버거에서 "Debugger Paused" 해결 방법

  • 브라우저 개발자 도구에서 발생하는 디버깅 중단 문제는 단순히 소스 탭에서 일시 중지 옵션을 해제하면 해결됩니다.

수동으로 프록시 설정 변경하기

# 웹사이트 분석 중 IP 차단으로 인해 데이터를 가져올 수 없는 경우, 프록시를 수동으로 변경할 수 있습니다.
# 몇 가지 유용한 프록시 제공 사이트:
- 무료 프록시:
    - 전국 프록시 IP: www.goubanjia.com 
    - 빠른 프록시: https://www.kuaidaili.com/
    - 시치 프록시: https://www.xicidaili.com/nn/
    - 프록시 스프라이트: http://http.zhiliandaili.cn/

User-Agent 풀 구성 및 활용

import random

class Crawler:
    def __init__(self):
        self.user_agents = [
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36",
            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
        ]
        self.headers = {}

    def fetch(self):
        self.headers['User-Agent'] = random.choice(self.user_agents)
        print(self.headers)

crawler = Crawler()
crawler.fetch()

프로그램 실행 시간 표시

import time
import datetime

def perform_task():
    time.sleep(random.randint(1, 5))

if __name__ == '__main__':
    start_time = datetime.datetime.now()
    print(f"{start_time.strftime('%Y-%m-%d %H:%M:%S')} 작업 시작")
    perform_task()
    end_time = datetime.datetime.now()
    print(f"{end_time.strftime('%Y-%m-%d %H:%M:%S')} 작업 종료! 소요 시간: {end_time - start_time}")

중요한 크롤링 요청 파라미터 구성

import requests
import traceback

session = requests.Session()

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
}

params = {
    "ajaxAction": True
}

proxies = {
    'http': '127.0.0.1:7891',
    'https': '127.0.0.1:7891'
}

def fetch_data():
    try:
        response = session.get(url='http://example.com', headers=headers, params=params, proxies=proxies, timeout=8)
        if response.status_code == 200:
            return response.text
    except Exception as e:
        print(f"오류 발생: {traceback.format_exc()}")
        return None

문자열 날짜에 하루 더하기

from datetime import datetime, timedelta

date_str = '2023-03-15'
date_obj = datetime.strptime(date_str, '%Y-%m-%d')
next_day = date_obj + timedelta(days=1)
formatted_date = next_day.strftime('%Y-%m-%d')
print(formatted_date)  # 출력: 2023-03-16

스레드 풀과 고정 간격의 작업 실행

import threading
import time
from concurrent.futures import ThreadPoolExecutor

def fetch_data(task_info):
    try:
        # 여기에 크롤링 로직 추가
        return {"status": "success", "data": task_info}
    except Exception as e:
        print(f"작업 실패: {e}")
        return None

def save_data(result):
    try:
        data = result.result()
        if data:
            print(f"데이터 저장 완료: {data}")
    except Exception as e:
        print(f"저장 실패: {e}")

def main():
    tasks = [{"id": i} for i in range(1, 6)]
    with ThreadPoolExecutor(max_workers=5) as executor:
        futures = [executor.submit(fetch_data, task) for task in tasks]
        for future in futures:
            future.add_done_callback(save_data)

thread = threading.Thread(target=main)
thread.start()

while True:
    if not thread.is_alive():
        thread.start()
    time.sleep(300)

URL 쿼리 매개변수를 딕셔너리로 변환

from urllib.parse import urlparse, parse_qs

def convert_query_to_dict(url):
    parsed_url = urlparse(url)
    query_params = parse_qs(parsed_url.query)
    return {key: value[0] if len(value) == 1 else value for key, value in query_params.items()}

url = "?cc=1&ck=1&cl=24-bit&ds=1920x1080&vl=1041&et=0&ja=0&ln=zh-cn&lo=0&lt=1628728417&ck=2"
result = convert_query_to_dict(url)
print(result)
# 출력: {'cc': '1', 'ck': ['1', '2'], 'cl': '24-bit', 'ds': '1920x1080', 'vl': '1041', 'et': '0', 'ja': '0', 'ln': 'zh-cn', 'lo': '0', 'lt': '1628728417'}

태그: python web-crawling threading

7월 4일 21:01에 게시됨