現在スクレイピングを行なっております。
実現したい内容として、
1該当indexから一つずつshowへ移動し、必要情報を取得
2終わったら次のshowを取得
3取りきったら、次のページへ自動的に移動し1、2を繰り返す
となります。
先日もご質問させて頂き丁寧に回答頂きましたが、スキル不足もありプログラムを構成することが出来なかったので再質問とさせて頂きました。
もし可能であれば、以下のプログラムをベースにeachやwhileを使って次ページへ進むプログラムを教えて頂けないでしょうか?
よろしくお願い致します。
require 'rubygems' require 'mechanize' a = Mechanize.new { |agent| agent.user_agent_alias = "#"} page = a.get("#") urls = a.page.css("...").css("a").map { |x| +x["href"]} #sleep 5 urls.each { |x| p x begin a.get(x); p a.page.css("#").css("a").text(); #タイトル p a.page.css("#")[1].text(); #住所 p a.page.css("#").text(); #自社URL p a.page.css("#")[2].text(); #人数 sleep 5; rescue => e p e end p "" }
example
1require 'mechanize' 2 3agent = Mechanize.new 4agent.user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)' 5 + ' AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' 6 7urls = [] 8 9page = agent.get('https://teratail.com/feed/new/1') 10 11loop do 12 page.css('#mainContainer > div.boxContentWrap.btnNew.j-feedContentsWrapper > ul > li:nth-child(1) > div.C-questionFeedItem__main.boxItemContent > h2 > a').each do |a| 13 urls << a['href'] 14 end 15 break if page.css('#mainContainer > div.j-feedPagination.u-mt40 > div > p > a > span').empty? 16 sleep(rand(3..5)) 17 page = page.link_with(text: '次のページ').click 18end 19 20urls.each do |url| 21 page = agent.get(url) 22 puts page.css('#l-headContents > div > div.p-questionHead__main > h1').text 23 sleep(rand(3..5)) 24end 25
2点質問があります。
1. 質問に記述されているコードは「このままの状態」で質問者さんの環境で動作しますか?
2. クロール対象のサイトは動的にページが生成されるタイプのものではないですか?
※ 動的に生成される場合、Mechanizeでは実現不能です。
可能であれば、対象サイトのHTMLを教えていただけるとコードが記述しやすいと思います。
user1さん。引き続きこちらでも対応頂きありがとう御座います。折角前回も対応頂いたのに知識不足で改めてスレッドを立てることになり申し訳ありませんでした。
上記内容について回答させて頂きます。
1. はい。動作します。
2. スクレイピングする毎に違った情報が取得されるので動的だと思われます。
動的でも現在習得できているのですが、Mechanizeでは難しいとはどういうことなのでしょうか?
また対象サイトのHTMLもお伝えしたいところなのですが、こちらに記載しても良いのもなのでしょうか?
スレッドを立てることは別に構いませんよ。
2について、例えばChromeで「Ctrl + U」と「F12(Elements)」でそれぞれHTMLを
確認できますが、両者で表示されるHTMLが異なっているサイトがあります。
このようなサイトかつ「F12(Elements)」で表示されるHTMLにのみ目的の要素が存在する
場合、Mechanizeでは取得が難しいです。
私には事情が分からないので対象のHTMLの公開については自分で判断してください。
回答1件
あなたの回答
tips
プレビュー