上一篇博文新浪微博数据爬取Part 1:用户个人信息介绍了如何爬取用户个人资料,使用了BeautifulSoup以及正则表达式,最后得到了与用户有关的14个字段。在这篇文章里,将继续介绍如何爬取微博数据,爬取的内容包括用户的粉丝、用户的关注者、用户个人发表的微博三部分信息。博主知道,没有完整的项目源码支持,对于初学者来说,确实是一件不容易的事。所以,笔者打算先将每个部分的代码单独抽取出来,等到下一篇附上源码的同时,介绍如何运行整个爬虫项目。
本文继续使用第二种方法进行数据爬取,与登录有关的信息,此处就不重复介绍了,读者可参考前面的文章模拟新浪微博登录:从原理分析到实现 AND 新浪微博数据爬取Part 1:用户个人信息。
说明一下,以下所有方法都是写在SinaClient类中,关于SinaClient类所有方法,本文不会细说,不过会在后续文章中给出,还请见谅。
获取用户关注者
登录微博之后,可以使用浏览器观察某个用户关注者的url链接,最后你会发现,用户1669282904
的关注者url为http://weibo.cn/1669282904/follow?page=1,后面的page=1
为参数,所以我们需要做的就是获取所有page的源码,并将关注着的uid取出来,然后合并到一起。整个代码如下:
1 | #爬取单个用户的follow,ulr = http://weibo.cn/%uid/follow?page=1 |
温馨提示:在获取用户关注者时,有的用户因不明原因被sina确定为广告用户,所以不会显示出来,因此在得到的follows列表里,uid的总数会有所缩减。最后返回一个JSON字符串,包括uid、follow_ids两个字段,即:
1 | uid:用户ID |
获取用户粉丝
同理,可以使用浏览器观察某个用户粉丝的url链接,以用户1669282904
为例,粉丝的url链接为http://weibo.cn/1669282904/fans?page=1,后面的page=1
为参数,所以我们需要做的也是获取所有page的源码,并将用户粉丝的uid取出,最后合并到一起。整个代码如下:
1 | #获取用户粉丝对象UID列表 ulr = http://weibo.cn/%uid/fans?page=1 |
温馨提示:在获取用户粉丝时,有的用户同样因不明原因被sina确定为广告用户,所以不会显示出来,因此在得到的fans列表里,uid的总数会也有所缩减。最后返回一个JSON字符串,包括uid、fans_ids两个字段,即:
1 | uid:用户ID |
获取个人发表微博
为了获取用户发表的微博,我们同样需要知道显示微博的url,在这里我们使用的网址是http://weibo.cn/,该url内容相对而言易于爬取。值得一提的是,爬取时需要注意的细节比较多,尤其是用户发微博的时间,需要仔细斟酌。下面是获取用户tweets的源码,每个tweets结果包括用户ID、创建时间、评论数、转发数、内容、发表来源、转发理由、点赞量、tweets类型(转发、原创)等字段。完整的代码如下:
1 | """ |
getUserTweets 方法传入三个参数,外部调用时只需传入前两个参数即可,一个是uid,一个是类型为list的tweets_list。最后返回就是该list,每个元素都是一个JSON字符串,字段如下:
1 | uid:用户ID |
结果
根据上面的代码运行可得到如下样例结果:
1.getUserFollows
1 | {"follow_ids": ["6049590367", "2239044693", "1974808274", "1674175865"], "uid": "1669282904"} |
2.getUserFans
1 | {"fans_ids": ["5883245860", "3104658267"], "uid": "1669282904"} |
3.getUserTweets
1 | {"uid": "1669282904", "created_at": "2016-12-16 11:42:00", "comment_count": "0", "repost_count": "0", "content": "#\u5317\u4eac\u7a81\u53d1#\u3010\u96fe\u973e\u8fdb\u57ce\u4e86\u2026[\u6cea]\u3011@\u6c14\u8c61\u5317\u4eac \uff1a\u96fe\u973e\u5df2\u5230\u5317\u4eac\uff0c\u6b64\u523b\u80fd\u89c1\u5ea6\u5357\u5317\u5dee\u8ddd\u5f88\u5927\uff0c\u5357\u90e8\u6c61\u67d3\u7269\u6d53\u8f83\u9ad8\uff0c\u901a\u5dde\u3001\u95e8\u5934\u6c9f\u548c\u6d77\u6dc0\u8fd8\u80fd\u770b\u89c1\u84dd\u5929\uff0c\u4f46\u5927\u5174\u90e8\u5206\u5730\u533a\u80fd\u89c1\u5ea6\u5df2\u4e0d\u8db32\u516c\u91cc\u3002\u3002\u3002\u5927\u5bb6\u4e00\u5b9a\u8bb0\u5f97\u6234\u53e3\u7f69\uff0c\u8fd9\u51e0\u5929\u4e5f\u5c3d\u91cf\u4e0d\u8981\u5f00\u7a97\u901a\u98ce\u3002", "source": "iPhone 6s Plus", "reason": "\u6709\u79cd\u707e\u96be\u7247\u7684\u8d76\u811a[\u611f\u5192] ", "like_count": "0", "type": "repost_image"} |
匆忙之际赶出本文,篇幅有些简洁,代码部分只给出了核心内容,如有任何问题,可在下面留言。对于微博数据爬取的全部内容,将在下一篇文章中介绍,敬请期待!