LoginSignup
0
0

More than 3 years have passed since last update.

WEB情報を集める必要があったのでスクレイピング入門

Last updated at Posted at 2021-02-14

はじめに

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テキストの取得まで全部自動でやりたいけど今回はここまで。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0