python爬虫微博粉丝数据_Scrapy 爬取新浪微博数据分析男女粉丝数量
通过之前爬取新浪微博发现,无论通过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 爬取新浪微博数据分析男女粉丝数量相关推荐
- python爬虫之股票数据定向爬取
python爬虫之股票数据定向爬取 功能描述 目标:获取上交所和深交所所有股票的名称和交易的信息 输出:保存到文件中 技术路线:requests-bs4-re 前期分析 选取原则:股票的信息静态存在H ...
- python爬虫实现豆瓣数据的爬取
本文利用urllib在python3.7的环境下实现豆瓣页面的爬取! 用到的包有urllib与re两个模块,具体实现如下! import urllib.request import re import ...
- Python爬虫对json数据解析爬取
使用工具 PyCharm 2018.2.3 Anaconda Navigator Python 3.6 解析目标 [{"导航鸭 ♪(^∀^●)ノ": [{"name&qu ...
- Python 爬虫实战,模拟登陆爬取数据
Python 爬虫实战,模拟登陆爬取数据 从0记录爬取某网站上的资源连接: 模拟登陆 爬取数据 保存到本地 结果演示: 源网站展示: 爬到的本地文件展示: 环境准备: python环境安装 略 安装r ...
- Python爬虫--笔趣阁小说爬取
Python爬虫–笔趣阁小说爬取 爬虫用到的插件 import requests from lxml import etree 小说目录页 以小说"我有百万技能点"为例,在笔趣阁搜 ...
- python爬虫入门练习:BeautifulSoup爬取猫眼电影TOP100排行榜,pandas保存本地excel文件
传送门:[python爬虫入门练习]正则表达式爬取猫眼电影TOP100排行榜,openpyxl保存本地excel文件 对于上文使用的正则表达式匹配网页内容,的确是有些许麻烦,替换出现任何的差错都会导致 ...
- python爬虫 - 起点女生榜单爬取 - 1
python爬虫 - 起点女生榜单爬取 最近一直在追庆余年,顺带瞄了一眼小说,真真是精彩(虽然因为范闲多妻的设定接受不了就放弃了). 说来说去,还是钟爱女频的修仙小说,所以就想爬一下起点女生网 ...
- Python爬虫实战系列(一)-request爬取网站资源
Python爬虫实战系列(一)-request爬取网站资源 python爬虫实战系列第一期 文章目录 Python爬虫实战系列(一)-request爬取网站资源 前言 一.request库是什么? 二 ...
- python爬虫实战(一)--爬取知乎话题图片
原文链接python爬虫实战(一)–爬取知乎话题图片 前言 在学习了python基础之后,该尝试用python做一些有趣的事情了–爬虫. 知识准备: 1.python基础知识 2.urllib库使用 ...
最新文章
- 交叉编译VIM并移植到ARM嵌入式Linux系统
- 基于python的文件传输程序_7个步骤,教你快速学会用python实现ftp文件传输功能(收藏了)...
- Caused by: java.sql.SQLException: GC overhead limit exceeded处理百万数据出现的异常
- 英语什么意思_“你什么意思”用英语怎么说?千万不要说成“What#39;s your meaning?”...
- QtJava笔记-Qt与Java进行SSL双向认证(Qt服务端,Java客户端)
- 2天驾驭div+css_老婆竟然只知道几个css伪类,不行得惩罚她了
- sql中变量用法_SQL变量:基础和用法
- Delphi Open Tools Api实例研究(一)
- 阿里云服务器Ubuntu16.04安装Anaconda(python3.6)和本地远程连接jupyter
- C/C++[PAT B level 1036]图形输出
- js配合css3开发流畅的web拾色器功能
- FreeSurfer和FSL的安装和使用(脑部图像去除头骨+对图像和label同时进行仿射对齐)教程
- 国科大数据挖掘课程总结
- MySQL auto_increment介绍及自增键断层的原因分析
- thinkphp 之接收请求参数并过滤
- VUE项目SEO问题的解决
- 详谈京东的商品搜索系统架构设计
- 使用ASP.NET做购物网站
- 自己思考得到的结论在辩论中没有信服力?
- FTP协议中的登录 上传 下载 新建目录 删除目录 的wireshark包分析(一文看完TCP包分析,附源文件,ppt,操作视频)
热门文章
- 为什么越来越多的人转行学IT当程序员?
- ISO 16750.2-2012道路车辆电子电气部件的环境试验 第二部分
- Mp4文件缓冲问题解决方案
- okcc呼叫中心如何隐藏号码?
- 科士达STATIONAIR系列精密空调远程监控解决方案
- elasticsearch下载与安装
- [转载]【转】ArcGIS 10安装方法(对比流行的2种安装方法)||迅雷电驴下载
- h5 淘宝web登录注册1:1还原响应式页面源码
- 设置文本框 input [type=text] 的长度不超过固定值,输入的字符不超过固定值
- 【材料-化学】专题合集:CP2k、gaussian、lammps、reaxff