本文详细介绍了如何利用python实现微博评论的爬取,可以爬取指定微博下的评论。基于的策略是找到微博评论接口,先登录微博,获取cookies,使用requests库发送请求,并且将数据存储到mysql中。
首先微博的站点有四个,pc 端weibo.com
、weibo.cn
以及移动端 m.weibo.com
(无法在电脑上浏览)、m.weibo.cn
。在网上大致浏览了一下,普遍都认为移动端爬取比较容易,故选择移动端m.weibo.cn进行爬取。
登陆m.weibo.cn之后,找到指定微博,例如榜姐的微博如下图。
打开浏览器开发者模式,点击network,勾选XHR,刷新浏览器,发现出现下图中的一些请求。
点开红色方框中的链接,查看我们需要的信息,从可以找到请求链接,以及请求得到的数据,此页包含19条评论。
此时我们继续下拉网页,会出现一系列包含我们所需数据的URL,如下图,
接下来我们就需要找出URL的构造规律然后发送请求获取数据了,将三个URL放在一起进行比较,如下图,第一个URL是固定不变的,往后每个URL中的max_id 后的一串字符会发生变化(URL中的id,mid都是一样的,其实就是每条微博的专属ID),也就是说我们如果知道max_id的生成方法即可构造被请求的URL。
打开第一个URL里面得到的数据,我们查看数据,发现里面有一个max_id,没错!第一个URL中获取到的数据max_id= 31526326254194240, 就是第二个URL中的max_id后的一串字符,使用这个max_id就可以构造下次请求的URL
关于获取cookie, 我们可以在浏览器开发者模式中,查看请求头,其中headers中有请求头,将cookie复制到代码中即可。
写代码之前我们先整理一下思路,通过第n次请求得到的max_id 用于构造第n+1次请求的URL,首先想到的就是递归函数,将函数返回值传入函数,形成递归。
以下是获取数据的核心代码部分:
import requestsimport randomimport timeimport reimport jsonstart_url = 'https://m.weibo.cn/comments/hotflow?id=4490833493055699&mid=4490833493055699&max_id_type=0' #首个urlnext_url = 'https://m.weibo.cn/comments/hotflow?id=4490833493055699&mid=4490833493055699&max_id={}&max_id_type=1' #用于构造后面的url的模板continue_url = start_urlheaders = {'cookie': 'your cookie', # 传入你自己的cookie'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',}count = 0def get_data(url): for trytime in range(3): # 允许超时次数为3次 try: response = requests.get(url=url, headers= headers,timeout=5) data = json.loads(response.text) if response.status_code == 200: break except: print('超时') if trytime == 2: #连续3次超时就退出递归 print('连续3次超时') return if data['ok'] == 0: # 若没有获取到数据也进行退出 print("获取到的数据data['ok']=", 0) return elif data['ok'] == 1: # 判断若能够获取到数据 则进行所需数据提取,并且构造下次请求的url,调用函数 max_id = data.get("data").get("max_id") comments = data.get('data').get('data') for item in comments: ''' 获取内容creattime;floor——number;text;userid;screen——name;''' global count count+=1 create_time = item['created_at'] floor_number = item['floor_number'] text = ''.join(re.findall('[\u4e00-\u9fa5]',item['text'])) #item['text'] userid = item.get('user')['id'] screen_name = item.get('user')['screen_name'] print(count, create_time, userid, screen_name, floor_number, text) global next_url continue_url = next_url.format(str(max_id)) print(continue_url) time.sleep(random.random()) get_data(continue_url) # 调用函数本身 return if __name__ == "__main__": get_data(continue_url)
执行上述代码,后台会打印出如下数据,分别是序号,评论时间,用户ID,用户昵称,楼层,评论内容。
完整代码以及爬取完的所有数据示例见下面的链接。
https://github.com/Shengwei-Zhang/Python3Webspider/tree/master/weibocomments