Kernel: Python 3
Yahoo知恵袋のスクレイピングのPythonサンプルプログラム
seleniumをつかったyahoo知恵袋のスクレイピングのサンプルプログラムです。
質問の検索結果まで出力できます。
出力結果は、csvファイルに書き出します。
参考にしたコード
【Python×Selenium】超簡単にWebサイトをスクレイピングしてみる
https://miyanetdev.com/archives/327
In [ ]:
from selenium import webdriver from time import sleep import urllib import re import pandas as pd PAGE_LIMIT = 20 #ページ遷移の最大の回数 SEARCH_QUERY = "プログラミング" SQRAPING_URL = "https://chiebukuro.yahoo.co.jp/" #出力結果を格納数csvファイル csv_file_name = SEARCH_QUERY + ".csv" #ドライバーを設定する #linuxなどGUIがない環境で動かす場合は、ヘッドレスモードを入れておく #options = webdriver.ChromeOptions() #options.add_argument('--headless') #driver = webdriver.Chrome('./chromedriver', options) driver = webdriver.Chrome('./chromedriver') #知恵袋ページを読み込む driver.get(SQRAPING_URL)
In [ ]:
#該当ページを解析する def analysis_action(): elems = driver.find_elements_by_xpath('//*[@id="sr"]/ul/li[*]') # 取得した要素を1つずつ表示 out_puts = [] if(len(elems) == 0): print("ページは存在しないよ〜") else: for elem in elems: out_dic ={} out_dic['query_key'] = SEARCH_QUERY out_dic['rs_title'] = elem.find_elements_by_xpath('h3/a')[0].text out_dic['rs_link'] = elem.find_elements_by_xpath('h3/a')[0].get_attribute('href') out_dic['rs_summary'] = elem.find_elements_by_xpath('p[1]')[0].text #print(out_dic) out_puts.append(out_dic) #print("*" * 60) return out_puts
In [ ]:
def next_page_action(): """ 現在のページから次のページを読み込むアクションを実行する """ rtn = False #次へボタンのクリック elems = driver.find_elements_by_xpath('//*[@id="pg_low"]/div/a[*]') #現在のページ print("ページ遷移前のurl:") print(driver.current_url) if(len(elems) == 0): print("次のページは存在しないよ〜") else: for elem in elems: #print(elem.text) if(elem.text != "次へ"): continue url = elem.get_attribute('href') driver.get(url) rtn = True break return rtn
In [ ]:
# 最初の検索を実行する search_box = driver.find_element_by_css_selector('input.txtKeyword') search_box.send_keys(SEARCH_QUERY) search_button_container = driver.find_element_by_css_selector('p.btnSearch') search_button = search_button_container.find_element_by_css_selector('input') search_button.click() sleep(2)
In [ ]:
#知恵袋の検索結果の一覧をpandasに格納してcsvに書き出す #csvには、途中で止まっても良いように、1ページ終わったら書き出すようにしている d = analysis_action() df=pd.DataFrame(d) df.to_csv(csv_file_name, encoding="utf_8_sig") analysis_list = [] analysis_list.extend(d) for page in range(PAGE_LIMIT): print("ページ %dを実行中" % page) sleep(5) #次のページに遷移する rtn = next_page_action() if(rtn == False): break #知恵袋の質問リストを格納する d = analysis_action() if(len(d) > 0): analysis_list.extend(d) df=pd.DataFrame(analysis_list) df.to_csv(csv_file_name, encoding="utf_8_sig") driver.close() driver.quit()
In [ ]: