popup mlv

swiftのサンプルを動かしてみたり。

pythonでbeautifulsoupを使って今期のアニメ一覧をスクレイピング

1年に年4回もアニメ一覧を調べて60回くらいコピペしていくのもめんどくさいのでpythonスクレイピングしてほぼ日付順にして放送日、タイトル、URLを抽出してtxtで出力する話です。

放送日のところは正規表現で抽出するようにはしていません。(よくわからなかったから) google chromeを使って抽出したいページで右クリック→検証をするとどこをbs4で抽出すればいいのかなどが分かります。 bs4で文字を抽出するときは.get_text()を利用すると抽出がうまくいきやすいです。

出力結果

2017年03月xx日~ title1 “http://”
2017年03月xx日~ title2 “http://”

必要なもの

  • python3.5以上(どこのバージョンで作ったのか覚えていない)
  • BeautifulSoup4
import urllib.request
from bs4 import BeautifulSoup

web = ""
txt = "./matome.txt"

def read_items(soup):
    """アニメ一覧を読み込む"""
    animes = soup.find_all("div", {"class": "itemBox"})
    return animes

def item_date(soup):
    """最速放送日"""
    date1 = soup.find(class_="firstDate").get_text()
    date2 = date1.replace("最速放送日  ", "")
    # ソート用に日付を mm月, dd日 整形
    if date2.find("年") - date2.find("月") == -2:
        date2 = date2.replace("年", "年0", 1)
    if date2.find("月") - date2.find("日") == -2:
        date2 = date2.replace("月", "月0", 1)
    return date2

def item_title(soup):
    """タイトル"""
    h2 = soup.find("h2").get_text()
    return h2

def item_url(soup):
    """公式URL"""
    website = soup.find("a", class_="officialSite")
    if website is None:
        website = ""
    else:
        website = website.get("href")
    return website

def main():
    """アニメ一覧から 最速放送日, タイトル, URLをパース"""
    # URL 読み込み
    with urllib.request.urlopen(web) as response:
        html = response.read()
    bs4soup = BeautifulSoup(html, "html.parser")

    # アニメ一覧から 最速放送日, タイトル, URLを取り出してくっつける
    items = read_items(bs4soup)
    matome = []
    for i, item in enumerate(items):
        title = item_title(item)
        date = item_date(item)
        url = item_url(item)
        item_join = "{}\t{}\t\"{}\"".format(date, title, url)
        print(item_join)
        matome.append(item_join)
    matome = sorted(matome)

    # txtへ書き出し
    data = "\n".join(matome)
    with open(txt, "w", encoding="utf-8") as f:
        f.write(data)

if __name__ == "__main__":
    main()