MacroCat@Siro - ExcelVBA・PHP・フリーランス

ExcelVBA、WEBスクレイピング、その他技術に関して書いていきます。

ランサーズの過去データ分析準備①

読者になる/フォローする

 

Excelマクロ + IEを使ったランサーズ案件一覧作成マクロ

こんにちは。にゃんたです。

前回までで、Googleにアクセスして検索結果をExcelに出力するマクロを開発しました。

siroexcelvba.hatenablog.com

 

このままでもほしい人いるかもしれないんですが、

どうせならユーザが困っていることを解決できるようなマクロ作りたいですよね。

なので、まずは「ランサーズ」にある特定キーワードの案件を取得して表示するマクロ作ってみようと思います。分析とかに使えそうだよね。

過去案件一覧見て、ユーザが欲している困っている情報を分析して、

勉強して力になれたら最高ですね。

 

通常、過去案件見たい場合はページをクロールして、10件ずつ見たりしなきゃいけないんですが、それだと日が暮れてしまうので、

ボタンをポチッ

っと押したあとほうっておくと自動で出力してくれるものを作りたいと思います。

 

ランサーズのURLを考察してみた

まずは、ランサーズの画面を開いて、URLを見てました。

 

カテゴリ:すべて
 http://www.lancers.jp/work/search/all?keyword=マクロ

 

カテゴリ:システム開発・運用
 http://www.lancers.jp/work/search/system?keyword=マクロ

 

カテゴリ:システム開発・運用>Web・システム開発
 http://www.lancers.jp/work/search/system/development?keyword=マクロ

 

カテゴリ:システム開発・運用>Web・システム開発>Excelマクロ作成・VBA開発
 http://www.lancers.jp/work/search/system/vba?keyword=マクロ

 

どうやら、allsystemに入っている部分を変えれば大カテゴリを変えられる模様
で、「/」のあとに続けて中・小カテゴリが入っているみたいですね。

なので、URLを変えればカテゴリの指定はできそう。

 

ちなみに、今回のサブ目的は
「ランサーズのVBAに関する過去案件の洗い出し」なので、
VBA」で過去案件含め結果を表示するマクロ
を作ろうかと思います。


IE操作するためのクラス名、IDなどの確認方法

まずは、IE操作を行う対象のサイトがどんな構成になっているか確認する必要があります。

とってくる項目のTag名や、Classや、IDなど事前に確認したうえでマクロを書く必要があるので。

 

【確認方法】
 ・InternetExplolerの場合
   F12の管理者ツールを起動して確認
  
 GoogleChromeの場合
  「Ctrl + Shift + I」でデベロッパツール開いて確認

※個人的にはGoogleChromeがおすすめです  

 

Lancersで確認してみた

どうやら、検索結果はdivタグの「jobCard__col jobCard__col--main」というクラス内にあるようです。
なので、処理はこのDIVの数分ループでよいかと。


こんな感じ

>||

Set div = htmlDoc.getElementsByTagName("div") 'HTMLドキュメント内のspan要素をコレクションとしてGet
For Each el In div

If el.className Like "jobCard__col jobCard__col--main" Then '要素のclassが「g」の場合のみ以下処理を実施
Debug.Print "クラス名:" + el.className

' 'データ確認
Debug.Print el.getElementsByTagName("p")(0).innerText 'タイトルを表示

End If

Next el

||<

 


さて、次に金額やらなにやら項目取ろうと思ったんですが・・・

10000 ~ 20000円

・10000
・~
・20000

これがそれぞれprice-numberというクラスになっていて
かつ、要素数が1つの場合と2つの場合と3つの場合があって

※1つの場合
・~
・20000

※2つの場合
・~
・20000

※3つの場合
・10000
・~
・20000

 

なので、素数ごとに処理変えねばなりません。

VBAで要素数取得に関して、調べてたらこんな素敵なサイト

www.vba-ie.net

.Lengthで取得できるようなので、条件追加してみた

 

>|vb|

If el.getElementsByClassName("price-number").Length = 3 Then

Debug.Print el.getElementsByClassName("price-number")(0).innerText + _
el.getElementsByClassName("price-number")(1).innerText + _
el.getElementsByClassName("price-number")(2).innerText
Else

Debug.Print el.getElementsByClassName("price-number")(0).innerText + _
el.getElementsByClassName("price-number")(1).innerText

End If

||<

 

el.getElementsByClassName("price-number").Length
というもので取得できるようですね。

 

ランサーズでは応募までの締切残日数を持っているので、
それもついでに取得してみた。

 

>|vb|

'残日数
Debug.Print el.getElementsByClassName("jobCard-below__col jobCard-below__col--time")(0).innerText

<||

 

こちらもクラス指定で簡単に取れました。

 

ページ遷移して情報を取得せねばならぬ

ページ遷移する方法だけど、postでページを指定しているサイトがほとんどだと思うので、ランサーズでもURLを比較してみた。

 

・1ページ目
http://www.lancers.jp/work/search/system/vba?keyword=マクロ&completed=1

・2ページ目
http://www.lancers.jp/work/search/system/vba?keyword=マクロ&completed=1&page=2

 

ふむふむ。どうやら「page=ページ数」を指定すればいけるらしい。
ためしに「page=1」でも1ページ目が検索されるか確認してみた。

http://www.lancers.jp/work/search/system/vba?keyword=マクロ&completed=1&page=1

f:id:sirosiro346:20170922204707p:plain

普通に行けた。

 

最終ページをどこから取得しよう?

「page=XXX」で指定できるのはわかったんですが、最終ページがどこなのかわからないと、どこまでループすればよいか不明なので、取得する処理を書いておく必要があります。

ランサーズの場合、「最後へ>>」という便利なボタンのリンクが、
http://www.lancers.jp/work/search/system/vba?keyword=マクロ&completed=1&page=XX
となってたので、ここのXXから取得することに。

最後の文字だけほしいので、Right関数とsplit関数を使って数字のみ抽出
http://officetanaka.net/excel/vba/tips/tips62.htm
※ここのサイトいつもお世話になってます

 

>|vb|

Dim pager As IHTMLElementCollection 'pagerのHTMLエレメントコレクションを準備

Set pager = htmlDoc.getElementsByClassName("pager__item__anchor") '「最後へ」ボタンのclassを指定して値取得
intMaxPage = Split(Right(pager*1.href, 5), "=")(1) '最大ページ数のみ取得

||< 


問題ないっぽいので、指定したページまでデータを取得するよう、For文を追加して、
Excelに書き込んだらこうなりました。

※処理重いので注意

 

youtu.be

 

なんとかできた。

明日はこれを使って傾向を分析して学習方針固めようと思います。

 

ではではーノシ

*1:pager.Length - 1