Pythonでやる奴

Python出来る→機械学習も出来る→価値UPで年収UPでやりがいUP→いつかは田舎暮らししたい男のブログ

メルカリをスクレイピングした結果をcsvファイルに書き込む

前回の続きです。 pypython.hatenablog.com

所々コードを変えていますが、メインはcsvに書き込む際の データの二次元配列格納、それを受けてのcsvへの書き込みです。

from selenium import webdriver
import csv

# 件数表示用
count = 0
# 検索結果格納
result = []


def main():
    # chromeDriverの位置
    driver = webdriver.Chrome('/usr/local/bin/chromeDriver')

    set_search_conditions(driver)
    r = get_item(driver)
    # csv への書込み
    writer_csv(r)
    driver.close()


def set_search_conditions(driver):
    # macbook pro を5万〜20万かつ販売中のものを検索条件としている。
    driver.get('https://www.mercari.com/jp/'
               'search/?sort_order=&keyword=macbook+pro'
               '&category_root=7&category_child=&brand_name='
               '&brand_id=&size_group='
               '&price_min=50000&price_max=200000&status_on_sale=1')


def get_item(driver):
    """
    検索結果を取得し、二次元配列のリストで返す
    """
    global result
    global count
    search_limit = 100

    items = driver.find_elements_by_class_name('items-box')
    for item in items:
        if count == 0:
            # 最初にヘッダを用意する
            result.append(['No', 'Link', 'Title', 'ImageLink', 'Price'])

        result.append([count + 1,  # No
                       # Link
                       item.find_element_by_tag_name('a').get_attribute('href'),  
                       # Title
                       item.find_element_by_tag_name('h3').text,  
                       # ImageLink
                       item.find_element_by_tag_name('img').get_attribute('data-src'),  
                       # Price
                       item.find_element_by_class_name('items-box-price').text])  

        count += 1
        if count == search_limit:
            break

    # やりすぎ注意
    if count == search_limit:
        return result

    # 次のページがあれば処理を繰り返す
    next_page = driver.find_element_by_class_name('pager-next')
    if next_page.is_displayed() is True:
        next_page.find_element_by_tag_name('a').click()
        get_item(driver)

    return result


def writer_csv(data):
    f = open('result.csv', 'w')
    w = csv.writer(f)
    w.writerows(data)
    f.close()


if __name__ == '__main__':
    main()

csvはこのようになりました。上手くいきました。 f:id:ring-star4610:20180728065958p:plain


最初、DictWriter、writeheaderを使う方法を前提としていたのだが、(参考にしているサイトがそう書いていたため) ヘッダ部も二次元配列に落とし込むことで、より短いコードで書けた。これがベストなのかは分からないが・・・。 また、データを2次元配列に書き込む方法が最初分からず苦労したが、対話モードで試していくとあっさり解決した。対話モードはヘルプも簡単に出せるし、今後積極的に使っていこう思う。