NO IMAGE

Pythonによるスクレイピングのやり方

  • 2021年12月31日
  • 2022年1月22日
  • Python
  • 5view

ネット上には、いろいろな情報が公開されています。プログラムを使うと自動で集めることをクローリングといいます。さらに収集したデータを解析して、必要なデータを取り出すことをスクレイピングといいます。

Pythonはネットへアクセスするライブラリが充実していて、「クローリング」や「スクレイピン」をしやすい言語になっています。

・著作権を守こと・・・無断で複製したり二次利用しない
・アクセスし過ぎて業務妨害をしないこと・・・1回アクセスしたら1秒待つ
・クローリング禁止のところからクローリングしないこと・・・HTML内に<meta name=”robots”  contet=”nanofllow”>とあれば控える

Pythonをインストール

https://creaters-you.com/
からインストールします。

自動的に自分のOSに合わせたiページが表示されます。

windowsの方は、「□Add Python 3.x to PATH」は必ずチェックを入れるようにしてください。

Macの方へPython3.6以降では、インストール後にネットワーク通信に使用するSSL証明書をインストールする必要があります。Python3.xフォルダを開き、「install Certificates.command」ファイルをダブルクリックしてください。ターミナルが自動的に起動して、証明書のインストールが実行されます。[プロセスが完了しました]と表示されたら、表示されたターミナルを終了してください。

requestsでアクセスしてみる

インターネットにアクセスする命令としては、Pythonの標準ライブラリに「urllib request」があります。しかし、もっと簡単に使える「requests」という外部ライブラリがあるので、これを使います。

ライブラリのインストール方法

Windowsではコマンドプロンプトを起動

スタートメニューを開いて、[Windowsシステムツール]→コマンドプロンプトを起動します。そして以下のpip
コマンドでインストールします。

pip install requests

macOSではターミナルを起動

[アプリケーション]フォルダの中の[ユーティリティ]フォルダにあるターミナルをクリック、起動させます。以下pip3コマンドでインストールします。

pip3 install requests

HTMLファイルを読み込むプログラム

インストールしたrequestsを使って、ネット上のHTMLファイルを読み込んで表示させてみます。練習用に簡単なWebページを作ったので、このHTMLファイルを読み込むプログラムを作ってみましょう。

練習用テストページ
https://creaters-you.com/

 

(以下のコードを書いています)

<!DOCTYPE html>
<html lang=”ja”>
<head>
<metacharset=”UTF-8″>
<metahttp-equiv=”X-UA-Compatible”content=”IE=edge”>
<metaname=”viewport”content=”width=device-width, initial-scale=1.0″>
<title>スクレイピングを学ぶ</title>
</head>
<body>
<h1>寺中晴紀のスクレイピング講座</h1>
<div id= “chap1”>
<h2>Pythonでデータをダウンロード</h2>
<ol>
<li>スクレイピングって何</li>
<li>Pythonをインストール</li>
<li>Requestsでアクセスしてみよう</li>
</ol>
</div><div id= “chap2″>
<h2>HTMLを解析する</h2>
<ol>
<li>HTMLを解析</li>
<li>ニュースの記事を取得</li>
<li>画像をダウンロード</li>
</ol>
</div>
<p><img src=”pc.png” width=”50%” height=”50%”></p>
<p><img src=”pc2.png” width=”50%” height=”50%”></p>
<p><a href=”https://creaters-you.com/index2.html”>絶対URLでリンクへとぶ</a></p>
<p><a href=”index3.html”>相対URLでリンクへとぶ</a></p>
</body>
</html>

インターネット上のWebページには、「requests.get(URL)」という命令で取得できます。ただし、取得したデータにはいろいろな情報が入っているので、そこから「.text」で文字列データを取り出します。また、日本語が文字化けしないように、「requests.encoding=response.apparent_encoding」と指定しておきます。

step/step1.py

 

Youtubeで学ぶ https://youtu.be/fhxV1UPoXKI

import requests
# Webページを取得する
url =”https://creaters-you.com/”
response = requests.get(url)
# 文字化けしないようにする
response.encoding = response.apparent_encoding
# 取得した文字列データを表示する
print(response.text)

テキストファイルに書き込む:open、close

HTMLファイルを読み込めたので、これをファイルに書き込むかたちで保存します。

step/step2.py
import requests
# Webページを取得する
url =”https://creaters-you.com/”
response = requests.get(url)
# 文字化けしないようにする
response.encoding = response.apparent_encoding
filename=”download.txt”
f=open(filename,mode=”w”)
f.write(response.text)
f.close()
実行すると、step1フォルダの中に「download.txt」というテキストファイルが作られます。この中に、取り出したデータがしるされます。

openのいろいろなモード

r 読み込み用
w 書き込み用
a 追加書き込み(書き足す)
t テキストモード

HTMLを解析する

Beautiful Soup をインストール

HTMLを簡単に解析できるライブラリがあります。それがBeautifil Soupです。外部ライブライなので、pip
コマンドでインストールします。

windowsの方

pip install beautifulsoup4

macOSの方

pip3 install beaftifulssoup4

Beautifu Soupは、bs4というパッケージに入っているので、「from bs4 import BeautifulSoup」とします。

次にそのHTMLデータ(.content)をBeautifulSoup(HTMLデータ,”html.parser”)に渡します。

step/step3.py

YouTubeで学ぶ https://youtu.be/wD_EKvzqNoo

import requests
from bs4 import BeautifulSoup
import urllib
load_url=”https://creaters-you.com/index.html”
html=requests.get(load_url)
soup=BeautifulSoup(html.content,”html.parser”)
print(soup)

実行結果

読み込んだHTMLがそのまま表示されています。ここからいろいろな要素を取り出して行きます。

タグを探して表示する

要素を取り出してみます。「soup.find(“タグ名”)」と命令します。

titleタグ、h2タグ、liタグを表示させてみます。

step/step4.py

 

import requests
from bs4 import BeautifulSoup
import urllib
load_url=”https://creaters-you.com/index.html”
html=requests.get(load_url)
soup=BeautifulSoup(html.content,”html.parser”)
print(soup.find(“title”))
print(soup.find(“h2”))
print(soup.find(“li”))

要素が3つ表示されました。ここから文字列だけを表示させます。最後に.textをつけます。

step1/step1-5.py

mport requests
from bs4 import BeautifulSoup
import urllib
load_url=”https://creaters-you.com/index.html”
html=requests.get(load_url)
soup=BeautifulSoup(html.content,”html.parser”)
print(soup.find(“title”).text)
print(soup.find(“h2”).text)
print(soup.find(“li”).text)

実行結果

全てのタグを探して表示する

.find(タグ名)で取得できるのは1つだけです。全ての要素を取得するには、.find_all(“タグ名”)を使います。そして、見つかった要素は、for文で取り出せます。

ページ全てのliタグを取り出してみます。

step1/step1-6.py

import requests
from bs4 import BeautifulSoup
import urllib
load_url=”https://creaters-you.com/index.html”
html=requests.get(load_url)
soup=BeautifulSoup(html.content,”html.parser”)
for element in soup.find_all(“li”):
print(element.text)

実行結果

idやクラスで検索範囲を絞り込む

BeutifulSoupでは、id属性やclass属性の名前を使い、範囲を搾り混んで検索することができます。

※classはPythonの予約語(最初から使い方が決められている言葉)で、そのまま使えないので、「class_」と書きます。

<!DOCTYPE html>
<html lang=”ja”>
<head>
<metacharset=”UTF-8″>
<metahttp-equiv=”X-UA-Compatible”content=”IE=edge”>
<metaname=”viewport”content=”width=device-width, initial-scale=1.0″>
<title>スクレイピングを学ぶ</title>
</head>
<body>
<h1>寺中晴紀のスクレイピング講座</h1>
<div id= “chap1”>
<h2>Pythonでデータをダウンロード</h2>
<ol>
<li>スクレイピングって何</li>
<li>Pythonをインストール</li>
<li>Requestsでアクセスしてみよう</li>
</ol>
</div><div id= “chap2”>
<h2>HTMLを解析する</h2>
<ol>
<li>HTMLを解析</li>
<li>ニュースの記事を取得</li>
<li>画像をダウンロード</li>
</ol>
</div>
<p><img src=”pc.png” width=”50%” height=”50%”></p>
<p><img src=”pc2.png” width=”50%” height=”50%”></p>
<p><a href=”https://creaters-you.com/index2.html”>絶対URLでリンクへとぶ</a></p>
<p><a href=”index3.html”>相対URLでリンクへとぶ</a></p>
</body>
</html>

div id=”chap2″の要素を取得してみます。

step1/step1-7.py

import requests
from bs4 import BeautifulSoup
import urllib
load_url=”https://creaters-you.com/index.html”
html=requests.get(load_url)
soup=BeautifulSoup(html.content,”html.parser”)
chap2=soup.find(id=”chap2″)
print(chap2)

 

id=”chap2″の要素が取得できました。

リンク一覧をファイルに書き出す

ページ内の全てのリンクを検索して、その結果をリンク一覧として、ファイルに書き出してみます。

リンクのURLは、タグの中に「href=”URL”」と書かれています。これを取り出すには、「get(属性名)」を使います。また、imgタグの「src=”URL”」も同じように「.get(属性名)」を使います。

全てのaタグ(アンカータグといって、リンクさせるためのタグです)は、

for element in soup.find_all(“a”):

で、1つずつ取り出せます。

さらにリンクはhref属性なので、

url=element.get(“href”)

と指定すれば取り出せます。

step1/step1-8.py

import requests
from bs4 import BeautifulSoup
import urllib
load_url=”https://creaters-you.com/index.html”
html=requests.get(load_url)
soup=BeautifulSoup(html.content,”html.parser”)
for element in soup.find_all(“a”):
print(element.text)
url=element.get(“href”)
print(url)

実行結果

リンクが2つ表示されました。

絶対URLのhttps://creaters-you.com/index2.htmlと相対URLのindex3.htmlです。

絶対URLはこのまま使えますが、相対URLは、絶対URLに直さないと、使えません。絶対URLに変換していきましょう。

相対URLを絶対URLに変換する

変換するには、urllibライブラリのparse.urljoinを使います。

parse.urljoin(ベースURL , 変換したい相対URL)

ベースURLはどのページから見たURLなのかのURLです。今回の場合は、https://creaters-you.com/になります。urllibをimportして、URLの変換処理を追加します。

step1/step1-9.py

import requests
from bs4 import BeautifulSoup
import urllib
load_url=”https://creaters-you.com/index.html”
html=requests.get(load_url)
soup=BeautifulSoup(html.content,”html.parser”)
for element in soup.find_all(“a”):
print(element.text)
url=element.get(“href”)
link_url=urllib.parse.urljoin(load_url , url)
print(link_url)

どちらも絶対URLで表示させることができました。

リンク一覧自動作成プログラム

さらにファイルに書き込んでいきます。保存先のファイル名を決めて、書き込みモードとして開き、検索結果が出るたびに、「.write」で書き足していきます。そのまま書き足していくと、全部繋がった1行になってしまうので、改行コード「\n」を入れていきます。

step1/step1-10.py

import requests
from bs4 import BeautifulSoup
import urllib
load_url=”https://creaters-you.com/index.html”
html=requests.get(load_url)
soup=BeautifulSoup(html.content,”html.parser”)
filename=”linklist.txt”
with open(filename , “w”) as f:
for element in soup.find_all(“a”):
url=element.get(“href”)
link_url=urllib.parse.urljoin(load_url , url)
f.write(element.text +”\n”)
f.write(link_url+”\n”)
f.write(“\n”)

実行すると、リンク一覧ファイルの「link.txt」が作られます。

 

画像を一括ダウンロードしよう

画像をダウンロードするには、画像の絶対URLが必要になります。その方法は後で解説するので、まずは用意したURLで画像をダウンロードしてみてください。

画像ファイルを1枚だけダウンロード

テストWebページのhttps://creaters-you.com/から、https://creaters-you.com/pc.pngというYRLのサンプル画像をダウンロードします。新たにstep2というフォルダと、その中にstep2-1というファイルを作ってください。

ダウンロードの方法は、requestsでインターネットからデータを取得して、ファイルに書き込むだけです。ただし、画像はバイナリーファイルなので、開くときは、mode=”wb”を指定します。

保存する時には、ファイル名が必要なので、URLからファイル名を取り出します。

https://creaters-you.com/pc.png

「/」で区切っているURLをバラバラにします。バラバラにした1番最後がファイル名です。後ろから1番目なので、[ -1 ]と表します。

step2/step2-1.py

import requests
imge_url=”https://creaters-you.com/pc.png”
imgdata=requests.get(imf_url)
filename=imge_url.split(“/”)[-1] with open(filename , mode=”wb”) as f:
f.write(img,data.content)

そうすると

pc.pngの画像がstep2のフォルダに保存されます。

ダウンロード用のフォルダを作って保存する

次は、複数の画像ファイルをまとめて、ダウンロードするプログラムを作ってみます。ダウンロード用のフォルダを作り、そこにまとめて書き出します。

パソコン上にフォルダを作ったり、そのフォルダにいろいろアクセスしたりするには、「Path」を使います。
Pathはpathlibというパッケージに入っているので、「from pathlib import Path」と指定するだけで、importできます。

フォルダ名を指定して、Pathを作ったら、「.mkdir(exist_ok=True)」と命令すると、フォルダが作られます。また、その中のファイルにアクセスするときは、「フォルダ.joinpath(“ファイル名”)」と、フォルダとファイル名をつなぐだけで、アクセスできるパス(道)が作れます。このパスに画像データを書き出せば、フォルダ内に画像ファイルが作られます。

フォルダを作る書式
フォルダ=Path(“”フォルダ名)
フォルダ.mkdir(exist_ok=True)
フォルダ内のファイルにアクセスするパスを作る書式
フォルダ.joinpath(“ファイル名”)
「download」というフォルダを作って、そこに「pc.png」という画像ファイルを保存してみます。
step2/step2-2.py
import requests
from pathlib import Path
#保存フォルダを作る
out_folder=Path(“download”)
out_folder.mkdir(exist_ok=True)
#画像ファイルを取得する
image_url=”https://creaters-you.com/pc.png”
imgdata=requests.get(image_url)
#フォルダ名にファイル名をつける
filename=image_url.sprit(“/”)[-1] out_path=out_folder.joinpath(filename)
#画像ファイルをファイルに書き出す
with open(out_path , mode=”wb”) as f:
f.write(imgdata.content)
実行すると、「step」フォルダの中に「dowload」フォルダが作られ、その中に「pc.ong」という画像ファイルが書き出されます。

すべてのimgタグの画像ファイルURLを表示する

テストWebサイト「https://creaters-you.com/」の画像ファイル一覧を表示するテストプログラムです。直接アクセスして読み込みを行うので、絶対URLに変換します。
また、そのURLの一番最後の値を取り出して、保存する画像名にして表示します。

srep2/step2-3.py

import requests
from bs4 import BeautifulSoup
import urllib
load_url=”https://creaters-you.com”
html=requests.get(load_url)
soup=BeutifulSoup(html.content,”html.parser”)
#全てのimgタグを検索し、リンクを取得する
for element in soup.find_all(“img”)
src=element.get(“src”)
#絶対URLとファイルを表示する
image_url=urllib.parse.urljoin(load_url)
filename=image_url.split(“/”)[-1] print(image_url , “>>” , filename)
実行結果

画像を一括ダウンロードするプログラム

アクセスし過ぎて相手のサーバーに負担をかけないようにするために「1回アクセスしたら、1秒待つ」time.sleep(1)というプログラムをを追加しています。

srep2/step2-4.py

import requests
from bs4 import Beautiful Soup
from pathlib import Path
import urllib
import time
load_url=”https://creaters-you.com/”
html=requests.get(load_url)
soup=BeautifulSopup(html.content,”html.parser)”
out_folder=Path(“download2”)
out_folder.mkdir(exist_ok=True)
for element in soup.find_all(“img”)
src=elenent.get(“src”)
image_url=urllib.parse.urljoin(load_url,src)
imgdata=requests.get(image_url)
filename=image_url.split(“/”)[-1] out_path=out_folder.joinpath(filename)
      with open(out_path , mode=”wb”) as f:
      f.write(imgdata.content)
      time.sleep(1)
実行すると、download2というフォルダが作られ、その中に、pc.pngとpc2.pngという画像ファイルが書き込まれます。
NO IMAGE
最新情報をチェックしよう!
>プログラミング 独学

プログラミング 独学

本当にプログラミングを学びたい人のためになるブログにしたいと思っていますので、些細なことでも気が付いたのであればご報告いただけると幸いです。

CTR IMG