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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

2375閲覧

スクレイピングで取得したデータの一部しかcsvに書き込めません

beij

総合スコア16

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2015/07/31 08:40

Amazonのレビュー欄のデータ(レビューの本文や評価など)をスクレイピングすることには成功したのですが、それをcsvに書き込もうとしても一部しか書き込まれません。
取得したデータすべてをcsvに書き込むにはどうしたら教えていただけたら幸いです。
よろしくお願いいたします。

* coding:utf-8 *

require 'anemone'
require 'nokogiri'
require 'open-uri'
require 'kconv'
require 'csv'

urls = ['http://www.amazon.co.jp/product-reviews/ISBNの番号/ref=cm_cr_pr_btm_link_1?ie=UTF8&showViewpoints=0&sortBy=recent&reviewerType=all_reviews&formatType=all_formats&filterByStar=all_stars&pageNumber=1']

opts = {
:depth_limit => false,
:obey_robots_txt => true,
:delay => 3
}

Anemone.crawl(urls, opts) do |anemone|
anemone.skip_links_like /next_+|prev+|unsticky/

anemone.focus_crawl do |page| page.links.keep_if { |link| link.to_s.match( /product-reviews\/ISBNの番号\/ref=cm_cr_pr_btm_link_/) } end PATTERN = %r[ref=cm_cr_pr_btm_link_] anemone.on_pages_like(PATTERN) do |page| doc = Nokogiri::HTML.parse(page.body.toutf8) retxt = [] tit = [] hyo = [] retim = [] renam = [] san = [] reviewtext = doc.xpath("//span[@class='a-size-base review-text']") title = doc.xpath("//a[@class='a-size-base a-link-normal review-title a-color-base a-text-bold']") hyoka = doc.xpath("//div[@class='a-section review']/div[2]/a[1]/i/span") reviewtime = doc.xpath("//div[@class='a-section review']/div[3]/span[4]") reviewname = doc.xpath("//*[@class='a-section review']/div[3]/span[1]/a") sankou = doc.xpath("//*[@class='a-section review']/div[1]/span") reviewtext.each do |node| retxt << node.text end title.each do |node| tit << node.text end hyoka.each do |node| hyo << node.text end reviewtime.each do |node| retim << node.text end reviewname.each do |node| renam << node.text end sankou.each do |node| san << node.text end puts sankou.text, reviewtext.text, title.text, hyoka.text, reviewtime.text, reviewname.text, sankou.text File.open('hibana2.csv', 'w') do |csv| retxt.length.times do |i| csv << [retxt[i], tit[i], hyo[i], retim[i], renam[i], san[i]] end end end

end

#sankou = doc.xpath("//div[@style='margin-left:0.5em;']/div[@style='margin-bottom:0.5em;']").text

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

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

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

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

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

guest

回答2

0

細かくは見てませんが、ページごとにループしているにもかかわらず、そのループ内でFile.open('hibana2.csv', 'w') しているので、ループごとにファイルを上書きして、最後のページの分しか残っていないということではないでしょうか。

openをループの外に出すのが簡単な変更ですね。

投稿2015/07/31 14:12

otn

総合スコア84380

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

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

beij

2015/07/31 15:02

なるほど、確かにそうなのかもしれません。 まだまだ初心者なので、なぜそうなるのかを教えていただけて非常にありがたいです!
otn

2015/07/31 23:18

>なぜそうなるのかを教えていただけて非常にありがたいです! 回答に書いたとおりなのですが、「上書き」という概念が分からないのでしょうか? 紙に文字が書いてあるとして、「上書き」というのは書いてあった文字を全部消しゴムで消してから書き直すと言うことです。なので、最後に書いた物しか残らない。 消しゴムで消すのを、書く毎に行うので無く、プログラム最初で1回だけ行えば良かったのにと言うことです。 消しゴムで消すのをやめる(=File.open('hibana2.csv', 'a')にする)というのでもいいのですが、プログラム全体を何度も実行すると、どんどん書かれたことが増える一方なので、プログラムの実行の最初で一度だけ消しゴムをつかうのが良いだろうと言うことです。
guest

0

ベストアンサー

CSV書き込みのところがおかしいかな?

Ruby

1CSV.open("hibana2.csv", "wb") do |csv| 2 retxt.length.times do |i| 3 csv << [retxt[i], tit[i], hyo[i], retim[i], renam[i], san[i]] 4 end 5end

投稿2015/07/31 08:50

rifuch

総合スコア1901

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

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

beij

2015/07/31 09:08

ご回答有難うございます。 ご指摘のとおりに修正して試してみましたがこれまでと同じように一部しかcsvに書き込まれません。 データ取得自体はできていると思います(コマンドプロンプト上に表示されているので)。
rifuch

2015/07/31 09:12

大体何件ぐらい取得して、何件ぐらいの書き込みで失敗していますか?
rifuch

2015/07/31 09:20

見落としてました。 一括で書き込みするなら、 結果を格納する配列(retxt,tit,hyo,retim,renam,san)の宣言部をAnemone.crawlブロックの前、CSV.openをAnemone.crawlブロックの後に出してみてください。 毎行追加するなら、CSV.openブロックの位置は変えずに、 CSV.open("hibano2.csv", 'a') do |csv| csv << [sankou.text, reviewtext.text, title.text, hyoka.text, reviewtime.text, reviewname.text, sankou.text] end で行けると思います。 多分、ここだと思います。
beij

2015/07/31 09:43

取得件数は450件ほどだと思います。 書き込みに成功したのが10件で、コマンドプロンプト上で最後に表示されていたので、最後にクローリングで取得したページに載っているレビューのデータ10件分が書き込まれていると思います。
beij

2015/07/31 15:01

ご指摘通りに変更したら上手くいきました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問