LoginSignup
souwasora
@souwasora (takei souwa)

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スクレイピング リダイレクトされる?

解決したいこと

スクレイピングするにあたって
取得したいURLが変わってしまう為、どうしたら良いのか
解決方法を教えて下さい。

発生している問題・エラー

スクリーンショット 2023-02-01 14.31.06.png

上記の条件で取得したい。
「職種」システム開発・・・モバイル系
「勤務地」渋谷
「雇用状態」正社員

URLは以下になる

https://next.rikunabi.com/rnc/docs/cp_s00700.jsp?leadtc=n_ichiran_panel_submit_btn

スクリーンショット 2023-02-01 14.41.36.png

しかし、スクレイピングを実施すると
URLが変更してしまう(条件が全て無効になってる)

該当するソースコード

def rikunabi_next():
    #ここでurlを取得
    get_url = request.form.get('url_name')
    get_page = request.form.get('page')
    browser = webdriver.Chrome(ChromeDriverManager().install())
    url = get_url
    browser.get(url)
    response = requests.get(url, allow_redirects=False)
    soup = BeautifulSoup(response.text, 'html.parser')
    page_count = 1
    p = get_page
    p = int(p)
    urls = []
    while True:
        #ブロックで取得
        res = requests.get(url)
        soup = BeautifulSoup(res.content, 'html.parser',from_encoding='utf-8')
        boxs = soup.find_all('ul', attrs={'class': 'rnn-group rnn-group--xm rnn-jobOfferList'})
        for box in boxs:
            links = box.find_all('a', attrs={'class': 'rnn-linkText rnn-linkText--black'})
            for link in links:
                link = link.get('href')
                urls.append(link)
        page_count += 50
        time.sleep(3)
        url = get_url + 'crn' + str(page_count) + '.html'
        browser.get(url)
        if page_count > p:
            break
            #except TimeoutException:
            print('pageの読み込みを終了しました')

    lists = []
    periods = []
    for list in urls:
        key_word = list
        url = 'https://next.rikunabi.com' + key_word
        browser.get(url)
        res = requests.get(url)
        soup = BeautifulSoup(res.content, 'html.parser',from_encoding='utf-8')
        #会社名取得
        list = soup.find('p', attrs={'class': 'rn3-companyOfferSide__menuMainCompanyName'})
        period = soup.find('p',attrs={'class': 'rn3-companyOfferHeader__period'})
        for z in list: 
            z = z.replace("[<p class=rn3-companyOfferSide__menuMainCompanyName>",'')
            lists.append(z)
        for x in period:
            period = x.text
            periods.append(period)
        time.sleep(3)
    phone_numbers = []
    titles = []
    adress = []
    for title in lists:
        titles.append(title)
        key_word = title
        #取得した会社名+電話番号でGoogleで調べる
        url = 'https://www.google.com/search?q=' + key_word +'電話番号'
        browser.get(url)
        #電話番号取得
        if browser.find_elements_by_class_name('X0KC1c'):
            phone_number = browser.find_elements_by_class_name('X0KC1c')
            #所在地取得
            adres = browser.find_elements_by_css_selector('span[class="LrzXr"]')
            for d in adres:
                adres = d.text
                adress.append(adres)
            for c in phone_number:
                phone_number = c.text
                phone_numbers.append(phone_number)
            sec = random.uniform(5,7)
            time.sleep(sec)
        else:
            phone_numbers.append('') 
            adress.append('')
            time.sleep(1)
    df = pd.DataFrame()
    df['会社名'] = titles
    df['掲載期間'] = periods
    df['電話番号'] = phone_numbers
    df['住所'] = adress
    df

    SCOPES = ["https://spreadsheets.google.com/feeds",
          'https://www.googleapis.com/auth/spreadsheets',
          "https://www.googleapis.com/auth/drive.file",
          "https://www.googleapis.com/auth/drive"]
    SERVICE_ACCOUNT_FILE = '**************'
    credentials = ServiceAccountCredentials.from_json_keyfile_name(SERVICE_ACCOUNT_FILE, SCOPES)
    gs = gspread.authorize(credentials)
    SPREADSHEET_KEY ='*************'
    workbook = gs.open_by_key(SPREADSHEET_KEY)
    today = datetime.date.today()

    #シート作成(新規)
    workbook.add_worksheet(title='リクナビNEXT_IT'+str(today), rows=500, cols=10)
    #先程作成したシートに出力
    set_with_dataframe(workbook.worksheet('リクナビNEXT_IT'+str(today)), df, include_index=True)

    browser.quit()
    return url

自分で試したこと

https://dot-blog.jp/news/python-requests-redirect-url-status-code-get/#:~:text=%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E6%99%82%E3%80%81%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E5%8B%95%E4%BD%9C%E3%82%92,%E3%80%8EFalse%E3%80%8F%E3%81%AB%E3%81%97%E3%81%BE%E3%81%97%E3%82%87%E3%81%86%E3%80%82
を試しましたが

get_url = request.form.get('url_name')
url = get_url
browser.get(url)

上記が悪さしているのかな?と思い、スクレイピングの処理を挟まず、returnで1個1個確認しました。
全て
https://next.rikunabi.com/rnc/docs/cp_s00700.jsp?leadtc=n_ichiran_panel_submit_btn
となっており問題はありませんでした。
どのような対策を取ればよろしいでしょうか?

0

1Answer

Your answer might help someone💌