質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

346閲覧

1ページ上の複数リンクをスクレイピングしてCSVに書き出しを行いたい

c-man

総合スコア5

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/01/20 01:32

編集2023/01/20 01:57

前提

CSVに記載のURL一覧から各ページに進み
各ページから複数のリンクをスクレイピングしてCSVに書き出しを行ったところ
CSVに最後のリンクしか書き出しされない

実現したいこと

まずはCSVのページ分の各ページの複数リンクをCSVに書き出したい

該当のソースコード

from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.firefox.options import Options from subprocess import CREATE_NO_WINDOW from pydrive.drive import GoogleDrive from pydrive.auth import GoogleAuth from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import pandas as pd import os import time import datetime import csv import glob import subprocess from PIL import Image import io from urllib import request df = pd.read_csv('C:\\Users\\v0_thumb.csv', names=['urls'], encoding="utf-8") # HEADER = ['title','url_link'] # 追加部分 options = Options() options.headless = True options.add_argument('--headless') path = r'C:\\Users\\geckodriver.exe' # CSVファイルを最終行まで繰り返す for i in range(len(df)): # CSVデータのi行0列目のデータを取得 url = df.iloc[i, 0] driver = webdriver.Firefox(executable_path=path, options=options) driver.get(url) # 待機処理 driver.implicitly_wait(40) # 対象のURLにリクエストを送る element = driver.find_elements(by=By.ID, value='banners') with open('C:\\Users\\v1_thumb.csv','a', encoding='utf_8',newline='') as f: writer = csv.writer(f) for elem in element: try: url_link = elem.find_elements(by=By.TAG_NAME, value="a") for url in url_link: a = url.get_attribute("href") print(a) row = [a] writer.writerow(row) df = pd.to_csv('C:\\Users\\v1_thumb.csv', index=False, na=True, encoding='utf_8') print(df) # 待機処理 time.sleep(5) except: pass # タスクキル subprocess.Popen('taskkill /im firefox.exe /f', shell=True) driver.quit() time.sleep(5)

CSVの中身は以下になってます。

0 https://www.irasutoya.com/p/event.html 1 https://www.irasutoya.com/p/figure.html 2 https://www.irasutoya.com/p/food.html 3 https://www.irasutoya.com/p/school.html

試したこと

CSV書き出しの位置を変更したり(for文に含まれるよう)しましたがprintが期待した通りにできないなど
行きつまっております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

writer.writerow(row)によって1行ずつ出力しているにもかかわらず
df = pd.to_csv('C:\\Users\\s1_thumb.csv', ~)によって、ファイル全体が上書きされてしまっています。
これは不要ではないでしょうか。
あるいは行の内容を蓄積しておいて最後に一括出力するなど処理の流れを見直してください。

投稿2023/01/20 01:52

can110

総合スコア38268

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

ありがとうございます。以下で解決できました。

with open('C:\\Users\\v1_thumb.csv','a', encoding='utf_8',newline='') as f: writer = csv.writer(f) for elem in element: try: url_link = elem.find_elements(by=By.TAG_NAME, value="a") for url in url_link: a = url.get_attribute("href") print(a) row = [a] writer.writerow(row) print(df)

投稿2023/01/20 02:43

c-man

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問