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