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

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

6
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以上のウェブサイトクローリング体験

無料で始める →

Comments

Add Comment

Your email won't be published and will only be used for reply notifications.

続きを読む

Get notified of new posts

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

Your email will only be used for new post notifications.