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

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

作者: 老马的程序人生 | 来源:发表于2019-03-22 20:37 被阅读0次

    在情感分析中,基于情感词典的方法是最简单也是最常用的一种了。它的大概思路如下:

    对文档分词,找出文档中的情感词、否定词以及程度副词,然后判断每个情感词之前是否有否定词及程度副词,将它之前的否定词和程度副词划分为一个组,如果有否定词将情感词的情感权值乘以-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 的类。

    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. 构造接收“情感词典”的类。

    public class JsonWord
    {
        public MapInfo rt_mapinfo;
    }
    
    public class MapInfo
    {
        public List<Word> words;
    }
    
    public class Word
    {
        public string word;
        public string score;
        public override string ToString()
        {
            return word + "," + score;
        }
    }
    

    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!

    相关文章

      网友评论

          本文标题:如何利用 C# 爬取带 Token 验证的网站数据?

          本文链接:https://www.haomeiwen.com/subject/uvnrvqtx.html