

アメブロのランキングをカテゴリー分けして、順位とタイトルをページが無くなるまでスクレイピングしたいのですが、エクセル出力がうまくいきません。  
初心者で色々と間違っているのは自覚してますがご教授ください。

[code]

    options = Options()
    options.add_argument('--headless')
    
    # ChromeのWebDriverオブジェクトを作成(ヘッドレスモードの場合)
    # ノーヘッドレスの場合は引数なしで実行する
    browser = webdriver.Chrome(chrome_options=options)
    url = "https://blogger.ameba.jp/genres/t_variety/blogs/ranking"
    browser.get(url)
    time.sleep(2)
    
    def getTitle():
    title = browser.find_elements_by_tag_name("h3")
    rank = browser.find_elements_by_class_name("c-iconRank__rank")
    #Loop
    
    for titles, ranks in zip(title,rank):
    
    el = ranks.text
    el2 = titles.text
    #print(el)
    #print(el2)
    #print("=====================================")
    global df
    df = pd.DataFrame(columns=['順位','ブログ名'])
    df_add = pd.Series([[el, el2]])
    df = df.append(df_add, ignore_index = True)
    #print(df)
    
    def next_page():
    # 次のページに移動する
      btn = browser.find_element_by_css_selector('li.c-pager__item--next > a')
      btn.click()
      time.sleep(1)
    
    def last_page():
      btn = browser.find_element_by_css_selector('li.c-pager__item--next > a')
      if not btn:
        browser.quit()
    
    def start():
      end = 2
      try:
        for page in range(end):
          getTitle()
      next_page()
      last_page()
    finally:
      browser.quit()
    
    # 次のページが無くなるまで
    """def start():
      while True:"""
    
    start()
    
    df.to_excel('test.xlsx', sheet_name='new_sheet_name', index=False)
    
[/code]


CC BY-SA 4.0
2019-04-08T14:25:01.750
54024
2022-12-17T18:00:35.043
2020-04-06T06:28:49.710
3060
14308
question
python python3 web-scraping selenium
スクレイピング結果をエクセルに出力したい


一番の原因は `df` 関連の処理が色々と間違っていたことです。  
特に `pd.Series()` のパラメータ指定方法ですね。以下になります。

[code]

    df_add = pd.Series([el, el2], index=df.columns)
    
[/code]

修正箇所をまとめると以下のようになります。

  * 提示されたソースに import が無いので追加
  * `chrome_options=` は古いので `options=` に変更
  * `getTitle()` と `start()` の中身のインデントがおかしいので修正
  * `df` の定義と初期化はグローバルに行うように移動
  * `global df` を for ループの中ではなく、`getTitle()` の先頭に移動
  * 上記 `pd.Series()` のパラメータ指定方法修正
  * `next_page()` と `last_page()` は統合して１つにし、戻り値で次ページ有無(ループ継続か否か)を通知

修正結果を以下に示します。

[code]

    import pandas as pd
    import time
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    options.add_argument('--headless')
    
    # ChromeのWebDriverオブジェクトを作成(ヘッドレスモードの場合)
    # ノーヘッドレスの場合は引数なしで実行する
    browser = webdriver.Chrome(options=options)
    url = "https://blogger.ameba.jp/genres/t_variety/blogs/ranking"
    browser.get(url)
    time.sleep(2)
    df = pd.DataFrame(columns=['順位','ブログ名'])
    
    def getTitle():
      global df
      title = browser.find_elements_by_tag_name("h3")
      rank = browser.find_elements_by_class_name("c-iconRank__rank")
      #Loop
      for titles, ranks in zip(title,rank):
        el = ranks.text
        el2 = titles.text
        #print(el)
        #print(el2)
        #print("=====================================")
        df_add = pd.Series([el, el2], index=df.columns)
        df = df.append(df_add, ignore_index=True)
    
    def next_page():
    # 次のページに移動する
      btn = browser.find_element_by_css_selector('li.c-pager__item--next > a')
      if not btn:
        return False
      btn.click()
      time.sleep(1)
      return True
    
    def start():
      end = 2
      exists = False
      try:
        for page in range(end):
          getTitle()
          exists = next_page()
          if not exists:
            break
      finally:
        browser.quit()
    
    start()
    
    #print(df)
    df.to_excel('test.xlsx', sheet_name='new_sheet_name', index=False)
    
[/code]


CC BY-SA 4.0
2019-04-10T12:00:24.943
54068
2019-04-10T12:00:24.943
26370
54024
answer