LoginSignup
Haru57636433
@Haru57636433 (haru .)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Python seleniumでスクレイピング

解決したいこと

スクレイピングの練習をしている中で、
2点解決したいことがございます。

・検索結果が1ページのみの場合、下記の処理だと終了してしまい1ページ目の情報を取得できない

・複数ページで情報取得する際、ある一定数のページを超えると、企業名は取得できるが初任給が取得できない
⇒CSVに検索結果の情報を書き出すのですが、
企業名,初任給
A社,100万円
B社,200万円
C社,50万円
D社,
E社,

というように、途中から初任給が取得できない状態です。

コードは下記の通りです。

また、コード内のtarget1というxpathの中腹の、["+str(i)+"]という部分に、
そのページの企業数を1から1ずつ増やして当てはめて、順番に初任給を取得する
ということを行っております。

import os
from selenium.webdriver import Chrome, ChromeOptions
import time
import pandas as pd
from selenium.common.exceptions import NoSuchElementException
import csv
import numpy as np
import logging
import logging.handlers
import logging.config
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

# Chromeを起動する関数をここに本来記載しております
###########################
###########################


        ##########スクレイピング処理##########
        # dataframe空箱作成
        df = pd.DataFrame(index=[], columns=[])
        # 企業名を格納
        company_list = []
        # 検索結果の企業の初任給を取得
        starting_salary_list = []
        # スクレイピング開始を表示
        text = "scraping now"
        page = 0

        while True:# ページ終了まで繰り返し
            p = len(driver.find_elements_by_link_text("次へ"))
            if  p > 0:


                # そのページの企業数を格納する
                page_count = []
                # クラス名から企業名を取得
                name_list = driver.find_elements_by_class_name("cassetteRecruit__name")

                # 1ページ分繰り返し会社名を取得し、企業数を把握する
                for name in name_list:
                    company_list.append(name.text)
                    page_count.append(name.text)

                l = (len(page_count))
                print(l)
                print(text)
                print(company_list)

                for i in range(1, l, 1):

                    target1 = "/html/body[@class='js__modal']/div[@class='wrapper']/div[@class='container'][1]/form/div[@class='container__inner']/div[@class='cassetteRecruit']["+str(i)+"]/div[@class='cassetteRecruit__content']/div[@class='cassetteRecruit__detail']/div[@class='cassetteRecruit__main']/table[@class='tableCondition']/tbody/tr[5]/td[@class='tableCondition__body']"
                    salary = driver.find_elements_by_xpath(target1)
                    for sa in salary:
                        starting_salary_list.append(sa.text)


                driver.find_element_by_link_text("次へ").click()
                page = page + 1
                logger.info(F"{page}ページ目終了")
                time.sleep(5)

            else:
                CompanySeries = pd.Series(company_list)
                SalarySeries = pd.Series(starting_salary_list)
                df = pd.concat([df, CompanySeries, SalarySeries], axis=1)
                df.columns=["企業名", "初任給"]
                df.to_csv('mynavi03.csv', encoding='utf-8_sig', mode="a")
                text = "finish"
                print(text)
                driver.quit()

    except:
        logging.info("info")
        logging.error("error")
        logging.debug("debug")
        pass

自分で試したこと

具体的なことは明記しにくいのですが、
ロジックをいろいろと考え直し組みなおしたのですが、
この状態で長期間躓いてしまっており、ご質問させて頂きました。

宜しくお願い致します。

0

No Answers yet.

Your answer might help someone💌