Pythonのコードをweb上で実装したいです。
理系大学2年生、Pythonを一ヶ月勉強しています。
Seleniumを使ってスクレイピングをするコードをVScode で作成しました。具体的にはAmazonや楽天市場の商品情報を取得するものです。(写真参照)
今はコードに商品名を直接入力しているのですが、webページから検索バーで商品検索し、情報を一覧化するにはどうすれば良いでしょうか?
とりあえずFlaskを勉強し始めたところです。よろしくお願いします!!
画像が荒くて文字が見えないかもしれないので下に書きます。
出力結果
商品名 価格 送料 ポイント URL
【Amazon】 Anker… ¥4,999 通常配送料無料 50ポイント https…
【楽天】 Anker… ¥4,999 送料無料 …
【PayPayフリマ】 …
のような感じです!
イメージ説明
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
![guest](/img/icon/icnUserSample.jpg)
回答2件
0
ベストアンサー
webページから検索バーで商品検索し、情報を一覧化するにはどうすれば良いでしょうか?
そういう機能を持つものがまさにWebアプリケーションです。
なので、ここでちょっと説明するという規模ではありませんので、 Flaskの勉強をするのがいいでしょう。
勉強にあたっては、Webではなく、体系的に学べる書籍を使うのをお勧めします。
Amazonあたりで、「Flask入門」などと検索して出てくるものを選びましょう。
注意点としては、使っているOSに合っているものを選ぶことです。 WindowsとMacでは導入部分がかなり異なります。 python開発環境については問題ないということであれば、無視してもOKです。
投稿2023/11/09 15:14
総合スコア13337
0
既に解決済みですが、Python では wsgiref — WSGI Utilities and Reference Implementation が提供されています。こちらを利用するのも良いかと思います。
python
1import pandas as pd 2import requests 3import wsgiref.simple_server 4from urllib.parse import parse_qs, urljoin 5from bs4 import BeautifulSoup 6 7template = ''' 8<!DOCTYPE html> 9<html lang="ja"> 10<head> 11 <meta charset="UTF-8"> 12 <title>検索</title> 13</head> 14<body> 15<form action="/" method="post"> 16 <div> 17 <label for="query">検索ワード</label> 18 <input type="text" name="query" id="query" value="{search_word}"> 19 <button type="submit">検索</button> 20 </div> 21</form> 22 23{result_table} 24 25</body> 26</html> 27''' 28 29def query(search_word): 30 query_url = 'https://www.amazon.co.jp/s/ref=nb_sb_noss_1' 31 headers = {'Referer': 'https://www.amazon.co.jp/', 'User-Agent': 'Mozilla/5.0'} 32 params = {'k': search_word, '__mk_ja_JP': 'カタカナ'} 33 res = requests.get(query_url, headers=headers, params=params) 34 # print(res.request.url) 35 soup = BeautifulSoup(res.text, 'html.parser') 36 df = pd.DataFrame(columns=['商品名', '価格', '送料', 'ポイント', 'URL']) 37 38 items = soup.select('div[data-asin]:not([data-asin=""])') 39 for item in items: 40 price = item.select_one('span.a-price-whole') 41 price = '' if price is None else price.text 42 shipping_charge = item.select_one('span:-soup-contains(送料)') 43 shipping_charge = '' if shipping_charge is None else shipping_charge.text 44 point = item.select_one('span:-soup-contains(ポイント)') 45 point = '' if point is None else point.text 46 url = f'<a href="{urljoin(query_url, item.select("a[href]")[-1]["href"])}">Link</a>' 47 df.loc[len(df)] = [item.select_one('h2').text, price, shipping_charge, point, url] 48 49 df.index += 1 50 return df.to_html(escape=False) 51 52def application(env, start_response): 53 path, method = env['PATH_INFO'], env['REQUEST_METHOD'] 54 if path == '/': 55 if method == 'POST': 56 wsgi_input = env['wsgi.input'] 57 length = int(env['CONTENT_LENGTH']) 58 form = wsgi_input.read(length).decode() 59 data = parse_qs(form, keep_blank_values=True) 60 search_word = data['query'][0] 61 table = f'<hr>{query(search_word)}' 62 response = template.format(search_word=search_word, result_table=table).encode('utf-8') 63 status = '200 OK' 64 else: 65 response = template.format(search_word='', result_table='').encode('utf-8') 66 status = '200 OK' 67 else: 68 # 404 not found 69 response = b'<h1>Not found</h1>' 70 status = '404 Not Found' 71 72 # response headers 73 headers = [ 74 ('Content-Type', 'text/html'), 75 ('Content-Length', str(len(response))) 76 ] 77 78 start_response(status, headers) 79 return [response] 80 81if __name__ == '__main__': 82 w_s = wsgiref.simple_server.make_server( 83 host='localhost', port=8000, app=application) 84 w_s.serve_forever()
投稿2023/11/10 02:28
編集2023/11/10 07:20総合スコア20255
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
![guest](/img/icon/icnUserSample.jpg)
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/11/09 15:23
2023/11/09 15:35
2023/11/09 23:37