上一篇文章我们讲解分析了如何获取单博主的微博,这一篇我们来用代码实现我们的免登陆微博爬虫。
这里我们想要的预期是随便输入一个微博名称就可以获得他的所有微博,那我们就按照这个路子一步一步来。
1.首先肯定是要获取到用户的ID,这样才能和我们上一篇分析出的接口进行拼接成我们想要的数据。
我们这里和上一篇的方法一样,通过搜索谢娜这个微博名可以抓包到微博的接口。
req_url = 'https://m.weibo.cn/api/container/getIndex?&containerid=100103type%3D3%26q%3D{keyword}'.format(
keyword=key_word)
search_web_content = requests.get(url=req_url, headers=headers).text
json_text = json.loads(search_web_content)
if json_text['ok'] == 1:
card_list = json_text['cards']
for cards in card_list:
if cards['card_type'] == 11:
card_group_list = cards['card_group']
for card_group in card_group_list:
if card_group['user']['screen_name'] == key_word:
uid = card_group['user']['id']
# 用户id
content_url = 'https://m.weibo.cn/api/container/getIndex?containerid=107603{uid}&page={page}'.format(
uid=uid, page=1)
print(content_url)
else:
print("微博查无此人")
这样我们就可以通过微博名获取到用户id。
2.这里我们用scrapy+redis+MongoDB来构建我们的爬虫。
创建工程:scrapy startproject weibo_spider
创建爬虫
import json
import re
from scrapy.http import Request
from scrapy_redis.spiders import RedisSpider
class WeiboSpider(RedisSpider):
name = 'weibo_spider'
redis_key = 'spider:starts_url'
def parse(self, response):
json_text = json.loads(response.text)
if json_text['ok'] == 1:
# 有数据
cards_list = json_text['cards']
for cards in cards_list:
if cards['card_type'] == 9:
mblog = cards['mblog']
scheme = cards['scheme']
text = mblog['text'] #微博内容
weiBoId = mblog['id']
screen_name = mblog['user']['screen_name'] # 昵称
avatar_hd = mblog['user']['avatar_hd'] # 高清头像
# # 下一页
next_page = re.findall('page=([\d]*)', str(response.url), re.S)[0]
uid = re.findall('containerid=(.*?)&', str(response.url), re.S)[0]
next_page = int(next_page) + 1
next_url = 'https://m.weibo.cn/api/container/getIndex?containerid={uid}&page={page}'.format(
uid=uid, page=next_page)
核心部分就在这里了,接着只需要启动这个爬虫,然后在我们获取用户id的地方用redis去lpush 就可以了。
每条微博的评论也可以按照我讲的这种思路找到api接口然后拿到。