ChatGPTを使用して大容量のHTMLを入力するためにクロード(Claude)を使用します。

Claude를 사용하여 대용량 HTML을 입력하는 방법과 Claude의 기능, HTML 분석, 웹 데이터 추출 방법을 살펴보세요.

4,620
ChatGPTを使用して大容量のHTMLを入力するためにクロード(Claude)を使用します。
目次

클로드(Claude)로 한정판 거래 플랫폼, 크림 (Kream : https://kream.co.kr)의 실시간 차트를 크롤링하는 예제를 준비했습니다.

1. 클로드(Claude)란 무엇인가?

notion image

Claude(클로드)は、OpenAIの従業員たちが設立し、Googleの強力なサポートを受けている人工知能スタートアップAnthropicのAIチャットボットサービスです。

クロード2は2023年7月11日に発表され、約3か月後の10月17日に韓国でも発売されました。

クロードは韓国語チャットはもちろん、最大10MBのPDF、TXT、CSVファイルを最大5つまで添付できる機能を提供します。プロンプトでは10万個のトークンをサポートし、GPT-4(最大32,768個)よりもはるかに多くのトークンを入力できる特徴があります。

2. ClaudeでHTML解析する

今回はKreamのリアルタイムチャートにある価格変動情報をクローリングしてみましょう。

notion image

商品リストを持つ<ul>タグのHTMLをコピーして解析をリクエストしてみます。

以前のChatGPTで完成するクローリングボットの投稿では、GPT-4はトークン数の問題でした。GPT-4でこのHTMLを解析できるかどうか見てみましょう。

notion image

やはりトークン数制限により処理できません。

クロードはどうでしょうか?

notion image

まず、クロードはHTMLをtxtファイルとして受け取って解析します。

解析結果を見ると、商品情報だけでなくHTMLタグ情報、どのライブラリを使用したかまで分析してくれます。分析結果をもとにどの情報を収集できるか確認できます。

3. ClaudeでWebデータを抽出する

さて、本格的にデータ抽出のためのコードをクロードに質問してみましょう。

3.1. プロンプトの作成

以下のようにプロンプトを入力しました。

셀레니움으로 웹 페이지 데이터를 추출하고자 해. 언어는 Python을 사용해줘.
위 HTML에서 상품 이미지 URL, 상품명, 모델 번호, 사이즈, 가격, 가격 변동, 가격 변동 비율을 가져와줘.
위 항목은 모두 필수 데이터이므로 해당 데이터가 없다면 나에게 어떤 데이터를 찾을 수 없는지 오류 메시지를 전달해야 해.
모든 HTML element는 xpath로 찾아줘.
위 조건을 가지고 JSON 형식으로 데이터를 출력해줘.

3.2. 第1の応答

notion image

上の画像からわかるように、セレニウムでxpathを見つけてデータを取得するコードを書いてくれます。

しかし、最新バージョンのセレニウムはfind_element_by_xpathをサポートしていないため、次のように修正を要求しました。

내 셀레니움 버전에서는 `find_element_by_xpath`를 사용할 수 없어.
`By`를 import해서 `find_element`로 요소를 찾도록 수정해줘.

3.3. 第2の応答

notion image

find_elementByを使用するように修正されました。

次は、クロードが書いてくれたコード全体です。

from selenium import webdriver
from selenium.webdriver.common.by import By
import json

driver = webdriver.Chrome()

driver.get("<https://www.example.com>")

products = []

items = driver.find_elements(By.XPATH, "//ul[@class='trading-items-container']/li")
for item in items:

  try:
    img_url = item.find_element(By.XPATH, ".//picture/img").get_attribute("src")
  except:
    img_url = "Image URL not found"

  try:
    name = item.find_element(By.XPATH, ".//div[contains(@class,'name')]").text
  except:
    name = "Name not found"

  try:
    code = item.find_element(By.XPATH, ".//div[contains(@class,'style-code')]").text
  except:
    code = "Code not found"

  try:
    size = item.find_element(By.XPATH, ".//div[contains(@class,'option')]").text
  except:
    size = "Size not found"

  try:
    price = item.find_element(By.XPATH, ".//div[contains(@class,'current-price')]").text
  except:
    price = "Price not found"

  try:
    change = item.find_element(By.XPATH, ".//div[contains(@class,'change-price')]/span").text
  except:
    change = "Price change not found"

  try:
    change_pct = item.find_element(By.XPATH, ".//div[contains(@class,'change-percent')]").text.split()[0]
  except:
    change_pct = "Change percentage not found"

  product = {
    "image": img_url,
    "name": name,
    "code": code,
    "size": size,
    "price": price,
    "price_change": change,
    "price_change_pct": change_pct
  }

  products.append(product)

print(json.dumps(products, indent=2))

driver.quit()

このコードを見ると、例外処理からjson形式の出力まで、プロンプトの要件をすべて満たしていることがわかります。

3.4. 第1の修正

ここで、Chromeドライバーの設定だけを変更すればよさそうです。

パッケージのimportからChromeブラウザを起動するまでのコードを次のように変更しました。

import json
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By

url = "<https://kream.co.kr/trading-chart>"
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get(url)

3.5. 第1の実行

さて、準備が整ったので実行してみましょう。

[
  {
    "image": "<https://kream-phinf.pstatic.net/MjAyMzA0MDNfMTE1/MDAxNjgwNDkxOTQ4NjQ0.W-mLA596MM6US4gSI6jNsJ9NhCbIeUR5mg0qxQ6p_AUg.Ec1REyClrXQ38dSM40zZhVidrYf0gxBsnc7C1SqK71kg.JPEG/a_e78ed04e3a1948a09a7b26bff5b27634.jpg?type=m>",
    "name": "Nike x Peaceminusone LS T-Shirt Black (DR0098-010)",
    "code": "DR0098-010",
    "size": "M",
    "price": "152,000",
    "price_change": "\u25b2",
    "price_change_pct": "+1.3%"
  },
  {
    "image": "<https://kream-phinf.pstatic.net/MjAyMTAxMjBfNTAg/MDAxNjExMTIyMzAzMTY2.0QpenidH075iEa1_gVzZTKOxJPiB8W6KyX4YmiELcfIg.ydUN0Aq9T8nWA5frqrsbwnbFfsNMNHDx6ezU5WxGAfQg.PNG/p_28c110281b3f4e109e30a6247d503e2a.png?type=m>",
    "name": "Nike Dunk Low Pro Premium Medium Curry",
    "code": "DD1390-100",
    "size": "255",
    "price": "107,000",
    "price_change": "\u25b2",
    "price_change_pct": "+0.9%"
  },
  {
    "image": "<https://kream-phinf.pstatic.net/MjAyMTAzMDVfMjQz/MDAxNjE0OTE0NzIzMTQ4.tsuFUJtHGm4g4KE5EDikVMScORptOQqIB7afi1Nz2Qwg.sftz3YQOuw48xpNSJa1tV4uEsz5iU4mjIvpllgHWEn8g.PNG/p_8f7b72adbc924b5bbf7c670d55865e6b.png?type=m>",
    "name": "Adidas Samba OG Cloud White",
    "code": "B75806",
    "size": "215",
    "price": "130,000",
    "price_change": "\u25b2",
    "price_change_pct": "+0.8%"
  }
]
<div data-v-4f90d828="" class="change-price up" style="color: rgb(241, 87, 70);">
  <span data-v-4f90d828="" class="arrow">▲</span>
  <span data-v-4f90d828="">27,000</span>
</div>

ほぼすべての情報を正常に取得しましたが、上記のHTML構造のためにに対応する\\u25b2文字だけを取得し、変動額は取得できなかったようです。

3.6. 第2の修正

変動額も取得できるように次のように修正します:

try:
    change = item.find_element(By.XPATH, ".//div[contains(@class,'change-price')]").text.replace("\u25bc", "-").replace("\u25b2", "+")
except:
    change = "Price change not found"

3.7. 第2の実行

再度実行した結果です:

[
  {
    "image": "<https://kream-phinf.pstatic.net/MjAyMTA3MzBfNTYg/MDAxNjI3NjI3OTg5ODM5.p-9pRcc3cQ_eaTl7UZdCmPJz8Astbjg2N6_HkEhLrHsg.ekjxXxJ-kcnoaZC6gCQH_-KBCUJORPTRC791UZ_C3ukg.PNG/p_e1ef5e002eda49adb7f5d0c8a41f798d.png?type=m>",
    "name": "Jordan 1 x Travis Scott x Fragment Retro Low OG SP Military Blue",
    "code": "DM7866-140",
    "size": "260",
    "price": "1,875,000",
    "price_change": "+27,000",
    "price_change_pct": "+1.5%"
  },
  {
    "image": "<https://kream-phinf.pstatic.net/MjAyMzA0MDNfMTE1/MDAxNjgwNDkxOTQ4NjQ0.W-mLA596MM6US4gSI6jNsJ9NhCbIeUR5mg0qxQ6p_AUg.Ec1REyClrXQ38dSM40zZhVidrYf0gxBsnc7C1SqK71kg.JPEG/a_e78ed04e3a1948a09a7b26bff5b27634.jpg?type=m>",
    "name": "Nike x Peaceminusone LS T-Shirt Black (DR0098-010)",
    "code": "DR0098-010",
    "size": "M",
    "price": "152,000",
    "price_change": "+2,000",
    "price_change_pct": "+1.3%"
  },
  {
    "image": "<https://kream-phinf.pstatic.net/MjAyMjEwMTJfMjQ3/MDAxNjY1NTYyODI3ODMw.YeSueVotfq5mgVXlQIVeV-uL_Q2otMk6nkvlbG2rHncg.vMJPWgosd9OjOn-s75jjEnjk44sB1gNqftQSN8CEkTAg.PNG/a_b2325461062d47e2887459a3e6928d88.png?type=m>",
    "name": "Adidas Puffylette Core Black",
    "code": "GY4559",
    "size": "265",
    "price": "78,000",
    "price_change": "+1,000",
    "price_change_pct": "+1.3%"
  }
]

これで変動額とその方向も正しく表示されるようです。

4. 結論

このように、クロードを活用してKreamのリアルタイムチャートクローラーを作成してみました。

クロードには最大10MBのファイルを添付できるため、長いHTMLも分析できました。

ChatGPTにクローラーを作成してもらうにはHTMLのサイズを縮小する必要がありますが、クロードは長いHTMLも問題なく処理する様子を見せてくれました。

回答速度はChatGPTに比べて遅いですが、回答に不満はありませんでした。

結論として、Webクローラーを作成するには、ChatGPTよりもクロードの方がより有用だと考えられます。

この記事も一緒に読んでみてください:

データ収集、今度は自動化してください

コーディングなしで5分で開始・5,000以上のウェブサイトクローリング体験

無料で始める →

コメント

コメントする

メールアドレスは公開されず、返信通知にのみ使用されます。

続けて読む

Get notified of new posts

We'll email you when 해시스크래퍼 기술 블로그 publishes new content.

Your email will only be used for new post notifications.