# 5.2 儲存成CSV檔案

這隻爬蟲會去ezprice上根據指定的商品字眼搜集商品資訊, 並且將爬到的資訊儲存至csv檔案裡.

```python
import requests
import urllib.parse
import csv
import os
from bs4 import BeautifulSoup


EZPRICE_URL = 'https://ezprice.com.tw'
CSV_FILE_NAME = 'ezprice.csv'


def get_web_content(url):
    resp = requests.get(url)
    if resp.status_code != 200:
        print('Invalid url: ' + resp.url)
        return None
    else:
        return resp.text


def get_price_info(query, page):
    encoded_query = urllib.parse.quote(query)
    doms = list()
    for page in range(1, page + 1):
        url = EZPRICE_URL + '/s/%s/price/?q=%s&p=%s' % (encoded_query, encoded_query, str(page))
        result_page = get_web_content(url)
        doms.append(BeautifulSoup(result_page, 'html5lib'))
    return doms


def extract_results(dom):
    items = list()
    for div in dom.find_all('div', 'search-rst clearfix'):
        item = list()
        item.append(div.h4.a['title'])
        item.append(div.find(itemprop='price')['content'])
        if div.find('span', 'platform-name'):
            item.append(div.find('span', 'platform-name').text.strip())
        else:
            item.append('N/A')
        items.append(item)
    return items, len(items)


def show_results(items):
    for item in items:
        print(item)


def write_to_csv_file(is_first_page, items):
    with open(CSV_FILE_NAME, 'a', encoding='UTF-8', newline='') as file:
        writer = csv.writer(file)
        if is_first_page:
            writer.writerow(('Item', 'Price', 'Store'))
        for item in items:
            writer.writerow((column for column in item))


def read_from_csv_file():
    print('\nRead from csv file: ' + CSV_FILE_NAME)
    with open(CSV_FILE_NAME, 'r', encoding='UTF-8') as file:
        reader = csv.DictReader(file)
        for row in reader:
            print(row['Item'], row['Price'], row['Store'])


def main():
    query = '吉胖喵'
    page = 5
    doms = get_price_info(query, page)
    is_first_page = True
    total_item_count = 0
    for dom in doms:
        items, count = extract_results(dom)
        total_item_count += count
        show_results(items)
        write_to_csv_file(is_first_page, items)
        is_first_page = False
    print('There are %s items in %d page(s).' % (total_item_count, page))
    read_from_csv_file()
    # Uncomment this if you don't want to keep the data in csv file.
    # os.remove(CSV_FILE_NAME)


if __name__ == '__main__':
    main()
```

輸出結果:

```
['妖怪手錶【吉胖喵】頭型抱枕', '590', 'GOHAPPY']
['妖怪手錶【吉胖喵】頭型抱枕', '590', 'GOHAPPY']
['《童趣植栽》【Light+Bio】超萌妖怪苔球-吉胖喵', '448', 'myfone購物']
['妖怪手錶手機擦吊飾。吉胖喵', '199', 'GOHAPPY']
['【 日本 BANDAI 】妖怪手錶 絨毛娃娃 吉胖喵 MM651651', '638', '百利市購物中心']
['妖怪手錶 - 吉胖喵氣球', '999', 'Yahoo奇摩購物中心']
['【BANDAI】妖怪轉蛋(吉胖喵篇)', '375', 'momo富邦購物館']
['妖怪手錶 QQ吉胖喵吊飾', '148', '博客來']
['下殺-BANDAI 妖怪轉蛋 吉胖喵篇', '299', 'ibon mart']
['妖怪手錶 吉胖喵氣球', '1295', '博客來']
['妖怪手錶手機束口袋。吉胖喵', '235', 'GOHAPPY']
['妖怪手錶手機擦吊飾。吉胖喵', '199', 'GOHAPPY']
['妖怪手錶【吉胖喵】頭型暖手抱枕', '650', 'GOHAPPY']
['妖怪手錶毛絨護腕。吉胖喵', '285', 'GOHAPPY']
['妖怪手錶金屬吊飾。吉胖喵', '199', 'GOHAPPY']
['【妖怪手錶】吉胖喵疊疊樂', '1100', '全家行動購']
['妖怪手錶手機束口袋。吉胖喵', '235', 'GOHAPPY']
['妖怪手錶手機擦吊飾。吉胖喵', '199', 'GOHAPPY']
['妖怪手錶金牌吊飾。吉胖喵', '199', 'GOHAPPY']
['妖怪手錶金屬吊飾。吉胖喵', '199', 'GOHAPPY']
['【Nano Block迷你積木 】NBH-094妖怪手錶吉胖喵', '479', 'friDay購物']
['【妖怪手錶】手機擦吊飾(吉胖喵)', '199', 'momo富邦購物館']
['【迎光】超萌妖怪苔球-吉胖喵', '448', '博客來']
['ENSKY 3D 立體拼圖 KM-72 吉胖喵 透明版 日版', '370', 'Yahoo奇摩購物中心']
['妖怪手錶毛絨護腕。吉胖喵', '285', 'GOHAPPY']
['妖怪手錶手機擦吊飾。吉胖喵', '199', 'GOHAPPY']
['妖怪手錶金牌吊飾。吉胖喵', '199', 'GOHAPPY']
['【BabyTiger虎兒寶】卡通造型幼教兒童睡袋- 妖怪手錶-吉胖喵', '1088', 'GOHAPPY']
['妖怪手錶趴姿毛絨公仔。吉胖喵', '720', 'GOHAPPY']
['妖怪手錶警報器吊飾。吉胖喵', '565', 'GOHAPPY']
['妖怪手錶毛絨小公仔。吉胖喵', '540', 'GOHAPPY']
['【波克貓哈日網】妖怪手錶系列◇造型相框◇《吉胖喵》', '465', 'GOHAPPY']
['妖怪手錶毛絨公仔筆袋。吉胖喵', '450', 'GOHAPPY']
['妖怪手錶毛萬用小包。吉胖喵', '350', 'GOHAPPY']
['妖怪手錶金屬人形吊飾。吉胖喵', '199', 'GOHAPPY']
['【BabyTiger虎兒寶】卡通造型幼教兒童睡袋- 妖怪手錶-吉胖喵', '1088', 'GOHAPPY']
['妖怪手錶兒童連身雨衣。吉胖喵', '850', 'GOHAPPY']
['【妖怪手錶】錶數位收納包(吉胖喵)', '299', 'momo富邦購物館']
['妖怪手錶 - 吉胖喵3D立體小拼圖', '249', 'Yahoo奇摩購物中心']
['妖怪手錶 妖怪徽章變形 吉胖喵', '108', '博客來']
['童鞋城堡-妖怪手錶 中大童 吉胖喵造型運動鞋YW6501-藍', '890', 'ibon mart']
['妖怪手錶毛絨小公仔。吉胖喵', '540', 'GOHAPPY']
['童鞋城堡-妖怪手錶 中大童 吉胖喵造型運動鞋YW6501-藍', '890', 'GOHAPPY']
['妖怪手錶兒童連身雨衣。吉胖喵', '850', 'GOHAPPY']
['妖怪手錶趴姿毛絨公仔。吉胖喵', '720', 'GOHAPPY']
['妖怪手錶萬用收納包。吉胖喵', '530', 'GOHAPPY']
['妖怪手錶萬用收納包。吉胖喵', '530', 'GOHAPPY']
['妖怪手錶公仔吊飾零錢車票夾。吉胖喵', '450', 'GOHAPPY']
['妖怪手錶毛萬用小包。黑邊 吉胖喵', '350', 'GOHAPPY']
['妖怪手錶毛絨鑰匙套吊飾。吉胖喵', '230', 'GOHAPPY']
['妖怪手錶鑰匙套吊飾。吉胖喵', '199', 'GOHAPPY']
['妖怪手錶療癒球形吊飾。吉胖喵', '199', 'GOHAPPY']
['童鞋城堡-妖怪手錶 中童 吉胖喵運動鞋YW8844-藍', '690', 'GOHAPPY']
['妖怪手錶警報器吊飾。吉胖喵', '565', 'GOHAPPY']
['【妖怪手錶】吉胖喵與小石獅100%純棉條紋浴巾', '502', 'momo富邦購物館']
['童鞋城堡-妖怪手錶 中童 吉胖喵夾腳拖鞋YW2116-黃', '290', 'ibon mart']
['妖怪手錶兒童連身雨衣。吉胖喵', '850', '博客來']
['妖怪手錶 吉胖喵與小石獅100%純棉條紋浴巾', '590', 'Yahoo奇摩購物中心']
['妖怪手錶毛絨公仔筆袋。吉胖喵', '450', 'GOHAPPY']
['妖怪手錶毛萬用小包。黑邊 吉胖喵', '350', 'GOHAPPY']
['妖怪手錶毛絨鑰匙套吊飾。吉胖喵', '230', 'GOHAPPY']
['妖怪手錶鑰匙套吊飾。吉胖喵', '199', 'GOHAPPY']
['妖怪手錶金屬人形吊飾。吉胖喵', '199', 'GOHAPPY']
['童鞋城堡-妖怪手錶 中大童 吉胖喵電燈運動鞋YW6508-藍', '890', 'GOHAPPY']
['妖怪手錶公仔吊飾零錢車票夾。吉胖喵', '450', 'GOHAPPY']
['妖怪手錶毛萬用小包。吉胖喵', '350', 'GOHAPPY']
['妖怪手錶數位收納包。吉胖喵', '299', 'GOHAPPY']
['妖怪手錶金屬人形吊飾。吉胖喵', '199', 'GOHAPPY']
['妖怪手錶療癒球形吊飾。吉胖喵', '199', 'GOHAPPY']
['BABYTIGER 【虎兒寶】卡通造型幼教兒童睡袋- 妖怪手錶-吉胖喵', '829', 'watsons屈臣氏']
['妖怪手錶數位收納包。吉胖喵', '299', 'GOHAPPY']
['妖怪手錶金屬人形吊飾。吉胖喵', '199', 'GOHAPPY']
['【妖怪手錶】吉胖喵武士慶典單人床包二件組 3.5x6.2尺(105x186公分)', '549', 'GOHAPPY']
['【日本進口】妖怪手錶 吉胖喵 票夾零錢/收納包-黃色', '399', '博客來']
['童鞋城堡-妖怪手錶 中童 吉胖喵夾腳拖鞋YW2149-藍', '390', 'ibon mart']
['妖怪手錶兒童連身雨衣。吉胖喵', '850', 'Yahoo奇摩購物中心']
['【妖怪手錶】可愛圖騰兒童睡袋(吉胖喵喵版--藍)', '850', 'momo富邦購物館']
There are 77 items in 5 page(s).

Read from csv file: ezprice.csv
妖怪手錶【吉胖喵】頭型抱枕 590 GOHAPPY
妖怪手錶【吉胖喵】頭型抱枕 590 GOHAPPY
《童趣植栽》【Light+Bio】超萌妖怪苔球-吉胖喵 448 myfone購物
妖怪手錶手機擦吊飾。吉胖喵 199 GOHAPPY
【 日本 BANDAI 】妖怪手錶 絨毛娃娃 吉胖喵 MM651651 638 百利市購物中心
妖怪手錶 - 吉胖喵氣球 999 Yahoo奇摩購物中心
【BANDAI】妖怪轉蛋(吉胖喵篇) 375 momo富邦購物館
妖怪手錶 QQ吉胖喵吊飾 148 博客來
下殺-BANDAI 妖怪轉蛋 吉胖喵篇 299 ibon mart
妖怪手錶 吉胖喵氣球 1295 博客來
妖怪手錶手機束口袋。吉胖喵 235 GOHAPPY
妖怪手錶手機擦吊飾。吉胖喵 199 GOHAPPY
妖怪手錶【吉胖喵】頭型暖手抱枕 650 GOHAPPY
妖怪手錶毛絨護腕。吉胖喵 285 GOHAPPY
妖怪手錶金屬吊飾。吉胖喵 199 GOHAPPY
【妖怪手錶】吉胖喵疊疊樂 1100 全家行動購
妖怪手錶手機束口袋。吉胖喵 235 GOHAPPY
妖怪手錶手機擦吊飾。吉胖喵 199 GOHAPPY
妖怪手錶金牌吊飾。吉胖喵 199 GOHAPPY
妖怪手錶金屬吊飾。吉胖喵 199 GOHAPPY
【Nano Block迷你積木 】NBH-094妖怪手錶吉胖喵 479 friDay購物
【妖怪手錶】手機擦吊飾(吉胖喵) 199 momo富邦購物館
【迎光】超萌妖怪苔球-吉胖喵 448 博客來
ENSKY 3D 立體拼圖 KM-72 吉胖喵 透明版 日版 370 Yahoo奇摩購物中心
妖怪手錶毛絨護腕。吉胖喵 285 GOHAPPY
妖怪手錶手機擦吊飾。吉胖喵 199 GOHAPPY
妖怪手錶金牌吊飾。吉胖喵 199 GOHAPPY
【BabyTiger虎兒寶】卡通造型幼教兒童睡袋- 妖怪手錶-吉胖喵 1088 GOHAPPY
妖怪手錶趴姿毛絨公仔。吉胖喵 720 GOHAPPY
妖怪手錶警報器吊飾。吉胖喵 565 GOHAPPY
妖怪手錶毛絨小公仔。吉胖喵 540 GOHAPPY
【波克貓哈日網】妖怪手錶系列◇造型相框◇《吉胖喵》 465 GOHAPPY
妖怪手錶毛絨公仔筆袋。吉胖喵 450 GOHAPPY
妖怪手錶毛萬用小包。吉胖喵 350 GOHAPPY
妖怪手錶金屬人形吊飾。吉胖喵 199 GOHAPPY
【BabyTiger虎兒寶】卡通造型幼教兒童睡袋- 妖怪手錶-吉胖喵 1088 GOHAPPY
妖怪手錶兒童連身雨衣。吉胖喵 850 GOHAPPY
【妖怪手錶】錶數位收納包(吉胖喵) 299 momo富邦購物館
妖怪手錶 - 吉胖喵3D立體小拼圖 249 Yahoo奇摩購物中心
妖怪手錶 妖怪徽章變形 吉胖喵 108 博客來
童鞋城堡-妖怪手錶 中大童 吉胖喵造型運動鞋YW6501-藍 890 ibon mart
妖怪手錶毛絨小公仔。吉胖喵 540 GOHAPPY
童鞋城堡-妖怪手錶 中大童 吉胖喵造型運動鞋YW6501-藍 890 GOHAPPY
妖怪手錶兒童連身雨衣。吉胖喵 850 GOHAPPY
妖怪手錶趴姿毛絨公仔。吉胖喵 720 GOHAPPY
妖怪手錶萬用收納包。吉胖喵 530 GOHAPPY
妖怪手錶萬用收納包。吉胖喵 530 GOHAPPY
妖怪手錶公仔吊飾零錢車票夾。吉胖喵 450 GOHAPPY
妖怪手錶毛萬用小包。黑邊 吉胖喵 350 GOHAPPY
妖怪手錶毛絨鑰匙套吊飾。吉胖喵 230 GOHAPPY
妖怪手錶鑰匙套吊飾。吉胖喵 199 GOHAPPY
妖怪手錶療癒球形吊飾。吉胖喵 199 GOHAPPY
童鞋城堡-妖怪手錶 中童 吉胖喵運動鞋YW8844-藍 690 GOHAPPY
妖怪手錶警報器吊飾。吉胖喵 565 GOHAPPY
【妖怪手錶】吉胖喵與小石獅100%純棉條紋浴巾 502 momo富邦購物館
童鞋城堡-妖怪手錶 中童 吉胖喵夾腳拖鞋YW2116-黃 290 ibon mart
妖怪手錶兒童連身雨衣。吉胖喵 850 博客來
妖怪手錶 吉胖喵與小石獅100%純棉條紋浴巾 590 Yahoo奇摩購物中心
妖怪手錶毛絨公仔筆袋。吉胖喵 450 GOHAPPY
妖怪手錶毛萬用小包。黑邊 吉胖喵 350 GOHAPPY
妖怪手錶毛絨鑰匙套吊飾。吉胖喵 230 GOHAPPY
妖怪手錶鑰匙套吊飾。吉胖喵 199 GOHAPPY
妖怪手錶金屬人形吊飾。吉胖喵 199 GOHAPPY
童鞋城堡-妖怪手錶 中大童 吉胖喵電燈運動鞋YW6508-藍 890 GOHAPPY
妖怪手錶公仔吊飾零錢車票夾。吉胖喵 450 GOHAPPY
妖怪手錶毛萬用小包。吉胖喵 350 GOHAPPY
妖怪手錶數位收納包。吉胖喵 299 GOHAPPY
妖怪手錶金屬人形吊飾。吉胖喵 199 GOHAPPY
妖怪手錶療癒球形吊飾。吉胖喵 199 GOHAPPY
BABYTIGER 【虎兒寶】卡通造型幼教兒童睡袋- 妖怪手錶-吉胖喵 829 watsons屈臣氏
妖怪手錶數位收納包。吉胖喵 299 GOHAPPY
妖怪手錶金屬人形吊飾。吉胖喵 199 GOHAPPY
【妖怪手錶】吉胖喵武士慶典單人床包二件組 3.5x6.2尺(105x186公分) 549 GOHAPPY
【日本進口】妖怪手錶 吉胖喵 票夾零錢/收納包-黃色 399 博客來
童鞋城堡-妖怪手錶 中童 吉胖喵夾腳拖鞋YW2149-藍 390 ibon mart
妖怪手錶兒童連身雨衣。吉胖喵 850 Yahoo奇摩購物中心
【妖怪手錶】可愛圖騰兒童睡袋(吉胖喵喵版--藍) 850 momo富邦購物館

Process finished with exit code 0
```

CSV檔案內容:

```
Item,Price,Store
妖怪手錶【吉胖喵】頭型抱枕,590,GOHAPPY
妖怪手錶【吉胖喵】頭型抱枕,590,GOHAPPY
《童趣植栽》【Light+Bio】超萌妖怪苔球-吉胖喵,448,myfone購物
妖怪手錶手機擦吊飾。吉胖喵,199,GOHAPPY
【 日本 BANDAI 】妖怪手錶 絨毛娃娃 吉胖喵 MM651651,638,百利市購物中心
妖怪手錶 - 吉胖喵氣球,999,Yahoo奇摩購物中心
【BANDAI】妖怪轉蛋(吉胖喵篇),375,momo富邦購物館
妖怪手錶 QQ吉胖喵吊飾,148,博客來
下殺-BANDAI 妖怪轉蛋 吉胖喵篇,299,ibon mart
妖怪手錶 吉胖喵氣球,1295,博客來
妖怪手錶手機束口袋。吉胖喵,235,GOHAPPY
妖怪手錶手機擦吊飾。吉胖喵,199,GOHAPPY
妖怪手錶【吉胖喵】頭型暖手抱枕,650,GOHAPPY
妖怪手錶毛絨護腕。吉胖喵,285,GOHAPPY
妖怪手錶金屬吊飾。吉胖喵,199,GOHAPPY
【妖怪手錶】吉胖喵疊疊樂,1100,全家行動購
妖怪手錶手機束口袋。吉胖喵,235,GOHAPPY
妖怪手錶手機擦吊飾。吉胖喵,199,GOHAPPY
妖怪手錶金牌吊飾。吉胖喵,199,GOHAPPY
妖怪手錶金屬吊飾。吉胖喵,199,GOHAPPY
【Nano Block迷你積木 】NBH-094妖怪手錶吉胖喵,479,friDay購物
【妖怪手錶】手機擦吊飾(吉胖喵),199,momo富邦購物館
【迎光】超萌妖怪苔球-吉胖喵,448,博客來
ENSKY 3D 立體拼圖 KM-72 吉胖喵 透明版 日版,370,Yahoo奇摩購物中心
妖怪手錶毛絨護腕。吉胖喵,285,GOHAPPY
妖怪手錶手機擦吊飾。吉胖喵,199,GOHAPPY
妖怪手錶金牌吊飾。吉胖喵,199,GOHAPPY
【BabyTiger虎兒寶】卡通造型幼教兒童睡袋- 妖怪手錶-吉胖喵,1088,GOHAPPY
妖怪手錶趴姿毛絨公仔。吉胖喵,720,GOHAPPY
妖怪手錶警報器吊飾。吉胖喵,565,GOHAPPY
妖怪手錶毛絨小公仔。吉胖喵,540,GOHAPPY
【波克貓哈日網】妖怪手錶系列◇造型相框◇《吉胖喵》,465,GOHAPPY
妖怪手錶毛絨公仔筆袋。吉胖喵,450,GOHAPPY
妖怪手錶毛萬用小包。吉胖喵,350,GOHAPPY
妖怪手錶金屬人形吊飾。吉胖喵,199,GOHAPPY
【BabyTiger虎兒寶】卡通造型幼教兒童睡袋- 妖怪手錶-吉胖喵,1088,GOHAPPY
妖怪手錶兒童連身雨衣。吉胖喵,850,GOHAPPY
【妖怪手錶】錶數位收納包(吉胖喵),299,momo富邦購物館
妖怪手錶 - 吉胖喵3D立體小拼圖,249,Yahoo奇摩購物中心
妖怪手錶 妖怪徽章變形 吉胖喵,108,博客來
童鞋城堡-妖怪手錶 中大童 吉胖喵造型運動鞋YW6501-藍,890,ibon mart
妖怪手錶毛絨小公仔。吉胖喵,540,GOHAPPY
童鞋城堡-妖怪手錶 中大童 吉胖喵造型運動鞋YW6501-藍,890,GOHAPPY
妖怪手錶兒童連身雨衣。吉胖喵,850,GOHAPPY
妖怪手錶趴姿毛絨公仔。吉胖喵,720,GOHAPPY
妖怪手錶萬用收納包。吉胖喵,530,GOHAPPY
妖怪手錶萬用收納包。吉胖喵,530,GOHAPPY
妖怪手錶公仔吊飾零錢車票夾。吉胖喵,450,GOHAPPY
妖怪手錶毛萬用小包。黑邊 吉胖喵,350,GOHAPPY
妖怪手錶毛絨鑰匙套吊飾。吉胖喵,230,GOHAPPY
妖怪手錶鑰匙套吊飾。吉胖喵,199,GOHAPPY
妖怪手錶療癒球形吊飾。吉胖喵,199,GOHAPPY
童鞋城堡-妖怪手錶 中童 吉胖喵運動鞋YW8844-藍,690,GOHAPPY
妖怪手錶警報器吊飾。吉胖喵,565,GOHAPPY
【妖怪手錶】吉胖喵與小石獅100%純棉條紋浴巾,502,momo富邦購物館
童鞋城堡-妖怪手錶 中童 吉胖喵夾腳拖鞋YW2116-黃,290,ibon mart
妖怪手錶兒童連身雨衣。吉胖喵,850,博客來
妖怪手錶 吉胖喵與小石獅100%純棉條紋浴巾,590,Yahoo奇摩購物中心
妖怪手錶毛絨公仔筆袋。吉胖喵,450,GOHAPPY
妖怪手錶毛萬用小包。黑邊 吉胖喵,350,GOHAPPY
妖怪手錶毛絨鑰匙套吊飾。吉胖喵,230,GOHAPPY
妖怪手錶鑰匙套吊飾。吉胖喵,199,GOHAPPY
妖怪手錶金屬人形吊飾。吉胖喵,199,GOHAPPY
童鞋城堡-妖怪手錶 中大童 吉胖喵電燈運動鞋YW6508-藍,890,GOHAPPY
妖怪手錶公仔吊飾零錢車票夾。吉胖喵,450,GOHAPPY
妖怪手錶毛萬用小包。吉胖喵,350,GOHAPPY
妖怪手錶數位收納包。吉胖喵,299,GOHAPPY
妖怪手錶金屬人形吊飾。吉胖喵,199,GOHAPPY
妖怪手錶療癒球形吊飾。吉胖喵,199,GOHAPPY
BABYTIGER 【虎兒寶】卡通造型幼教兒童睡袋- 妖怪手錶-吉胖喵,829,watsons屈臣氏
妖怪手錶數位收納包。吉胖喵,299,GOHAPPY
妖怪手錶金屬人形吊飾。吉胖喵,199,GOHAPPY
【妖怪手錶】吉胖喵武士慶典單人床包二件組 3.5x6.2尺(105x186公分),549,GOHAPPY
【日本進口】妖怪手錶 吉胖喵 票夾零錢/收納包-黃色,399,博客來
童鞋城堡-妖怪手錶 中童 吉胖喵夾腳拖鞋YW2149-藍,390,ibon mart
妖怪手錶兒童連身雨衣。吉胖喵,850,Yahoo奇摩購物中心
【妖怪手錶】可愛圖騰兒童睡袋(吉胖喵喵版--藍),850,momo富邦購物館
```

原始碼[點我](https://github.com/yotsuba1022/web-crawler-practice/blob/master/ch5/ezprice_csv.py)
