分享

如何利用 C# 爬取带 Token 验证的网站数据?

 老马的程序人生 2020-08-17

在对文本数据的情感分析中,基于情感词典的方法是最简单也是最常用的一种了。

它的大体思路如下:

对文档分词,找出文档中的情感词、否定词以及程度副词,然后判断每个情感词之前是否有否定词及程度副词,将它之前的否定词和程度副词划分为一个组,如果有否定词将情感词的情感权值乘以-1,如果有程度副词就乘以程度副词的程度值,最后所有组的得分加起来,大于 0 的归于正向,小于 0 的归于负向。

这两天,学校的一个团队让我帮忙爬取某网站的两份带有权值的情感词典。

第一份是“台湾大学情感词汇库”,有 11086 个带有权值的情感词。

台湾大学情感词汇库

第二份是“萌泰情感词汇库”,有 27466 个带有权值的情感词。

萌泰情感词汇库

分析这个网站,我们发现每一个网络请求都需要携带 Token,即身份认证。

所以,我们需要先通过登陆请求,获取到该用户的 Token,之后的每次请求带上该 Token 才能爬取到该网站的数据。


为了快速完成爬取这两份情感词典的任务,我使用了两套开源代码,RestSharpNewtonsoft.Json

RestSharp

利用该开源代码可以得到网络请求之后的 Json 数据,其下载地址如下:

https://github.com/restsharp/RestSharp

RestSharp

Newtonsoft.Json

利用该开源代码可以对得到的 Json 数据进行反序列化,得到 C# 对应的类,其下载地址如下:

https://github.com/JamesNK/Newtonsoft.Json

Newtonsoft.Json

Newtonsoft.Json 这套开源代码,我在 如何利用 C# 爬取「猫眼电影专业版:票房」数据! 以及 如何做一款「桌面版百度翻译」软件? 中使用过,以前网络请求部分都是通过 HttpWebRequest直接写的,这次偷懒使用了 RestSharp 这套来源代码。

如果大家对这两套开源代码感兴趣,给我留言,我再来写几篇图文介绍它们,下面来看看爬取情感词典的代码。

1. 构造接收 Token 的类 UserInfor

public class Token
{

    public string token;
}

public class UserInfor
{

    public Token rt_info;
}

2. 得到登陆用户的Token数据。

public string GetToken(string baseUrl,string username,string password)
{
    string value = "{\"username\":\"" + username + "\",\"password\":\"" + password + "\"}";

    RestClient client = new RestClient(baseUrl);
    RestRequest request = new RestRequest(Method.POST);
    request.AddHeader("cache-control""no-cache");
    request.AddHeader("Content-Type""application/json;charset=UTF-8");
    request.AddParameter("application/json", value, ParameterType.RequestBody);

    IRestResponse response = client.Execute(request);
    StringReader sr = new StringReader(response.Content);
    JsonTextReader jsonReader = new JsonTextReader(sr);
    JsonSerializer serializer = new JsonSerializer();

    UserInfor user = serializer.Deserialize<UserInfor>(jsonReader);
    return user.rt_info.token;
}

3. 构造接收“情感词典”的类 JsonWord

public class Word
{
    public string word;
    public string score;
    public override string ToString()
    
{
        return word + "," + score;
    }
}

public class MapInfo
{
    public List<Word> words;
}

public class JsonWord
{
    public MapInfo rt_mapinfo;
}

4. 得到所需要的情感词典。

public List<Word> GetDictionary(string baseUrl,string token,int dictionaryId)
{
    string value = "{\"dictionaryId\":" + dictionaryId + ",\"name\":\"\",\"pageNow\":1,\"pageSize\":200000}";
    RestClient client = new RestClient(baseUrl);

    RestRequest request = new RestRequest(Method.POST);
    request.AddHeader("cache-control""no-cache");
    request.AddHeader("Content-Type""application/json");
    request.AddHeader("Authorization", token);
    request.AddParameter("application/json",value, ParameterType.RequestBody);

    IRestResponse response = client.Execute(request);
    StringReader sr = new StringReader(response.Content);
    JsonTextReader jsonReader = new JsonTextReader(sr);
    JsonSerializer serializer = new JsonSerializer();

    JsonWord r = serializer.Deserialize<JsonWord>(jsonReader);
    return r.rt_mapinfo.words;
}

5. 输出感情词典。

static void SaveToFile(List<Word> lst)
{
    string str = string.Empty;
    for (int i = 0; i < lst.Count; i++)
    {
        str += lst[i] + "\r\n";
    }

    string temp = Environment.GetEnvironmentVariable("TEMP");
    temp += "\\words.txt";
    StreamWriter sw = File.CreateText(temp);
    sw.Write(str);

    Process.Start(temp);
    sw.Close();
}

包含 11086 个词汇以及评分的“台湾大学情感词汇”爬取结果如下:

台湾大学情感词汇

包含 27466 个词汇以及评分的“蒙泰感情词汇”爬取结果如下:

蒙泰感情词汇

通过以上的介绍,如何利用 C# 爬取带 Token 验证的网站数据?就介绍完了,如果大家发现所要爬取的网站不能直接得到HTML DOM TREE,这个网站或许就是利用前后端分离技术完成的,如果这样的网站每一次请求都需要带Token,可以尝试使用我今天介绍的方法。好了,今天就到这里吧!See You!


    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多