エクセルVBA WEBスクレイピングで求人情報を取得する

求人ボックスの求人情報をエクセルシートに転記する。

 ネットでいろんなサイトから求人情報が取得できます。ちまちまクリックして閲覧していたのですが、非常に面倒くさい。Webスクレイピングで情報をまとめて取得したい!と思ったので作ってみました。

今回の作成例

「求人ボックスから求人情報を取得する」

 処理内容
1 求人ボックスのサイトを開く。
2 求人情報を取得する。エクセルに情報を転記する。
3 次のページがあれば、次のページへ遷移するボタンをクリック。
4 求人情報を取得する。エクセルに情報を転記する。
5 次のページがなくなったら終了。

1~5までの処理を自動化します。
エクセルシートに情報を転記してそこに検索をして、調べたいという自分の需要です。
具体的には、取得したデータの池袋駅の求人を知りたい、というものです。

何がどうなるか

f:id:bimori466:20200726073440p:plain

検索して出てきた情報を…


f:id:bimori466:20200726073253p:plain

エクセルシートに転記する。

処理コード

Sub IE_Open()

Dim IE As InternetExplorer
Dim htdoc As HTMLDocument
Dim JobOffer_anchor As Object
Dim End_Flg, Next_Flg As Boolean


'処理時間の計測-----------------------------------------------------------------------------------
Dim startTime As Double
Dim endTime As Double
Dim processTime As Double

startTime = Timer
'__________________________________________________________________________________________________


Set IE = CreateObject("internetexplorer.application")

'internetexplrerの可視化
IE.Visible = True

'求人ボックスのエクセルVBAで検索
IE.Navigate "https://xn--pckua2a7gp15o89zb.com/Excel-VBA-%E7%B5%8C%E9%A8%93%E8%80%85%E3%81%AE%E4%BB%95%E4%BA%8B-%E6%9D%B1%E4%BA%AC%E9%83%BD"

'ieを開く待ち時間の処理
Do While IE.Busy Or IE.ReadyState < READYSTATE_COMPLETE
    'Debug.Print IE.Busy & ":" & IE.ReadyState
    DoEvents
Loop


r = 0  '情報の書き込み先セル行

'ループ処理。End_Flgがtrueになるまで。-------------------------------------------------------------
End_Flg = False: Next_Flg = False

Do Until End_Flg = True
    '開いたIEドキュメントをSetする。
    Set htdoc = IE.Document
    
     n = 0  'タグの数
     
    
    'タグ数174以降のSecionタグに求人情報があるので取得。
    For Each JobOffer_anchor In htdoc.DocumentElement.all
        
        n = n + 1
        
        If n > 174 Then
            If JobOffer_anchor.tagName = "SECTION" Then
                'Debug.Print zaiko_anchor.innerText
                r = r + 1
                Range("a" & r) = JobOffer_anchor.innerText
                
            End If
        End If
        
    Next JobOffer_anchor
    
    
    
    
    '次のページへをクリックする。
    For Each JobOffer_anchor In htdoc.getElementsByTagName("A")
        If InStr(JobOffer_anchor.className, "c-icon c-icon-other c-navBtn c-navBtn-next p-paging_btn_in ver3") > 0 Then
            JobOffer_anchor.Click
            
            'ieを開く処理後のスリープ処理(クリックを効かせるため)
            Application.Wait Now + TimeValue("00:00:02")
            
            'ieを開く待ち時間の処理
            Do While IE.Busy Or IE.ReadyState < READYSTATE_COMPLETE
                'Debug.Print IE.Busy & ":" & IE.ReadyState
                DoEvents
            Loop
            
            ms = IE.LocationURL
            
            '取得済のIEデータを初期化。
            Next_Flg = True
            Set htdoc = Nothing
            Exit For
            
        ElseIf InStr(JobOffer_anchor.className, "c-icon c-icon-other c-navBtn c-navBtn-prev p-paging_btn_in ver3") > 0 Then
        
            End_Flg = True
            
        End If
    Next
    
    'すべての要素を検索しても、次ページがない場合はループを抜ける。
    If Next_Flg = False Then: End_Flg = True
    
Loop


'処理時間の計測-----------------------------------------------------------------------------------
endTime = Timer
processTime = endTime - startTime

MsgBox "end 処理時間=" & processTime
'__________________________________________________________________________________________________

End Sub


使用手順
 上記のモジュール「IE_OPEN」を実行。求人ボックス(エクセルVBA 東京都で検索したサイト)をIEで開く。

 以上。
 
 次のページがなくなるまで、処理をする。
 エクセルシートに求人データが転記される。
 池袋で検索!

コード作成での気づき

 1 タグ数174以降に求人情報が入っている。
   *これに気づくためには、HTMLDocumentをすべてシートに書き出して分析する必要があります。
    以下に、すべてのHTMLDocumentをシートに書き出すモジュールを記載しておきます。


すべてのHTMLDocumentをシートに書き出すコード

Sub make_Ichiran()

Dim IE As InternetExplorer
Dim htdoc As HTMLDocument

Dim n As Long
Dim objTAG As Object

On Error Resume Next

n = 0


'サイトにアクセス----------------------------------------------------------------------------------
Set IE = CreateObject("internetexplorer.application")

'internetexplrerの可視化
IE.Visible = True

'求人ボックスのエクセルVBAで検索
IE.Navigate "https://xn--pckua2a7gp15o89zb.com/Excel-VBA-%E7%B5%8C%E9%A8%93%E8%80%85%E3%81%AE%E4%BB%95%E4%BA%8B-%E6%9D%B1%E4%BA%AC%E9%83%BD"

'ieを開く待ち時間の処理
Do While IE.Busy Or IE.ReadyState < READYSTATE_COMPLETE
    'Debug.Print IE.Busy & ":" & IE.ReadyState
    DoEvents
Loop

Set htdoc = IE.Document
'__________________________________________________________________________________________________

For Each objTAG In htdoc.DocumentElement.all
    n = n + 1
    Cells(n + 2, 1) = IE.Name
    Cells(n + 2, 4) = "'" & TypeName(objTAG)
    Cells(n + 2, 5) = "'" & objTAG.tagName
    Cells(n + 2, 6) = n
    Cells(n + 2, 7) = objTAG.Name
    Cells(n + 2, 8) = "'" & Left(objTAG.innerText, 256)
    Cells(n + 2, 9) = "'" & Left(objTAG.innerHTML, 256)
    Cells(n + 2, 10) = "'" & Left(objTAG.outerHTML, 256)
    
Next

MsgBox "end"

End Sub

2 SECTONタグに求人情報のまとめたものがある。
3 次のページをクリックした後に、2秒処理待ちを加えないと次のデータに更新されない。

まとめ

 以上になります。ネット情報のちまちま検索から卒業できそうな兆しが見えました。
 DB上にするには、もう少し処理に工夫が必要ですがそこまでは求めていなかったのでSECTONをそのまま転記しました。
 WEBスクレイピングは、サイトごとに分析をしてから、処理方法を決める必要があるので作るまでは時間がかかりますが、作った後はすごい楽です。