メモのコツを教えてください!

pythonでAmazonのほしいものリストをローカルに保存するスクリプトを
パプレシティで作成したのですが、

スクリプトを実行すると

ほしいものリストの先頭ページしかローカル保存できません。

複数ページにまたがるほしいものリストの場合どのようにすればローカルに保存できますか?

アドバイスいただけると幸いです。よろしくおねがいします。

--------------------------------------------------------------------------

import requests
from bs4 import BeautifulSoup
import csv

def get_wishlist(wishlist_id):
url = f"https://www.amazon.co.jp/hz/wishlist/ls/{wishlist_id}"
headers = {
"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"
}

response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.content, 'html.parser')

items = []
for item in soup.find_all('li', {'data-id': True}):
title = item.find('h2', {'class': 'a-size-base'}).text.strip()
price = item.find('span', {'class': 'a-price'})
price = price.text.strip() if price else 'N/A'
link = "https://www.amazon.co.jp" + item.find('a', {'class': 'a-link-normal'})['href']

items.append([title, price, link])

return items

def save_wishlist_csv(items, filename):
with open(filename, 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerow(['タイトル', '価格', 'リンク']) # ヘッダー行
writer.writerows(items)

# メインの実行部分
wishlist_id = input("Amazon wishlist IDを入力してください: ")
items = get_wishlist(wishlist_id)

if items:
filename = "amazon_wishlist.csv"
save_wishlist_csv(items, filename)
print(f"ほしいものリストを {filename} に保存しました。")
else:
print("ほしいものリストの取得に失敗しました。")

質問者からの補足コメント

  • どう思う?

    ライブラリのインポート
    python
    import requests
    from bs4 import BeautifulSoup
    import csv

    requests: HTTPリクエストを送信するためのライブラリです。
    BeautifulSoup: HTMLを解析するためのライブラリです。
    csv: CSVファイルを操作するためのライブラリです。

      補足日時:2024/09/22 17:37
  • どう思う?

    ほしい物リスト取得関数

    python
    def get_wishlist(wishlist_id):
    url = f"https://www.amazon.co.jp/hz/wishlist/ls/{wishlist_id}"
    headers = {
    "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"
    }

    この関数は、指定されたwishlist IDを使用してAmazonのほしい物リストページのURLを構築します。
    headersにUser-Agentを設定し、ブラウザからのリクエストに見せかけています。

      補足日時:2024/09/22 17:37
  • どう思う?

    python
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.content, 'html.parser')

    requests.get()でウェブページを取得し、BeautifulSoupを使用してHTMLを解析します。

      補足日時:2024/09/22 17:39
  • どう思う?

    python items = []  for item in soup.find_all('li', {'data-id': True}):
    title = item.find('h2', {'class': 'a-size-base'}).text.strip()
    price = item.find('span', {'class': 'a-price'}) price = price.text.strip() if price else 'N/A'
    link = "https://www.amazon.co.jp" + item.find('a', {'class': 'a-link-normal'})['href']
    items.append([title, price, link])

      補足日時:2024/09/22 17:41
  • どう思う?

    ページ内の各商品アイテムを検索し、タイトル、価格、リンクを抽出します。抽出した情報をitemsリストに追加します。

      補足日時:2024/09/22 17:42
  • どう思う?

    CSV保存関数
    python
    def save_wishlist_csv(items, filename):
    with open(filename, 'w', newline='', encoding='utf-8-sig') as f:
    writer = csv.writer(f)
    writer.writerow(['タイトル', '価格', 'リンク']) # ヘッダー行
    writer.writerows(items)

    この関数は、取得した商品情報をCSVファイルに保存します。
    ヘッダー行を追加し、その後に各商品の情報を書き込みます。

      補足日時:2024/09/22 17:42
  • どう思う?

    メイン実行部分
    python
    wishlist_id = input("Amazon wishlist IDを入力してください: ")
    items = get_wishlist(wishlist_id)

    if items:
    filename = "amazon_wishlist.csv"
    save_wishlist_csv(items, filename)
    print(f"ほしいものリストを {filename} に保存しました。")
    else:
    print("ほしいものリストの取得に失敗しました。")

      補足日時:2024/09/22 17:43
  • どう思う?

    ユーザーからwishlist IDを入力として受け取ります。
    get_wishlist()関数を呼び出してほしい物リストの情報を取得します。
    取得に成功した場合、save_wishlist_csv()関数を使用してCSVファイルに保存します。
    失敗した場合はエラーメッセージを表示します。

      補足日時:2024/09/22 17:43

A 回答 (1件)

nextやページボタンがあれば、そこにURLが書いてあると思いますので、BeatifulSoupで対象となるタグを検索し、'url'とか、'text'で、次のページurlを取得して、BeatifulSoupで新しいページとしてロードすればいいとは思います


(クエリパラメータでpage=1とか追加されるケースがほとんどだと思いますが・・・。もしかすると、JavaScriptでリンクを生成してるかもしれません。その場合には、JavaScriptを解析してデータを持ってくるしかないです)

ただ、今のget_wishlistは、URL固定なので、whileで、loadpage(url)で戻り値をsoupにして、next pageがあれば、urlに設定して、ループ、なければ、breakして、items を戻り値にするなどの変更が必要だとは思います

多分、ページ構成は同じだと思うので、タグ検索もそのまま使えると思います。
    • good
    • 0
この回答へのお礼

ありがとう

お礼日時:2024/09/26 18:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A