1. 程式人生 > >爬蟲爬取新浪微博

爬蟲爬取新浪微博

這周的第一個小任務:爬取動態網頁,拿新浪微博做例子,我爬取了指定使用者微博的基本資訊,包括暱稱,性別,粉絲數,關注人數和主頁地址,還有發過的所有微博的地址和資訊內容,如果轉發時沒有說任何內容的話只會顯示轉發了微博。
需要注意的是網頁版資訊量太大,用手機端的也就是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()

部分結果截圖:
部分結果

存入檔案結果:

檔案中內容