Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

Python Scrapingに挑戦1

概要

pythonのscrapingに挑戦

参考書籍

urllib.requestを使ってみる

  • 画像を保存する
import urllib.request

# URLと保存パスを指定
url = "http://uta.pw/shodou/img/28/214.png"
savename = "test2.png"

# ダウンロード
mem = urllib.request.urlopen(url).read()

# ファイルへ保存 withを使うと自動で、fileをcloseしてくれる。
with open(savename, mode="wb") as f:
    f.write(mem)
    print("保存しました")
  • データを取得する
import urllib.request
import urllib.parse

API = "http://api.aoikujira.com/zip/xml/get.php"

values = {
    'fmt': 'xml',
    'zn': '1500042'
}
# パラメーターをURLエンコードする。これは何気に重要
params = urllib.parse.urlencode(values)

# リクエスト用のURLを生成。?はGETメソッドかな。複数を指定の場合は、&を使う
url = API + "?" + params
print("url=", url)

# ダウンロード
data = urllib.request.urlopen(url).read()
text = data.decode("utf-8")
print(text)

beautifulsoupを使ってみる。

便利そうやなぁ!

from bs4 import BeautifulSoup

# 解析したいHTML
html = """
    <html><body>
    <h1 id="title">スクレイピングとは?</h1>
    <p id="body">webページを解析すること。</p>
    <p>任意の箇所を抽出すること。</p>
    <ul>
        <li><a href="http://uta.pw">uta</a></li>
        <li><a href="http://oto.chu.jp">oto</a></li>
    </ul>
    <body></html>
    """

# htmlを解析する
soup = BeautifulSoup(html, 'html.parser')

# 任意の部分を抽出する
h1 = soup.html.body.h1
p1 = soup.html.body.p
p2 = p1.next_sibling.next_sibling

# idで抽出する。
title = soup.find(id="title")
body = soup.find(id="body")

# find_all(メソッドで取り出す。この例では、<a>のものをまとめてゲットしている。
links = soup.find_all("a")

# 要素をforで表示させる
for a in links:
    href = a.attrs['href']
    text = a.string
    print(text, ">", href)

# 要素のテキストを表示する
print("h1 = " + h1.string)
print("p = " + p1.string)
print("p = " + p2.string)
print("#title=" + title.string)
print("#body=" + body.string)

urlopen()とBeautifulSoupの組み合わせ

うーん、便利!

from bs4 import BeautifulSoup
import urllib.request as req

url = "http://api.aoikujira.com/zip/xml/1500042"

# urlopen()でデータを取得
req = req.urlopen(url)

# BeautifulSoupで解析
soup = BeautifulSoup(req, "html.parser")

# 任意のデータを抽出
ken = soup.find("ken").string
shi = soup.find("shi").string
cho = soup.find("cho").string
print(ken, shi, cho)

CSSセレクタを使う

from bs4 import BeautifulSoup

# 解析したいHTML
html = """
    <html><body>
    <div id="meigen">
    <h1 id="title">トルストイ名言</h1>
    <ul class="items">
        <li>汝の心に教えよ、心に学ぶな</li>
        <li>謙虚な人は誰からも好かれる</li>
        <li>強い人間は、いつも気取らない</li>
    </ul>
    </div>
    <body></html>
    """

# htmlを解析する
soup = BeautifulSoup(html, 'html.parser')

# 任意の部分を抽出する
h1 = soup.select_one("div#meigen > h1").string
print("h1 = ", h1)

li_list = soup.select("div#meigen > ul.items > li")
for li in li_list:
    print("li = ", li.string)

これで一通り、データの取得は可能か!