質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Q&A

0回答

857閲覧

Webスクレイピングで商品情報を抽出しましたが、書き出し後の処理がぐちゃぐちゃになってしまいます。

fear

総合スコア3

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

0グッド

0クリップ

投稿2021/10/05 06:20

from datetime import datetime
import openpyxl as px
from openpyxl.styles import PatternFill
import requests
from bs4 import BeautifulSoup
import pandas as pd

#プログラム2
def Pagecrawling(soup, item_list):

# プログラム2-1|<li>タグのなかで、class='Product'のものを変数productsに格納 products = soup.find_all('li', class_='Product') # プログラム2-2|変数productsの要素を一つずつ調査 for product in products: # プログラム2-3|変数productsのなかで、aタグで、class='Product__titleLink'のものを変数urlsに格納 urls = product.find_all('a', class_='Product__titleLink') # プログラム2-4|変数productsのなかで、divタグで、class='Product__priceInfo'のものを変数pricesに格納 prices = product.find_all('div', class_='Product__priceInfo') # プログラム2-5|変数productsのなかで、divタグで、class='Product__otherInfo'のものを変数othersに格納 others = product.find_all('div', class_='Product__otherInfo') # プログラム2-6|zip関数でまとめて繰り返し処理を実行 for (url, price, other) in zip(urls, prices, others): # プログラム2-7|変数linkに変数urlのhref部分を取得(製品url) link = url.get('href') # プログラム2-8|変数nameに変数urlのtitle部分を取得(製品名) name = url.get('title') # プログラム2-9|変数priceのspanタグで、class='Product__price'のものを変数pricevaluesに格納 pricevalues = price.find_all('span', class_='Product__price') # プログラム2-10|変数の初期化 currentprice = '-' fixedprice = '-' # プログラム2-11|変数pricevaluesの要素を一つずつ処理 for pricevalue in pricevalues: # プログラム2-12|もし変数pricevalueのテキスト情報が'現在'が含まれていれば if '現在' in pricevalue.get_text(): # プログラム2-13|変数currentpriceに現在の価格を取得('\n'で改行を削除) currentprice = pricevalue.get_text().replace('\n', '') # プログラム2-14|もし変数pricevalueのテキスト情報が'即決'が含まれていれば elif '即決' in pricevalue.get_text(): # プログラム2-15|変数fixedpriceに即決の価格を取得('\n'で改行を削除) fixedprice = pricevalue.get_text().replace('\n', '') # プログラム2-16|変数labelのdivタグの0番目の要素を取得('\n'で改行を削除)→入札 label = other.find_all('div')[0].get_text().replace('\n','') # プログラム2-17|変数labelのdivタグの1番目の要素を取得('\n'で改行を削除)→残り時間 lefttime = other.find_all('div')[1].get_text().replace('\n','') # プログラム2-18|リスト「item_list」に必要な要素を追加 item_list.append([name, link, currentprice, fixedprice, label, lefttime]) # プログラム2-19|リスト「item_list」を返す return item_list

#プログラム3

def Checkpage(pagerlinks):

# プログラム3-1|変数pageurlをNoneにリセット pageurl = None # プログラム3-2|引数pagerlinksの中に、「次へ」があれば、そのurlをpageurlに設定(「次へ」がない場合は、Noneのまま) for pagerlink in pagerlinks: if pagerlink.get_text() == '次へ': pageurl = pagerlink.get('href') break # プログラム3-3|pageurlを返す return pageurl

#プログラム5|mainプログラム

プログラム5-1|検索キーワードとYahooオークションURLの設定

keyword = 'Python'
url = 'https://auctions.yahoo.co.jp/search/search?p=' + keyword + '&n=100';

プログラム5-2|ヤフオクページの取得

r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')

プログラム5-3|取得したデータを格納するリスト

item_list = []

プログラム5-4|リスト「item_list」にプログラム3の結果を格納

item_list = Pagecrawling(soup, item_list)

プログラム5-5|プログラム4を実行して、次のページがあるかどうか調査

pageurl = Checkpage(soup.find_all('a', class_='Pager__link'))

プログラム5-6|次のページがなくなるまで、処理を実行

while True:
# プログラム5-7|次のページがないならwhile文を終了
if pageurl is None:
break

# プログラム5-8|次のページがあるなら処理を実行 else: # プログラム5-9|次のページを取得 nextpage = requests.get(pageurl) soup = BeautifulSoup(nextpage.text, 'lxml') # プログラム5-10|リスト「item_list」にプログラム3の結果を格納 item_list = Pagecrawling(soup, item_list) # プログラム5-11|プログラム4を実行して、次のページがあるかどうか調査 pageurl = Checkpage(soup.find_all('a', class_='Pager__link'))

df = pd.DataFrame(item_list)
df.columns=["商品名", "URL", "現在価格", "即決価格" ,"入札数", "残り日数"]

df.to_csv('ああ.csv')

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問