python微博爬虫分析_python爬取和分析新浪微博(一):scrapy构建新浪微博榜单、博主及微博信息爬虫...
1. 爬虫项目介绍
爬虫首先基于python scrapy 框架,使用了随机用户代理和IP代理等反爬技巧,将爬取到的微博领域数据,各领域榜单博主信息和博主的微博信息分别存入的mysql数据库对应的表格中。
查看爬虫完整代码请移步GitHub:QiliWu/sinaweibo_spidergithub.com
2. 爬虫逻辑
2.1 获取微博领域信息
首先爬取了V影响力榜列出的微博全部领域名称及对应的各领域微博榜单链接。
2.2 获取各领域榜单博主信息
分别进入各领域排行榜页面(以互联网为例),抓取4月 月榜 排名前100的博主相关信息。
分析上述网页发现,博主信息是通过单独请求json文件获得的。
请求的url地址为:
最后面__rnd字段的值起始为请求的时间戳
请求方式为POST, 发送的表单内容为:
其中type, date,domainId字段都可以在主页网址(互联网榜)的源码中获取到。
根据上述分析编写的请求代码如下:
def parse_domain_url(self, response):
match = re.match(r'.*?"currentDate":(\d+).*?"pagetype":"(\d+)".*?"domainId":(\d+).*', response.text, re.S)
date = match.group(1)
type = match.group(2)
domainId = int(match.group(3))
post_data = {'type': type,
'period': 'month',
'date': date,
'pagesize': '100', #一次请求100条博主信息
'page': '1',
'domainId': str(domainId),
'_t': '0'}
post_url = 'http://v6.bang.weibo.com/aj/wemedia/rank?ajwvr=6&__rnd={0}'
headers = {'Content-Type':'application/x-www-form-urlencoded',
'X-Requested-With': 'XMLHttpRequest',
'Referer':response.url}
yield FormRequest(url=post_url.format(int(time.time()*1000)),
method='POST',
formdata=post_data,
headers=headers,
callback=self.parse_domain_detail,
meta={'domainId':domainId})
2.3 获得博主个人主页和发表微博信息
获得每个博主的信息(包括博主的昵称,id, 粉丝数,关注数,微博数,性别,地址等信息)后,进入该博主的微博主页,爬取该博主最近的前60条微博信息(包括微博内容,发表日期,转发/点赞/评论数等信息)。
这里,请求每个博主主页url时,需要带上cookie信息,cookie的内容是固定的,可以通过手动操作浏览器请求一次随便一个博主主页获得。
cookies = {'SINAGLOBAL': '6766495850665.497.1501852555183',
'SUB': '_2AkMtfS1zf8NxqwJRmP0TzmziboRyywzEieKbIdyoJRMxHRl-yT9kqlEitRB6XNyh2MtIX_786TcqrC_9KhHomc2jrviO',
'SUBP': '0033WrSXqPxfM72-Ws9jqgMF55529P9D9WWTsTi36AWHDVnU2ITVs6AB',
'UM_distinctid': '1621ce4477d161-044b65bce7d5c1-b353461-100200-1621ce4477ecc',
'UOR': 'news.youth.cn,widget.weibo.com,www.baidu.com',
'_s_tentry': '-',
'Apache': '811175706409.3062.1526986486457',
'TC-Page-G0': '1e758cd0025b6b0d876f76c087f85f2c'}
yield Request(url=data['profile_url'],
cookies=cookies,
callback=self.parse_user_weibo,
meta={'useritem':useritem})
随后,分析博主微博主页发现,发表的微博内容信息又是通过单独请求json文件获得的。其中data键对应的值是一个字符串格式的html内容,里面包含了约15条微博的具体信息。
获取json文件的url为:
https://weibo.com/p/aj/v6/mblog/mbloglist?ajwvr=6&domain=100505&is_hot=1&pagebar=0&pl_name=Pl_Official_MyProfileFeed__20&id=1005051577826897&script_uri=/fenng&feed_type=0&page=1&pre_page=1&domain_op=100505&__rnd=1527403062839
url很长,其中domain,pl_name, page_id , script_uri字段值都可以通过分析博主微博主页的源码获得。而rnd同样为时间戳,pre_page字段为页码,逐渐递增的。
请求url的方式为GET。
所以请求的代码为:
def parse_user_weibo(self, response):
useritem = response.meta['useritem']
...
...
#请求微博内容的json数据
domain = re.match(r".*CONFIG\['domain'\]='(\d+?)'.*", response.text, re.S).group(1)
pl_name = re.match(r'.*domid":"(Pl_Official_MyProfileFeed__\d+)".*', response.text, re.S).group(1)
page_id = domain + useritem['uid']
script_uri = '/u/'+useritem['uid']
weibo_url = 'https://weibo.com/p/aj/v6/mblog/mbloglist?ajwvr=6&domain={0}&is_hot=1&pagebar={1}&pl_name={2}&id={3}&script_uri={4}&feed_type=0&page=1&pre_page=1&domain_op={0}&__rnd={5}'
#微博内容是json, 每页15条,爬取前60条
for pagebar in range(4):
yield Request(url=weibo_url.format(domain, pagebar, pl_name, page_id, script_uri, int(time.time()*1000)),
callback=self.parse_weibo_detail)
请求到json文件后,将data对应的值其转化为scrapy的Selector子类,即可使用css或者xpath选择器来从中获取想要的信息。
def parse_weibo_detail(self, response):
r = json.loads(response.text)
data = r['data']
selector = Selector(text=data)
weibolist = selector.css('div[action-type="feed_list_item"]')
for weibo in weibolist:
weiboitem = WeiboInfoItem()
...#详细内容见github源码
...
yield weiboitem
3. 爬虫代理设置
新浪微博的方法还是很厉害的,同一个ip多次请求后很快就被封了。所以本爬虫项目使用了随机更换user-agent和ip地址的方法来反爬。
3.1 随机user-agent
编写一个RandomUserAgentMiddleware中间件,使用fake-useragent第三方包生成一个UserAgent()实例,为每个ip随机生成一个user-agent。
3.2 随机ip
首先在蘑菇ip代理上都买付费的代理ip,生成一个包含5个ip的api链接,然后通过GetIP类对api链接返回的json文件进行处理,提取ip信息保存到mysql数据库中。然后scrapy在每次生成请求时都会向数据库随机请求一个有效的ip(通过请求http://ip.chinaz.com/getip.aspx网址来事先判断数据库ip的有效性)。
如此不停地变换ip地址发送请求,基本上不会被反爬。
4. 爬取结果
爬取到的结果通过twisted框架提供的方法异步保存到mysql数据库,微博领域,博主和微博内容信息分别存到weibotopic, topicuser, weiboinfo三个表格中。
weibotopic (共38个领域):
topicuser(共3648个用户,有些领域榜单上没有100个用户):
weiboinfo(共115740条微博)
5. 小结
以上就是基于V影响力榜单爬取新浪微博信息的爬虫介绍,具体代码在github上,欢迎查看,交流指教。
接下来,在文章wala qili:python爬取和分析新浪微博(二):微博影响力榜用户数据和微博内容的信息挖掘及可视化展示zhuanlan.zhihu.com
中,针对爬取到的数据信息,使用numpy, pandas对其进行了简单的统计分析,并通过可视化工具 matplotlib, wordcloud和basemap对分析结果进行了可视化展示。分析结果还是包含很多有意思的结论,欢迎继续关注。
python微博爬虫分析_python爬取和分析新浪微博(一):scrapy构建新浪微博榜单、博主及微博信息爬虫...相关推荐
- Python爬虫实战 | (1) 爬取猫眼电影官网的TOP100电影榜单
在本篇博客中,我们将使用requests+正则表达式来爬取猫眼电影官网的TOP100电影榜单,获取每部电影的片名,主演,上映日期,评分和封面等内容. 打开猫眼Top100,分析URL的变化:发现Top ...
- python分析b站_Python爬取并分析B站最热排行榜,我发现了这些秘密
现在大家的生活中,已经越来越离不开B站了,2020年的第一季度,B站月活跃用户达到了1.72亿,日活跃用户也已经突破了5000万个用户.源源不断的流量让B站的up主们也是粉丝数目不断暴涨,百万粉丝的u ...
- python爬取数据分析淘宝商品_python爬取并分析淘宝商品信息
python爬取并分析淘宝商品信息 Tip:本文仅供学习与交流,切勿用于非法用途!!! 背景介绍 有个同学问我:"XXX,有没有办法搜集一下淘宝的商品信息啊,我想要做个统计".于是 ...
- python微信点赞脚本_Python爬取微信公众号评论、点赞等相关信息
微信公众号爬虫方案分析(爬取文艺相处公众号) 之前考虑过使用搜狗微信来爬取微信公众号信息,不过搜狗提供的数据有诸多弊端,比如文章链接是临时的,文章没有阅读量等指标,所以考虑通过手机客户端利用 Pyth ...
- python爬取微博图片教程_Python爬取微博实例分析
引言 利用Ajax分析微博并爬取其内容如微博内容,点赞数,转发数,评论数等. 分析 打开陈一发微博网站:https://m.weibo.cn/p/1005051054009064,并同时打开开发者工具 ...
- python爬取微博恶评_Python爬取新浪微博评论数据,了解一下?
开发工具 **Python版本:**3.6.4 相关模块: argparse模块: requests模块: jieba模块: wordcloud模块: 以及一些Python自带的模块. 环境搭建 安装 ...
- python爬取微博用户关注_python爬取微博用户关注和粉丝的公开基本信息
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:TM0831 PS:如有需要Python学习资料的小伙伴可以加点击下 ...
- python爬取微博恶评_python爬取微博评论的实例讲解
python爬虫是程序员们一定会掌握的知识,练习python爬虫时,很多人会选择爬取微博练手.python爬虫微博根据微博存在于不同媒介上,所爬取的难度有差异,无论是python新入手的小白,还是已经 ...
- python电商数据挖掘_Python 爬取淘宝商品数据挖掘分析实战
作者 孙方辉 本文为CDA志愿者投稿作品,转载需授权 项目内容 本案例选择>> 商品类目:沙发: 数量:共100页 4400个商品: 筛选条件:天猫.销量从高到低.价格500元以上. 项目 ...
最新文章
- centos下如何停止ping命令
- 启动两个Tomcat的方法
- java按位取反“~“运算符,负数右移
- nginx php7提速,nginx+php7-fpm 性能提升几倍跟踪实践结果并优化
- FATE HDU - 2159(二维完全背包)
- 报名 | 全国知识图谱与语义计算大会(CCKS 2019)评测任务发布
- spss 卡方检验_SPSS篇—卡方检验
- linux系统中存放用户账号信息的文件是,信息安全技术题库:Linux系统中,用户登录密码的hash是存放在()文件中的。...
- c++ 输出格式控制
- AtomicInteger原子整形与ReentrantLock锁
- 性能测试--33Jvisualvm远程监控Linux服务器方案
- ipod nano7安装linux,怎么用ipod nano看视频?
- 一种基于GRU神经网络的英文诗歌生成系统
- AngularJS总结
- BRC4工具1.2.2入门教程学习
- pandas之数据文件导入和导出(python读取.csv,.txt,excel文件(.xlsx)以及导出为.csv、excel文件)
- 【word基础操作】如何在word中为公式编号
- 石墨笔记, Onenote 和 Effie 哪个适合 up 主?
- unlikely和likely的使用
- 路由规则——MVC控制器