mecobalamin’s diary

人間万事塞翁が馬

beautiful soupで更新チェック

iPad mini 5が出るような噂
もしかしたらmini 4が安く出るんではないかと
整備品の値段をappleのサイトでいちいち調べてた

名前と値段のリストをとってくるスクリプトを書いてみた
PythonのBeautiful Soup4をつかう

スクレイピングについて参考にしたのはこの本
PythonによるWebスクレイピング 第2版
(Amazonのページに飛びます)

まずiPadの正規整備品のサイトから
"refurbished-category-grid-no-js"のタグだけとってきて
その中に含まれる"li"のタグでfor文を回して
タグに含まれる製品名と価格を表示する

これだけだけど久々に書こうとしたら忘れてた

from urllib.request import urlopen
from bs4 import BeautifulSoup
import datetime

today = datetime.date.today()
todaydetail = datetime.datetime.today()

# date time
print('----------------------------------')
print("Today's refurbished iPad")
print(todaydetail)
print('----------------------------------')

url = "https://www.apple.com/jp/shop/refurbished/ipad"
html = urlopen(url).read()

bsObj = BeautifulSoup(html, 'lxml')

refurbishedipad = bsObj.find("div", {"class":"refurbished-category-grid-no-js"})

for i in refurbishedipad.find_all("li"):
    ipad_name = i.find("a").get_text()
    ipad_price = i.find("div", {"class":"as-price-currentprice as-producttile-currentprice"}).get_text()
    ipad_price = ipad_price.replace(" ", "").replace("\n", "")
    print(ipad_name + " " + ipad_price)

実行するとこんな感じ

----------------------------------
Today's refurbished iPad
2019-03-13 15:55:05.999841
----------------------------------
9.7インチiPad Pro Wi-Fi 32GB - スペースグレイ [整備済製品] ¥50,800(税別)
9.7インチiPad Pro Wi-Fi 32GB - ゴールド [整備済製品] ¥50,800(税別)
9.7インチiPad Pro Wi-Fi 32GB - ローズゴールド [整備済製品] ¥50,800(税別)
10.5インチiPad Pro Wi-Fi 256GB - シルバー [整備済製品] ¥73,800(税別)
10.5インチiPad Pro Wi-Fi 256GB - ゴールド [整備済製品] ¥73,800(税別)
10.5インチiPad Pro Wi-Fi 256GB - ローズゴールド [整備済製品] ¥73,800(税別)
12.9インチiPad Pro Wi-Fi 64GB - ゴールド [整備済製品] ¥73,800(税別)
12.9インチiPad Pro Wi-Fi 256GB - ゴールド [整備済製品] ¥87,800(税別)

atomで実行すると文字化けする
power shellで大丈夫だから
atomの問題っぽい

Atom-runnerの日本語文字化け解決方法 | げーまーこんぶの戯言

process.env.PYTHONIOENCODING = "utf-8";

追加したけど改善してない。。。

14 March 2019追記
PCの再起動とかしてたら文字化けしなくなった
PythonだけでなくRも大丈夫
エラーコードは相変わらず文字化けする

28 November 2020 追記
Pythonのオブジェクト指向プログラミングを完全理解 - Qiita
こちらのサイトを参考に少し書き換えた

スクレイピングするclassを新たに作成して複数のページをスクレイピングできるようにした。
関数のままでも良かったのだが、勉強を兼ねて書き換え。

from urllib.request import urlopen
from bs4 import BeautifulSoup
import datetime

class HtmlScraping:
    def __init__(self, url):
        self.url = url

    def url_scraping(self):
        html = urlopen(self.url).read()
        bs_Obj = BeautifulSoup(html, 'html.parser')
        refurbished_product = bs_Obj.find("div", {"class":"refurbished-category-grid-no-js"})

        for i in refurbished_product.find_all("li"):
            product_name = i.find("a").get_text().replace("\xa0", "")
            product_price = i.find("div", {"class":"as-price-currentprice as-producttile-currentprice"}).get_text()
            product_price = product_price.replace(" ", "").replace("\n", "")
            print(product_name + " " + product_price)

if __name__ == '__main__':

    today = datetime.date.today()
    todaydetail = datetime.datetime.today()

    url_refurbished_products = {"Recommended_Products":"https://www.apple.com/jp/shop/refurbished",
                                "iPad":"https://www.apple.com/jp/shop/refurbished/ipad",
                                "mac":"https://www.apple.com/jp/shop/refurbished/mac"}

    for i in url_refurbished_products:
        print('----------------------------------')
        print("Today's refurbished " + i)
        print(todaydetail)
        print('----------------------------------')

        url = HtmlScraping(url_refurbished_products[i])
        url.url_scraping()

追記ここまで