利用UnityWebRequest进行网页爬取和内容解析的技巧
  2023/8/8 17:54:47
  网络爬虫已经被广泛应用在各行各业。通过爬取网站的数据,我们可以获取到海量信息,对于一些需要数据支持的项目来说,网络爬虫也成为了必不可少的一部分。在Unity游戏开发中,UnityWebRequest提供了一种简单、高效的方式来进行网页爬取和内容解析。
一、UnityWebRequest的基本使用
UnityWebRequest是Unity提供的一个网络请求工具,可以使用它获取网络数据。下面我们来看一下简单的使用示例。
IEnumerator GetHtml()
{ UnityWebRequest uwr = UnityWebRequest.Get("https://www.example.com");
  yield return uwr.SendWebRequest();
  if (uwr.result == UnityWebRequest.Result.Success)string html=uwr.downloadHandler.text;
}

在这个示例中,我们首先实例化了UnityWebRequest,并传入了一个网站地址。接着使用yield关键字等待WebRequest的返回结果,然后我们判断结果是否成功,并获取到下载完成的html内容。
二、UnityWebRequest的高级使用
虽然简单的使用相对来说比较容易,但在实际开发中,我们需要对UnityWebRequest进行更多的操作,才能达到我们的需求。
1、设置请求头信息
在进行网络请求时,有时候我们需要在请求中加入一些头信息。比如设置Referer、User-Agent等信息,这些信息可以帮助我们模拟浏览器发送请求,防止被网站屏蔽。
IEnumerator GetHtmlWithHeader()
{  UnityWebRequest uwr = UnityWebRequest.Get("https://www.e.com");
  uwr.SetRequestHeader("Referer", "https://www.g.com");
  yield return uwr.SendWebRequest();
  if (uwr.result==UnityWebRequest.Result.Success)string html=uwr.downloadHandler.text;
}

在这个示例中,我们使用SetRequestHeader方法设置了一个Referer信息为https://www.g8.com。当我们进行网页爬取时,服务器可能会检测我们的来源,如果不加Referer信息,就会被禁止访问。
2、设置Cookie信息
在进行模拟登录或者需要进行用户验证的操作时,我们需要设置Cookie信息,来保证请求的有效性。UnityWebRequest提供了SetRequestHeader方法来设置Cookie信息。
IEnumerator Login()
{ string url = "https://www.example.com/login";
  string postData = "username=yourusername&password=yourpassword";
  byte[] data = Encoding.UTF8.GetBytes(postData);
  UnityWebRequest uwr = new UnityWebRequest();
  uwr.url = url; uwr.method = UnityWebRequest.kHttpVerbPOST;
  uwr.uploadHandler = new UploadHandlerRaw(data);
  uwr.downloadHandler = new DownloadHandlerBuffer();
  uwr.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  uwr.SetRequestHeader("Cookie", "mycookie=value");
  yield return uwr.SendWebRequest();
  if (uwr.result == UnityWebRequest.Result.Success)Debug.Log("Login Success!");
}

在这个示例中,我们通过设置请求方法和上传数据等信息,完成了模拟登录的操作,并且通过SetRequestHeader方法设置了Cookie信息。
3、设置超时时间
有时候,在进行网络爬取时,服务器返回信息不够及时,或者连接不太稳定,我们需要设置请求超时时间来保证请求的完成性。
IEnumerator GetHtmlWithTimeout()
{ UnityWebRequest uwr = UnityWebRequest.Get("https://www.example.com");
  uwr.timeout = 10;
  yield return uwr.SendWebRequest();
  if (uwr.result==UnityWebRequest.Result.Success)string html=uwr.downloadHandler.text;
}

在这个示例中,我们通过设置timeout属性来设置超时时间为10秒。
三、网页内容解析技巧
在进行网页爬取时,我们通常需要对网页的HTML内容进行解析,获取到我们所需要的数据。下面我们就来看一些网页内容解析的技巧。
1、使用正则表达式进行内容解析
正则表达式是用于匹配字符串的一种工具,可以通过它来简单地实现对HTML标签的解析
IEnumerator GetTitle()
{ UnityWebRequest uwr = UnityWebRequest.Get("https://www.example.com");
  yield return uwr.SendWebRequest();
  if (uwr.result == UnityWebRequest.Result.Success)
  { string html = uwr.downloadHandler.text;
    string pattern = @""; Match match = Regex.Match(html, pattern);
    if (match.Success)string title = match.Groups[1].Value;     
  }
}

在这个示例中,我们使用正则表达式匹配了网页中的title标签,并获得了它的内容。
2、使用HtmlAgilityPack进行内容解析
HtmlAgilityPack是一个开源的.NET库,可以过滤HTML解析器,可以让我们方便快捷地进行HTML标签的解析操作。Unity也可以通过引入HtmlAgilityPack进行HTML解析。
IEnumerator GetList()
{ UnityWebRequest uwr = UnityWebRequest.Get("https://www.example.com");
  yield return uwr.SendWebRequest();
  if (uwr.result == UnityWebRequest.Result.Success)
  {  string html = uwr.downloadHandler.text;
    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(html); List resultList = new List();
    foreach(HtmlNode node in doc.DocumentNode.SelectNodes("//div[@class='list-item']"))
    { string content = node.InnerText; resultList.Add(content); }
    foreach (string result in resultList)Debug.Log(result);   
  }
}

在这个示例中,我们使用HtmlAgilityPack来解析了网页中的一个列表,可以通过SelectNodes方法选择相应的节点进行解析。
3、使用JsonUtility进行内容解析
JsonUtility是Unity提供的一个json数据工具类,可以非常方便地进行json数据格式的解析。
[System.Serializable]
public class UserInfo
{  public string username; public int level; public string email; }
IEnumerator GetUser()
{ UnityWebRequest uwr = UnityWebRequest.Get("https://www.example.com/userinfo");
  yield return uwr.SendWebRequest();
  if (uwr.result == UnityWebRequest.Result.Success)
  { string json = uwr.downloadHandler.text;
    UserInfo userInfo = JsonUtility.FromJson(json);
    Debug.Log(userInfo.username+userInfo.level+userInfo.email);  }
}

示例中,我们通过JsonUtility和UserInfo类来解析了返回的json数据,并将数据赋值给相应属性,方便进行数据解析。
总结
通过本文的介绍,我们可以了解到UnityWebRequest作为网络请求库,在进行游戏开发中,可以方便快捷地进行网页爬取和数据解析功能。我们一定会在日常开发中使用到这些高级使用和解析技巧。
 [1] [2]

相关文章(向右看)..

·相关
unity使用GUI及时控制文字
unity控制物体运动标准代码
Unity如何使用HDRP,项目/图
阿帕奇或NG服务器架设PHP失败/图
nginx本地网站穿透与反向代理
u3D物体添加重力后总穿地下掉,/图
常用的Unity Math 函数/图
游戏模型突然部分透明解决方案/图
Unity:物体没有影子、影子闪
Unity中Update,Fix

·热点