通过之前爬取新浪微博发现,无论通过http://m.weibo.cn这里,还是http://weibo.cn这里,都没办法获取全部粉丝数据

那如果我想分析一个明星的男女粉丝数据怎么办,比如想知道某明星的男女粉丝占比,可以通过这样一个思路来解决这个问题采集该明星的所有微博

获取每条微博中 评论、点赞、转发 的用户id

根据id获取该用户数据(性别)

用户数据 存储到数据库中

存储到数据库中的用户数据允许重复,出现过一次该用户数据就代表他进行过 评论、点赞、转发 某一项中的一次 ;凡是有参与过的亲密值加一,当这个值超过一定限度时(比如说10或者20),我们就认为该用户是该明星的粉丝

在http://m.weibo.cn站点中 所发所有微博url还是很容易获取

start_urls = ['https://m.weibo.cn/api/container/getIndex?containerid=1076031223178222&page={}' .format(i) for i in range(1, 376)]

这里我们爬取胡歌的粉丝为例,谁叫人们总说胡歌男粉多呢 containerid=1076031223178222 中 1223178222 为用户id,可以自行修改换成其他用户 id

这里可以看到一共有多少微博,一个url大概10条微博,可以试出来大概多少页

代码

import scrapy

import json

from scrapy import Request

from ..items import WeiboFansSpiderItem

class WeiboFansSpdSpider(scrapy.Spider):

name = 'weibo_fans_spd'

start_urls = ['https://m.weibo.cn/api/container/getIndex?containerid=1076031223178222&page={}'

.format(i) for i in range(1, 376)]

repost_url = 'https://m.weibo.cn/api/statuses/repostTimeline?id={}&page={}'

comment_url = 'https://m.weibo.cn/api/comments/show?id={}&page={}'

attitudes_url = 'https://m.weibo.cn/api/attitudes/show?id={}&page={}'

user_url = 'https://m.weibo.cn/api/container/getIndex?type=uid&value={}'

def parse(self, response):

data = json.loads(response.text)

if data.get('ok') == 1:

weibos = data.get('data').get('cards')

for weibo in weibos:

mblog = weibo.get('mblog')

if mblog:

mid = mblog.get('mid')

# 转发

yield scrapy.Request(self.repost_url.format(mid, 1), callback=self.parse_repost, meta={'mid': mid, 'page': 1})

# 评论

yield scrapy.Request(self.comment_url.format(mid, 1), callback=self.parse_comment, meta={'mid': mid, 'page': 1})

# 点赞

yield scrapy.Request(self.attitudes_url.format(mid, 1), callback=self.parse_attitudes, meta={'mid': mid

处理转发

转发页面中可以直接获取用户详细数据

# 转发

def parse_repost(self, response):

data = json.loads(response.text)

if data['ok'] == 1:

for i in data.get('data').get('data'):

item = WeiboFansSpiderItem()

item['id'] = i.get('user').get('id')

item['statuses_count'] = i.get('user').get('statuses_count')

item['screen_name'] = i.get('user').get('screen_name')

item['profile_url'] = i.get('user').get('profile_url')

item['description'] = i.get('user').get('description')

item['gender'] = i.get('user').get('gender')

item['followers_count'] = i.get('user').get('followers_count')

item['follow_count'] = i.get('user').get('follow_count')

yield item

mid = response.meta['mid']

page = response.meta['page'] + 1

yield Request(self.repost_url.format(mid, page),

callback=self.parse_repost, meta={'page': page, 'mid': mid})

处理评论及点赞

评论或点赞中获取到id后,需要Ruquest 到 def parse_user 中获取详细用户数据

# 评论

def parse_comment(self, response):

data = json.loads(response.text)

if data['ok'] == 1:

for i in data.get('data').get('data'):

id = i.get('user').get('id')

yield Request(self.user_url.format(id), callback=self.parse_user)

mid = response.meta['mid']

page = response.meta['page'] + 1

yield Request(self.comment_url.format(mid, page),

callback=self.parse_comment, meta={'page': page, 'mid': mid})

# 点赞

def parse_attitudes(self, response):

data = json.loads(response.text)

if data['ok'] == 1:

for i in data.get('data').get('data'):

id = i.get('user').get('id')

yield Request(self.user_url.format(id), callback=self.parse_user)

mid = response.meta['mid']

page = response.meta['page'] + 1

yield Request(self.attitudes_url.format(mid, page),

callback=self.parse_attitudes, meta={'page': page, 'mid': mid})

处理用户数据

# 用户数据

def parse_user(self, response):

data = json.loads(response.text)

if data['ok'] == 1:

item = WeiboFansSpiderItem()

item['id'] = data.get('data').get('userInfo').get('id')

item['statuses_count'] = data.get('data').get('userInfo').get('statuses_count')

item['screen_name'] = data.get('data').get('userInfo').get('iscreen_named')

item['profile_url'] = data.get('data').get('userInfo').get('profile_url')

item['description'] = data.get('data').get('userInfo').get('description')

item['gender'] = data.get('data').get('userInfo').get('gender')

item['followers_count'] = data.get('data').get('userInfo').get('followers_count')

item['follow_count'] = data.get('data').get('userInfo').get('follow_count')

yield item

处理数据

在mongodb中 运用aggregate方法 并生成一个新集合

db.getCollection('WeiboFansSpiderItem').aggregate(

[

{"$group" : {_id:{id:"$id"}, count:{$sum:1}}},

{$sort:{"count":-1}},

{ $out:"result_id"},

],

{

allowDiskUse:true,

cursor:{}

}

)

MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果

根据新生成的集合再进行处理

db.getCollection('result_id').find({'_id.gender':'f'}).count()

db.getCollection('result_id').find({'count':{'$gte':10},'_id.gender':'f'}).count()

我这里 代理ip时间有限 只爬取了11w+条数据就停止了爬取,只是做一个简单的参考吧原始数据 未根据id进行去重处理数据--------------男粉丝占比%32.74,女粉丝占比%67.26

根据id进行去重处理数据--------------------------男粉丝占比%33.67,女粉丝占比%66.33

亲密度大于10的粉丝-----------------------------男粉丝占比%25.30,女粉丝占比%74.70

谁说胡歌男粉多来着?

python爬虫微博粉丝数据_Scrapy 爬取新浪微博数据分析男女粉丝数量相关推荐

  1. python爬虫之股票数据定向爬取

    python爬虫之股票数据定向爬取 功能描述 目标:获取上交所和深交所所有股票的名称和交易的信息 输出:保存到文件中 技术路线:requests-bs4-re 前期分析 选取原则:股票的信息静态存在H ...

  2. python爬虫实现豆瓣数据的爬取

    本文利用urllib在python3.7的环境下实现豆瓣页面的爬取! 用到的包有urllib与re两个模块,具体实现如下! import urllib.request import re import ...

  3. Python爬虫对json数据解析爬取

    使用工具 PyCharm 2018.2.3 Anaconda Navigator Python 3.6 解析目标 [{"导航鸭 ♪(^∀^●)ノ": [{"name&qu ...

  4. Python 爬虫实战,模拟登陆爬取数据

    Python 爬虫实战,模拟登陆爬取数据 从0记录爬取某网站上的资源连接: 模拟登陆 爬取数据 保存到本地 结果演示: 源网站展示: 爬到的本地文件展示: 环境准备: python环境安装 略 安装r ...

  5. Python爬虫--笔趣阁小说爬取

    Python爬虫–笔趣阁小说爬取 爬虫用到的插件 import requests from lxml import etree 小说目录页 以小说"我有百万技能点"为例,在笔趣阁搜 ...

  6. python爬虫入门练习:BeautifulSoup爬取猫眼电影TOP100排行榜,pandas保存本地excel文件

    传送门:[python爬虫入门练习]正则表达式爬取猫眼电影TOP100排行榜,openpyxl保存本地excel文件 对于上文使用的正则表达式匹配网页内容,的确是有些许麻烦,替换出现任何的差错都会导致 ...

  7. python爬虫 - 起点女生榜单爬取 - 1

    python爬虫 - 起点女生榜单爬取 ​ 最近一直在追庆余年,顺带瞄了一眼小说,真真是精彩(虽然因为范闲多妻的设定接受不了就放弃了). ​ 说来说去,还是钟爱女频的修仙小说,所以就想爬一下起点女生网 ...

  8. Python爬虫实战系列(一)-request爬取网站资源

    Python爬虫实战系列(一)-request爬取网站资源 python爬虫实战系列第一期 文章目录 Python爬虫实战系列(一)-request爬取网站资源 前言 一.request库是什么? 二 ...

  9. python爬虫实战(一)--爬取知乎话题图片

    原文链接python爬虫实战(一)–爬取知乎话题图片 前言 在学习了python基础之后,该尝试用python做一些有趣的事情了–爬虫. 知识准备: 1.python基础知识 2.urllib库使用 ...

最新文章

  1. 交叉编译VIM并移植到ARM嵌入式Linux系统
  2. 基于python的文件传输程序_7个步骤,教你快速学会用python实现ftp文件传输功能(收藏了)...
  3. Caused by: java.sql.SQLException: GC overhead limit exceeded处理百万数据出现的异常
  4. 英语什么意思_“你什么意思”用英语怎么说?千万不要说成“What#39;s your meaning?”...
  5. QtJava笔记-Qt与Java进行SSL双向认证(Qt服务端,Java客户端)
  6. 2天驾驭div+css_老婆竟然只知道几个css伪类,不行得惩罚她了
  7. sql中变量用法_SQL变量:基础和用法
  8. Delphi Open Tools Api实例研究(一)
  9. 阿里云服务器Ubuntu16.04安装Anaconda(python3.6)和本地远程连接jupyter
  10. C/C++[PAT B level 1036]图形输出
  11. js配合css3开发流畅的web拾色器功能
  12. FreeSurfer和FSL的安装和使用(脑部图像去除头骨+对图像和label同时进行仿射对齐)教程
  13. 国科大数据挖掘课程总结
  14. MySQL auto_increment介绍及自增键断层的原因分析
  15. thinkphp 之接收请求参数并过滤
  16. VUE项目SEO问题的解决
  17. 详谈京东的商品搜索系统架构设计
  18. 使用ASP.NET做购物网站
  19. 自己思考得到的结论在辩论中没有信服力?
  20. FTP协议中的登录 上传 下载 新建目录 删除目录 的wireshark包分析(一文看完TCP包分析,附源文件,ppt,操作视频)

热门文章

  1. 为什么越来越多的人转行学IT当程序员?
  2. ISO 16750.2-2012道路车辆电子电气部件的环境试验 第二部分
  3. Mp4文件缓冲问题解决方案
  4. okcc呼叫中心如何隐藏号码?
  5. 科士达STATIONAIR系列精密空调远程监控解决方案
  6. elasticsearch下载与安装
  7. [转载]【转】ArcGIS 10安装方法(对比流行的2种安装方法)||迅雷电驴下载
  8. h5 淘宝web登录注册1:1还原响应式页面源码
  9. 设置文本框 input [type=text] 的长度不超过固定值,输入的字符不超过固定值
  10. 【材料-化学】专题合集:CP2k、gaussian、lammps、reaxff