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

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

ただいまの
回答率

88.59%

プログラムの内容について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 702

EUROPEAN

score 17

以前、pythonプログラムに詳しい知人から教えてもらいYahoo映画のサイトからユーザーレビューを取得し、テキストファイルに読み込むプログラムを作成しました。しかし、自分でもなにをやっているのかよくわからない部分が多いためコメントアウトで教えていただけるとたすかります。 

import re
import math
import time
import random
import codecs

import requests
from bs4 import BeautifulSoup


def generate_soup_obj(url, params=None):
    return BeautifulSoup(requests.get(url, params=params).content, "lxml")


def find_total_review_count(movie_url):
    def search_total_review_count_element(target_tag):
        ret = target_tag.name == "small" and\
              target_tag.parent['class'] == ["label"] and \
              not target_tag.string == "〜"
        return ret

    soup = generate_soup_obj(movie_url)
    count_string = soup.find(search_total_review_count_element).string
    return int(re.search(r"([0-9]+)", count_string).group())


def make_review_url_list(movie_url, total_count):
    result = list()
    pages = math.ceil(total_count / 10)

    for page in range(1, pages+1):
        payload = {"page": page}
        soup = generate_soup_obj(movie_url, params=payload)
        urls = soup.find_all("a", class_="listview__element--right-icon")
        for el in urls:
            url = BASE_URL + el.get("href")
            url = url[:url.index("?")]
            result.append(url)
        time.sleep(random.randint(1, 3))

    return result


def fetch_review_text(review_url, is_string=True):
    soup = generate_soup_obj(review_url)
    element = soup.find("p", class_="text-small text-break text-readable p1em")
    if is_string:
        return element.text.strip()
    else:
        review_string = "".join(list(map(str, element.contents)))
        return review_string.strip().replace("<br/>", "\n")


def write_txt(obj, dist):
    with codecs.open(dist, "w", encoding="utf-8")as fw:
        fw.write("\n".join(obj))


if __name__ == "__main__":
    BASE_URL = "https://movies.yahoo.co.jp"
    MOVIE_URL = "6https://movies.yahoo.co.jp/movie/%E6%A4%9C%E5%AF%9F%E5%81%B4%E3%81%AE%E7%BD%AA%E4%BA%BA/363102/review/"
    DIST = "./sample2.txt"

    url_list = make_review_url_list(movie_url=MOVIE_URL,
                                    total_count=find_total_review_count(MOVIE_URL))
    print("Complete making review url list")

    output = []
    for url in url_list:
        text = fetch_review_text(review_url=url, is_string=True)
        output.append(text)
        time.sleep(random.randint(1, 3))
        print(f"Complete: {url}")

    write_txt(output, DIST)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mather

    2018/11/09 10:20

    長い変数名で検索したらすぐ出てきますが、ほぼこれですよね…。 https://gist.github.com/crimnut02/d5add5009d8a74fe0681153eeb58f8de Pythonに詳しい知人に教えてもらってください。

    キャンセル

  • azuapricot

    2018/11/09 10:21

    自分で作ったプログラムなのにわからないとはどういうことでしょう・・・。自分がわからないのに人が分かるわけがないといいますか・・・。もう一度その知人に尋ねた方がよろしいのでは

    キャンセル

  • ikedas

    2018/11/09 11:05

    ご自分がわからない箇所に、コメントで「何がわからないのか」を書き込んでください。

    キャンセル

  • 退会済みユーザー

    2018/11/20 12:15

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 2

+1

理解できない場合、
・勉強する
・諦める
のどちらかです。
前者なら、まずはPythonに入門しましょう。
個人的には、後者をお薦めします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

コメントアウトで教えていただけるとたすかります。 

import re # reをインポートします
import math # mathをインポートします
import time # timeをインポートします
import random # randomをインポートします
import codecs # codecsをインポートします

import requests # importをインポートします
from bs4 import BeautifulSoup # bs4からBeautifulSoupをインポートします


def generate_soup_obj(url, params=None): # 引数がurl, params=Noneである関数generate_soup_objを定義します
    return BeautifulSoup(requests.get(url, params=params).content, "lxml") # BeautifulSoup(requests.get(url, params=params).content, "lxml")を返します


def find_total_review_count(movie_url): # 引数がmovie_urlである関数find_total_review_countを定義します
    def search_total_review_count_element(target_tag): # 引数がtarget_tagである関数search_total_review_count_elementを定義します
        ret = target_tag.name == "small" and\ # target_tag.name と "small"が等しく かつ
              target_tag.parent['class'] == ["label"] and \ # target_tag.parent['class'] と ["label"]が等しく かつ
              not target_tag.string == "〜" # target_tag.string が "〜" ではない
        return ret # retを返します

# 以下同様なので略

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る