1. 爬虫项目介绍

爬虫首先基于python scrapy 框架,使用了随机用户代理和IP代理等反爬技巧,将爬取到的微博领域数据,各领域榜单博主信息和博主的微博信息分别存入的mysql数据库对应的表格中。

查看爬虫完整代码请移步GitHub:QiliWu/sinaweibo_spider​github.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构建新浪微博榜单、博主及微博信息爬虫...相关推荐

  1. Python爬虫实战 | (1) 爬取猫眼电影官网的TOP100电影榜单

    在本篇博客中,我们将使用requests+正则表达式来爬取猫眼电影官网的TOP100电影榜单,获取每部电影的片名,主演,上映日期,评分和封面等内容. 打开猫眼Top100,分析URL的变化:发现Top ...

  2. python分析b站_Python爬取并分析B站最热排行榜,我发现了这些秘密

    现在大家的生活中,已经越来越离不开B站了,2020年的第一季度,B站月活跃用户达到了1.72亿,日活跃用户也已经突破了5000万个用户.源源不断的流量让B站的up主们也是粉丝数目不断暴涨,百万粉丝的u ...

  3. python爬取数据分析淘宝商品_python爬取并分析淘宝商品信息

    python爬取并分析淘宝商品信息 Tip:本文仅供学习与交流,切勿用于非法用途!!! 背景介绍 有个同学问我:"XXX,有没有办法搜集一下淘宝的商品信息啊,我想要做个统计".于是 ...

  4. python微信点赞脚本_Python爬取微信公众号评论、点赞等相关信息

    微信公众号爬虫方案分析(爬取文艺相处公众号) 之前考虑过使用搜狗微信来爬取微信公众号信息,不过搜狗提供的数据有诸多弊端,比如文章链接是临时的,文章没有阅读量等指标,所以考虑通过手机客户端利用 Pyth ...

  5. python爬取微博图片教程_Python爬取微博实例分析

    引言 利用Ajax分析微博并爬取其内容如微博内容,点赞数,转发数,评论数等. 分析 打开陈一发微博网站:https://m.weibo.cn/p/1005051054009064,并同时打开开发者工具 ...

  6. python爬取微博恶评_Python爬取新浪微博评论数据,了解一下?

    开发工具 **Python版本:**3.6.4 相关模块: argparse模块: requests模块: jieba模块: wordcloud模块: 以及一些Python自带的模块. 环境搭建 安装 ...

  7. python爬取微博用户关注_python爬取微博用户关注和粉丝的公开基本信息

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:TM0831 PS:如有需要Python学习资料的小伙伴可以加点击下 ...

  8. python爬取微博恶评_python爬取微博评论的实例讲解

    python爬虫是程序员们一定会掌握的知识,练习python爬虫时,很多人会选择爬取微博练手.python爬虫微博根据微博存在于不同媒介上,所爬取的难度有差异,无论是python新入手的小白,还是已经 ...

  9. python电商数据挖掘_Python 爬取淘宝商品数据挖掘分析实战

    作者 孙方辉 本文为CDA志愿者投稿作品,转载需授权 项目内容 本案例选择>> 商品类目:沙发: 数量:共100页 4400个商品: 筛选条件:天猫.销量从高到低.价格500元以上. 项目 ...

最新文章

  1. centos下如何停止ping命令
  2. 启动两个Tomcat的方法
  3. java按位取反“~“运算符,负数右移
  4. nginx php7提速,nginx+php7-fpm 性能提升几倍跟踪实践结果并优化
  5. FATE HDU - 2159(二维完全背包)
  6. 报名 | 全国知识图谱与语义计算大会(CCKS 2019)评测任务发布
  7. spss 卡方检验_SPSS篇—卡方检验
  8. linux系统中存放用户账号信息的文件是,信息安全技术题库:Linux系统中,用户登录密码的hash是存放在()文件中的。...
  9. c++ 输出格式控制
  10. AtomicInteger原子整形与ReentrantLock锁
  11. 性能测试--33Jvisualvm远程监控Linux服务器方案
  12. ipod nano7安装linux,怎么用ipod nano看视频?
  13. 一种基于GRU神经网络的英文诗歌生成系统
  14. AngularJS总结
  15. BRC4工具1.2.2入门教程学习
  16. pandas之数据文件导入和导出(python读取.csv,.txt,excel文件(.xlsx)以及导出为.csv、excel文件)
  17. 【word基础操作】如何在word中为公式编号
  18. 石墨笔记, Onenote 和 Effie 哪个适合 up 主?
  19. unlikely和likely的使用
  20. 路由规则——MVC控制器

热门文章

  1. 笔记本卡顿不流畅是什么原因_笔记本卡顿不流畅是什么原因_笔记本电脑卡顿不流畅如何解决-win7之家...
  2. Arduino提高篇24—摇杆调节时钟时间
  3. 浅谈PageRank算法
  4. 钓鱼网站检测 repo复现
  5. 拉勾Java工程师P7训练营 高薪笔记
  6. KETTLE实现循环批量多表抽取添加字段
  7. python实现京东秒杀
  8. 洛谷P5274 优化题(ccj)
  9. 基于php教学信息自助查询系统
  10. 8255芯片实现7段LED显示器