スクレイピング
はじめに知ってほしいこと
スクレイピングは便利ですが、webページに高速にアクセスすると相手に迷惑がかかります。
アクセス頻度はtimeモジュールのsleep関数にて調整します。
またプログラム(ロボット)でアクセスして良いかどうかを「robots.txt」というファイルで明示している場合も多いです。
スクレイピングする場合には「https://(サイトドメイン)/robots.txt」にアクセスして確認しておくといいでしょう。
スクレイピングのコード
指定したURLのリンクを取得するコード
code: scraping1.py
import sys
from time import sleep
import requests
from bs4 import BeautifulSoup as soup
def get_links(url):
content = requests.get(url)
sleep(2) # ここで2秒静止してアクセス頻度を調整
page = content.text
soup_content = soup(page, "lxml")
links = []
for element in soup_content.find_all("a"):
link = element.get("href")
links.append(link)
return links
print(links)
スクレイピングでは大きく2つの処理が行われます。
requests を使ってインターネットから情報を取得
content = requests.get('https://***') によってURL「https://***」からデータを取得します。
取得したデータはHTMLというマークアップ言語で書かれた文字列として取得されます。上の例で次のようにprint文を追加すると<!DOCTYPE html>から始めるHTML文字列を確認できます。
code:python
content = requests.get(url)
print(content.text)
BeautifulSoup を使ってHTML 文字列をオブジェクトに変換
soup_content = soup(page, "lxml") によってHTML文字列をBeautifulSoupオブジェクトに変換します。
文字列のままだとPythonから扱うのが面倒なため、BeautifulSoupを使用して文字列をオブジェクトに変換します。BeautifulSoupオブジェクトにしておくとgetメソッドやfind_allメソッドを使って特定の要素・属性を簡単に取り出すことができます。
次のように文字列からBeautifulSoupオブジェクトを作るとイメージしやすいかも知れません。
code:python
from bs4 import BeautifulSoup as soup
html='''
<!DOCTYPE html>
<html>
<head>
<title>簡単なHTMLのサンプル</title>
</head>
<body>
<p>HTMLはツリー状の構造をしていて、headやbodyといったいろいろなタグでできています。</p>
<p>BeautifulSoupを使うとHTMLツリーをオブジェクトとして扱うことができます。</p>
</body>
</html>
'''
soup_object = soup(html, "lxml")
paragraphs = soup_object.select("p")
for paragraph in paragraphs:
print(paragraph.getText())