빙응의 공부 블로그

[7주차] 본문

goorm

[7주차]

빙응이 2024. 10. 8. 21:35

📝Django 웹 크롤링

  • 파이썬의 BeautifulSoup를 사용하면 간단하게 웹 크롤링이 가능하다

📌 BeautifulSoup

  • HTML과 XML 문서를 파싱하여, 데이터를 추출하기 쉽게 만들어주는 파이썬 라이브러리이다.
주요 특징
  • HTML/XML 파싱 : BeautifulSoup은 복잡하거나 잘못된 형식의 HTML도 유연하게 처리할 수 있다. 
  • DOM 탐색 : BeautifulSoup을 사용하면 HTML 태그들(예: <div>, <a>, <span> 등)을 쉽게 찾아서 그 안의 텍스트나 속성을 추출할 수 있다.
주요 메서드 
  • find(): 특정 조건에 맞는 첫 번째 태그를 찾습니다.
tag = source.find('a')
  • find_all(): 조건에 맞는 모든 태그를 리스트로 반환합니다.
tags = source.find_all('a')
  • .get_text(): 해당 태그의 텍스트(내용)를 가져옵니다.
text = tag.get_text()
  • .attrs: 태그의 속성(attribute)을 딕셔너리 형태로 가져옵니다.
href = tag.attrs['href']

 

해당 프로젝트의 코드
def naver_keyword(keyword):
    url = "https://search.naver.com/search.naver?where=news&query=" + str(keyword)
    web = requests.get(url).content
    source = BeautifulSoup(web, 'html.parser')

    news_subjects = source.find_all('a', {'class' : '_sp_each_title'}) # ResultSet (리스트와 유사한 형태)
    result = []

    for subject in news_subjects:
        result_subject = subject.get_text()
        result_url = subject.attrs['href']
        result.append((result_subject, result_url))

    return result
  • 웹 url에서 html을 받아 <a>의 class "_sp_each_title"을 받아오는 것이다. 

 

 

📝 {% csrf_token %}

CSRF (Cross-Site Request Forgery)란?
사용자가 의도하지 않는 요청을 특정 웹사이트에 보내게 만들어 악의적인 작업을 수행하는 공격 기법

Django는 이러한 CSRF 공격을 방지하기 위해 CSRF 토큰이라는 보안 메커니즘을 제공한다. CSRF 토큰은 서버가 생성한 고유한 값으로, 서버는 이 토큰을 요청과 함께 전달받아 해당 요청이 정상적인 웹사이트에서 온 것인지 확인한다.

 

 

Spring에서는?
  • 스프링에서는 Spring Security를 사용하면 자동으로 CSRF 토큰을 폼에 추가한다. 
  • 해당 행동은 보통 Thymeleaf 사용시에만 사용하며 API 서버는 사용하지 않는다.
  • 물론 수동 추가도 가능하다.
<form th:action="@{/your-action}" method="post">
    <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
    <input type="text" name="name" />
    <button type="submit">Submit</button>
</form>

 

📝액셀 파일 처리하기 

읽어올 데이터 형식 구현
class StudyAnalysis(models.Model):
    study_name = models.CharField(max_length=200)
    treatment_name = models.CharField(max_length=200)
    imported_sheet = models.FileField(upload_to='files/imported_sheets')
    up_patients = models.IntegerField()
    processed_df = PickledObjectField(default="None")
    sorted_df = PickledObjectField(default="None")
    reassessed_df = PickledObjectField(default="None")
    createdAt = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.study_name
액셀 읽기
    study = get_object_or_404(StudyAnalysis, pk=pk)
    up_patients = study.up_patients
    main_df = pd.read_excel(study.imported_sheet, sheetname=0)
    num_patients_imported = len(main_df.ID.unique())
    num_all_patients = num_patients_imported + up_patients

    context = {
        "study": study,
        "num_patients_imported": num_patients_imported,
        "num_all_patients": num_all_patients
    }
    return render(request, "calcmain/data_confirm.html", context)
  • main_df = pd.read_excel(study.imported_sheet, sheetname=0)
    • 해당 명령어는 pandas 라이브러리를 이용하여 study.imported_sheet 경로에 있는 액셀 파일을 읽는다.
    • sheetname=0은 첫 번째 시트를 가져오겠다는 의미이다.

 

액셀에 쓰기 
# 기존 Excel 파일 읽기
existing_df = pd.read_excel('output.xlsx', sheet_name='Sheet1')

# 새로운 데이터 추가
new_data = {
    'ID': [4],
    'Name': ['David'],
    'Age': [40]
}
new_df = pd.DataFrame(new_data)

# DataFrame 결합
updated_df = pd.concat([existing_df, new_df], ignore_index=True)

# 업데이트된 DataFrame을 다시 Excel 파일로 저장
updated_df.to_excel('output.xlsx', index=False, sheet_name='Sheet1')
  • 해당 코드는 액셀에 쓰는 예이다. 
  • 기존 액셀을 읽고
  • 새로 들어온 액셀을 DataFrame으로 결합하여 to_excel을 통해 업데이트하면 된다. 

'goorm' 카테고리의 다른 글

[8주차]  (1) 2024.10.16
[6주차]이미지 처리와 OpenCV 인식  (0) 2024.10.02
[4,5주차]  (1) 2024.09.25
[3주차]Django  (1) 2024.09.09
[2주차]Django 본격적인 시작  (0) 2024.09.02