ホーム > カテゴリ > Delphi・Lazarus >

ユーザーエージェントを偽装してWebスクレイピングをする

Webサイトから自動的に情報を抽出する「Webスクレイピング」ですが、IEやChrome、FireFoxなどの「ユーザーエージェント」を設定しないとサーバーから拒否されてURLにアクセスできない場合があります。Webスクレイピングのコードが既にある方は、一行のコードを変更する事でユーザーエージェントを偽装してWebスクレイピングをする事が可能となります。

Webスクレイピングのサンプルコード

WebスクレイピングのサンプルコードはDelphiという言語で使用できる関数にしました。C言語や.NET FrameworkやJavaなどでも手法は同様です。適宜、変更して下さいね。

// HTMLを取得する
function getHTML(url:String):String;
var
  hWinInet,hUrl :HINTERNET ;
  Buffer : Array[0..1023] of Char;
  ReadCount,Filesize : DWORD; 
  p   : Pointer;
  Mem : TMemoryStream;
  html: String;
begin
  html := '';  filesize :=0;
  Mem  := TMemoryStream.Create;

  // WinInet関数のアプリケーションの使用を初期化
  // ※ユーザーエージェントはIE11 Windows7(64bit)
  hWinInet :=InternetOpen('Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',
                          INTERNET_OPEN_TYPE_PRECONFIG,
                          nil, nil, 0);
  try
    if Assigned(hWinInet) then
    begin
        // FTPまたはHTTPのURLに接続
        hUrl :=InternetOpenUrl(hWinInet,PChar(url),
                               nil, 0,INTERNET_FLAG_RELOAD, 0);
        try
          if Assigned(hUrl) then
          begin
              while true do
              begin
                  // 指定バイト数づつファイルを読み込む
                  InternetReadFile(hUrl, @Buffer, Sizeof(Buffer), ReadCount);

                  // ファイルの終端でループを抜ける
                  if ReadCount = 0 then Break;

                  // 読み込んだファイル情報の格納
                  Filesize := Filesize + ReadCount;
                  Mem.Write(Buffer,ReadCount);
              end;

              if (Mem.size<>0) then
              begin
                  GetMem(p,Filesize);
                  try
                      Mem.Position:=0;
                      Mem.ReadBuffer(p^,Filesize);

                      // UTF8をSjisに変換
                      // html :=Utf8NToSjis(pchar(p)) ;
                      html := pchar(p);
                  finally
                      FreeMem(p);
                  end;
              end;
          end;
        finally
          InternetCloseHandle(hUrl);
        end;
    end;
  finally
    InternetCloseHandle(hWinInet);
    Mem.Free;
  end;
  Result := html;
end;

[使用例]

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.text := getHTML('URLを記述');
end;

[実行例]

ユーザーエージェントを偽装する

本題のユーザーエージェントを偽装する部分ですが、InternetOpenの第一引数に任意の「ユーザーエージェント」を指定します。

サンプルでは「Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko」が記述されていますが、これは「IE11、Windows7 64bit」との意味となります。

一般的なユーザーエージェントは次の通りです。

[Microsoft Edge Windows 10 32bit]

Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240

[Microsoft Edge Windows 10 64bit]

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240

[IE11 Windows 8.1 32bit]

Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko

[IE11 Windows 8.1 64bit]

Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko

[IE11 Windows 7 32bit]

Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko

[IE11 Windows 7 64bit]

Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko

以上となります。

注意事項

Webスクレイピングは対象サイトの利用規約やrobots.txt、または関連法律などを遵守して各自の責任において実行するようにして下さい。この記事の執筆者及び運営者は一切の責任を負いませんのでご了承ください。

参考サイト

Webスクレイピングの注意事項一覧
Webスクレイピングのノウハウを公開します(PHP用)





関連記事



公開日:2015年09月16日
記事NO:01359