Pythonを使ったスクレイピング技術(実務No2)
お小遣い稼ぎでデータ収集やGASによりシートないの自動化アプリを開発しています。
今回は実務の際に基本的操作をコピペできるよう経験から学んだことを備忘録として書き留める
目次
- スクレイピングする前の注意点
- 基本操作
- ブラウザの起動(よくあるエラー)
- htmlタグの取得(aタグの取得⇨再度検索)
- 広告対処
- ファイルを開いてファイルに格納
- with open ~ 書き込みと読み込みの方法
- タイムスリープの設定
スクレイピングする前の注意点
1.著作権について調べる
Webコンテンツは全て配信者の著作物になるので、勝手に使用することは基本的にNG。以下の用途での使用ならOKと考えて良い
- 個人や家族間で使用する。
- Web検索サービスを提供する。
- 情報解析をする。
2.robot.txtを調べる
検索するurlに/robot.txtで検索すると以下のような指示が書かれている
User-Agent:*
Disallow: /admin/
Disallow: /logs
Disallow: /search/
この場合、url/admin/、/logs、/search/にはクローラーが立ち入ることを禁止している。
基本操作
ブラウザの起動
スクレイピングでよく使われるseleniumを使用したいと思います。
初期設定として
- クロームドライバーのバージョンを合わせておく
- import chromedriver_binary を忘れずに
from selenium import webdriver
import chromedriver_binary
import time
import csv
import requests
from bs4 import BeautifulSoup
url='ここに調べたいurlを入れる'
browser = webdriver.Chrome()
browser.implicitly_wait(1)
browser.get(url)
browser.find_element()を使い倒す
よく使うfind_elementを以下にまとめる
- クラス取得,タグ取得(aタグ,div,ul,li)
browser.findelement_by_class_name('')
find_element_by_id('contentsleft')
find_elements_by_tag_name('li')
find_element_by_link_text('click here')⇨<a href='url'>click here</a>
- hrefの取得(urlの取得),textの取得
url=find_element_by_tag_name('a').get_attribute('href')
title=find_element_by_tag_name('a').get_attribute('title')
text=find_element_by_tag_name('a').get_attribute('textContent')
ページによってはないタグがある場合
複数のページをスクレイピングする際にこのページにはxタグがあるけど、他のページにはないことが稀にあります。
このように、あるかどうかわからないタグについてはtry ecept関数を使って対処します
# 広告があるか調べる
try:
representative=browser.find_element_by_class_name('node__representative').find_element_by_tag_name('dl').find_element_by_class_name('mincho').text
nav = browser.find_element_by_class_name('contentsWrap__rightcolumn').find_element_by_class_name('node__box')
company_url = nav.find_element_by_class_name('cf').find_element_by_tag_name('a').get_attribute('href')
except:
representative = ' '
company_url='NO'
ファイルを開いてファイルに格納
基本的にデータ分析を行う場合は以下の3つのモジュールを使い倒すことが多いです。
今回は、基本的な『書き込みと読み込み』だけなのでcsvモジュールのみを紹介します
-numpy
-pandas
-csv
書き込み
with open("company_data1.csv", "w") as f:
writer = csv.writer(f)
writer.writerow(["会社名", "url", "代表者"])
読み込み
with open("company_data1.csv", "r") as f:
reader = csv.reader(f)
for read in reader:
print(reader)
タイムスリープの設定
最後にタイムスリープの紹介です。これは、相手のサーバーに負荷をかけないだけでなく、自分のpcをダウンさせないためにも必要な操作です。
def get_wait_secs():
"""画面の待機秒数の取得"""
max_wait = 7.0 #最大待機秒
min_wait = 3.0 #最小待機秒
mean_wait = 5.0 #平均待機秒
sigma_wait = 1.0 #標準偏差(ブレ幅)
cssセレクター
複数のクラスを取得
ele = driver.find_element_by_css_selector(".hoge.huga.piyo")
空白文字の処理
法方1:replace()
法方2:strip()