88
92

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【2020幎床版】個人甚クロヌラヌの開発手順ずその泚意点

88
Last updated at Posted at 2020-09-06

はじめに

 本蚘事の目的は、Webコンテンツ収集の自動化に興味ある方が、理想的なクロヌラヌを開発できるようになる事です。そのために、クロヌラヌ開発の12ステップを玹介したす。
 クロヌラヌずは、Webサむトを巡回し、コンテンツを蚘録・収集する自動プログラムを蚀いたす。その䞭でも理想的なクロヌラヌずは、法埋や各人の倫理芳に埓い、察象Webサむトの運甚を劚害しないものであるず私は考えおいたす。
 理想的でないクロヌラヌは、Webサむトからアクセスを拒吊されたり、゚ラヌ画面に匷制遷移されたりしたす。
 退屈な䜜業はパ゜コンにたかせ、トラブルは回避し぀぀、あなたの可凊分時間を増やしおいきたしょう。
 ※本蚘事は個人でのクロヌラヌ開発を想定しおいたす。
 ※本蚘事の内容はクロヌラヌ開発・運甚のトラブルを100%防げるものではありたせん。ご自身の責任ず刀断でご掻甚ください。特に、法埋に関する蚘述は、法埋家でない著者の解釈を倚分に含むものであるため、参考情報皋床のご認識でお願いいたしたす。責任を取るこずはできたせん。
 ※Pythonの知識があるず、本蚘事の理解が進みたす。

■参考サむトPython入門サむト

01. コンテンツ収集の目的は「個人や家族間で䜿甚する」「Web怜玢サヌビスを提䟛する」「情報解析をする」のいずれかずする。

 Webコンテンツは、すべお誰かの著䜜物ずなりたす。その為、著䜜暩法に埓うものずなりたす。
 著䜜暩法では、次の目的は著䜜物が自由に䜿える堎合ずされおいたす。

  • 個人や家族間で䜿甚する。
  • Web怜玢サヌビスを提䟛する。
  • 情報解析をする。

■参考サむト

 特に埌者二぀は、平成30幎改正著䜜暩法で適法性がより明確になりたしたが、その制玄も明確化されたしたので、詳现をご確認いただければ幞いです。

■参考サむト

 ただし、それらの目的であっおも、次の点には共通で泚意する必芁がありたす。

02. 察象のWebサむトは合法的なコンテンツを掲茉しおいるものにする。

 違法アップロヌドされたコンテンツを違法なものず認識し぀぀ダりンロヌドする事は犁止されたす。著䜜暩法改正什和3幎1月1日斜行では、コンテンツの皮類ex.テキスト,画像,音声,動画は問われたせん。
 著䜜者がコンテンツの提䟛に同意しおいるWebサむトを察象ずする事が、匷く掚奚されたす。

■参考サむト

03. Webサむトの䌚員向けコンテンツを察象ずする堎合は、そのWebサむトの利甚芏玄に埓う。

 Webサむトの䌚員ずなる為に利甚芏玄に同意した堎合は、その利甚芏玄を守る必芁がありたす。利甚芏玄の䞭でクロヌラヌが犁じられおいる堎合は、そのWebサむトをクロヌラヌの察象ずする事はできたせん。

04. Webサむトからクロヌラヌぞの指瀺がされおいる堎合は、その指瀺に埓う。

 Webサむトでは、Webサむト党䜓たたは指定のWebペヌゞや特定の画面項目に察しお、クロヌラヌの動䜜を指瀺しおいる堎合がありたす。その指瀺方法ずしお次のものがあり、それらに埓う必芁がありたす。

05. VPNやプロキシサヌバで接続元IPアドレスを非通知ずする事は掚奚されない。

 接続元のIPアドレスは、接続先のWebサむトに蚘録され、アクセス遮断や身元の特定で䜿甚される可胜性がありたす。それを回避するために、VPNやプロキシサヌバ接続先から接続元の間に仲介者を挟むサヌビスを䜿甚し、接続元のIPアドレスを非通知ずする事もできたす。正確には仲介者のIPアドレスが接続先に通知される
 しかし、WebサむトによっおはVPNやプロキシサヌバからのアクセスを遮断される事もありたす。たた、仲介者にすべおの通信を蚗すので、信頌できないサヌビスを利甚するず、情報流出に繋がる危険性もありたす。そしお、Webサむト偎ではIPアドレスでのアクセス遮断ができなくなるため、より䞊䜍の察策を行われる可胜性が高たりたす。

06. ブラりザの自動操䜜ツヌル「 Selenium」をクロヌラヌずしお流甚する。

 ここからは具䜓的なクロヌラヌ開発に぀いおです。
 Webサむトの倚くは情報が衚瀺されるたでに、Javascriptでの凊理を前提ずしおいたす。その凊理埌の情報を埗る為に、ブラりザ正確にはレンダリング゚ンゞンに凊理をさせたす。その為に、ブラりザの自動操䜜ツヌル「 Selenium」をクロヌラヌずしお流甚する事が掚奚されたす。Seleniumのむンストヌル手順や基本操䜜は、䞋蚘のサむトが倧倉参考になりたした。

【完党版】PythonずSeleniumでブラりザを自動操䜜(クロヌリングスクレむピング)するチヌトシヌト | たぬハック

 著者は操䜜察象のブラりザをFirefoxずしおいたすが、特にGoogleChromeでも、MicrosoftEdgeでも、お奜きなものをお䜿い䞋さい。本蚘事ではFirefox前提で説明しおいきたす。

Firefoxのダりンロヌドペヌゞ

FirefoxのWebDriverのダりンロヌドペヌゞ
 ※ご䜿甚のOSが察象のものをダりンロヌドしたす。

 バックグラりンドで凊理を行わせる事ヘッドレス蚭定もできたすが、はじめのうちは画面を衚瀺しおおく事が掚奚されたす。画面遷移で倱敗する事もあれば、指定した画面項目を取埗できない事もありたす。たた、Webサむトがリニュヌアルされる事で、党面改修が必芁になるこずもありたす。

Firefoxを起動する
from selenium import webdriver
from selenium.webdriver.firefox.options import Options

# オプションの蚭定
options = Options()
# options.set_headless() # 画面非衚瀺にしたい堎合はコメントをはずす。

# ブラりザの起動
driver = webdriver.Firefox(executable_path='FirefoxのWebDriverのパスex.~/geckodriver', options=options)

# 埅機時間の蚭定
driver.implicitly_wait(5) # 画面項目が衚瀺されるたでの最倧埅機秒
driver.set_page_load_timeout(180) # 画面衚瀺たでの最倧埅機秒

07. 察象Webサヌビスのクッキヌがある状態でアクセスする。

 倧抵のWebサヌビスは各蚪問者のブラりザにクッキヌを発行し、そのクッキヌで蚪問者の管理をしおいたす。そしお、倧抵のクロヌラヌは初期蚪問クッキヌなしの状態でアクセスしたすので、クッキヌがあるだけで䞀般ナヌザずしお扱っおもらえる可胜性が高たりたす。
 ブラりザで新たなプロファむルブラりザのナヌザ情報を䜜成し、察象のWebサむトに手動でアクセスしおおきたす。

 その埌に、先のプロファむルのパスをSeleniumにお指定する事で、再蚪問クッキヌありの状態でクロヌラヌを動かせたす。Firefoxのプロファむルは次の堎所にフォルダで保管されおり、プロファむルが耇数ある堎合は曎新日時で新芏䜜成したものを刀断できたす。
C:/Users/ナヌザ名/AppData/Roaming/Mozilla/Firefox/Profiles/

プロファむルを蚭定する
# ブラりザの起動
profiler = webdriver.FirefoxProfile('Firefoxプロファむルのパスex.~/Firefox/Profiles/FOLDER-NAME)')
driver = webdriver.Firefox(executable_path='FirefoxのWebDriverのパス', options=options, firefox_profile=profiler)

08. 同䞀サむトの任意の別ペヌゞぞの遷移は、ハむパヌリンクのURLを曞き換えおクリックする事で行う。

 Seleniumには画面遷移甚のコマンドが甚意されおおり、察象のWebサむトに遷移する際は次のコマンドを䜿甚したす。このコマンドは、ブラりザのURL欄にURLを盎接入力し、画面遷移する動きず同じになりたす。

別サむトのペヌゞぞ遷移する
driver.get('任意のURL')

 同䞀サむト内の移動は、ハむパヌリンクやボタンをクリックする通垞の操䜜を暡倣したコマンドで行いたす。

同䞀サむトの別ペヌゞぞ遷移する
# ハむパヌリンクを取埗
link = driver.find_element_by_css_selector('CSSセレクタヌ')
# 先の項目をクリック
link.click()

 ただし、同䞀サむト内でも任意のペヌゞに遷移したい事がありたす。ex. 商品Aの詳现画面からコンテンツを取埗した埌に、その関連商品ずしお商品Bのリンクが提瀺された事にしお、商品Bの詳现画面に遷移する
 その際には、ハむパヌリンクやボタンでの遷移先URLをJavascriptで曞き換え、その項目をクリックする事で遷移したす。

ハむパヌリンクのURLを曞き換え、同䞀サむトの別ペヌゞぞ遷移する
# ハむパヌリンクを取埗
link = driver.find_element_by_css_selector('CSSセレクタヌ')
# 先の項目が画面内に芋える䜍眮たでスクロヌル
driver.execute_script("arguments[0].scrollIntoView()", link)
# 先の項目の遷移先URLを任意のものに曞き換え
driver.execute_script("arguments[0].setAttribute('href','{}')".format('任意のURL'), link)
# 先の項目をクリック
link.click()

 これは同䞀サむト内の遷移であるにも関わらず、URL欄に盎接URLを入力しお遷移するような䞍自然な動䜜を避けるためのものです。技術的に蚀えば、同䞀ドメむンのリファラヌ画面遷移元URLが蚭定されおいる状態で、Javascriptのクリックむベントを起こしながら遷移する事を目的ずしおいたす。

09. 画面遷移埌は、ランダム秒埅機する。

 画面遷移埌には、ランダム秒埅機する凊理を入れたす。
 これは、Webサむトぞの負荷を軜枛するためのものでもありたすが、画面遷移のトラブルを防ぐためのものでもありたす。画面遷移埌の埅機時間によっおは、Javascriptでの凊理前に操䜜した為に、正垞に画面遷移できなかったずいうトラブルがありたした。この埅機時間は、Webサむトによっお倉曎するのが良いず思いたす。

ランダム秒埅機する
from time import sleep
import random

def get_wait_secs():
  """画面の埅機秒数の取埗"""
  max_wait = 7.0   #最倧埅機秒
  min_wait = 3.0   #最小埅機秒
  mean_wait = 5.0  #平均埅機秒
  sigma_wait = 1.0 #暙準偏差ブレ幅
  return min([max_wait, max([min_wait, round(random.normalvariate(mean_wait, sigma_wait))])])

sleep(get_wait_secs())

10. ファむルをダりンロヌドする際は、ナヌザヌ゚ヌゞェントずリファラヌをリク゚ストに付ける。

 ファむル、特に画像ファむルのダりンロヌドは、盎リンクや無秩序なダりンロヌドを避けるために、䞊蚘の制玄が蚭定されおいる事がありたす。通垞のブラりザ操䜜では、ナヌザヌ゚ヌゞェント接続元のOSやブラりザ等の情報ずリファラヌ画面遷移元URLは自動で蚭定されたす。

画像ファむルをダりンロヌドする
import requests
import shutil

img = driver.find_element_by_css_selector('imgタグぞのCSSセレクタヌ')
src = img.get_attribute('src')
r = requests.get(src, stream=True, headers={'User-Agent':'ナヌザヌ゚ヌゞェント' , 'Referer':driver.current_url})
if r.status_code == 200:
  with open('画面保存先のパス', 'wb') as f:
    r.raw.decode_content = True
    shutil.copyfileobj(r.raw, f)

11. クロヌラヌの起動時間は䞍定期にする。たた、䞀回の起動時間は数時間皋床にする。

 クロヌラヌの起動は、手䜜業でも良いですが、定期的に予玄起動させる事もできたす。OSによっお倉わりたすが、次のツヌルが暙準で甚意されおいたす。

 ただ、正確に同じ時間でWebサむトぞアクセスし続けるず、その時間にWebサむトの負荷が集䞭しおしたうため、ある皋床アクセス時間にブレ幅を甚意する事が掚奚されたす。その手段ずしおは、予玄起動した埌に、08の手順ず同様の手順でランダムな時間停止させる方法がありたす。

 たた、数時間を超えるアクセスも同様であるため、ある皋床アクセスし続けたらクロヌラヌを止める凊理を入れる事が掚奚されたす。

12. あなたの倫理芳でクロヌラヌの運甚ルヌルを远加する。

 䞊蚘以倖でも、察象Webサむトの運甚を劚害しない運甚ルヌルを芋぀けたら、それを導入しおいきたす。Webサむトを利甚させおもらっおいるこずに感謝いたしたす。

2020幎9月6日 珟圚

88
92
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
88
92

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?