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