• 欢迎访问数智,大数据学习

【爬虫】最新python爬虫抓取新浪微博所有用户信息,思路+架构+源码

Python Raybra_Wei 2年前 (2018-08-17) 972次浏览 4个评论 扫描二维码

目录

一、前期工作… 3

1.1 爬取目标… 3

1.2 准备工作… 3

1.3 爬取思路… 3

1.4 爬取分析… 3

二、项目实战… 5

2.1 新建项目… 5

2.2 创建 Item.. 6

2.3 提取数据… 8

2.4 数据清洗… 12

2.5 数据存储… 13

2.6 Cookies 池对接… 15

2.7 代理池对接… 15

 

一、前期工作

1.1 爬取目标

爬取的目标是新浪微博用户的公开基本信息,如用户昵称、头像、用户的关注、粉丝列表以及发布的微博等

1.2 准备工作

代理池、 Cookies 池已经实现并可以正常运行,安装 Scrapy 、PyMongo 库

1.3 爬取思路

首先我们要实现用户的大规模爬取。 这里采用的爬取方式是,以微博的几个大 V 为起始点,爬取他们各内的粉丝和关注列表,然后获取粉丝和关注列表的粉丝和关注列表,以此类推,这样下去就可以实现递归爬取。 如果一个用户与其他用户有社交网络上的关联,那他们的信息就会被爬虫抓取到,这样我们就可以做到对所有用户的爬取 。 通过这种方式,我们可以得到用户的唯一 ID ,再根据 ID 获取每个用户发布的微博即可。

1.4 爬取分析

爬取的站点是https://m.weibo.cn,此站点是微博移动端的站点,找到一个用户的主页面

在页面最上方可以看到她的关注和粉丝数量 。 我们点击关注,进入到她的关注列表

 

打开开发者工具,切换到 XHR 过滤器,一直下拉关注列表,即可看到下方会出现很多人 ajax 请求,这些请求就是获取关注列表的 Ajax 请求.

  1. AJAX = 异步 JavaScript 和 XML。
  2. AJAX 是一种用于创建快速动态网页的技术。
  3. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

打开第一个 Ajax 请求, 将其展开之后 即可看到其关注的用户的基本信息。接下来我们只需要构造这个请求的参数。其中最主要的参数就是 cont ainerid 和 page 。 有了这两个参数,我们同样可以获取请求结果 。 我们可以将接口精简为 :

https://m.weibo.cn/api/container/getIndex?containerid=231051_-_followers_-_2244367010&page=2

这里的 containerid 的前半部分是固定的,后半部分是用户的 id 。 所以这里参数就可以构造出来了,只需要修改 containerid 最后的 id 和 page 参数即可获取分页形式的关注列表信息 。

利用同样的方法,我们也可以分析用户详情的 Ajax 链接、用户微博列表的 Ajax 链接,如下所示:

  1. #用户详情 API

  1. #关注列表 API

  1. #粉丝列表 API

  1. #微博列表 API

此处的 uid 和 page 分别代表用户 ID 和分页页码。

二、项目实战

2.1 新建项目

接下来,我们用 Scrapy 来实现这个抓取过程。 首先创建一个项目,命令如下所示:scrapy startproject weibo 进入项目中,新建一个 Spider,名为 weibocn ,命令如下所示 :scrapy genspider weibocn m.weibo.cn 我们首先修改 Spider,配置各个 Ajax 的 URL ,选取几个大 V,将他们的 ID 赋值成一个列表,实现 start_requests()方法, 也就是依次抓取各个大 V 的个人详情,然后用 parse_user()进行解析

2.2 创建 Item

解析用户的基本信息并生成 Item。 这里我们先定义几个 Item ,如用户、用户关系、微博 Item ,如下所示

这里定义了 collection 字段,指明保存的 Collection 的名称。 用户的关注和粉丝列表直接定义为一个单独的 UserRelationitem ,其中 id 就是用户的 ID, follows 就是用户关注列表, fans 是粉丝列表

2.3 提取数据

开始解析用户的基本信息,实现 parse_user ()方法,如下所示:

在这里一共完成了两个操作:

  1. 解析 JSON 提取用户信息并生成 UserItem 返回 。 我们并没有采用常规的逐个赋值的方法,而是定义了一个字段映射关系 。 我们定义的字段名称可能和 JSON 中用户的字段名称不同,所以在这里定义成一个字典,然后遍历字典的每个字段实现逐个字段的赋值。
  2. 构造用户的关注、粉丝、微博的第一页的链接,井生成 Request ,这里需要的参数只有用户的 ID 。 另外,初始分页页码直接设置为 l 即可。

接下来,我们还需要保存用户的关注和粉丝列表。以关注列表为例,其解析方法为 parse_follows() ,实现如下所示:

在这个方法里面做了如下三件事:

  1. 解析关注列表中的每个用户信息并发起新的解析请求。我们首先解析关注列表的信息,得到用户的 ID ,然后再利用 user_url 构造访问用户详情的 Request ,回调就是刚才所定义的 parse_user()方法 。
  1. 提取用户关注列表内的关键信息并生成 UserRelationitem 。 id 字段直接设置成用户的 ID,JSON 返回数据中的用户信息有很多冗余字段 。 在这里我们只提取了关注用户的 lD 和用户名,然后把它们赋值给 follows 字段, fans 字段设置成空列表。 这样我们就建立了一个存有用户 ID 和用户部分关注列表的 UserRelationitem ,之后合并且保存具有同 一个 lD 的 UserRelationit 凹的关注和粉丝列表 。
  1. 提取下一页关注。 只需要将此请求的分页页码加 l 即可 。 分页页码通过 Request 的 meta 属性进行传递, Response 的 meta 来接收。 这样我们构造并返回下一页的关注列表的 Request。

抓取粉丝列表的原理和抓取关注列表原理相同

来抓取用户的微博信息;

2.4 数据清洗

 

有些微博的时间可能不是标准的时间,比如它可能显示为刚刚、几分钟前、几小时前、昨天等。这里我们需要统一转化这些时间,实现一个 parse_time ()方法,如下所示:

用正则来提取一些关键数字,用 time 库来实现标准时间的转换。

上面数据清洗的工作主要是对时间做清洗。

2.5 数据存储

数据清洗完毕之后,我们就要将数据保存到 MongoDB 数据库 。 我们在这里实现 MongoPipeline 类,如下所示:

2.6 Cookies 池对接

在这里实现一个 Middleware,为每个 Request 添加随机的 Cookies

2.7 代理池对接

启动 redis 提供数据存储

运行代理池程序

 

获取代理 IP:

在微博抓取中的程序中启动代理 ip 服务

555 代表优先级,设置完毕

文章转载需要授权,版权所有

 


数智 Lab , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:【爬虫】最新 python 爬虫抓取新浪微博所有用户信息,思路+架构+源码
喜欢 (102)
[]
分享 (0)
关于作者:
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(4)个小伙伴在吐槽
  1. 请问可以获取源代码吗?
    May2019-03-04 20:25 Reply
    • 微信公众号:tudounews 回复新浪爬虫 :smile:
      Raybra_Wei2019-04-15 02:06
  2. 请问代码怎么获取
    🌈2019-04-07 15:40 Reply
    • 微信公众号:tudounews 回复新浪爬虫
      Raybra_Wei2019-04-15 02:07