これは自媒体でよく使われるケースです。今日はこのケースを分析することで、Python の学習と使用に関する情報を得ます。
効果
py スクリプトを実行して、ローカルで xlsx データテーブルファイルを出力します。
1、 自動化分類;全体一致率:84%〜96% の範囲。
2、 単語頻度統計;三者共存のホットサーチは、持続的な公共の熱度を示し、情報密度が高いことを示しています。
3、 テキスト感情の平均値、各タイトルの感情数値;主:人為的にトップに置かれたホットサーチのテキストの感情の強度。
4、 品詞分析;誘導や埋め込まれた意識成分の可能性がある用語をマークし、修飾語や状況語が多く重なる限り、常に宣伝の正しい状況になります。
コード#
import os
from datetime import datetime
import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook
from snownlp import SnowNLP
import jieba
from collections import Counter
import jieba.posseg as pseg
import json
import urllib.request
# テキスト形式を保存するための関数
def get_formatted_time():
"""
フォーマットされた現在の時間を取得
:return: フォーマットされた現在の時間文字列
"""
now = datetime.now()
return now.strftime('%Y-%m-%d')
# ニュース解析関数
def get_news_from_url(url: str):
"""
指定されたURLからホットサーチニュースを取得
:param url: ウェブページのURL
:return: ホットサーチニュースのリスト
"""
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
r = requests.get(url, headers=headers)
r.encoding = 'utf-8'
soup = BeautifulSoup(r.text, 'html.parser')
toutiao_resoubang = soup.find_all('div', class_='single-entry tindent')
resoubang_list = []
for item in toutiao_resoubang:
spans = item.find_all('span')
for span in spans:
resoubang_list.append(span.string)
return resoubang_list
# 空行を削除
def delete_empty_rows(sheet_name: str, wb: Workbook):
"""
指定されたワークシートから空行を削除
:param sheet_name: ワークシート名
:param wb: Excelワークブックオブジェクト
:param Noneキーワード
https://notes-by-yangjinjie.readthedocs.io/zh_CN/latest/python/05-modules/openpyxl.html?highlight=openpyxl
"""
ws = wb[sheet_name]
# 行を反復処理するための組み込み関数ws.iter_rows()
for row in ws.iter_rows():
if all(cell.value is None for cell in row):
ws.delete_rows(row[0].row)
# 平均指数、感情スコアを計算
def calculate_average_index_and_sentiment_score(sheet_name: str, wb: Workbook):
"""
指定されたワークシートのホットサーチニュースの平均指数と感情スコアを計算
:param sheet_name: ワークシート名
:param wb: Excelワークブックオブジェクト
:return: 平均指数、感情スコアのタプル
"""
ws = wb[sheet_name]
total_index = 0
count = 0
sentiment_score_list = []
for row in ws.iter_rows(min_row=2, min_col=1, max_col=3):
news_str = ''
for cell in row:
if cell.value is not None:
news_str += str(cell.value)
# 機能が多い、詳細は:https://github.com/isnowfy/snownlp
s = SnowNLP(news_str)
sentiment_score = s.sentiments
sentiment_score_list.append(sentiment_score)
# row[2]は各行の3番目のセル、つまり3列目を指します。
total_index += row[2].value
count += 1
ws.cell(row=row[0].row, column=4, value=sentiment_score)
# 各シートの平均指数と感情スコア
return (total_index / count, sum(sentiment_score_list) / len(sentiment_score_list))
# 単語頻度を計算
def calculate_word_count(sheet_names: list, wb: Workbook):
"""
ワークシートで最も頻繁に出現する20個の単語を計算し、結果を新しいワークシートに書き込む
:param sheet_names: ワークシート名
:param wb: Excelワークブックオブジェクト
:param stopwords_file: ストップワードファイルのパス
ストップワードとは、自然言語で使用頻度が非常に高いが、
通常は実際の意味を持たないか、テキスト分析タスクにあまり役立たない単語のことです。「の」、「了」など。
"""
# ストップワードファイル
stopwords_file = 'https://ghproxy.com/https://raw.githubusercontent.com/goto456/stopwords/master/cn_stopwords.txt'
# ストップワードライブラリをリクエスト
response = requests.get(stopwords_file)
stopwords = response.content.decode('utf-8').split('\n')
# ストップワードライブラリをロード
for word in stopwords:
jieba.del_word(word.strip())
# すべてのワークシートを反復処理し、単語頻度を統計
word_count = Counter()
for sheet_name in sheet_names:
ws = wb[sheet_name]
for row in ws.iter_rows(min_row=2, min_col=1, max_col=3):
news_str = ''
for cell in row:
if cell.value is not None:
news_str += str(cell.value)
words = jieba.lcut(news_str)
# 数値タイプは無視します。
# words = [word for word in words if not(word.isdigit() or (word.replace('w', '').replace('.', '').isdigit()))]
new_words = []
for word in words:
# 長さが0または1の文字列を無視
if len(word) <= 1:
continue
# 数値ノイズを除去
if not(word.isdigit() or (word.replace('w', '').replace('.', '').isdigit())):
new_words.append(word)
words = new_words
# 単語集を更新
word_count.update(words)
# ストップワードを除去
for word in list(word_count):
if word in stopwords:
del word_count[word]
# 最も出現する30個の単語を取得
top_words = word_count.most_common(30)
# 新しいワークシートを作成
ws = wb.create_sheet(title='単語頻度統計')
# 行を追加
ws.append(['順位', '単語', '頻度'])
# 1からカウントを開始し、0からではなく順位を付ける
for i, (word, freq) in enumerate(top_words,1):
ws.append([i, word, freq])
# 2023.5.9 新しい分類機能を追加
def write_category_to_sheet(sheet_name: str, wb: Workbook):
"""
ニュースイベントのキーワード分類情報をExcelワークシートの5列目に書き込む
:param sheet_name: ワークシート名
:jieba分詞:https://github.com/fxsjy/jieba
"""
# オンライン分類辞書jsonを呼び出す
# URLからJSONデータを取得
response = urllib.request.urlopen('https://ghproxy.com/https://raw.githubusercontent.com/hoochanlon/scripts/main/AQUICK/category_news.json')
json_data = response.read().decode('utf-8')
# JSONデータを解析
category_keywords = json.loads(json_data)
# 現在のシートから開始
ws = wb[sheet_name]
for row in ws.iter_rows(min_row=2, min_col=1, max_col=4):
title_str = ''
for cell in row:
if cell.value is not None:
title_str += str(cell.value)
# タイトル文字列を分詞し、リスト配列に変換
words = pseg.cut(title_str)
category = ''
for word, flag in words:
# 内蔵の文字列メソッドを使用して、接頭辞が指定された開始を確認
# if flag.startswith('n'):
# キーキーワード、.items()でキーと値のペアを取得
for key, keywords in category_keywords.items():
if word in keywords:
category = key
break
if category:
break
if not category:
# category = 'その他'
category = '総合'
ws.cell(row=row[0].row, column=5, value=category)
# 解析されたウェブページのレイアウトデータを、規則に従ってxlsxに書き込み、行列が対称で明確にします。
def write_news_to_sheet(news_list: list, sheet_name: str, wb: Workbook):
"""
ニュースリストをExcelワークシートに書き込む
:param news_list: ニュースリスト
:param sheet_name: ワークシート名
:param wb: Excelワークブックオブジェクト
:cell.value.isnumeric()は、現在の文字列が数字として表現できるかどうかを示します
:isinstance(cell.value, str)は、現在の値が文字列かどうかを示します
"""
ws = wb.create_sheet(title=sheet_name)
row = []
for i, item in enumerate(news_list, start=1):
if i >= 156: # 50組のデータを抽出(インデックスが156を超える場合は、微博に関する他の紹介記事)
continue
if i % 3 == 1: # インデックスは0から始まる、つまり2%3、以降は新しいデータのグループ。
item = item.replace("、", "")
row.append(item)
if i % 3 == 0: # 3で割り切れる場合、3列ごとに行を追加。
ws.append(row)
row = []
# 2行目から各行のデータを反復処理
for row in ws.iter_rows(min_row=2, min_col=1):
for cell in row:
if cell.column == 1 or cell.column == 3:
# インスタンスの判断、Trueを返す場合、そうでなければFalseを返す。
if isinstance(cell.value, str) and not cell.value.isnumeric():
# 文字列から '[置頂]' 文字を除去、185は2、3、4位の平均値(リアルタイム)
cell.value = cell.value.replace('[置頂]', '185w')
if isinstance(cell.value, str) and cell.value.isnumeric():
cell.value = int(cell.value)
elif isinstance(cell.value, str):
cell.value = float(cell.value.replace('w', ''))
ws.cell(row=1, column=3, value='指数(万)')
ws.cell(row=1, column=4, value='感情得点')
ws.cell(row=1, column=5, value='分類')
def main():
urls = ['http://resou.today/art/11.html', 'http://resou.today/art/22.html','http://resou.today/art/6.html']
sheet_names = ['今日のトレンド', '抖音時事トレンド', '微博ホットサーチ']
wb = Workbook()
wb.remove(wb['Sheet'])
for url, sheet_name in zip(urls, sheet_names):
news_list = get_news_from_url(url)
# ウェブ解析データをxlsxに書き込む
write_news_to_sheet(news_list, sheet_name, wb)
# 削除操作で残った空行を削除
delete_empty_rows(sheet_name, wb)
# 分類
write_category_to_sheet(sheet_name, wb)
# 平均指数、各表の平均感情値を統計
average_index, sentiment_score = calculate_average_index_and_sentiment_score(sheet_name, wb)
print(f'{sheet_name} 平均指数:{average_index:.2f} 感情得点: {sentiment_score:.2f}')
# 単語頻度統計
calculate_word_count(sheet_names, wb)
# クロスプラットフォーム処理の保存パス
save_path_xlsx_file = os.path.join(os.path.join(os.path.expanduser("~"), "Desktop"),
"resoubang_{}.xlsx".format(get_formatted_time()))
# 空のシートを削除し、指定されたファイル名で保存
# wb.remove(wb['Sheet']);wb.save(save_path_xlsx_file)
wb.save(save_path_xlsx_file)
# 現在のモジュールが他のモジュールによってインポートされている場合、この条件文の下のコードは実行されません。
if __name__ == '__main__':
main()
分析#
コードの最初の部分では、いくつかの一般的な Python ライブラリとモジュールがインポートされています。
import os:これは Python の標準ライブラリの一つで、オペレーティングシステムとのインタラクションに使用されます。たとえば、フォルダーの作成、ファイルの削除などの操作です。
from datetime import datetime:datetime モジュールから datetime メソッドをインポートし、日付と時間を処理する機能を提供します。
import requests:これは非常に一般的なライブラリで、HTTP リクエストを送信するために使用されます。たとえば、ウェブページの内容を取得するためです。
from bs4 import BeautifulSoup:BeautifulSoup モジュールから BeautifulSoup クラスをインポートし、HTML または XML 文書からデータを解析および抽出するために使用されます。
from openpyxl import Workbook:openpyxl モジュールから Workbook クラスをインポートし、Excel ファイルを操作するために使用されます。
from snownlp import SnowNLP:snownlp モジュールから SnowNLP クラスをインポートし、中国語のテキスト感情分析に使用されます。
import jieba:これは非常に一般的な中国語分詞ライブラリで、中国語のテキストを単語に分割するために使用されます。
from collections import Counter:collections モジュールから Counter クラスをインポートし、反復可能なオブジェクトをカウントするために使用されます。
import jieba.posseg:jieba ライブラリの posseg モジュールをインポートし、中国語の品詞タグ付けに使用されます。
import json:これは Python の標準ライブラリの一つで、JSON データを処理するために使用されます。
import urllib.request:これは Python の標準ライブラリの一つで、HTTP リクエストを送信し、URL を処理するために使用されます。
全体の部分の説明#
これらの複数のサードパーティライブラリを使用して、さまざまな機能を実現しています。
次に、コードは get_formatted_time () 関数を定義し、フォーマットされた現在の時間を取得します。
その後、コードは get_news_from_url (url: str) 関数を定義し、指定された URL からホットサーチニュースを取得します。
次に、コードは delete_empty_rows (sheet_name: str, wb: Workbook) 関数を定義し、指定されたワークシートから空行を削除します。
その後、コードは calculate_average_index_and_sentiment_score (sheet_name: str, wb: Workbook) 関数を定義し、指定されたワークシートのホットサーチニュースの平均指数と感情スコアを計算します。
次に、コードは calculate_word_count (sheet_names: list, wb: Workbook) 関数を定義し、ワークシートで最も頻繁に出現する 20 個の単語を統計します。
その後、コードは write_category_to_sheet (sheet_name: str, wb: Workbook) 関数を定義し、ニュースイベントのキーワード分類情報を Excel ワークシートに書き込みます。
次に、コードは write_news_to_sheet (news_list: list, sheet_name: str, wb: Workbook) 関数を定義し、ニュースリストを Excel ワークシートに書き込みます。
最後に、コードは main () 関数を定義し、主要なプログラムロジックを実行します。最初に、取得する URL とワークシート名のリストを定義し、次に Excel ワークブックオブジェクトを作成します。その後、get_news_from_url () 関数を使用してホットサーチニュースを取得し、write_news_to_sheet () 関数を使用してニュースリストを Excel ワークシートに書き込みます。その後、delete_empty_rows () 関数を使用して空行を削除し、write_category_to_sheet () 関数を使用してキーワード分類情報を Excel ワークシートに書き込みます。次に、calculate_average_index_and_sentiment_score () 関数を使用して平均指数と感情スコアを計算し、結果を印刷します。最後に、calculate_word_count () 関数を使用して単語頻度を統計し、ワークブックを xlsx ファイルとして保存します。
最後に、コードは if name == 'main': 条件文を使用して、現在のモジュールが直接実行されているかどうかを判断し、そうであれば main () 関数を呼び出して主プログラムロジックを実行します。
使用方法#
Python をインストールします。
Python をダウンロード:まず、Python インタプリタをダウンロードしてインストールする必要があります。Python の公式ウェブサイト(https://www.python.org)で、さまざまなバージョンの Python を見つけることができます。お使いのオペレーティングシステムに適したバージョンを選択し、インストーラーをダウンロードしてインストールします。
Python をインストール:ダウンロードしたインストーラーを実行し、インストールウィザードの指示に従ってインストールします。Python をシステムパスに追加するオプションを選択してください。
Python ファイルを実行する場合:コマンドプロンプト(Windows)またはターミナル(Mac/Linux)を開き、Python スクリプトが保存されているディレクトリに移動します。cd コマンドを使用してディレクトリを切り替えます。たとえば:cd C:\Users\YourUsername\Documents その後、次のコマンドを実行して Python スクリプトを実行できます:python example.py これで、Python ファイルをインストールして実行できるようになります。すべてが順調であれば、コマンドプロンプトまたはターミナルで出力結果を見ることができるはずです。
注:python3.x バージョンを使用する場合は、python3 example.py を実行してファイルを実行します。
Python のグローバル環境変数を設定#
ターミナルアプリケーションを開きます。アプリケーションフォルダ内に見つけることができるか、Spotlight で「ターミナル」と入力して検索します。
ターミナルで、次のコマンドを入力して bash 設定ファイルを編集します(Zsh を使用している場合は、コマンド内の.bash_profile を.zshrc に置き換えます):
nano ~/.bash_profile
ターミナルは、bash設定ファイルの内容を表示するテキストエディタを開きます(設定ファイルを作成したことがない場合は空白になります)。ファイルの末尾に次の行を追加して、Python のグローバル環境変数を設定します:
export PATH="/usr/local/bin:$PATH"
これにより、/usr/local/binディレクトリがPATH環境変数に追加されます。このディレクトリは通常、Pythonがインストールされる場所です。Control + X を押してテキストエディタを終了し、Y を押して変更を保存し、最後に Enter キーを押して保存するファイル名を確認します。
ターミナルで次のコマンドを入力して、変更を有効にします:
source ~/.bash_profile
これにより、bash設定ファイルが再読み込みされ、変更が即座に有効になります。これで、Python のグローバル環境変数が正常に設定されました。ターミナルで python コマンドを実行して、正しく設定されているかどうかを確認できます。
サーバー証明書を正しく検証
Python を使用して urllib ライブラリが HTTPS リクエストを送信する際に証明書検証に失敗した場合の問題を解決するために、次の手順を試すことができます。
ターミナルアプリケーションを開きます。
次のコマンドを入力して Enter キーを押します:
/applications/python\ {your_python_version}/install\ Certificates.command
{your_python_version}を現在使用しているPythonのバージョン番号に置き換えてください。たとえば、Python 3.10を使用している場合、コマンドは次のようになります:/applications/python\ 3.10/install\ Certificates.command
上記のコマンドを実行すると、欠落しているルート証明書が自動的にダウンロードされ、インストールされます。このコマンドは、Python インストールディレクトリ内の Install Certificates.command スクリプトを実行し、欠落しているルート証明書をインストールします。このコマンドを実行した後、Python 環境はサーバー証明書を正しく検証できるようになり、証明書検証失敗のエラーが発生しなくなるはずです。
PIP でファイル依存ライブラリをインストール
次のコマンドを入力して、pip がすでにインストールされているかどうかを確認します:
pip --version
pipがすでにインストールされている場合、pipのバージョン情報が表示されます。インストールされていない場合、エラーメッセージが表示されます。pip がインストールされていない場合、次のいずれかの方法を使用してインストールできます:
コマンドラインで次のコマンドを実行して pip をインストールします:
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
sudo python get-pip.py
ブラウザで https://bootstrap.pypa.io/get-pip.pyを開きます。ページの内容を get-pip.py という名前の Python スクリプトファイルとして保存します。
コマンドラインで get-pip.py ファイルが保存されているディレクトリに移動します。
次のコマンドを実行して pip をインストールします:
python get-pip.py
Windows ユーザーの場合:
Mac および Linux ユーザーの場合:
インストールが完了したら、次のコマンドを再度実行して pip が正常にインストールされたかどうかを確認できます:
pip のバージョン情報が表示されれば、pip は正常にインストールされています。
pip --version
これで、ターミナルで次のコマンドを使用して必要な依存ライブラリをインストールできます:pip install requests beautifulsoup4 openpyxl snownlp jiebaosとfrom datetime import datetimeの2つのライブラリはPythonの組み込みライブラリであり、インストールする必要はありません。import jieba.posseg as psegおよびimport urllib.requestはPython標準ライブラリの一部であり、個別にインストールする必要はありません。pipでインストールする際に権限の問題が発生した場合、–userパラメータを追加してライブラリをユーザーディレクトリにインストールできます:pip install –user requests beautifulsoup4 openpyxl snownlp jieba最後に、Python の必要な環境とファイルの依存ライブラリが満たされた状態で、ターミナルコマンドまたは Python インタプリタを使用してファイルを直接実行できます。