<目次>
(1) PythonでのWebスクレイピングについて
やりたいこと
STEP0:概要
STEP1:必要なパッケージのインストール
STEP2:サンプルプログラムの作成(疎通編)
STEP3:サンプルプログラムの作成(robots.txtに従う)
(1) PythonでのWebスクレイピングについて
やりたいこと
STEP0:概要
STEP1:必要なパッケージのインストール
> pip install beautifulsoup4
STEP2:サンプルプログラムの作成(疎通編)
STEP2-1:サンプルプログラムの準備
import requests from bs4 import BeautifulSoup # ウェブページのURLを指定 url = 'http://books.toscrape.com/' # requestsライブラリを使って、ウェブページのHTMLを取得 r = requests.get(url) # BeautifulSoupを使って、HTMLをパース soup = BeautifulSoup(r.text, 'html.parser') # タイトルを取得して表示 print(soup.title.text)
STEP2-2:実行
STEP3:サンプルプログラムの作成(robots.txtに従う)
import re import requests from bs4 import BeautifulSoup from urllib.parse import urlparse # ウェブページのURLを指定 url = 'http://books.toscrape.com/' # url = 'http://books.toscrape.com/' # 規約に従ってウェブページにアクセス可能かチェックする関数 def is_allowed_by_robots_txt(url): # ドメイン名を取得 # →xxxxx.jpなど domain = urlparse(url).netloc # robots.txtの内容を取得 robots_url = f"https://{domain}/robots.txt" try: robots = requests.get(robots_url).text except requests.exceptions.RequestException: return False # UserAgentを設定 user_agent = "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" user_agent_matched = False # robots.txtの各行を解析 for line in robots.split("\n"): # 空行またはコメント行は無視 if not line or line.startswith("#"): continue # UserAgentが一致するかどうかを判断 if line.startswith("User-agent:"): # 「User-agent: xxxxxx」のxxxxxxの部分を抽出 user_agent_str = line.split(":", 1)[1].strip() # 一致の場合(robots.txtがワイルドカート or スクレイピング者のuser_agentと一致) if user_agent_str == "*" or user_agent_str == user_agent: user_agent_matched = True else: user_agent_matched = False # UserAgentが一致した場合のDisallowの判断 elif user_agent_matched and line.startswith("Disallow:"): # Disallow: 以降のエンドポイントを抽出 disallow_path = line.split(":", 1)[1].strip() # "/"の場合、全部不許可 if disallow_path == "/": # 許可しない return False # "*"が含まれる場合 elif "*" in disallow_path: # 「*」を「.*」で置き換え disallow_regex = disallow_path.replace("*", ".*") # 正規表現によるパターンマッチング if re.search(disallow_regex, url): # 合致の場合:許可しない return False else: # 最後の部分が一致する場合 if url.endswith(disallow_path): # 許可しない return False # アクセスが許可されている場合はTrueを返す return True # robots.txtに従ってウェブページにアクセス if is_allowed_by_robots_txt(url): # requestsライブラリを使って、ウェブページのHTMLを取得 response = requests.get(url) # BeautifulSoupを使って、HTMLをパース soup = BeautifulSoup(response.text, 'html.parser') # タイトルを取得して表示 print(soup.title.text) else: print('このURLへのスクレイピングはrobots.txtにより許可されていません。')
入力:url = 'http://books.toscrape.com/' 出力:All products | Books to Scrape - Sandbox