kazunarigit
@kazunarigit (村田 一成)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

スクレイピング元のURLが違うため、URLの指定が出来ない。

解決したいこと

オリジナルアプリを作っていて、スクレイピング元のサイトのデータを引っ張ってくるときに以下の問題があります。
前提:スクレイピング元はヤフースポーツのプロ野球サイト
①選手の最終成績データのURLであれば、固定されてるためScrapingControllerに記述できる。
②試合ごとのデータでは、各々の数値が割り振られていて、ScrapingControllerに記述できない。

https://baseball.yahoo.co.jp/npb/game/*****/top
****が各々割り振られた数値で変動する。

該当するソースコード

$crawler = $client->request('GET', 'https://baseball.yahoo.co.jp/npb/teams/3/memberlist?kind=b');
$crawler = $client->request('GET', 'https://baseball.yahoo.co.jp/npb/teams/3/memberlist?kind=p');

上記コードは最終成績画面。

自分で試したこと

どうしたらいいか考え中。
追記
ページ取得として
取得するチームの月間試合日程のページから一日ごとの試合結果のリンクのタグをフィルタリングで取得し(ここまでをforeachで)、各選手の成績をまたスクレイピングで取得するという方法を考えています。

0

2Answer

ページのソースを見た感じ、試合ごとのデータのリンクには
class属性でbb-score__contentが付与されているので、
以下のような方法はどうでしょうか。(PHPに詳しくないのであくまでイメージですが…)

(1)class属性bb-score__contentが付与された<a>タグhref属性を取得する
(2)正規表現でgame/から/index間を切り出す
(3)切り出した情報をスクレイピング前にURLに埋め込む

(※但し、サイトで該当部分の構成が変更された場合には、
コードも修正する必要があります。)

スクリーンショット 2022-06-29 154417.png

0Like

https://baseball.yahoo.co.jp/npb/schedule/?date=2022-06-01のように日付を指定するとその日の試合結果のページを取得できます。
そこからは @syutorum001 さんが書かれているようにbb-score__contentなリンクを拾い出せば「任意の指定した日のすべての試合ID」を(その日試合があれば)手に入れることができます。
というかこの試合IDは単純な連番のようなので、「今の番号よりそこそこ若い番号(2021000000とか)から順番に番号を増やしていき、試合の日付が未来になったら終了」というアバウトなやり方でもいいんじないですかね。
「試合終了となったものは再取得しない」とすれば初回以外はアクセス量も大したことないでしょうし。

0Like

Your answer might help someone💌