인터넷에서 Amazon의 제품 카드를 구문 분석할 수 있는 스크립트를 발견했습니다. 그리고 저는 그런 문제에 대한 해결책이 필요했습니다.
Amazon의 제품 카드를 구문 분석하는 방법을 찾다가 머리가 아팠습니다. 문제는 Amazon이 다양한 출력에 대해 다양한 디자인 옵션을 사용한다는 것입니다. 특히 검색어 "bags"로 카드를 구문 분석해야 하는 경우 카드는 필요에 따라 세로로 배열되지만 예를 들어 , "티셔츠" – 그러면 카드가 가로로 배열되며 이러한 방식으로 스크립트에 오류가 발생하여 페이지를 열 수는 있지만 스크롤할 수는 없습니다.
게다가 Amazon에서 보안 문자 우회 방법에 대해 사용자들이 의아해하는 다양한 기사를 읽은 후 스크립트를 업그레이드하여 이제 보안 문자가 발생하면 우회할 수 있습니다(2captcha와 함께 작동). 스크립트는 새 페이지를 로딩할 때마다 페이지에 보안 문자가 있는지 확인하고 보안 문자가 발생하면 2capcha 서버에 요청을 보내고 솔루션을 받은 후 이를 대체하여 계속 작동합니다.
그러나 보안 문자를 우회하는 방법은 오늘날 사소한 작업이기 때문에 가장 어려운 문제는 아닙니다. 더 시급한 질문은 제품 카드의 세로 배열뿐만 아니라 가로 배열에서도 스크립트가 작동하도록 하는 방법입니다.
아래에서 스크립트에 포함된 내용을 자세히 설명하고, 작동 방식을 시연해 드리며, 문제 해결에 도움을 주실 수 있는지, 카드 가로 설정에서 작동하도록 스크립트에 무엇을 추가(변경)해야 하는지 아시는 분은 감사하겠습니다.
현재로서는 스크립트가 제한된 기능으로 누군가에게 도움이 될 수 있습니다.
그럼 대본을 하나씩 분해해 볼까요!
먼저 스크립트는 작업을 완료하는 데 필요한 모듈을 가져옵니다
Selenium import webdriver에서
selenium.webdriver.common.keys에서 키 가져오기
selenium.webdriver.common.action_chains에서 ActionChains 가져오기
selenium.webdriver.support.ui에서 WebDriverWait 가져오기
selenium.webdriver.support에서 예상_조건을 EC로 가져옵니다
CSV 가져오기
OS 가져오기
from time 가져오기 수면
가져오기 요청
부분적으로 분해해 보겠습니다.
Selenium import webdriver에서
스크립트를 통해 브라우저(제 경우에는 Firefox)를 제어할 수 있는 webdriver 클래스를 가져옵니다
selenium.webdriver.common.by import By
스크립트가 XPath로 구문 분석할 요소를 검색하는 theBy 클래스를 가져옵니다(다른 속성을 검색할 수 있지만 이 경우 Xpath가 사용됨)
selenium.webdriver.common.keys에서 키 가져오기
키 입력을 시뮬레이션하는 데 사용될 Keys 클래스를 가져옵니다. 이 스크립트의 경우 페이지를 Keys.PAGE_DOWN
아래로 스크롤합니다.selenium.webdriver.common.action_chains에서 ActionChains 가져오기
ActionChains 클래스를 가져와서 복잡한 순차 작업을 생성합니다. 우리의 경우에는 PAGE_DOWN 버튼을 클릭하고 페이지의 모든 요소가 로드될 때까지 기다립니다(Amazon 카드는 스크롤할 때 로드되기 때문입니다).
selenium.webdriver.support.ui에서 WebDriverWait 가져오기
우리가 찾고 있는 정보(예: Xpath로 검색할 제품 설명)가 로드될 때까지 기다리는 WebDriverWait 클래스를 가져옵니다
selenium.webdriver.support에서 예상_조건을 EC로 가져오기
이전 클래스와 함께 작동하고 WebDriverWait에게 기다려야 할 특정 조건을 알려주는 Expect_conditions 클래스(EC로 약칭)를 가져옵니다. 이는 아직 로드되지 않은 콘텐츠와 상호 작용을 시작하지 않도록 스크립트의 신뢰성을 높입니다.
CSV 가져오기
csv 파일을 사용하기 위해 csv 모듈을 가져옵니다.
OS 가져오기
운영 체제에서 작동하도록 os 모듈을 가져옵니다(디렉토리 생성, 파일 존재 확인 등).
시간 가져오기 수면
sleep 기능을 가져옵니다. 이는 스크롤하는 동안 요소가 로드되도록 특정 시간(제 경우에는 2초이지만 더 많이 설정할 수 있음) 동안 스크립트를 일시 중지하는 기능입니다.
가져오기 요청
2captcha 인식 서비스와 상호작용하기 위해 HTTP 요청을 보내기 위한 요청 라이브러리를 가져옵니다.
모든 항목을 가져온 후 스크립트는 특히 다음과 같은 작업용 브라우저 구성을 시작합니다.
2captcha 서비스 접속을 위한 API 키 설치
# 2Captcha용 API 키
API_KEY =
스크립트에는 브라우저용으로 설치되는 사용자 에이전트(물론 변경 가능)가 포함되어 있습니다. 그 후 브라우저는 지정된 설정으로 시작됩니다.
`user_agent = "Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
옵션 = webdriver.FirefoxOptions()
options.add_argument(f"user-agent={user_agent}")
드라이버 = webdriver.Firefox(옵션=옵션)
`
다음은 보안 문자 솔루션 모듈입니다. 보안 문자 해결 방법을 검색할 때 사용자가 찾는 곳이 바로 이곳입니다. 이 코드에는 특별한 문제가 없었으므로 오랫동안 분석하지 않겠습니다.
간단히 말하면, 스크립트는 각 페이지가 로드된 후 페이지에 보안 문자가 있는지 확인하고 거기에서 발견하면 2captcha 서버로 전송하여 문제를 해결합니다. 보안 문자가 없으면 계속 실행됩니다.
`defsolv_captcha(드라이버):
# 페이지에 보안문자가 있는지 확인하세요
시도해 보세요:
captcha_element = 드라이버.find_element(By.CLASS_NAME, 'g-recaptcha')
captcha_element인 경우:
print("보안문자가 감지되었습니다. 해결 중...")
site_key = captcha_element.get_attribute('data-sitekey')
current_url = 드라이버.현재_url
# Send captcha request to 2Captcha captcha_id = requests.post( 'http://2captcha.com/in.php', data={ 'key': API_KEY, 'method': 'userrecaptcha', 'googlekey': site_key, 'pageurl': current_url } ).text.split('|')[1] # Wait for the captcha to be solved recaptcha_answer = '' while True: sleep(5) response = requests.get(f"http://2captcha.com/res.php?key={API_KEY}&action=get&id={captcha_id}") if response.text == 'CAPCHA_NOT_READY': continue if 'OK|' in response.text: recaptcha_answer = response.text.split('|')[1] break # Inject the captcha answer into the page driver.execute_script(f'document.getElementById("g-recaptcha-response").innerHTML = "{recaptcha_answer}";') driver.find_element(By.ID, 'submit').click() sleep(5) print("Captcha solved.") except Exception as e: print("No captcha found or error occurred:", e)
파싱
다음은 페이지 정렬, 로드 및 스크롤을 담당하는 코드 섹션입니다.
시도해 보세요:
base_url = "https://www.amazon.in/s?k=bags"
for page_number in range(1, 10): page_url = f"{base_url}&page={page_number}" driver.get(page_url) driver.implicitly_wait(10) solve_captcha(driver) WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//span[@class="a-size-medium a-color-base a-text-normal"]'))) for _ in range(5): ActionChains(driver).send_keys(Keys.PAGE_DOWN).perform() sleep(2)
`
다음은 상품 데이터 수집입니다. 가장 중요한 부분. 이 부분에서 스크립트는 로드된 페이지를 검사하고 거기에서 지정된 데이터를 가져옵니다. 저희 경우에는 상품명, 리뷰수, 가격, URL, 상품평점 입니다.
`product_name_elements = 드라이버.find_elements(By.XPATH, '//span[@class="a-size-medium a-color-base a-text-normal"]')
rating_number_elements = 드라이버.find_elements(By.XPATH, '//span[@class="a-size-base s-underline-text"]')
star_ating_elements = 드라이버.find_elements(By.XPATH, '//span[@class="a-icon-alt"]')
가격_요소 = 드라이버.핀드_요소(By.XPATH, '//span[@class="a-price-whole"]')
product_urls = 드라이버.find_elements(By.XPATH, '//a[@class="a-link-normal s-underline-text s-underline-link-text s-link-style a-text-normal"]')
product_names = [element.text for element in product_name_elements] rating_numbers = [element.text for element in rating_number_elements] star_ratings = [element.get_attribute('innerHTML') for element in star_rating_elements] prices = [element.text for element in price_elements] urls = [element.get_attribute('href') for element in product_urls]
`
다음으로 지정된 데이터가 폴더에 업로드됩니다(각 페이지마다 csv 파일이 생성되어 출력 파일 폴더에 저장됩니다). 폴더가 없으면 스크립트가 해당 폴더를 생성합니다.
` output_directory = "출력 파일"
그렇지 않은 경우 os.path.exists(output_directory):
os.makedirs(output_directory)
with open(os.path.join(output_directory, f'product_details_page_{page_number}.csv'), 'w', newline='', encoding='utf-8') as csvfile: csv_writer = csv.writer(csvfile) csv_writer.writerow(['Product Urls', 'Product Name', 'Product Price', 'Rating', 'Number of Reviews']) for url, name, price, star_rating, num_ratings in zip(urls, product_names, prices, star_ratings, rating_numbers): csv_writer.writerow([url, name, price, star_rating, num_ratings])
`
그리고 마지막 단계는 작업 완료와 리소스 공개입니다.
마침내:
드라이버.종료()
전체 스크립트
`Selenium import webdriver에서
selenium.webdriver.common.by import By
selenium.webdriver.common.keys에서 키 가져오기
selenium.webdriver.common.action_chains에서 ActionChains 가져오기
selenium.webdriver.support.ui에서 WebDriverWait 가져오기
selenium.webdriver.support에서 예상_조건을 EC로 가져옵니다
CSV 가져오기
OS 가져오기
from time 가져오기 수면
가져오기 요청
API_KEY = "귀하의 API 키"
user_agent = "Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
옵션 = webdriver.FirefoxOptions()
options.add_argument(f"user-agent={user_agent}")
드라이버 = webdriver.Firefox(옵션=옵션)
defsolv_captcha(드라이버):
# 페이지에 보안문자가 있는지 확인하세요
시도해 보세요:
captcha_element = 드라이버.find_element(By.CLASS_NAME, 'g-recaptcha')
captcha_element인 경우:
print("보안문자가 감지되었습니다. 해결 중...")
site_key = captcha_element.get_attribute('data-sitekey')
current_url = 드라이버.현재_url
# Send captcha request to 2Captcha captcha_id = requests.post( 'http://2captcha.com/in.php', data={ 'key': API_KEY, 'method': 'userrecaptcha', 'googlekey': site_key, 'pageurl': current_url } ).text.split('|')[1] # Wait for the captcha to be solved recaptcha_answer = '' while True: sleep(5) response = requests.get(f"http://2captcha.com/res.php?key={API_KEY}&action=get&id={captcha_id}") if response.text == 'CAPCHA_NOT_READY': continue if 'OK|' in response.text: recaptcha_answer = response.text.split('|')[1] break # Inject the captcha answer into the page driver.execute_script(f'document.getElementById("g-recaptcha-response").innerHTML = "{recaptcha_answer}";') driver.find_element(By.ID, 'submit').click() sleep(5) print("Captcha solved.") except Exception as e: print("No captcha found or error occurred:", e)
해 보세요:
# 시작페이지 URL
base_url = "https://www.amazon.in/s?k=bags"
for page_number in range(1, 2): page_url = f"{base_url}&page={page_number}" driver.get(page_url) driver.implicitly_wait(10) # Attempt to solve captcha if detected solve_captcha(driver) # Explicit Wait WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//span[@class="a-size-medium a-color-base a-text-normal"]'))) for _ in range(5): ActionChains(driver).send_keys(Keys.PAGE_DOWN).perform() sleep(2) product_name_elements = driver.find_elements(By.XPATH, '//span[@class="a-size-medium a-color-base a-text-normal"]') rating_number_elements = driver.find_elements(By.XPATH, '//span[@class="a-size-base s-underline-text"]') star_rating_elements = driver.find_elements(By.XPATH, '//span[@class="a-icon-alt"]') price_elements = driver.find_elements(By.XPATH, '//span[@class="a-price-whole"]') product_urls = driver.find_elements(By.XPATH, '//a[@class="a-link-normal s-underline-text s-underline-link-text s-link-style a-text-normal"]') # Extract and print the text content of each product name, number of ratings, and star rating, urls product_names = [element.text for element in product_name_elements] rating_numbers = [element.text for element in rating_number_elements] star_ratings = [element.get_attribute('innerHTML') for element in star_rating_elements] prices = [element.text for element in price_elements] urls = [element.get_attribute('href') for element in product_urls] sleep(5) output_directory = "output files" if not os.path.exists(output_directory): os.makedirs(output_directory) with open(os.path.join(output_directory, f'product_details_page_{page_number}.csv'), 'w', newline='', encoding='utf-8') as csvfile: csv_writer = csv.writer(csvfile) csv_writer.writerow(['Product Urls', 'Product Name', 'Product Price', 'Rating', 'Number of Reviews']) for url, name, price, star_rating, num_ratings in zip(urls, product_names, prices, star_ratings, rating_numbers): csv_writer.writerow([url, name, price, star_rating, num_ratings])
마침내:
드라이버.종료()
`
이렇게 하면 스크립트가 오류 없이 작동하지만 세로형 제품 카드에만 해당됩니다. 다음은 스크립트 작동 방식의 예입니다.
이에 관해 하고 싶은 말이 있으면 댓글로 토론해보겠습니다.
위 내용은 Amazon은 쉬운 수준에서 스스로 구문 분석합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!