Requestsを使ってみた

HTTPリクエストを簡単にできるRequestsを使ってみました。

公式ページによると、pythonに標準ではいっているurllibモジュールに比べて、APIの使いやすさが半端ないそうです。

今回はRequestsを使ってWikipediaのページをダウンロードして、その中身をファイルに書き込んでみます。

 

環境

関連リンク

Documentation

urllibを使ってWikipediaの記事をダウンロードする。 - どん底から這い上がるまでの記録

BeautifulSoupを使ってWikipediaのテキストを抽出する - どん底から這い上がるまでの記録

pythonの出力文いろいろまとめてみる。 - どん底から這い上がるまでの記録

Wikipediaのページをダウンロードする

まずは必要なモジュールをインポート。

import requests

入っていない場合は、pipでインストールします。

pip install requests

モジュールをインポートしたら、リクエストを生成してウェブページを取得します。今回はWikipedia織田信長の記事をダウンロードします。

url = "https://ja.wikipedia.org/wiki/織田信長"
response = requests.get(url)

取得したいウェブページのURLをget()に渡すだけです。

変数responseはResponseオブジェクトになっていて、レスポンスのヘッダーやウェブページの中身などの情報があります。

print(response)
# <Response [200]>
print(response.status_code)
# 200
  • ヘッダーの確認

辞書形式になっています。

print(response.headers)
  • ウェブページのソースを取得
html = response.text

htmlにはHTML形式の文字列が入っています。

BeautifulSoupを使って、htmlに含まれる<p></p>で囲まれた文字列を抽出してみます。

コードにすると、下のようになります。

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "lxml")
p_tags = soup.find_all("p")

 

p_tagsにはhtmlに含まれる<p></p>(を含む)で囲まれた文字列が入っています。

print(p_tags[0])
"""<p><b>織田 信長</b>(おだ のぶなが)は、<a href="/wiki/%E6%88%A6%E5%9B%BD%E6%99%82%E4%BB%A3_(%E6%97%A5%E6%9C%AC)" title="戦国時代 (日本)">戦国時代</a>から<a href="/wiki/%E5%AE%89%E5%9C%9F%E6%A1%83%E5%B1%B1%E6%99%82%E4%BB%A3" title="安土桃山時代">安土桃山時代</a>にかけての<a href="/wiki/%E6%AD%A6%E5%B0%86" title="武将">武将</a>・<a href="/wiki/%E6%88%A6%E5%9B%BD%E5%A4%A7%E5%90%8D" title="戦国大名">戦国大名</a>。<b><a href="/wiki/%E4%B8%89%E8%8B%B1%E5%82%91" title="三英傑">三英傑</a></b>の一人。
</p>"""

 

ここから、タグなどを取り除いて本文だけを抽出するには、.textでできます。

print(p_tags[0].text)
# '織田 信長(おだ のぶなが)は、戦国時代から安土桃山時代にかけての武将・戦国大名。三英傑の一人。\n'

 

最後に、print()を使って、<p></p>で囲まれた文字列をファイルに書き込んでみます。

import codecs
corpus = []
for p_tag in soup.find_all('p'):
    corpus.append(p_tag.text.strip())

print(*corpus, sep="\n", file=codecs.open("nobunaga.txt", 'w', 'utf-8'))

corpusというリストを用意して、その中に文字列を加えていきます。

最後に、print()を使って改行区切りで、ファイルにリストの中身を書き込んでいます。

ソースコード

import codecs
import requests
from bs4 import BeautifulSoup


url = "https://ja.wikipedia.org/wiki/織田信長"
# 指定したページの情報を取得
response = requests.get(url)
# HTMLのフォーマットに変換
html = response.text
soup = BeautifulSoup(html, "lxml")
# pタグで囲まれた部分を抽出
p_tags = soup.find_all("p")

corpus = []
for p_tag in soup.find_all('p'):
    corpus.append(p_tag.text.strip())
# テキストファイルに書き込む
print(*corpus, sep="\n", file=codecs.open("nobunaga.txt", 'w', 'utf-8'))