前言
本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
作者:野客
出處:https://www.cnblogs.com/ityard
看動漫的小伙伴應該知道最近出了一部神漫《霧山五行》,其以極具特色的水墨畫風和超燃的打斗場面廣受好評,首集播出不到 24 小時登頂 B 站熱搜第一,豆瓣開分 9.5,火爆程度可見一斑,就打斗場面而言,說是最炫動漫也不為過,當然唯一有一點不足之處就是集數有點少,只有 3 集,
下面放幾張動圖,一起欣賞一下,
看過動圖之后,是不是覺得我所說的最炫動漫,并非虛言,接下來我們爬取一些評論,了解一下大家對這部動漫的看法,這里我們選取 B 站、微博和豆瓣這 3 個平臺來爬取資料,
爬取 B 站
我們先來爬取 B 站彈幕資料,動漫鏈接為:https://www.bilibili.com/bangumi/play/ep331423,彈幕鏈接為:http://comment.bilibili.com/186803402.xml,爬取代碼如下:
url = "http://comment.bilibili.com/218796492.xml" req = requests.get(url) html = req.content html_doc = str(html, "utf-8") # 修改成utf-8 # 決議 soup = BeautifulSoup(html_doc, "lxml") results = soup.find_all('d') contents = [x.text for x in results] # 保存結果 dic = {"contents": contents} df = pd.DataFrame(dic) df["contents"].to_csv("bili.csv", encoding="utf-8", index=False)
如果對爬取 B 站彈幕資料不了解的小伙伴可以看一下:爬取 B 站彈幕,
我們接著將爬取的彈幕資料生成詞云,代碼實作如下:
def jieba_(): # 打開評論資料檔案 content = open("bili.csv", "rb").read() # jieba 分詞 word_list = jieba.cut(content) words = [] # 過濾掉的詞 stopwords = open("stopwords.txt", "r", encoding="utf-8").read().split("\n")[:-1] for word in word_list: if word not in stopwords: words.append(word) global word_cloud # 用逗號隔開詞語 word_cloud = ','.join(words) def cloud(): # 打開詞云背景圖 cloud_mask = np.array(Image.open("bg.png")) # 定義詞云的一些屬性 wc = WordCloud( # 背景圖分割顏色為白色 background_color='white', # 背景圖樣 mask=cloud_mask, # 顯示最大詞數 max_words=500, # 顯示中文 font_path='./fonts/simhei.ttf', # 最大尺寸 max_font_size=60, repeat=True ) global word_cloud # 詞云函式 x = wc.generate(word_cloud) # 生成詞云圖片 image = x.to_image() # 展示詞云圖片 image.show() # 保存詞云圖片 wc.to_file('cloud.png') jieba_() cloud()
看一下效果:
爬取微博
我們再接著爬取動漫的微博評論,我們選擇的爬取目標是霧山五行官博頂置的這條微博的評論資料,如圖所示:
爬取代碼實作如下所示:
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # 爬取一頁評論內容 def get_one_page(url): headers = { 'User-agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3880.4 Safari/537.36', 'Host' : 'weibo.cn', 'Accept' : 'application/json, text/plain, */*', 'Accept-Language' : 'zh-CN,zh;q=0.9', 'Accept-Encoding' : 'gzip, deflate, br', 'Cookie' : '自己的cookie', 'DNT' : '1', 'Connection' : 'keep-alive' } # 獲取網頁 html response = requests.get(url, headers = headers, verify=False) # 爬取成功 if response.status_code == 200: # 回傳值為 html 檔案,傳入到決議函式當中 return response.text return None # 決議保存評論資訊 def save_one_page(html): comments = re.findall('<span >(.*?)</span>', html) for comment in comments[1:]: result = re.sub('<.*?>', '', comment) if '回復@' not in result: with open('wx_comment.txt', 'a+', encoding='utf-8') as fp: fp.write(result) for i in range(50): url = 'https://weibo.cn/comment/Je5bqpmCn?uid=6569999648&rl=0&page='+str(i) html = get_one_page(url) print('正在爬取第 %d 頁評論' % (i+1)) save_one_page(html) time.sleep(3)
對于爬取微博評論不熟悉的小伙伴可以參考:爬取微博評論,
同樣的,我們還是將評論生成詞云,看一下效果:
爬取豆瓣
最后,我們爬取動漫的豆瓣評論資料,動漫的豆瓣地址為:https://movie.douban.com/subject/30395914/,爬取的實作代碼如下:
def spider(): url = 'https://accounts.douban.com/j/mobile/login/basic' headers = {"User-Agent": 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)'} # 評論網址,為了動態翻頁,start 后加了格式化數字,短評頁面有 20 條資料,每頁增加 20 條 url_comment = 'https://movie.douban.com/subject/30395914/comments?start=%d&limit=20&sort=new_score&status=P' data = { 'ck': '', 'name': '用戶名', 'password': '密碼', 'remember': 'false', 'ticket': '' } session = requests.session() session.post(url=url, headers=headers, data=https://www.cnblogs.com/hhh188764/p/data) # 初始化 4 個 list 分別存用戶名、評星、時間、評論文字 users = [] stars = [] times = [] content = [] # 抓取 500 條,每頁 20 條,這也是豆瓣給的上限 for i in range(0, 500, 20): # 獲取 HTML data = https://www.cnblogs.com/hhh188764/p/session.get(url_comment % i, headers=headers) # 狀態碼 200 表是成功 print('第', i, '頁', '狀態碼:',data.status_code) # 暫停 0-1 秒時間,防止IP被封 time.sleep(random.random()) # 決議 HTML selector = etree.HTML(data.text) # 用 xpath 獲取單頁所有評論 comments = selector.xpath('//div[@]') # 遍歷所有評論,獲取詳細資訊 for comment in comments: # 獲取用戶名 user = comment.xpath('.//h3/span[2]/a/text()')[0] # 獲取評星 star = comment.xpath('.//h3/span[2]/span[2]/@class')[0][7:8] # 獲取時間 date_time = comment.xpath('.//h3/span[2]/span[3]/@title') # 有的時間為空,需要判斷下 if len(date_time) != 0: date_time = date_time[0] date_time = date_time[:10] else: date_time = None # 獲取評論文字 comment_text = comment.xpath('.//p/span/text()')[0].strip() # 添加所有資訊到串列 users.append(user) stars.append(star) times.append(date_time) content.append(comment_text) # 用字典包裝 comment_dic = {'user': users, 'star': stars, 'time': times, 'comments': content} # 轉換成 DataFrame 格式 comment_df = pd.DataFrame(comment_dic) # 保存資料 comment_df.to_csv('db.csv') # 將評論單獨再保存下來 comment_df['comments'].to_csv('comment.csv', index=False) spider()
對于爬取豆瓣評論不熟悉的小伙伴,可以參考:爬取豆瓣評論,
看一下生成的詞云效果:
PS:如有需要Python學習資料的小伙伴可以加下方的群去找免費管理員領取
可以免費領取原始碼、專案實戰視頻、PDF檔案等
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/67469.html
標籤:Python
