前两天在网上偶然看到一个大佬OmegaXYZ写的文章,Python爬取微博文字与图片(不使用Cookie)

于是就心血来潮,顺手撸一个C#版本的。

其实原理也很简单,现在网上大多数版本都需要Cookie来获取微博数据。但是微博之前不是出了PWA版本嘛,就是通过这个版本,可以不用Cookie,来顺利获取微博数据。

关于使用Cookie与不使用Cookie的区别,dataabc大佬也有说明,下面是原文引用

  1. 对于大部分微博用户,不添加cookie也可以获取其用户信息和大部分微博,不同的微博获取比例不同。以202012日迪丽热巴的微博为例,
    此时她共有1085条微博,在不添加cookie的情况下,可以获取到1026条微博,大约占全部微博的94.%,而在添加cookie后,可以获取全部微博。
    其他用户类似,大部分都可以在不添加cookie的情况下获取到90%以上的微博,在添加cookie后可以获取全部微博。
    具体原因是,大部分微博内容都可以在移动版匿名获取,少量微博需要用户登录才可以获取,所以这部分微博在不添加cookie时是无法获取的。
    有少部分微博用户,不添加cookie可以获取其微博,无法获取其用户信息。对于这种情况,要想获取其用户信息,是需要cookie的。

dataabc大佬,也是用万能的Python写了两个版本,一个是需要Cookie,一个是不需要Cookie的。

而且使用方法写的非常详细。有需要的可以去Github膜拜。

这里贴一下我亲自运行的结果:

而开头提到OmegaXYZ大佬,也是在他自己的版本上更上一层,给Python代码加上了GUI界面,更适合大众小白用户。

原文地址:python微博爬虫GUI程序

好了,介绍完大佬们写的作品,接下来就说一下我自己的C#版本吧。

由于我在爬虫领域属于纯小白,一窍不通,所以并不懂什么爬虫(Spider)、反爬虫(Anti-Spider)、反反爬虫(Anti-Anti-Spider)。

不过在爬虫与反爬虫的斗争中,爬虫一定会胜利的,因为爬虫会进化为和真实用户一模一样的行为。

接下载我写的代码,是没有加入反反爬虫的,建议一跑起来,就立即终止,或者,加入一个Task.Delay(1000)之类的延时。

不要爬取的太快,容易被微博屏蔽ip!!!

不要爬取的太快,容易被微博屏蔽ip!!!

不要爬取的太快,容易被微博屏蔽ip!!!

即使被屏蔽也别慌,过一段时间就会恢复。

1. 获取用户的uid,构建基础url

uid即微博用户的唯一标识id,具体如何获取uid,可以查看前面二位大佬写的教程,这并不是本文的重点。

基础url是指我们通过这个,可以获取微博用户的基本信息,以及一个非常重要的字段:containerid

只有通过containerid才可以获取用户发的微博。

一个完整的实例Url:

  1. string strBaseUrl = "https://m.weibo.cn/api/container/getIndex?type=uid&value=1197191492";

2.通过HttpClient获取containerid

通过HttpClient,把strBaseUrl和uid拼接起来,我们就可以得到返回的json数据。

而我们需要的containerid就是在 res?.data?.tabsInfo?.tabs 下面。

  1. var res = await HttpHelper.GetAsync<UserSummary>(strBaseUrl);
  2. if(res != null && res?.ok == )
  3. {
  4. if(res?.data?.tabsInfo?.tabs != null)
  5. {
  6. foreach(var item in res?.data?.tabsInfo?.tabs)
  7. if(item.tab_type == "weibo")
  8. {
  9. strContainerId = item.containerid;
  10. break;
  11. }
  12. }
  13. }

3. 拼接基础url、containerid、page获取分页微博信息。

拼接上面的参数,一个完整的示例:

  1. https://m.weibo.cn/api/container/getIndex?type=uid&value=1197191492&containerid=1076031197191492&page=1

这里我通过自己的理解区分了三种微博类型:

①包含图片:

判断 home?.data?.cards[j].mblog.pics != null

②包含视频:

判断 home?.data?.cards[j].mblog.page_info != null && home?.data?.cards[j].mblog.page_info.type == "video"

③文字:

不是①和②的

不过应该还有其他的类型,我还没仔细分析。

C#代码:

  1. string strWeiboUrl = strBaseUrl + "&containerid=" + strContainerId + "&page=";
  2. int i = ;
  3. while(true)
  4. {
  5. var home = await HttpHelper.GetAsync<UserHome>(strWeiboUrl + i.ToString());
  6. if (home != null && home?.ok == && home?.data != null && home?.data?.cards?.Count > )
  7. {
  8. Debug.WriteLine("---第" + i + "页---");
  9.  
  10. for (int j = ; j <= home?.data?.cards.Count - ; j++)
  11. {
  12. if(home?.data?.cards[j].card_type == )
  13. {
  14. Debug.WriteLine("第" + (j + ) + "条微博---");
  15. Debug.WriteLine("微博原始地址:" + home?.data?.cards[j].scheme);
  16. if(home?.data?.cards[j].mblog != null)
  17. {
  18. Debug.WriteLine("发布日期:" + home?.data?.cards[j].mblog.created_at
  19. + ";转发数:" + home?.data?.cards[j].mblog.reposts_count
  20. + ";评论数:" + home?.data?.cards[j].mblog.comments_count
  21. + ";点赞数:" + home?.data?.cards[j].mblog.attitudes_count);
  22. if (!string.IsNullOrEmpty(home?.data?.cards[j].mblog.source))
  23. Debug.WriteLine("来自:" + home?.data?.cards[j].mblog.source);
  24. Debug.WriteLine("微博内容:" + home?.data?.cards[j].mblog.text);
  25. if(home?.data?.cards[j].mblog.pics != null)
  26. {
  27. Debug.WriteLine("微博类型:picture");
  28. foreach (var item in home?.data?.cards[j].mblog.pics)
  29. Debug.WriteLine(item.large.url);
  30. }
  31. else if(home?.data?.cards[j].mblog.page_info != null && home?.data?.cards[j].mblog.page_info.type == "video")
  32. {
  33. Debug.WriteLine("微博类型:" + home?.data?.cards[j].mblog.page_info.type);
  34. Debug.WriteLine(home?.data?.cards[j].mblog.page_info.media_info.mp4_hd_url);
  35. }
  36. else
  37. {
  38. Debug.WriteLine("微博类型:text");
  39. }
  40.  
  41. //转发的还是原创的
  42. if(home?.data?.cards[j].mblog.retweeted_status == null)
  43. {
  44. Debug.WriteLine("原创的微博");
  45. }
  46. else
  47. {
  48. Debug.WriteLine("转发的微博");
  49. Debug.WriteLine("原文作者:" + home?.data?.cards[j].mblog.retweeted_status.user.screen_name);
  50. Debug.WriteLine("原文内容:" + home?.data?.cards[j].mblog.retweeted_status.text);
  51. }
  52. }
  53. Debug.WriteLine("");
  54. }
  55. }
  56.  
  57. i++;
  58. Debug.WriteLine("");
  59. Debug.WriteLine("");
  60. Debug.WriteLine("");
  61. }
  62. else
  63. break;
  64. }

4. 最终效果

运行后,记得赶快停掉,别爬太多数据,容易被封。

后续我会研究如使用反反爬虫机制,防止被封。

C#爬取微博文字、图片、视频(不使用Cookie)的更多相关文章

  1. 爬虫---爬取b站小视频

    前面通过python爬虫爬取过图片,文字,今天我们一起爬取下b站的小视频,其实呢,测试过程中需要用到视频文件,找了几个网站下载,都需要会员什么的,直接写一篇爬虫爬取视频~~~ 分析b站小视频 1.进入 ...

  2. Python爬虫训练:爬取酷燃网视频数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 项目目标 爬取酷燃网视频数据 https://krcom.cn/ 环境 Py ...

  3. 用WebCollector爬取站点的图片

    用WebCollector爬取整站图片,仅仅须要遍历整站页面.然后将URL为.jpg.gif的页面(文件)保存到本地就可以. 比如我们爬取一个美食站点,获取里面全部的图片: import cn.edu ...

  4. python 爬虫入门----案例爬取上海租房图片

    前言 对于一个net开发这爬虫真真的以前没有写过.这段时间学习python爬虫,今天周末无聊写了一段代码爬取上海租房图片,其实很简短就是利用爬虫的第三方库Requests与BeautifulSoup. ...

  5. Python-王者荣耀自动刷金币+爬取英雄信息+图片

    前提:本文主要功能是 1.用python代刷王者荣耀金币 2.爬取英雄信息 3.爬取王者荣耀图片之类的. (全部免费附加源代码) 思路:第一个功能是在基于去年自动刷跳一跳python代码上面弄的,思路 ...

  6. from appium import webdriver 使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium)

    使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium) - 北平吴彦祖 - 博客园 https://www.cnblogs.com/stevenshushu/p ...

  7. 使用Python爬虫爬取网络美女图片

    代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...

  8. 第一个nodejs爬虫:爬取豆瓣电影图片

    第一个nodejs爬虫:爬取豆瓣电影图片存入本地: 首先在命令行下 npm install request cheerio express -save; 代码: var http = require( ...

  9. 【网络爬虫】【java】微博爬虫(一):小试牛刀——网易微博爬虫(自定义关键字爬取微博数据)(附软件源码)

    一.写在前面 (本专栏分为"java版微博爬虫"和"python版网络爬虫"两个项目,系列里所有文章将基于这两个项目讲解,项目完整源码已经整理到我的Github ...

随机推荐

  1. 吴裕雄--天生自然python机器学习:基于支持向量机SVM的手写数字识别

    from numpy import * def img2vector(filename): returnVect = zeros((1,1024)) fr = open(filename) for i ...

  2. Codeforces Round #599 (Div. 2)D 边很多的只有0和1的MST

    题:https://codeforces.com/contest/1243/problem/D 分析:找全部可以用边权为0的点连起来的全部块 然后这些块之间相连肯定得通过边权为1的边进行连接 所以答案 ...

  3. 感叹号在Linux bash中使用技巧

    1. 重复执行上一条指令  !! [root@iZ23t6nzr7dZ python]# ls /usr/local/ aegis bin etc games include lib lib64 li ...

  4. orthologs|paralogs

    从这里我们可以举例说明,例如人的S100A8基因与猪的S100A8基因即为orthologs.人的a球蛋白和b球蛋白基因即为paralogs.需要补充的是,人的a球蛋白和鼠的b球蛋白基因也为paral ...

  5. python之接口自动化测试框架

    梳理python+unittest接口自动化测试框架的思路: 1.确定目录: cases:存放测试用例的py文件:config:存放一些数据库,环境地址等固定不变的信息: core:核心的文件, ca ...

  6. 数据中台技术汇(二)| DataSimba系列之数据采集平台

    继上期数据中台技术汇栏目发布DataSimba——企业级一站式大数据智能服务平台,本期介绍DataSimba的数据采集平台. DataSimba采集平台属于DataSimba的数据计算及服务平台的一部 ...

  7. python使用geopandas和shapely处理shp文件

    一.环境搭建 所需库:geopandas (以及前置库)  doc:http://geopandas.org/ shapely(以及前置库)  doc: 二.数据预处理 1.将shp文件进行切片 2. ...

  8. [LC] 92. Reverse Linked List II

    Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n ≤ length of list. Exa ...

  9. spring xml 注入 map 时 map 标签报错

    如图所示: 在XML配置文件中并没有问题,问题出在实体类,在类中属性 maps 用 Map定义即可,用HashMap定义就会出现如上错误 K-I-N-G-D-O-M

  10. Microsoft Hyperlapse——让第一人称视频更快更流畅

    Hyperlapse--让第一人称视频更快更流畅" title="Microsoft Hyperlapse--让第一人称视频更快更流畅"> 职业摄影师Nick Di ...