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

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

新規登録して質問してみよう
ただいま回答率
85.35%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Python

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

Q&A

解決済

1回答

1703閲覧

beautifulsoup4のスクレイピングで情報の取得とスプレッドシートへの書き込みについて

退会済みユーザー

退会済みユーザー

総合スコア0

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Python

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

0グッド

0クリップ

投稿2020/05/21 23:40

編集2020/05/22 04:28

##前提・実現したいこと
Beautiful Soup4でGyaoのアニメのタイトルとURLを取得し、Google spread sheetsに書き込みたいと考えています。

1回の実行ですべての情報を取得し、一括してGoogel spread sheetsに書き込むことはできるでしょうか。

現状は、各カテゴリー(一挙配信中のアニメ,現在テレビ放送中の春アニメなど)のアニメのタイトルとURLを1つずつ取得し、Googel spread sheetsに書き込んでいます。
情報の取得、一括で書き込みのどちらかでも構いません。
よろしくお願いします。

Gyao
イメージ説明

##該当のソースコード

python

1from bs4 import BeautifulSoup 2import requests 3import time 4 5import gspread 6import json 7from oauth2client.service_account import ServiceAccountCredentials 8from googleapiclient import discovery 9 10 11scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive'] 12credentials = ServiceAccountCredentials.from_json_keyfile_name('伏せておきます', scope) 13gc = gspread.authorize(credentials) 14SPREADSHEET_KEY = '1DxPdf4JAcQp5LmKAEmBX2wuYW1j4ckva53Tnwm_byBg' 15worksheet = gc.open_by_key(SPREADSHEET_KEY) 16wb = worksheet.sheet1 17 18 19 20url = 'https://gyao.yahoo.co.jp/ct/anime/' 21r = requests.get(url) 22 23soup = BeautifulSoup(r.text, 'html.parser') 24 25 26section1 = soup.find_all('h2', class_ = 'section-header-title') 27 28sections = soup.find_all('div', class_='item-carousel-container') 29 30 31header_titles = [] 32for i in section1: 33 sec = i.text 34 header_titles.append(sec) 35 36anime_titles = [] 37for section in sections: 38 section_ = section.find_all('p') 39 anime_titles.append(section_) 40 41url_lists = [] 42for section in sections: 43 section_ = section.find_all('a') 44 url_lists.append(section_) 45 46 47wb.update_cell(1, 1, header_titles[0]) 48wb.update_cell(1, 3, header_titles[1]) 49for i in range(2,10,2): 50 wb.update_cell(1, i, 'URL') 51 52time.sleep(3) 53 54def anime_title_function(list_num, column): 55# for list_num in range(2,5):   56# for文で入れ子にして実行すると、spread sheetに書き込みの途中でエラーが出る。 57 anime = [] 58 for i in anime_titles[list_num]: 59 if list_num == 2: 60 animeTitle_ = i.string 61 animeTitle_ = animeTitle_.split('【一挙配信】')[1] 62 anime.append(animeTitle_) 63 else: 64 title = i.string 65 anime.append(title) 66 67 rows = [] 68 for i in range(2,len(anime)+2): 69 rows.append(i) 70 71 for row, title in zip(rows, anime): 72 wb.update_cell(row, column, title) 73anime_title_function(3, 3) 74 75 76time.sleep(3) 77 78def anime_url_function(list_num, column): 79 Anime_URL = [] 80 for i in url_lists[list_num]: 81 url_ = i.get('href') 82 Anime_URL.append(url_) 83 84 rows = [] 85 for i in range(2,len(Anime_URL)+2): 86 rows.append(i) 87 88 for row,url in zip(rows,Anime_URL): 89 wb.update_cell(row, column, url) 90anime_url_function(3, 4)

##試したこと
update_cellsでやってみましたが、1列ずつなら書き込めました。
これだと、update_cellとあまり変わりません。

python

1anime = [] 2for i in anime_titles[2]: 3 if 2 == 2: 4 animeTitle_ = i.string 5 animeTitle_ = animeTitle_.split('【一挙配信】')[1] 6 anime.append(animeTitle_) 7 else: 8 title = i.string 9 anime.append(title) 10 11anime1 = [] 12for i in anime_titles[3]: 13 title = i.string 14 anime1.append(title) 15 16 17cell_list = wb.range('A2:A'+str(len(anime)+2)) 18cell_list1 = wb.range('B2:B'+str(len(anime)+2)) 19 20for cell,cell1,a,a1 in zip(cell_list, cell_list1, anime,anime1): 21 cell.value = a 22 cell1.value = a1 23wb.update_cells(cell_list) 24wb.update_cells(cell_list1)

##worksheet.updateでやってみた

python

1anime1 = [] 2 for i in anime_titles[2]: 3 animeTitle_ = i.string 4 animeTitle_ = animeTitle_.split('【一挙配信】')[1] 5 anime1.append(animeTitle_) 6 7 anime2 = [] 8 for i in anime_titles[3]: 9 title = i.string 10 anime2.append(title) 11 12 anime3 = [] 13 for i in anime_titles[4]: 14 title = i.string 15 anime3.append(title) 16 17 anime4 = [] 18 for i in anime_titles[5]: 19 title = i.string 20 anime4.append(title) 21 22 23 rows = [] 24 for i in range(2, 20): 25 rows.append(i) 26 27 for row, a1,a2,a3,a4 in zip(rows, anime1, anime2, anime3, anime4): 28 wb.update('A:G'+str(row), [[a1,'' , a2, '', a3, '', a4]])

一括で表示できましたが、列の長さが1番短い列に合わせて表示されてしまいます。
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

gspread使ったこと無いのでアレですが、ドキュメントには下記のような範囲updateの例が載っています。

Update a range

worksheet.update('A1:B2', [[1, 2], [3, 4]])
Examples of gspread Usage

投稿2020/05/22 02:39

jeanbiego

総合スコア3966

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

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

退会済みユーザー

退会済みユーザー

2020/05/22 04:30

回答ありがとうございます。 worksheet.updateでやってみました。 結果は、質問蘭に載せておきます。 ありがとうございました。
jeanbiego

2020/05/22 05:36

for文でzipを使うと、一番短いリストの長さまでしか回りません。 一番長いリストの長さでrangeで回すか、itertools.zip_longest()などを使うほうが良いようです。 https://note.nkmk.me/python-zip-usage-for/
退会済みユーザー

退会済みユーザー

2020/05/23 05:41 編集

ご指摘いただいて、ありがとうございます。 worksheet.updateでのデータの書き込みは、書き込む量が多くなると途中でエラーが出てしまいます。 sleep関数を使う方法もあるようですが、pandasのDataFrameで書き込む方法があったので、そちらでやってみます。 回答いただき、ありがとうございました。 https://teratail.com/questions/208584
退会済みユーザー

退会済みユーザー

2020/05/26 03:04

To jeanbiegoさん DataFrameを使って何とかspreadsheetsに書き込むことができました。 worksheet.updateやitertools.zip_longest()は勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問