見出し画像

PythonでWebスクレイピングに取り組んだ感想

某レビューサイトに書かれているコメントが、ポジティブなのかネガティブなのかを判断させるAIモデルを作ろうとしています。そのプロセスでのWebスクレイピングに関する学びを書きます。

ライブラリは都度インポート、最初にまとめてインポート、どちらが良いか

ライブラリとは頻繁に行う処理を再利用するためにまとめて保存したコード集ですが、私はこれを「必殺技みたいなもの」と解釈しています。

みんな技名を言ってから敵に攻撃しますよね。

今回は資料の指示に従い作業しましたので、先に記述しました。

import time
import requests
from bs4 import BeautifulSoup
from tqdm import tqdm
import pandas
from sklearn.preprocessing import LabelEncoder
from janome.tokenizer import Tokenizer
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report

・time:時間関連の情報や関数を集めたライブラリ
・BeautifulSoup:Webスクレイピング用ライブラリ
・requests:HTTP送信用のライブラリ
・pandas:表形式データの操作用ライブラリ
・scikit-learn:AIモデル構築用ライブラリ
・janome:日本語に特化した形態素解析用ライブラリ
・tqdm:処理(=AIの学習)の進捗状況を表示するライブラリ


最初の環境構築の時点でエラーが出てかなり疲れました。
予め正確な指示書があってその通りに手を動かすだけなら特に問題はありませんが、自分で考えながら、あるいは適度に成果のレベルを落としながら完成を目指すならば都度インポートで良いのかなと思いました。

最初にまとめて書くのは、この戦いで使うすべての必殺技を先に言っておいてから始めるようなものです。
戦いが始まってからやっぱり使わないことも現場ではよくあるかなと思いますので。

ライダーキックやファイヤートルネードのように、「途中経過に関わらずに絶対に使う必殺技」だけ先に記述し、他の技は状況を見て都度繰り出そうと思います。

都度記述する場合の例。
参考:Axross Recipe

import requests

def parse_url(url, sleep_second=1):
    res = requests.get(url)
    time.sleep(sleep_second)
    return BeautifulSoup(res.content, "html.parser")

parse_url("取得するサイト")

ページを取得する関数を記述する前にライブラリ"requests"をインポート

from tqdm import tqdm
# tqgmモジュールからtqgmオブジェクトを取り込み、プログレス(処理の進捗)バーを表示

crawled = list()
for url in tqdm(checked_urls):
    # データの取得:articleという辞書に入れて、リストに詰めていく
    soup = parse_url(url)
    texts = soup.find_all("div", class_="tweet_text clearflt clearboth")
    labels = soup.find_all("span", class_="judge_text")
    title = soup.find("div", class_="title_").find("h1")
    # データのパース
    for t, l in zip(texts, labels):
        text = t.get_text(strip=True)
        metadata = t.find("span").get_text(strip=True)
        stripped_text = text.replace(metadata, "").strip()
        article = {
            "text": stripped_text,
            "label": l.get_text(strip=True),
            "title": title.get_text(strip=True)
        }
        crawled.append(article)
print("全URLの取得完了")

取得したページからツイートを取得する。本文、ラベル、タイトルを取得するコードを記述。その前に、ライブラリ"tqdm"をインポート

import pandas

df = pandas.DataFrame(crawled)

# カラムごとに150文字まで表示
pandas.set_option('display.max_colwidth',150)
display(df)

データを表形式で出力したいので、ここでライブラリ"pandas"をインポート

このように技をその場その場でヒットさせていきながら勝利を目指すのが、ギリギリでいつも生きている私にはあっているかもしれません。

Webサイトの理解が大事

SEMの世界で、検索広告やSEOで効果を出すためにはサイト構造の理解が訴求する商品理解同様に重要と言われます。
マーケティング文脈だけではなく、技術文脈でもこれを感じました。

Webサイトとはすなわち何らかのデータを表示する「板」ですが、その板がどのような構成や厚みでユーザーに見える形で情報をフィードしているのかを隅々まで知る必要があります。

サイトの表示の仕方がわかってはじめて、スクレイピングをどのように行うのかについて記述する具体的な作業に入れるのです。
逆に言えばサイトをマーケティングツールとして使うのであれば、最初から分析しやすいようデザインしておいたり(そしておそらくこのデザインはユーザーにとっても見やすい)、マーケティング担当者に構造の仕様書を共有してチームで取り組むことが良い成果に繋がると感じました。

今回はここまで。

年末年始はプログラミング頑張ります。
良いお年を。

この記事が気に入ったらサポートをしてみませんか?