pekorinko / review_check

0 stars 0 forks source link

スクレイピング出来ないURL #13

Closed pekorinko closed 3 years ago

pekorinko commented 3 years ago
pekorinko commented 3 years ago
pekorinko commented 3 years ago
pekorinko commented 3 years ago
pekorinko commented 3 years ago
pekorinko commented 3 years ago

mv:[[35.3831256,139.3652272],[35.3149229,139.3256056]]は「平塚 カフェ」で調べたときに地図がカフェを表示する範囲の緯度経度を示しているみたい

pekorinko commented 3 years ago

URLから正規表現で

mv:[[35.706644499999996,139.5884908],[35.679823,139.54468549999999]]

を削除して残りのURLを貰う

pekorinko commented 3 years ago

image

class ResultsController < ApplicationController
  def new; end

  def create
    url = params[:url]

    #ここでURLを正規表現できれいにする
    place_data_scraper = MyTools::PlaceDataScraper.new(url)
    place = place_data_scraper.save_place
    place_data_scraper.save_review(place.id)
    check_credibility = MyTools::CheckCredibility.new(place.id)
    @result = check_credibility.credibility
  end
end

↑URLを正規表現できれいにする場所

pekorinko commented 3 years ago

results_controller.rbにてスクレイピングできないURLに関しては正規表現で緯度経度を削除したことで解決

class ResultsController < ApplicationController
  def new; end

  def create
    url = params[:url]
    url = url.split('mv')[0] if url.include?('mv')
    place_data_scraper = MyTools::PlaceDataScraper.new(url)
    place = place_data_scraper.save_place
    place_data_scraper.save_review(place.id)
    check_credibility = MyTools::CheckCredibility.new(place.id)
    @result = check_credibility.credibility
  end
end
pekorinko commented 3 years ago
pekorinko commented 3 years ago
pekorinko commented 3 years ago

分かったこと ;tbs:lrf:!1m4!1u3!2m2!3m1!1e1!2m1!1e3!3sIAE,lf:1,lf_ui:4 の部分があると口コミに遷移してくれない

↓①口コミ画面のURLなのに image

↓②別タブで開くとここから口コミ画面に画面遷移しない image

pekorinko commented 3 years ago

上記の②の画面の「Google口コミ(64)」をクリックして取得したURLだと別タブで開いてもスクレイピングできる https://www.google.com/search?q=%E3%82%AB%E3%83%95%E3%82%A7%20%E3%83%AA%E3%82%BC%E3%83%83%E3%82%BF&hl=ja&sxsrf=ALeKk02jUNVuIJaqNnWbwzghmu4OE_uBlQ:1617940528548&source=hp&ei=LNBvYOHDFcX_-Qbs5pawCA&iflsig=AINFCbYAAAAAYG_ePI36dB_uhJLq53Vca-U6--tQkKbi&oq=%E3%82%AB%E3%83%95%E3%82%A7&gs_lcp=Cgdnd3Mtd2l6EAMYADIECCMQJzIECAAQBDIECAAQQzIQCAAQsQMQgwEQsQMQgwEQBDIECAAQBDIKCAAQsQMQsQMQBDIECAAQBDIECAAQBDoJCCMQJxBGEP8BOgcIABCxAxAEOgoIABCxAxCDARAEUI0OWJgUYLkdaABwAHgBgAGnAogBsQiSAQUwLjUuMZgBAKABAaoBB2d3cy13aXo&sclient=gws-wiz&tbs=lrf:!1m4!1u3!2m2!3m1!1e1!2m1!1e3!3sIAE,lf:1,lf_ui:4&tbm=lcl&rflfq=1&num=10&rldimm=10977287492993434335&lqi=Chbjgqvjg5Xjgqcg44Oq44K844OD44K_IgOIAQFaOAoW44Kr44OV44KnIOODquOCvOODg-OCvyIW44Kr44OV44KnIOODquOCvOODg-OCvyoGCAIQABABkgEEY2FmZQ&ved=2ahUKEwi63eKTovDvAhVXed4KHaSKD_oQvS4wAnoECAMQKQ&rlst=f#lrd=0x6018f51fe09589bd:0x985728d0913642df,1,,,&rlfi=hd:;si:10977287492993434335,l,Chbjgqvjg5Xjgqcg44Oq44K844OD44K_IgOIAQFaOAoW44Kr44OV44KnIOODquOCvOODg-OCvyIW44Kr44OV44KnIOODquOCvOODg-OCvyoGCAIQABABkgEEY2FmZQ;mv:[[35.6132762,139.6720453],[35.6100405,139.62310829999998]];tbs:lrf:!1m4!1u3!2m2!3m1!1e1!2m1!1e3!3sIAE,lf:1,lf_ui:4

pekorinko commented 3 years ago

【スクレイピングできるURL、出来ないURL共通点】

image

pekorinko commented 3 years ago

分かったこと ;tbs:lrf:!1m4!1u3!2m2!3m1!1e1!2m1!1e3!3sIAE,lf:1,lf_ui:4 の部分があると口コミに遷移してくれない

pekorinko commented 3 years ago

results_controller.rbにて以下正規表現を行うことで解消

url = url.split(';tbs:lrf:')[0] if url.include?(';tbs:lrf:')
url = url.split('mv:[[')[0] if url.include?('mv:[[')
pekorinko commented 3 years ago
pekorinko commented 3 years ago

↑別にこのURLが駄目な訳ではなくコントローラーでurl_validatorurl_filterより先に呼び出していたのが問題だった

pekorinko commented 3 years ago

新たに分かったこと:url_validatorurl_filterをどっち先に書くか問題

解消するためにurl_validator.rbにてURLに';tbs:lrf:'もしくは'mv:[['を含んでいないときだけURI.parseするというコードを書いた

def validate
      unless @url.include?(';tbs:lrf:') || @url.include?('mv:[[')
        uri = URI.parse(@url)
        uri.host == 'www.google.com' ? true : false
      end
    end
pekorinko commented 3 years ago

コントローラーに以下処理ベタ書したらGoogleで変な要素含まれているURLもGoogleではないURLもスクレイピング出来るようになった

createメソッド全体像(参考、後で戻したくなったときのために)

def create
    url = params[:url]
    url_filter = MyTools::UrlFilter.new(url)
    url_validator = MyTools::UrlValidator.new(url)

    if url.include?('www.google.com')
      url = url_filter.filter
      place_data_scraper = MyTools::PlaceDataScraper.new(url)
      place = place_data_scraper.save_place
      place_data_scraper.save_review(place.id)
      check_credibility = MyTools::CheckCredibility.new(place.id)
      @result = check_credibility.credibility
    end

    if url.exclude?('www.google.com') && url_validator.validate
      # GoogleのURLで変な要素付きのURLでもurl_validatorでURI.parseしちゃうからお腹壊す
      # もしhostがgoogleじゃなかった時だけ「url_validator.validate」を起動させたい
      place_data_scraper = MyTools::PlaceDataScraper.new(url)
      place = place_data_scraper.save_place
      place_data_scraper.save_review(place.id)
      check_credibility = MyTools::CheckCredibility.new(place.id)
      @result = check_credibility.credibility
    elsif url.exclude?('www.google.com') && !url_validator.validate
      flash.now[:alert] = 'URLが不正です'
      render :new
    end

  end
pekorinko commented 3 years ago

これからやること

pekorinko commented 3 years ago

コントローラーとurl_validator.rbのコードを変更した

【results_controller.rbのcreateメソッド】

def create
    @url = params[:url]

    if @url.include?('www.google.com')
      url_filter = MyTools::UrlFilter.new(@url)
      @url = url_filter.filter
    end

    url_validator = MyTools::UrlValidator.new(@url)
    if url_validator.validate
      @url = url_validator.validate
      place_data_scraper = MyTools::PlaceDataScraper.new(@url)
      place = place_data_scraper.save_place
      place_data_scraper.save_review(place.id)
      check_credibility = MyTools::CheckCredibility.new(place.id)
      @result = check_credibility.credibility
    elsif url.exclude?('www.google.com') && !url_validator.validate
      flash.now[:alert] = 'URLが不正です'
      render :new
    end
  end

【url_validator.rbのvalidateメソッド】

<変更前>

def validate
  uri = URI.parse(@url)
  uri.host == 'www.google.com' ? true : false
end

<変更後>

def validate
      if @url.include?('www.google.com')
        return @url
      else
        false
      end
    end
pekorinko commented 3 years ago

今のコントローラーのコードだと不要物が入っていないURLが入力された場合がうまく行かない https://www.google.com/search?q=%E5%90%89%E7%A5%A5%E5%AF%BA+%E3%83%81%E3%83%A3%E3%82%A4%E3%83%86%E3%82%A3%E3%83%BC&rlz=1C5CHFA_enJP939JP939&oq=%E5%90%89%E7%A5%A5%E5%AF%BA%E3%80%80%E3%83%81%E3%83%A3%E3%82%A4%E3%83%86%E3%82%A3%E3%83%BC&aqs=chrome.0.69i59j0.5734j0j9&sourceid=chrome&ie=UTF-8#lrd=0x6018ee482cb92a9b:0x4d6c0ab242091eef,1,,,

pekorinko commented 3 years ago

url_filter.rbを修正、以下4パターンのURLに対応出来るように変更、コントローラーではなくurl_filter.rbのif文に漏れがあった

pekorinko commented 3 years ago
tbs = ';tbs:lrf:'
mv = 'mv:[['

とすることでコードを分かりやすくした