100日後にエンジニアになるキミ - 73日目 - プログラミング - スクレイピングについて4

昨日までのはこちら

[100日後にエンジニアになるキミ - 70日目 - プログラミング - スクレイピングについて](https://qiita.com/otupy/items/f53e2e7d16adf80b5acf)

[100日後にエンジニアになるキミ - 66日目 - プログラミング - 自然言語処理について](https://qiita.com/otupy/items/5828ac7450c5ba8d6931)

[100日後にエンジニアになるキミ - 63日目 - プログラミング - 確率について1](https://qiita.com/otupy/items/0196897ae4d2134794fa)

[100日後にエンジニアになるキミ - 59日目 - プログラミング - アルゴリズムについて](https://qiita.com/otupy/items/f1a5e81633b868f3b5ed)

[100日後にエンジニアになるキミ - 53日目 - Git - Gitについて](https://qiita.com/otupy/items/0abaad82a7f3fea73f1f)

[100日後にエンジニアになるキミ - 42日目 - クラウド - クラウドサービスについて](https://qiita.com/otupy/items/d1765f1541a104ed6133)

[100日後にエンジニアになるキミ - 36日目 - データベース - データベースについて](https://qiita.com/otupy/items/7af17635d576677606dc)

[100日後にエンジニアになるキミ - 24日目 - Python - Python言語の基礎1](https://qiita.com/otupy/items/6d1e5453f530e07b7aec)

[100日後にエンジニアになるキミ - 18日目 - Javascript - JavaScriptの基礎1](https://qiita.com/otupy/items/2f71d5f9c754b29d9555)

[100日後にエンジニアになるキミ - 14日目 - CSS - CSSの基礎1](https://qiita.com/otupy/items/61a97863f6df14171994)

[100日後にエンジニアになるキミ - 6日目 - HTML - HTMLの基礎1](https://qiita.com/otupy/items/cd2315dcb38671cfded0)

今回もスクレイピングの続きです。

前回までで、リクエストと構文解析までは終わっています。
今回は取得したデータを保存する方法です。

## 取得した情報の保存

`スクレイピング`は1つのURLで終わらないことが多いため
リスト型などに取得した情報を格納しておき、適宜ファイルやデータベースに出力することでデータを保存できます。

```python
import requests
from bs4 import BeautifulSoup

url = 'アクセスURL'
res = requests.get(url)
soup = BeautifulSoup(res.content, "html.parser")

# 空のリストを用意
result_list = []

# a タグを全て取得する
a_tags = soup.find_all('a')
for a in a_tags[0:10]:
    # aタグのhrefをリストに格納する
    result_list.append(a.get('href'))

print(result_list)
```
['http://www.otupy.com', '/otu/', '/business/', '/global/', '/news/', '/python/', '/visits/', '/recruit/', '/vision/']

リストに格納したものをファイル化するのは次のコードで行えます。

```python
with open('ファイルパス','w') as _w:
    for row in result_list:
        _w.write('\t'.join(row))
```

### ファイルのダウンロード方法

スクレイピングで取得できるのはテキスト情報だけではありません。
リクエスト先がファイルの場合はファイルを取得することができます。

ファイルのダウンロードは次のようなコードで実現できます。

```python
import requests
import os

url = 'ファイルのURL'

# URLからファイル名を抜き出す
file_name = os.path.basename(url)
print(file_name)

# 対象URLにストリーミングアクセスする
res = requests.get(url, stream=True)
if res.status_code == 200:
    print('file download start {0}'.format(file_name))
    # バイトコードでファイル書き込みを行う
    
    with open(file_name, 'wb') as file:
        # chunk_sizeごとにファイル書き込みを進める
        for chunk in res.iter_content(chunk_size=1024):
            file.write(chunk)
    print('file download end   {0}'.format(file_name))
```

ファイルとして保存するには一度アクセスできるかを確かめた後に
レスポンスをファイルとして書き込みします。

`res.iter_content(chunk_size=チャンクサイズ)`で少しづつ書き込みをしていきます。

## URLエンコード

URLには日本語などの特殊な文字は使えません。
日本語検索時のURLなどで日本語をURLに使いたい場合は
文字列を特定のコード（記号や英数字の羅列）に変換する必要があります。

日本語からURLに使える文字列にすることを`URLエンコード`と言います。

逆に`URLエンコード`されて読めなくなった文字列を、再び読める状態に変換することを
`URLデコード`と言います。

pythonでは`urllib`ライブラリを用います。

**URLエンコード**
`urllib.parse.quote('対象文字列')`

**デコード**
`urllib.parse.unquote('対象文字列')`

```python
import urllib.parse

# URLエンコード
st = '乙py'
s_quote = urllib.parse.quote(st)
print(s_quote)

## デコード
d_quote = urllib.parse.unquote('%E4%B9%99py')
print(d_quote)
```
%E4%B9%99py
乙py


## まとめ

スクレイピングに関して、補足的な知識を載せています。
少量なのですぐにためせると思います。

昨日までの分を復習しておきましょう。

君がエンジニアになるまであと27日

## 作者の情報
乙pyのHP：
http://www.otupy.net/

Youtube：
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter：
https://twitter.com/otupython