PythonでGoogle検索結果からH1/H2/H3タグのスクレイピング行う
今回はPythonのWEBクローリングを用いていろいろ試してみます。
試してみる内容はGoogle検索結果から特定(任意)のキーワードでHITしたサイトのH1/H2/H3のテキストを抽出します。
HITするサイト数は任意で決めることが出来ます。
このサイトでは次のようなことが出来るようになります。
- Google検索結果から、タイトルとURLをCSVに出力することが出来る
- URLにアクセスしH1/H2/H3タグを抽出しTextに出力することが出来る
WEBクローリングを行うにあたり、Beautiful Soupを使用していきます。
Beautiful Soupのインストール方法
コマンドプロンプトで「pip install beautifulsoup4」を実行します。
または Anacondaを使用している場合は「conda install beautifulsoup4」を実行します。
PIPを使用してインストールする場合
1 |
>pip install beautifulsoup4 |
Anadondaを使用してインストールする場合
1 |
>conda install beautifulsoup4 |
Google検索結果から、タイトルとURLをCSVへの出力方法
1 2 3 4 5 6 7 |
from bs4 import BeautifulSoup import requests import csv import re list_keywd = ['AI','機械学習'] #キーワード page = 5 #サイト数 |
「page」に抽出対象のサイト件数を入力してください。
今回は例として「list_keywd」にAI,機械学習を、「page」に5を設定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
resp = requests.get('https://www.google.co.jp/search?num=' + str(page) + '&q=' + ' '.join(list_keywd)) resp.raise_for_status() # 取得したHTMLをパースする soup = BeautifulSoup(resp.text, "html.parser") # 検索結果のタイトルとリンクを取得 link_elem01 = soup.select('.r > a') # CSVファイルを書き込み用にオープンして整形して書き出す with open('TitleURL.csv','w',newline='',encoding='utf8') as outcsv: csvwriter = csv.writer(outcsv) csvwriter.writerow(['No','タイトル','URL']) for i in range(len(link_elem01)): # リンクのみを取得し、余分な部分を削除する url_text = link_elem01[i].get('href').replace('/url?q=','') url_text = re.sub('&.*', "", url_text) # タイトルのテキスト部分のみ取得 title_text = link_elem01[i].get_text() csvwriter.writerow([i+1,title_text,url_text]) outcsv.close() |
ここで設定したキーワードに対するGoogle検索結果から、上位のサイトを指定した件数分の取得することが出来ます。
このコードを実行すると「TitleURL.csv」というCSVが作成されます。
それぞれのカラムは以下の通りです。
・No
・タイトル
・URL
これでGoogle検索結果から、タイトルとURLをCSVに出力することが出来きるようになりました。続いて、このCSVを用いて1つずつURLにアクセスし、H1/H2/H3タグの内容を取得していきます。
URLにアクセスしH1/H2/H3タグを抽出しTextへの出力方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
def OutPutText(row,tag): #No_1-h1.txtのようにファイル名を付ける OutputFile = "No_" + str(int(row[0])) + "-" + tag + ".txt" soup = BeautifulSoup(requests.get(row[2]).content) summary = soup.find_all(tag) with open('AllText.txt','a',encoding='utf8') as alltext: alltext.write("【Title】" + row[1] + "【tag】" + tag) alltext.write("\n") with open(OutputFile,'w',encoding='utf8') as outputfile: for td in summary: try: text = td.find(text=True) outputfile.write(text) outputfile.write("\n") alltext.write(text) alltext.write("\n") except: continue |
この関数の引数は「row」「tag」の2つです。
「row」は先ほど生成したCSVファイルの1行に相当します。
すなわち、row[0]はNo,row[1]はタイトル,row[2]はURLが格納されています。
「tag」は"h1","h2","h3”のいずれかが指定されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
with open('TitleURL.csv','r',newline='',encoding='utf8') as inputcsv: print("Start-Analysis") #TitleURL.csvの読み込み csvreader = csv.reader(inputcsv) # ヘッダーを読み飛ばす next(csvreader) for row in csvreader: print("Analysis No: " + str(int(row[0]))) OutPutText(row,"h1") OutPutText(row,"h2") OutPutText(row,"h3") print("End-Analysis") |
これを実行すると、No_XXX-hX.txtという形式でテキストファイルが作成されます。
例えば、No1のh2タグを抽出した場合は「No_1-h2.txt」というファイル名です。
「No_1-h2.txt」にはGoogle検索結果からHITした上位1番目のH2タグのテキスト内容が出力されます。
もし、H2タグが無い場合や、テキストではなかった場合は0バイトの空ファイルが出力されます。
指定する件数が多い場合は大量のテキストが出力され、時間もかかるので注意してください。
また、「AllText.txt」というファイルに抽出したすべての情報が出力されます。
個別にテキストファイルを確認するのが面倒だという方や、1テキストにまとめたいという方は参考にしてください。
参考サイト:
以下のサイトを参考にさせて頂きました。
PythonのrequestsとBeautifulSoupでGoogle検索結果から、タイトルとURLと説明文だけを抜き取る
http://arakan-pgm-ai.hatenablog.com/entry/2018/01/17/080000