前两天在网上偶然看到一个大佬 OmegaXYZ https://www.omegaxyz.com/ 写的文章, Python 爬取微博文字与图片 (不使用 Cookie) https://www.omegaxyz.com/2018/02/13/python_weibo/
于是就心血来潮, 顺手撸一个 C# 版本的.
其实原理也很简单, 现在网上大多数版本都需要 Cookie 来获取微博数据. 但是微博之前不是出了 PWA 版本嘛, 就是通过这个版本, 可以不用 Cookie, 来顺利获取微博数据.
关于使用 Cookie 与不使用 Cookie 的区别, https://github.com/dataabc 大佬也有说明, 下面是原文引用
对于大部分微博用户, 不添加 cookie 也可以获取其用户信息和大部分微博, 不同的微博获取比例不同. 以 2020 年 1 月 2 日迪丽热巴的微博为例,
此时她共有 1085 条微博, 在不添加 cookie 的情况下, 可以获取到 1026 条微博, 大约占全部微博的 94.56%, 而在添加 cookie 后, 可以获取全部微博.
其他用户类似, 大部分都可以在不添加 cookie 的情况下获取到 90% 以上的微博, 在添加 cookie 后可以获取全部微博.
具体原因是, 大部分微博内容都可以在移动版匿名获取, 少量微博需要用户登录才可以获取, 所以这部分微博在不添加 cookie 时是无法获取的.
有少部分微博用户, 不添加 cookie 可以获取其微博, 无法获取其用户信息. 对于这种情况, 要想获取其用户信息, 是需要 cookie 的.
dataabc 大佬, 也是用万能的 Python 写了两个版本, 一个是需要 Cookie, 一个是不需要 Cookie 的.
而且使用方法写的非常详细. 有需要的可以去 GitHub 膜拜.
这里贴一下我亲自运行的结果:
而开头提到 OmegaXYZ 大佬, 也是在他自己的版本上更上一层, 给 Python 代码加上了 GUI 界面, 更适合大众小白用户.
- var res = await HttpHelper.GetAsync<UserSummary>(strBaseUrl);
- if(res != null && res?.ok == 1)
- {
- if(res?.data?.tabsInfo?.tabs != null)
- {
- foreach(var item in res?.data?.tabsInfo?.tabs)
- if(item.tab_type == "weibo")
- {
- strContainerId = item.containerid;
- break;
- }
- }
- }
- C# 代码:
- string strWeiboUrl = strBaseUrl + "&containerid=" + strContainerId + "&page=";
- int i = 1;
- while(true)
- {
- var home = await HttpHelper.GetAsync<UserHome>(strWeiboUrl + i.ToString());
- if (home != null && home?.ok == 1 && home?.data != null && home?.data?.cards?.Count> 0)
- {
- Debug.WriteLine("--- 第" + i + "页 ---");
- for (int j = 0; j <= home?.data?.cards.Count - 1; j++)
- {
- if(home?.data?.cards[j].card_type == 9)
- {
- Debug.WriteLine("第" + (j + 1) + "条微博 ---");
- Debug.WriteLine("微博原始地址:" + home?.data?.cards[j].scheme);
- if(home?.data?.cards[j].mblog != null)
- {
- Debug.WriteLine("发布日期:" + home?.data?.cards[j].mblog.created_at
- + "; 转发数:" + home?.data?.cards[j].mblog.reposts_count
- + "; 评论数:" + home?.data?.cards[j].mblog.comments_count
- + "; 点赞数:" + home?.data?.cards[j].mblog.attitudes_count);
- if (!string.IsNullOrEmpty(home?.data?.cards[j].mblog.source))
- Debug.WriteLine("来自:" + home?.data?.cards[j].mblog.source);
- Debug.WriteLine("微博内容:" + home?.data?.cards[j].mblog.text);
- if(home?.data?.cards[j].mblog.pics != null)
- {
- Debug.WriteLine("微博类型: picture");
- foreach (var item in home?.data?.cards[j].mblog.pics)
- Debug.WriteLine(item.large.url);
- }
- else if(home?.data?.cards[j].mblog.page_info != null && home?.data?.cards[j].mblog.page_info.type == "video")
- {
- Debug.WriteLine("微博类型:" + home?.data?.cards[j].mblog.page_info.type);
- Debug.WriteLine(home?.data?.cards[j].mblog.page_info.media_info.mp4_hd_url);
- }
- else
- {
- Debug.WriteLine("微博类型: text");
- }
- // 转发的还是原创的
- if(home?.data?.cards[j].mblog.retweeted_status == null)
- {
- Debug.WriteLine("原创的微博");
- }
- else
- {
- Debug.WriteLine("转发的微博");
- Debug.WriteLine("原文作者:" + home?.data?.cards[j].mblog.retweeted_status.user.screen_name);
- Debug.WriteLine("原文内容:" + home?.data?.cards[j].mblog.retweeted_status.text);
- }
- }
- Debug.WriteLine("");
- }
- }
- i++;
- Debug.WriteLine("");
- Debug.WriteLine("");
- Debug.WriteLine("");
- }
- else
- break;
- }
来源: https://www.cnblogs.com/hupo376787/p/12434841.html