最近为了做事件分析写了一些微博的爬虫,两个大V总共爬了超70W的微博数据。
官方提供的api有爬取数量上限2000,想爬取的数据大了就不够用了...
果断撸起袖子自己动手!先简单说一下我的思路:
一、目标选择
在确定爬取对象时,在移动端展示的数据可以满足的情况下,优先选择移动端。难度要低很多。
二、分析目标网站
在开始构造爬虫前,需要先了解目标网站的结构和数据传输方式。
拿本次爬取对象举例:
在开发者模式下可以找到构造页面内容的包,Request URL是页面数据api接口,滚动加载几页后即可发现规律。
在此 page = 2控制了滚动的页码数,可通过构造页面链接爬取微博大V所有的微博数据。
Content-Type:application/json; charset=utf-8 标明了页面数据是通过json返回的,编码类型为utf-8。
然后分析json包,里面包含了很多数据集,找你需要的就好:
其中的id 为构造某一条微博评论链接的关键数据,如果想爬具体某条微博下的评论数据需要用id的值来构造评论页链接。正常可感知的数据:微博内容、评论数、点赞数、分享数、发布时间和来源都是可以直接获取的。
页面分析的差不多了,可以开始构造微博爬虫了。
三、模拟浏览器请求
正常爬取微博时需要先登录,这里可以使用post请求将账号和密码传入的方式实现。也可以直接在浏览器内登录后使用登录后的api链接构造请求头,然后使用get方式请求即可。
本次按照第二种方式实现。在模拟请求头时,只需构造'User-Agent'和'Referer'这两组信息就行。
header=({'User-Agent': '在你的浏览器开发模式下获取此信息',
'Referer': '在你的浏览器开发模式下获取此信息',
})
这两组信息都可以在该页面的开发者模式下获取到:
(涉及到个人信息我涂掉了...)
构造完请求头,使用requests库进行模拟请求,请求成功网站服务器识别到模拟的浏览器请求会返回网站的json数据,然后通过python的json库来解析它。
到目前为止的代码为:
# _*_ coding:utf-8 _*_ #声明程序的编写字符
import requests #导入requests库
import json #导入json库
def get_data(url):
for a in range (0,560): #通过不断传入参数a来构造链接页码
url = '上面获取到的页面链接'+str(a)
header=({'User-Agent': '在你的浏览器开发模式下获取此信息',
'Referer': '在你的浏览器开发模式下获取此信息'})
data = requests.get(url,headers=header,timeout=10) #通过requests的get方法请求
data = json.loads(data.text) #解析json数据
四、数据清洗
json数据拿到后,需要对数据进行清洗,筛选出想要的字段信息。
再次分析json返回的数据,所有的微博内容都放在字典data下的['cards']中,按层级关系取出来就可以了。
每一页会返回10条微博内容,在每一页的['cards']中将其依次取出:
for i in range(0,10):
text = data['data']['cards'][i]['mblog']['text'].strip() #爬取每一页的所有微博内容
其他数据按照上面讲述的方式依次取就可以了,这里就不赘述了。
将爬取到的数据写入数据库:
如果想要爬取每一条微博下的所有评论内容,则需要先将评论链接构造出来,然后依次请求这些链接,后面的思路跟爬取微博内容类似。
本次爬取的数据分析结论首发在我的公众号:产品汪生存指南
刚刚起步,急需各种关爱~!o(* ̄▽ ̄*)ブ ~~
欢迎关注,一起学习一起成长。