콘텐츠 평가, 데이터 수집, 작가와 작품 모니터링 등의 목적을 위해 Medium에서 글을 추출하는 것은 매우 중요합니다. 이 튜토리얼에서는 파이썬 프로그래밍 언어를 사용하여 작가를 위한 기사 웹사이트인 Medium을 스크랩하는 방법을 배웁니다. Medium 기사의 지정된 웹 URL에서 기사 제목, 작성자 이름, 출판물 이름, 텍스트 본문 등의 데이터를 추출하는 방법에 대해 설명합니다.
이 튜토리얼에서는 Medium의 "코드를 크게 최적화하는 9가지 Python 내장 데코레이터" 문서를 스크랩할 것입니다.
시작하기 전에 다음 라이브러리를 설치하세요:
다음 명령어로 설치하세요:
pip install requests
pip install lxml
pip install pandas
Medium은 무단 스크래핑을 방지하기 위해 봇 탐지 기술을 사용합니다. 적절한 헤더와 프록시는 봇 탐지를 방지하고 책임감 있는 스크래핑을 위해 매우 중요합니다.
헤더: 실제 브라우저에서 오는 것처럼 요청을 시뮬레이션합니다. 여기에는 브라우저 유형, 허용되는 콘텐츠 유형, 캐싱 동작과 같은 정보가 포함됩니다.
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'priority': 'u=0, i',
'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
}
프록시: 프록시는 IP 주소를 마스킹하여 주기적으로 교체함으로써 요청이 Medium에 의해 차단될 가능성을 낮출 수 있습니다. 다음은 IP 주소 인증에 프록시를 사용하는 예시입니다:
proxies = {
'http': 'IP:PORT',
'https': 'IP:PORT'
}
response = requests.get(
'https://medium.com/techtofreedom/9-python-built-in-decorators-that-optimize-your-code-significantly-bc3f661e9017',
headers=headers,
proxies=proxies
)
헤더를 설정하고 문서 URL로 요청을 보내는 방법은 다음과 같습니다:
import requests
# 실제 브라우저 요청을 시뮬레이션하는 헤더
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'priority': 'u=0, i',
'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
}
url = 'https://medium.com/techtofreedom/9-python-built-in-decorators-that-optimize-your-code-significantly-bc3f661e9017'
response = requests.get(url, headers=headers)
페이지 콘텐츠가 있으면 이를 파싱하여 관련 정보를 추출할 수 있습니다.
lxml을 사용하여 HTML 응답을 구문 분석하고 특정 요소를 추출하겠습니다. 방법은 다음과 같습니다:
from lxml.html import fromstring
parser = fromstring(response.text)
# 데이터 추출
title = parser.xpath('//h1[@data-testid="storyTitle"]/text()')[0]
author = parser.xpath('//a[@data-testid="authorName"]/text()')[0]
publication_name = parser.xpath('//a[@data-testid="publicationName"]/p/text()')[0]
publication_date = parser.xpath('//span[@data-testid="storyPublishDate"]/text()')[0]
content = '\n '.join(parser.xpath('//div[@class="ci bh ga gb gc gd"]/p/text()'))
auth_followers = parser.xpath('//span[@class="pw-follower-count bf b bg z bk"]/a/text()')[0]
sub_title = parser.xpath('//h2[@id="1de6"]/text()')[0]
이제 추출된 모든 데이터를 담을 사전을 만들겠습니다. 이렇게 하면 CSV 파일로 저장하기가 더 쉬워집니다.
# 사전에서 데이터 저장
article_data = {
'Title': title,
'Author': author,
'Publication': publication_name,
'Date': publication_date,
'Followers': auth_followers,
'Subtitle': sub_title,
'Content': content,
}
print(article_data)
마지막으로, 추가 분석이나 기록 보관을 위해 데이터를 CSV 파일에 저장해 보겠습니다.
import pandas as pd
# 사전을 데이터프레임으로 변환하고 CSV로 저장하기
df = pd.DataFrame([article_data])
df.to_csv('medium_article_data.csv', index=False)
print("Data saved to medium_article_data.csv")
다음은 Medium 기사 데이터를 스크랩하는 전체 코드입니다:
import requests
from lxml.html import fromstring
import pandas as pd
# 브라우저를 모방하는 헤더
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'priority': 'u=0, i',
'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
}
proxies = {
'http': 'IP:PORT',
'https': 'IP:PORT'
}
# 페이지 요청하기
url = 'https://medium.com/techtofreedom/9-python-built-in-decorators-that-optimize-your-code-significantly-bc3f661e9017'
response = requests.get(url, headers=headers, proxies=proxies)
# 페이지 구문 분석하기
parser = fromstring(response.text)
# 데이터 추출
title = parser.xpath('//h1[@data-testid="storyTitle"]/text()')[0]
author = parser.xpath('//a[@data-testid="authorName"]/text()')[0]
publication_name = parser.xpath('//a[@data-testid="publicationName"]/p/text()')[0]
publication_date = parser.xpath('//span[@data-testid="storyPublishDate"]/text()')[0]
content = '\n '.join(parser.xpath('//div[@class="ci bh ga gb gc gd"]/p/text()'))
auth_followers = parser.xpath('//span[@class="pw-follower-count bf b bg z bk"]/a/text()')[0]
sub_title = parser.xpath('//h2[@id="1de6"]/text()')[0]
# 데이터 저장
article_data = {
'Title': title,
'Author': author,
'Publication': publication_name,
'Date': publication_date,
'Followers': auth_followers,
'Subtitle': sub_title,
'Content': content,
}
# CSV로 저장
df = pd.DataFrame([article_data])
df.to_csv('medium_article_data.csv', index=False)
print("Data saved to medium_article_data.csv")
Medium의 콘텐츠 스크래핑은 책임감 있게 수행해야 합니다. 서버에 과도한 요청 부하가 걸리면 서비스 성능에 영향을 미칠 수 있으며, 허가 없이 데이터를 스크랩하면 웹사이트의 이용약관에 위배될 수 있습니다. 웹사이트를 스크랩하기 전에 항상 robots.txt 파일과 약관을 확인하세요.
댓글: 0