크롤링 관련 실용적인 팁 및 기술
목차- 크롤링 관련 실용적인 팁
- 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<=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'}