이미지 데이터 세트를 생성할 때 Yahoo 이미지 검색에서 이미지를 스크랩하는 것은 중요합니다. 이 가이드에서는 Python과 요청 라이브러리를 HTML 구문 분석 기술용 lxml과 함께 사용하여 Yahoo 이미지 검색에서 이미지를 스크랩하는 방법을 설명합니다. 또한 Yahoo 봇 탐지 시스템에 걸리지 않도록 프록시 사용에 대해서도 다룹니다.
Yahoo 이미지에서 이미지를 스크랩하려면 다음 Python 라이브러리가 필요합니다:
필요한 라이브러리가 모두 설치되어 있는지 확인하세요. pip를 사용하여 설치합니다:
pip install requests
pip install lxml
또는 단일 명령을 사용하세요:
pip install requests lxml
먼저 스크래퍼에 필요한 라이브러리를 가져와야 합니다.
import requests
from lxml import html
다음으로 야후 이미지에서 검색을 수행하겠습니다.
여기서는 검색 쿼리를 강아지로 정의하고 필요한 헤더와 함께 Yahoo 이미지 검색에 GET 요청을 보내겠습니다. 요청 헤더는 브라우저 요청을 모방하는 데 중요하며, 이는 기본적인 봇 탐지 메커니즘을 우회하는 데 도움이 됩니다.
# 브라우저 요청을 모방할 헤더를 정의합니다.
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": "max-age=0",
"dnt": "1",
"priority": "u=0, i",
"sec-ch-ua": '"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
"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/125.0.0.0 Safari/537.36",
}
# 검색 쿼리 정의
search_query = "puppies"
# Yahoo 이미지 검색 페이지에 GET 요청을 합니다.
response = requests.get(
url=f"https://images.search.yahoo.com/search/images?p={search_query}",
headers=headers
)
야후로부터 응답을 받은 후 HTML을 파싱하여 이미지 URL을 추출해야 합니다. 이를 위해 lxml을 사용합니다.
# HTML 응답 구문 분석
parser = fromstring(response.text)
# XPath를 사용하여 이미지 URL 추출
images_urls = parser.xpath("//li[contains(@id, 'resitem-')]/a//@src")
함수 fromstring은 HTML 응답 텍스트를 구문 분석하는 데 사용됩니다. Xpath는 이미지의 URL을 추출하는 데 사용됩니다. 아래 스크린샷은 xpath를 얻은 방법을 보여줍니다.
이미지 URL 목록이 있으므로 이제 각 이미지를 다운로드해야 합니다.
여기서는 images_urls 목록을 반복하여 count(인덱스)와 url(주소)를 모두 추출합니다. 그런 다음 각 이미지가 해당 URL로 GET 요청을 전송하여 다운로드됩니다.
# 각 이미지를 다운로드하여 파일에 저장
for count, url in enumerate(images_urls):
response = requests.get(url=url, headers=headers)
마지막으로 다운로드한 이미지를 로컬 파일 시스템에 저장합니다. 파일 저장 프로세스를 처리하는 함수를 다운로드_파일로 정의합니다.
이 함수는 (고유한 파일명을 생성하기 위한) 개수와 (이미지 데이터를 포함하는) 응답을 받습니다. Content-Type 헤더에서 파일 확장자를 결정하고 ./images/ 디렉터리에 파일을 저장합니다.
def download_file(count, response):
# 콘텐츠 유형 헤더에서 파일 확장자를 가져옵니다.
extension = response.headers.get("Content-Type").split("/")[1]
filename = "./images/" + str(count) + f".{extension}"
# 디렉터리가 없는 경우 디렉터리 만들기
os.makedirs(os.path.dirname(filename), exist_ok=True)
# 파일에 응답 내용을 작성합니다.
with open(filename, "wb") as f:
f.write(response.content)
루프 내에서 이 함수를 호출하면 다운로드한 각 이미지를 저장합니다:
for count, url in enumerate(images_urls):
response = requests.get(url=url, headers=headers)
download_file(count, response)
야후에서 데이터를 스크랩할 때는 야후의 봇 탐지 메커니즘에 대해 알아두는 것이 중요합니다. 야후는 주로 이러한 기술을 사용하여 자동화된 봇을 식별하고 차단합니다:
특히 동일한 IP에서 여러 요청을 할 때 Yahoo 봇 탐지 메커니즘에 의해 차단되는 것을 방지하기 위해 프록시를 사용하여 IP 주소를 마스킹합니다.
여러 프록시를 통해 요청을 라우팅하면 스크래핑 활동을 여러 IP 주소로 분산하여 탐지될 확률을 줄일 수 있습니다.
proxies = {
'http': 'http://USER:PASS@HOST:PORT',
'https': 'http://USER:PASS@HOST:PORT'
}
response = requests.get(url, headers=headers, proxies=proxies, verify=False)
다음은 프록시를 사용하여 Yahoo 이미지 검색 결과에서 이미지를 스크랩하는 전체 스크립트입니다:
import os
import requests
from lxml.html import fromstring
def download_file(count, response):
"""
응답 내용을 ./이미지/ 디렉터리에 있는 파일에 저장합니다.
Args:
count (int): 파일의 고유 식별자입니다.
response (requests.Response): 파일 콘텐츠가 포함된 HTTP 응답입니다.
"""
# 콘텐츠 유형 헤더에서 파일 확장자를 가져옵니다.
extension = response.headers.get("Content-Type").split("/")[1]
filename = "./images/" + str(count) + f".{extension}"
# 디렉터리가 없는 경우 디렉터리 만들기
os.makedirs(os.path.dirname(filename), exist_ok=True)
# 파일에 응답 내용을 작성합니다.
with open(filename, "wb") as f:
f.write(response.content)
def main():
"""
이미지를 검색하고 다운로드하는 주요 기능입니다.
이 기능은 다음 단계를 수행합니다:
1. 요청 헤더를 설정합니다.
2. 야후에서 강아지 이미지를 검색합니다.
3. HTML 응답을 구문 분석하여 이미지 URL을 추출합니다.
4. 각 이미지를 다운로드하여 ./images/ 디렉터리에 저장합니다.
"""
# 브라우저 요청을 모방할 헤더를 정의합니다.
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": "max-age=0",
"dnt": "1",
"priority": "u=0, i",
"sec-ch-ua": '"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
"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/125.0.0.0 Safari/537.36",
}
# 속도 제한을 우회할 프록시를 정의하세요.
proxies = {"http": "http://USER:PASS@HOST:PORT", "https": "http://USER:PASS@HOST:PORT"}
# 검색 쿼리 정의
search_query = "puppies"
# Yahoo 이미지 검색 페이지에 GET 요청을 합니다.
response = requests.get(
url=f"https://images.search.yahoo.com/search/images?p={search_query}",
headers=headers,
proxies=proxies,
verify=False
)
# HTML 응답 구문 분석
parser = fromstring(response.text)
# XPath를 사용하여 이미지 URL 추출
images_urls = parser.xpath("//li[contains(@id, 'resitem-')]/a//@src")
# 각 이미지를 다운로드하여 파일에 저장
for count, url in enumerate(images_urls):
response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
download_file(count, response)
if __name__ == "__main__":
main()
Python을 사용해 Yahoo 이미지 검색에서 이미지를 스크랩하는 것은 데이터 수집 및 분석 작업을 자동화하는 강력한 기술입니다. HTTP 요청을 위한 요청 라이브러리와 HTML 구문 분석을 위한 lxml 라이브러리를 활용하면 이미지 URL을 효율적으로 추출하고 이미지를 다운로드할 수 있습니다. 프록시를 통합하면 광범위한 스크래핑 활동 중에 탐지를 피하고 IP 금지를 방지할 수 있습니다.
댓글: 0