本此爬虫采取scrapy框架进行编写。

一站式获取个人微博信息

  • 1. 梳理爬虫目的和思路
    • 1.1 爬虫的目的
    • 1.2 爬虫的思路
  • 2. 分析网页源码
    • 2.1 分析博主信息网页
    • 2.2 分析关注列表界面
    • 2.3 粉丝列表页面分析
    • 2.4 微博博文页面分析
  • 3. 得出2020年最新微博相关数据API
  • 4. 编写代码
    • 4.1 创建Scrapy爬虫项目
    • 4.2 创建Spider
    • 4.3 根据网页源码下user下的信息,创建自己想提取的信息所对应的Item
    • 4.4 进行数据的提取
      • 4.4.1 创建程序的起始请求
      • 4.4.2 提取博主个人信息
      • 4.4.3 提取博主关注列表及其用户信息
      • 4.4.4 提取博主粉丝列表及其用户信息
      • 4.4.5 提取博主微博内容
  • 5. 建立相应的数据库
    • 5.1 数据库如图所示:
  • 6. 连接数据库并将数据存入数据库
    • 6.1 启动pipline
  • 7. 套娃、批量式获取微博用户信息
  • 8. 代码存在的问题
  • 9. 爬取的结果
    • 9.1 后台结果
    • 9.2 数据库结果

1. 梳理爬虫目的和思路

1.1 爬虫的目的

  • 爬取博主的个人信息,包括名字,微博认证内容,粉丝数,关注数等
  • 爬取博主的关注列表,包括列表里的每个人的个人信息
  • 爬取博主的粉丝列表,包括列表里的那个人的个人信息
  • 爬取博主的微博内容,包括发微博的时间,来源,图片的链接,内容等

1.2 爬虫的思路

  • 分析网页源码,寻找其分装json数据响应的Request URL的规律,得到其微博相关数据API
  • 请求API,捕获返回的json数据
  • 分析这些json数据,提取自己有用的数据
  • 将数据保存入数据库

2. 分析网页源码

爬取的微博网址是手机端微博的登陆网址

2.1 分析博主信息网页

该网页是手机端微博登陆自己的微博后,打开自己的主页,f12打开面板,直接查看XHR下的请求,因为之前爬取过微博的爬虫,采用的不是框架爬虫,
Python帮你了解你喜欢的人!爬取她的微博内容信息!(Ajax数据爬取)
发现微博的数据是通过Ajax的方式加载的,故直接查看XHR下的响应,因为是指爬取博主的个人信息,所以不用下拉页面,直接f5刷新以下在出现的响应中进行爬取。很简单就可以找见如图所示的响应,发现个人信息就在data->user下,整体的数据返回格式是json,其RequestURL可以发现其就是最后的uid在发生变化

2.2 分析关注列表界面

点击其关注就可以进入其关注列表页面:
下拉页面,就会看见出现的请求响应,很明显这就是其加载关注列表的响应,分析其RequestURL链接,发现其请求变化的规律也是在于uid的变化和page的变化,其关注列表的信息在data->card_group中,列表中的每个人的信息在user中,其返回的数据格式也是json


2.3 粉丝列表页面分析

点击其粉丝便可进入其粉丝页面:
下拉粉丝也面,在XHR下也会看见加载的响应,便是存储粉丝列表的响应,其RequestURL链接的变化之初也是uid和since_id在变,一个标识用户,一个改变页数。其数据在data->cards下保存,每个粉丝的用户信息在usr中保存,数据的返回格式也是JSON。

2.4 微博博文页面分析

在其主页面,点击最下方的查看全部微博,便可以进入其微博博文页面:
下拉页面,在XHR下便可以看见加载的请求响应,其RequestURL的变化也是在于uid和page的变化,微博数据在data->cards->mblog中保存,整体的数据返回格式是JSON。

3. 得出2020年最新微博相关数据API

综上所述,得出相关的微博相关数据的API:

    # 用户详情APIuser_url = 'https://m.weibo.cn/profile/info?uid={uid}'# 关注列表APIfollow_url = 'https://m.weibo.cn/api/container/getIndex?containerid=231051_-_followers_-_{uid}&page={page}'# 粉丝列表APIfan_url = 'https://m.weibo.cn/api/container/getIndex?containerid=231051_-_fans_-_{uid}&since_id={page}'# 微博内容APIweibo_url = 'https://m.weibo.cn/api/container/getIndex?containerid=230413{uid}_-_WEIBO_SECOND_PROFILE_WEIBO&page_type=03&page={page}'

4. 编写代码

4.1 创建Scrapy爬虫项目

scrapy startproject weiboinfo

4.2 创建Spider

在Pycharm下端的Terminal中执行即可:

scrapy genspider weibo m.weibo.cn

4.3 根据网页源码下user下的信息,创建自己想提取的信息所对应的Item

在items.py下定义:

class UserItem(Item):# define the fields for your item here like:# name = scrapy.Field()id = Field()# 博主名字screen_name = Field()# 个人简介description = Field()# 关注数follow_count = Field()# 粉丝数followers_count = Field()# 是否关注自己follow_me = Field()# 自己是否关注他following = Field()# 微博认证verified_reason = Field()# 微博链接profile_url = Field()# 全部微博数statuses_count = Field()class UserAttentionItem(Item):id = Field()# 博主名字screen_name = Field()# 关注数follow_count = Field()# 粉丝数followers_count = Field()# 是否关注自己follow_me = Field()# 自己是否关注他following = Field()# 微博链接profile_url = Field()class UserFansItem(Item):id = Field()# 博主名字screen_name = Field()# 关注数follow_count = Field()# 粉丝数followers_count = Field()# 微博链接profile_url = Field()# 微博简介desc1 = Field()desc2 = Field()class WeiboItem(Item):id = Field()# 点赞数attitudes_count = Field()# 评论数comments_count = Field()# pictuer 链接picture_url = Field()# 内容raw_text = Field()# 来源source = Field()# 发布时间created_at = Field()

4.4 进行数据的提取

4.4.1 创建程序的起始请求

class WeiboSpider(scrapy.Spider):name = 'weibo'allowed_domains = ['m.weibo.cn']#start_urls = ['http://m.weibo.cn/']# 这里写的是你想要爬取博主信息的uidstart_users = ['uid']# 用户详情APIuser_url = 'https://m.weibo.cn/profile/info?uid={uid}'# 关注列表APIfollow_url = 'https://m.weibo.cn/api/container/getIndex?containerid=231051_-_followers_-_{uid}&page={page}'# 粉丝列表APIfan_url = 'https://m.weibo.cn/api/container/getIndex?containerid=231051_-_fans_-_{uid}&since_id={page}'# 微博内容APIweibo_url = 'https://m.weibo.cn/api/container/getIndex?containerid=230413{uid}_-_WEIBO_SECOND_PROFILE_WEIBO&page_type=03&page={page}'def start_requests(self):for uid in self.start_users:yield Request(self.user_url.format(uid=uid),callback=self.parse_user)

4.4.2 提取博主个人信息

   '''爬取博主个人信息'''def parse_user(self, response):result = json.loads(response.text)if result.get('data').get('user'):user_info = result.get('data').get('user')user_item = UserItem()user_item['id'] = user_info.get('id')user_item['screen_name'] = user_info.get('screen_name')user_item['description'] = user_info.get('description')user_item['follow_count'] = user_info.get('follow_count')user_item['followers_count'] = user_info.get('followers_count')user_item['follow_me'] = user_info.get('follow_me')user_item['following'] = user_info.get('following')user_item['verified_reason'] = user_info.get('verified_reason')user_item['profile_url'] = user_info.get('profile_url')user_item['statuses_count'] = user_info.get('statuses_count')yield user_item#获取博主的id,进行构造下一项的请求id = user_info.get('id')# 关注yield Request(self.follow_url.format(uid=id,page=1),callback=self.parse_follows,meta={'page':1,'uid':id})# 粉丝yield Request(self.fan_url.format(uid=id,page=1),callback=self.parse_fans,meta={'page':1,'uid':id})# 微博yield Request(self.weibo_url.format(uid=id,page=1),callback=self.parse_weibos,meta={'page':1,'uid':id})

4.4.3 提取博主关注列表及其用户信息

    '''爬取博主关注列表信息'''def parse_follows(self,response):result = json.loads(response.text)if result.get('ok') and result.get('data').get('cards') and len(result.get('data').get('cards')) and result.get('data').get('cards')[-1].get('card_group'):follows = result.get('data').get('cards')[-1].get('card_group')for follow in follows:if follow.get('user'):uid = follow.get('user').get('id')#yield Request(self.user_url.format(uid=uid),callback=self.parse_user)user_AttentionItem = UserAttentionItem()user_AttentionItem['id'] = follow.get('user').get('id')user_AttentionItem['screen_name'] = follow.get('user').get('screen_name')user_AttentionItem['follow_count'] = follow.get('user').get('follow_count')user_AttentionItem['followers_count'] = follow.get('user').get('followers_count')user_AttentionItem['follow_me'] = follow.get('user').get('follow_me')user_AttentionItem['following'] = follow.get('user').get('following')user_AttentionItem['profile_url'] = follow.get('user').get('profile_url')yield user_AttentionItem# 关注列表翻页uid = response.meta.get('uid')page = response.meta.get('page') + 1yield Request(self.follow_url.format(uid=uid,page=page),callback=self.parse_follows,meta={'page':page,'uid':uid})

4.4.4 提取博主粉丝列表及其用户信息

    '''爬取博主粉丝列表信息'''def parse_fans(self,response):result = json.loads(response.text)if result.get('ok') and result.get('data').get('cards') and len(result.get('data').get('cards')) and result.get('data').get('cards')[-1].get('card_group'):fans = result.get('data').get('cards')[-1].get('card_group')for fan in fans:if fan.get('user'):uid = fan.get('user').get('id')#yield Request(self.user_url.format(uid=uid),callback=self.parse_user)# 分析列表user_FansItem = UserFansItem()user_FansItem['id'] = fan.get('user').get('id')user_FansItem['screen_name'] = fan.get('user').get('screen_name')user_FansItem['follow_count'] = fan.get('user').get('follow_count')user_FansItem['followers_count'] = fan.get('user').get('followers_count')user_FansItem['desc1'] = fan.get('desc1')user_FansItem['desc2'] = fan.get('desc2')user_FansItem['profile_url'] = fan.get('user').get('profile_url')yield  user_FansItem# 分析列表 翻页uid = response.meta.get('uid')page = response.meta.get('page') + 1yield Request(self.fan_url.format(uid=uid,page=page),callback=self.parse_fans,meta={'page':page,'uid':uid})

4.4.5 提取博主微博内容

    '''爬取微博内容'''def parse_weibos(self,response):result = json.loads(response.text)if result.get('ok') and result.get('data').get('cards'):weibos = result.get('data').get('cards')for weibo in weibos[1::]:mblog = weibo.get('mblog')if mblog:weibo_item = WeiboItem()weibo_item['id'] = mblog.get('id')weibo_item['attitudes_count'] = mblog.get('attitudes_count')weibo_item['comments_count'] = mblog.get('comments_count')weibo_item['picture_url'] = mblog.get('bmiddle_pic')weibo_item['raw_text'] = mblog.get('raw_text')weibo_item['source'] = mblog.get('source')weibo_item['created_at'] = mblog.get('created_at')yield weibo_item# 微博内容翻页uid = response.meta.get('uid')page = response.meta.get('page') + 1yield Request(self.weibo_url.format(uid=uid,page=page),callback=self.parse_weibos,meta={'page':page,'uid':uid})

5. 建立相应的数据库

数据库中表的信息所建立的字段跟item中创建的Field一一对应即可。

5.1 数据库如图所示:

6. 连接数据库并将数据存入数据库

在 pipelines.py 中写入如下代码:

class PymysqlPipeline(object):#连接数据库def __init__(self):self.connect = pymysql.connect(host = 'localhost',database = 'weibo',user = 'root',password = '123456',charset = 'utf8',port = 3306)# 创建游标对象self.cursor = self.connect.cursor()# 此方法是必须要实现的方法,被定义的 Item Pipeline 会默认调用这个方法对 Item 进行处理def process_item(self,item,spider):# 判断item是哪一类的itemif isinstance(item,UserItem):cursor = self.cursorsql = 'insert into userItem(id,screen_name,description,follow_count,followers_count,follow_me,following,verified_reason,statuses_count,url) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'cursor.execute(sql,(item['id'],item['screen_name'],item['description'],item['follow_count'],item['followers_count'],item['follow_me'],item['following'],item['verified_reason'],item['statuses_count'],item['profile_url']))# 提交数据库事务self.connect.commit()return itemif isinstance(item,UserAttentionItem):cursor = self.cursorsql = 'insert into userAttentionItem(uid,screen_name,follow_count,followers_count,follow_me,following,profile_url) values (%s,%s,%s,%s,%s,%s,%s)'cursor.execute(sql,(item['id'],item['screen_name'],item['follow_count'],item['followers_count'],item['follow_me'],item['following'],item['profile_url']))#提交数据库事务self.connect.commit()return itemif isinstance(item,UserFansItem):cursor = self.cursorsql = 'insert into userfansitem(id,screen_name,follow_count,followers_count,desc1,desc2,profile_url) values (%s,%s,%s,%s,%s,%s,%s)'cursor.execute(sql,(item['id'],item['screen_name'],item['follow_count'],item['followers_count'],item['desc1'],item['desc2'],item['profile_url']))self.connect.commit()return itemif isinstance(item,WeiboItem):cursor = self.cursorsql = 'insert into weiboitem(id,attitudes_count,comments_count,picture_url,raw_text,source,created_at) values (%s,%s,%s,%s,%s,%s,%s)'cursor.execute(sql,(item['id'],item['attitudes_count'],item['comments_count'],item['picture_url'],item['raw_text'],item['source'],item['created_at']))self.connect.commit()return item

6.1 启动pipline

#开启自己写的 Pipeline
ITEM_PIPELINES = {'weiboinfo.pipelines.PymysqlPipeline':300
}

7. 套娃、批量式获取微博用户信息

这个功能在上述的代码编写的时候就已经实现了,由于是不断的迭代爬取,后台在一直出现数据,按理来说是很难自动停下来的,所以我将构建迭代请求的代码注释掉,次全部代码的功能为分析一个人的微博用户,可以爬取其个人信息,关注列表,粉丝列表,所发的微博内容信息。

不想迭代式爬取的第二个原因是,存储困难,mysql数据库无法按自己的想法存储对应的信息,比如,我想对两位博主的信息进行爬取,将两位博主各自的关注列表,粉丝列表各存储到一个表当中,但是因为公用的是一个item,无法实现分别存放,只能生硬的存放到一个表当中,存储的方式感觉不是很得当,或者是自己没有想到更好的解决方法…

若想实现套娃、迭代式的爬取,只需将如下图的代码接触注释即可:

8. 代码存在的问题

此代码,在反爬方面仅在setting.py当中添加了不同的headers,和构造了基础的请求头信息,自己在迭代爬取的过程当中发现,当爬取的数据一次性超过1100条以上,自己的ip地址将会被短暂的禁止访问网页,所以这里的反爬做的很是不好,自己还得努力,争取学会搭建cookies池…

9. 爬取的结果

9.1 后台结果

9.2 数据库结果





代码中有出现的错误和什么论述不对的地方,请评论或私信指出我立马改正。

大家有什么好的建议也可以评论或私信指出,小白接受任何批评

2020年最新微博相关数据API+一站式获取个人微博信息+套娃、批量式获取微博用户信息相关推荐

  1. 沪深A股指数最新分时交易数据API接口(JSON标准格式,Get请求方式)

    数据来源:沪深A股股票数据API接口 麦蕊智数(www.mairui.club) 最新分时交易 ·  API接口:http://api.mairui.club/zs/fsjy/指数代码(如sh0000 ...

  2. 关于电商商品数据API接口列表,你想知道的(详情页、Sku信息、商品描述、评论问答列表)

    目录 一.商品数据API接口列表 二.商品详情数据API调用代码item_get 三.获取sku详细信息item_sku 四.获得淘宝商品评论item_review 五.数据说明文档 进入 一.商品数 ...

  3. 5亿微博用户信息泄露背后:BTC与暗网数据的纠缠

    来源 | 碳链价值(ID:cc-value) 在目前中心化架构的互联网服务下,尽管各大互联网公司尽力防备,数据泄露事件层出不穷.再加上在这个时代,数据慢慢变成了一种重要的生产要素,同时猎奇之风盛行,「 ...

  4. php 微博 数据库,数据中心

    产品介绍 微博开放平台商业数据API为企业接入者提供便捷的获取微博官方数据的通道,从而使企业接入者可向微博帐号提供数据分析.舆情监控.企业运营等服务. 与平台的普通接口和高级接口区别如下: 1.为企业 ...

  5. mars3d获取地图和图层相关数据

    在实际项目中经常会遇到自定义图层和地图控件的需求,首先就需要获取到图层和地图相关的数据,mars3d都提供了相关的api来满足此类操作.这里先以实际项目中的地图控制为例来学习一下相关的api使用. / ...

  6. 计算机读取数据的接囗教程,八爪鱼采集怎样获取数据API链接 八爪鱼采集获取数据API链接的方法...

    今天给大家带来八爪鱼采集怎样获取数据API链接,八爪鱼采集获取数据API链接的方法,让您轻松解决问题.八爪鱼采集如何获取数据API链接 具体方法如下:1 java.cs.php示例代码点击下载 这个教 ...

  7. python 易盛行情_易盛信息9.0外盘期货行情数据API接口公共授权开发包例子代码...

    易盛信息9.0外盘期货行情数据API接口公共授权开发包例子代码 怎么才能获取到外盘期货行情数据API接口呢?不少朋友就会考虑到易盛9.0行情API接口,本身易盛就是一个软件提供商,提供行情API接口也 ...

  8. 为什么微博签到数据如此受欢迎?

    随着互联网的发展,人们在新浪微博.Twitter.Facebook.等社交媒体的网络社交活动也越来越活跃.就新浪微博而言,2023年春晚期间活跃用户3亿左右. 由于我国网民群体庞大.网络社交活动不受地 ...

  9. uniapp同步获取用户信息_微信小程序云开发教程微信小程序的API入门获取用户身份信息系列API...

    同学们大家好,我是小伊同学,上一节我们介绍了一些常用API,今天我们接着来学习一组API,那就是获取用户身份信息的API. 在微信小程序中,我们往往需要获取用户的身份信息,比如昵称.头像.性别.地区等 ...

  10. 微信小程序2022最新用户信息授权设置

    微信小程序2022最新用户信息授权设置 微信小程序中 用户信息授权 一直是一个非常重要的功能,它有着提升用户体验.进行用户身份认证.便于开发者进行数据分析等作用. -- 但是用户授权功能涉及到用户隐私 ...

最新文章

  1. .NET企业级应用架构设计系列之应用服务器
  2. PHP Memcached应用实现代码
  3. 【廖雪峰python入门笔记】tuple_创建单元素
  4. 8 个 Python 高效数据分析的技巧
  5. 修改Kali Linux 2020.1主题颜色
  6. golang 代码安全审计
  7. mysql的Table is readonly解决方案
  8. “千年虫”,计算机的巨大BUG!
  9. .Net 调用wordCOM组件转PDF
  10. vs2008 下编译jrtplib-3.9.0成功
  11. HTML中,TextArea的换行问题(添加wrap属性)。
  12. 三维空间下的交互设计
  13. Gcc编译选项 -E
  14. html5指标源码,通达信牛股起爆点副图指标
  15. 20140322深圳百公里
  16. Ubuntu16.04 ftp服务器安装+配置
  17. Win10添加ssh公钥
  18. Python中文社区征稿,最高1000元/篇!
  19. 关于JSON存放List集合的顺序问题
  20. pytorch框架--简单模型预测

热门文章

  1. Napatech网络加速卡
  2. 算法Training——数学规律
  3. win7桌面右下角的小喇叭音量图标不见了怎么办
  4. RN项目集成react-native-code-push(四)-- ReactNative项目集成react-native-code-push
  5. (34.1)【登录越权/爆破专题】原理、字典资源、工具、利用过程……
  6. html图片的title,图片标签IMG内alt和title属性
  7. 号外号外!兹有第一届区块链技术及应用峰会(BTA)·中国热点议题新鲜出炉,首轮盘点先睹为快...
  8. 2022最新PHP微信/QQ域名防封直连系统源码
  9. Matlab中矩阵的平方和矩阵中每个元素的平方介绍
  10. 伊甸园日历游戏 c语言,洛谷 P1024 — 一元三次方程求解