聲明:
最近在學習爬蟲的相關學習,爲了記錄下自己平時的學習內容,這個代碼只作爲學習研究使用。
爬取微博評論數據,這裏網上有很多爬取的方法,我們主要爬取的是 m.weibo.cn 這個站點上的數據。
這裏我們是將每條評論數據進行寫入文件,我們寫入文件的分隔爲“:::”, 格式爲:評論數據:::用戶id:::用戶名 的形式
注意,這裏需要用戶提供需要爬取微博的id號碼,這裏默認爲:“4514293905404071”, 同時number設置我們要爬取的數量,還有一個問題就是設置間隔時間,這個可以在程序中進行修改,避免被微博強制斷掉連接。
好啦,不多說,直接上代碼:
import requests
import json
import re
def bcpl(weibo_id, url, headers, number):
count = 0 #設置一個初始變量count爲0來進行計數
with open("微博id" + str(weibo_id) + ".txt", "a", encoding="utf8") as f: #打開一個名爲“微博idxxxxxx”的txt文件,編碼utf-8
# 當count數量小於預期的number時,進行循環
while count < number:
# 判斷是不是第一組評論,如果是的話,第一組評論不需要加max_id,之後的需要加
if count == 0:
try:
url = url + weibo_id + '&mid=' + weibo_id + '&max_id_type=0'
print("url: " + url)
web_data = requests.get(url, headers=headers) #F12查看data信息
js_con = web_data.json() #轉換一下數據格式
print("json : ", js_con)
# 獲取連接下一頁評論的max_id
max_id = js_con['data']['max_id'] #max_id在[data]中
print(max_id)
comments = js_con['data']['data'] #獲得數據中[data]中的[data]
# print("con: ", comments)
for one_comment in comments: #依次循環獲得comments中的數據
# print("cpm: ", comment)
comment = one_comment["text"] #獲得[text]下的數據,也就是評論數據
user = one_comment["user"]
user_id = str(user["id"]) + ""
# print(type(user_id))
user_name = user["screen_name"]
label = re.compile(r'</?\w+[^>]>', re.S) #刪除表情符號
comment = re.sub(label, '', comment) #獲得文本評論
f.write(comment +":::" + user_id +":::" + str(user_name) +'\n') #寫入到文件中
count += 1 #count = count + 1
print("已爬取" + str(count) + "條評論!" ) #顯示爬取到第幾條
except Exception as e:
print("出錯了if ", e.__context__)
continue
else:
try:
url = url + weibo_id + 'max_id=' + str(max_id) + '&max_id_type=0'
web_data = requests.get(url, headers=headers)
js_con = web_data.json()
# print("json : ", js_con)
max_id = js_con['data']['max_id']
comments = js_con['data']['data']
for one_comment in comments:
comment = one_comment["text"] #獲得[text]下的數據,也就是評論數據
user = one_comment["user"]
user_id = str(user["id"]) + ""
# print(type(user_id))
user_name = user["screen_name"]
label = re.compile(r'</?\w+[^>]>', re.S) #刪除表情符號
comment = re.sub(label, '', comment) #獲得文本評論
f.write(comment +":::" + user_id +":::" + user_name +'\n') #寫入到文件中
count += 1 #count = count + 1
print("已爬取" + str(count) + "條評論!")
except Exception as e:
print("出錯了" ,e)
continue
if __name__ == "__main__":
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
} #設置user-agent來進行僞裝,突破微博反爬限制
url = 'https://m.weibo.cn/comments/hotflow?id='
weibo_id = '4514293905404071' # 要爬取的微博id #[url=https://m.weibo.cn/detail/4478512314460101]https://m.weibo.cn/detail/4478512314460101[/url]
#打開微博手機端網頁[url=https://m.weibo.cn]https://m.weibo.cn[/url],找到要爬取的微博id!
#手機端網頁!手機端網頁!手機端網頁!
number = 1000 # 設置爬取評論量,爬取量在第X組,爬取時會爬取下來該組的數據,所以最終數據可能會大於number,一般是個整10的數
print("test")
bcpl(weibo_id, url, headers, number)