はじめに
pythonはほとんど使ったことなかったけど、この動画が参考になりました。
https://www.youtube.com/watch?v=LgZ8Li97yoM&t=1660s
上記の動画に倣ってjupiter labで一通り実行すると、仕組みがわかりました。
やりたかったこと
WEBサービスのFAQ情報を集める。
実現方法
質問回答ページのURLを一覧化して、pythonにインポートし、ページごとの回答をCSV形式でエクスポートする。
URL一覧
質問分類1 | 質問分類2 | 質問 | URL |
---|---|---|---|
アイテムについて | アイテムについて | サンダルについてしりたい! | https://xxxxxx |
... | ... | ... | ... |
コード
コメント部分は自分の解釈
from bs4 import BeautifulSoup
import urllib.request as req
import time
import pandas as pd
import os
import csv
import codecs
# FAQ掲載ページのURL一覧をCSV形式ファイルでインポートする
csv_file = open("./FAQ_suzuri.csv", "r", encoding="utf-8", errors="", newline="" )
f = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\n", quotechar='"', skipinitialspace=True)
header = next(f)
# インポートしたCSVファイルの3番目のカラムにあるURLを配列に読み込みます
url_list = []
for row in f:
url_list = url_list + [row[3]]
for url in url_list:
# urllib.request.urlopen(url)で、URLアクセス時のレスポンス情報を取得
response = req.urlopen(url)
# レスポンス情報をBeautifulSoupオブジェクトに変換
parse_html = BeautifulSoup(response,'html.parser')
# FAQの質問が格納されている要素を取得(クラス名がarticle-titleの要素)
question_list=parse_html.find_all(class_="article-title")
# FAQの回答が格納されている要素を取得(クラス名がarticle-bodyの要素)
answer_list=parse_html.find_all(class_="article-body")
ans = []
# 取得した回答ごとに、要素の中のPタグを収集
for i, x in enumerate(answer_list):
temp = ""
# 1つの回答にある1つ以上のPタグを配列として取得し、tempに格納
for y in x.find_all('p'):
temp = temp + y.text + '\n'
ans = ans + [temp]
#cp932形式で処理できない文字コードによりエラーが出るため、例外処理を記載
# 処理名をerr、処理内容を無名関数lambdaで記述(引数e,戻り値('', e.end))
codecs.register_error('err', lambda e: ('', e.end))
# 取得したデータがUTF-8形式の文字コードだが、エクセルで編集したいためcp932形式でデータを取得する。
# ファイルに書き込み(ファイル形式:CSV、文字コード形式:cp932、書き込み形式:追記)
with open('faq_suzuri_scraping_output.csv', 'a', encoding='cp932', errors='err') as f:
writer = csv.writer(f)
for i, q in enumerate(question_list):
# 質問と回答を書き込み
# 質問のHTML要素からテキスト部分を抜き出し、スペースと改行コードを除外
writer.writerow([q.text.replace(' ', '').replace('\n',''), ans[i]])
output
faq_suzuri_scraping_output.csv
サンダルについてしりたい! | S=2xcm・M=2xcm の2サイズ展開となっており、ソールは.xxxxxx |
---|---|
... | ... |
最後に
本当は、URL一覧の取得から目的のFAQテキストの取得まで全部自動でやりたいけど今回はここまで。