爬虫爬取新浪微博

这周的第一个小任务:爬取动态网页,拿新浪微博做例子,我爬取了指定用户微博的基本信息,包括昵称,性别,粉丝数,关注人数和主页地址,还有发过的所有微博的地址和信息内容,如果转发时没有说任何内容的话只会显示转发了微博。
需要注意的是网页版信息量太大,用手机端的也就是m版的会比较容易提取信息
下面是全部代码:

import urllib.request
import json

id='5443276821' #要爬取用户的Id
proxy_addr="122.241.72.191:808"#代理地址,可以自己在西刺网里找可用的IP
url = 'https://m.weibo.cn/api/container/getIndex?type=uid&value=' + id

def get_message_page(uurl):#使用代理发送请求
    handler = urllib.request.ProxyHandler({'http':proxy_addr})
    req=urllib.request.Request(uurl)#固定方法
    req.add_header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0")
    opener = urllib.request.build_opener(handler)
    urllib.request.install_opener(opener)#使它全局化,之后不论是什么方法发送请求都将使用自定义代理
    # response = urllib.request.urlopen('https://weibo.com/p/1005055443276821/home?from=page_100505&mod=TAB&is_all=1#place')
    data = urllib.request.urlopen(req).read().decode('utf-8', 'ignore')#获取信息
    return data

def get_message(uurl):#获取基本信息包括昵称性别,主页地址,粉丝数,关注人数等
    data=get_message_page(uurl)
    message=json.loads(data).get('data')
    message=message.get('userInfo')
    name=message.get('screen_name')
    gender=message.get('gender')
    if(gender=='f'):
        gender='女'
    else:
        gender='男'
    profile_url=message.get('profile_url')
    profile_image_url=message.get('profile_image_url')
    verified=message.get('verified')
    if(verified=='True'):
        verified='是'
    else:
        verified='否'
    follow_count=message.get('follow_count')
    followers_count=message.get('followers_count')
    print('昵称:'+name+'\n'+'性别:'+gender+'\n'+'头像:'+profile_image_url+'\n'+'主页:'+profile_url+'\n'+'是否认证:'+verified+'\n'+'粉丝数:'+str(followers_count)+'\n'+'关注人数:'+str(follow_count)+'\n')

def get_containerid(uurl):#获取网页的containerid,观察得之后提取微博信息时网页链接上需要用这个信息
    data=get_message_page(uurl)
    message=json.loads(data).get('data')
    for data in message.get('tabsInfo').get('tabs'):
        if(data.get('tab_type')=='weibo'):
            containerid=data.get('containerid')
            # print(containerid)
            return containerid

def get_all_mes(url,file):#获取微博的信息并且保存至文件
    containerid=get_containerid(url)
    i=1#控制网页页码
    while True:
        main_url='https://m.weibo.cn/api/container/getIndex?type=uid&value='+id+'&containerid='+containerid+'&page='+str(i)
        data=get_message_page(main_url)
        weibo=json.loads(data).get('data')
        cards=weibo.get('cards')
        if (len(cards) > 0):
            print('------第 ' + str(i) + ' 页---------------')
            for j in range(len(cards)):
                print("-----第" + str(i) + "页,第" + str(j) + "条微博------")
                card_type = cards[j].get('card_type')
                if (card_type == 9):#观察得包含所需微博信息的这个值都是9
                    mblog = cards[j].get('mblog')
                    attitudes_count = mblog.get('attitudes_count')
                    comments_count = mblog.get('comments_count')
                    created_at = mblog.get('created_at')
                    reposts_count = mblog.get('reposts_count')
                    scheme = cards[j].get('scheme')
                    text = mblog.get('text')
                    print('微博地址:'+str(scheme)+"\n" +'发布时间:'+str(created_at)+"\n"+"微博内容:"+text+"\n"+'点赞数:'+str(attitudes_count)+"\n"+"评论数:"+str(comments_count)+"\n"+"转发数:"+str(reposts_count)+"\n")
                    with open(file, 'a', encoding='utf-8') as f:
                        f.write("----第" + str(i) + "页,第" + str(j) + "条微博----" + "\n")
                        f.write("微博地址:"+str(scheme)+"\n"+"发布时间:"+str(created_at)+"\n"+"微博内容:"+text+"\n"+"点赞数:"+str(attitudes_count)+"\n"+"评论数:"+str(comments_count)+"\n"+"转发数:"+str(reposts_count) + "\n")
            print('--------------------------------\n')
            i += 1
        else:
            break

def main():
    url = 'https://m.weibo.cn/api/container/getIndex?type=uid&value=' + id
    get_message(url)
    file=id+'.txt'
    get_all_mes(url,file)

main()

部分结果截图:
部分结果

存入文件结果:

文件中内容

猜你喜欢

转载自blog.csdn.net/weixin_42404145/article/details/81382454