掲示板スクレイピング

さて,今回スクレイピングするのは掲示板です.ランキングを作りたいのですが,掲示板はユーザの生の意見が反映される性質が大きいと考え,採用しました.

掲示板であり,サイトは上からコメントが順次表示されており,各コメントは<li class="commen``t-item" id="commentXX">という形でIDが付与されています.(XXはコメント番号のようです.)

本文の部分は以下のようなセレクターで指定されています.

#comment6 > div.body.lv2
#comment8 > div.body.lv4
#comment32 > div.body.lv3

.body.lv3のようにレベルが指定されており,これはどうやらフォントのスタイルやインデントを決定しているようです.掲示板を観察していると,コメントにグッドを付けることが出来るのですが,このグッド数が多いほど大きい文字+色付き文字になります.

そして,各コメントに対する回答も階層的に表示されます.以下のように親コメント直下に回答がネストされています.

comment1
  |--answer1
  |--answer2
  |--answer3
comment2
comment3
comment4
  |--answer1
comment5

スクレイピング

さて,これら前提をもとにスクレイピングをします.
selenium,beautifulsoup,ドライバを使います.コードは以下の通りです.

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import time
options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.binary_location = '/usr/bin/google-chrome'
service = Service('/usr/local/bin/chromedriver')
driver = webdriver.Chrome(service=service, options=options)
driver.get("https://girlschannel.net/topics/5639448/")
time.sleep(3)
soup = BeautifulSoup(driver.page_source, 'html.parser')
driver.quit()
comments = soup.select('li.comment-item')
for comment in comments:
    body = comment.select_one('div.body') 
    if body:
        anchor = body.select_one('span.res-anchor')
        if anchor:
            anchor.decompose()
        print(body.get_text(strip=True))

スクレピングをしてみた感想

掲示板のコメントのスクレイピングをしました.コメントを抜擢して以下に記載します.

美白美容液ってクリームの後? アスタリフトの美白のやつ効きそう 去年二本使ったけど良かった。肌が安定してた。 安達祐実プロデュースブランド「Upt(ウプト)」Upt WHITE GLOW SERUM [医薬部外品]30mL 2,750円(税込) 税込で1万1千円でちょい予算オーバーだけどハクはどうですか?レフィル もあるし2本継続すると特製サイズが貰えるキャンペーンもしてる。色々美白美容液使ったけどハクが使い心地と効果が1番実感出来た。 アルテミューン迷ってるアラフォー超乾燥肌透明感とハリがほしい これ人気あるけど使い心地はどう? 敏感肌なのでアルビオンはヒリヒリして合いませんでした。 お前らには水で十分www エリクシールセラム使ってるけど美白成分ありました? HAKU気になってる 使わない方がマシなレベル

これらのコメントから,”Upt”や”ハク”,”エリクシールセラム”などの単語を抜擢し,これら単語(の頻度)をもとにランキングを作りたいのですが・・・.ふ~~~む.

階層的なスクレイピングもしてみる

先述で行っていたことは,ある特定のページのコメントを全部取得しましたが,やりたいことは「美容」カテゴリー内の記事を端から端まで取得することです.

で,カテゴリーのページから,すべての記事のタイトルとURLを取得し,さらにその記事のコメントを取得していきたいので,記事タイトルとURLを取得するコードを書きました.

from selenium import webdriver
from selenium.webdeiver.common.by import By
import time

driver = webdriver.Chrome()
driver.get('https://girlschannel.net/topics/category/cosme/')
time.sleep(3)
topics = driver.find_elements(By.CSS_SELECTOR, "ul.topic-list > li")
with open("title.txt", "w", encoding="utf-8") as f:
    for topic in topics:
        title_element = topic_find_element(By.CLASS_NAME, "title")
        title_text = title_element.text
        link_element = topic.find_element(By.TAG_NAME, "a")
        url = link_element.get_attribute("href")
        if url:
            f.write(f"{title_text} : {url}\n")
        else:
            f.write(f"{title_text} : NO URL\n")
driver.quit()

ということで取得したタイトルと記事が,次の画像です.

こんな感じに取得できました.

そして詳細記事でコメントを取得するコードと,カテゴリから詳細記事一覧を取得するコードを組み合わせます.

(執筆中)