python requests,bs4應用例項
阿新 • • 發佈:2018-11-09
獲取豆瓣最新電影的ID號和電影名稱
import requests from bs4 import BeautifulSoup url = "https://movie.douban.com/cinema/nowplaying/xian/" # 1). 獲取頁面資訊 response = requests.get(url) content = response.text # print(content) # 2). 分析頁面, 獲取id和電影名 soup = BeautifulSoup(content, 'lxml') # 線找到所有的電影資訊對應的li標籤; nowplaying_movie_list = soup.find_all('li', class_='list-item') print(nowplaying_movie_list[0]) print(type(nowplaying_movie_list[0])) # 儲存所有電影資訊[{'title':"名稱", "id":"id號"}] movies_info = [] # 依次遍歷每一個li標籤, 再次提取需要的資訊 for item in nowplaying_movie_list: nowplaying_movie_dict = {} # 根據屬性獲取title內容和id內容 # item['data-title']獲取li標籤裡面的指定屬性data-title對應的value值; nowplaying_movie_dict['title'] = item['data-title'] nowplaying_movie_dict['id'] = item['id'] nowplaying_movie_dict['actors'] = item['data-actors'] nowplaying_movie_dict['director'] = item['data-director'] # 將獲取的{'title':"名稱", "id":"id號"}新增到列表中; movies_info.append(nowplaying_movie_dict) print(movies_info)
獲取指定電影的影評資訊
# 目標: # 1). 爬取某一頁的評論資訊; # 2).爬取某個電影的前10頁評論資訊; # 3). 獲取所有電影的評論資訊; import threading import requests from bs4 import BeautifulSoup # # 1). 爬取某一頁的評論資訊; def getOnePageComment(id, pageNum): # 1). 根據頁數確定start變數的值 # 第一頁: https://movie.douban.com/subject/26425063/comments?start=0&limit=20&sort=new_score&status=P # 第二頁: https://movie.douban.com/subject/26425063/comments?start=20&limit=20&sort=new_score&status=P # 第三頁: https://movie.douban.com/subject/26425063/comments?start=20&limit=40&sort=new_score&status=P start = (pageNum-1)*20 url = "https://movie.douban.com/subject/%s/comments?start=%s&limit=20&sort=new_score&status=P" %(id, start) # 2). 爬取評論資訊的網頁內容 content = requests.get(url).text # 3). 通過bs4分析網頁 soup = BeautifulSoup(content, 'lxml') # 分析網頁得知, 所有的評論資訊都是在span標籤, 並且class為short; commentsList = soup.find_all('span', class_='short') pageComments = "" # 依次遍歷每一個span標籤, 獲取標籤裡面的評論資訊, 並將所有的評論資訊儲存到pageComments變數中; for commentTag in commentsList: pageComments += commentTag.text # return pageComments print("%s page" %(pageNum)) global comments comments += pageComments # 2).爬取某個電影的前10頁評論資訊; id = '26425063' comments = '' threads = [] # 爬取前10頁的評論資訊;獲取前幾頁就迴圈幾次; for pageNum in range(10): # 0 , 1 2 3 4...9 pageNum = pageNum + 1 # getOnePageComment(id, pageNum) # 通過啟動多執行緒獲取每頁評論資訊 t = threading.Thread(target=getOnePageComment, args=(id, pageNum)) threads.append(t) t.start() # 等待所有的子執行緒執行結束, 再執行主執行緒內容; _ = [thread.join() for thread in threads] print("執行結束") with open("%s.txt" %(id), 'w',encoding='utf-8') as f: f.write(comments)
資料清洗
完整的分析過程: - 資料的獲取: 通過爬蟲獲取(urllib|requests<獲取頁面內容> + re|bs4<分析頁面內容>) - 資料清洗: 按照一定的格式歲文字盡心處理; """ import re # 1. 對於爬取的評論資訊進行資料清洗(刪除不必要的逗號, 句號, 表情, 只留下中文或者英文內容) with open('./doc/26425063.txt',encoding='utf-8') as f: comments = f.read() # 通過正則表示式實現 pattern = re.compile(r'([\u4e00-\u9fa5]+|[a-zA-Z]+)') deal_comments = re.findall(pattern, comments) newComments = '' for item in deal_comments: newComments += item print(newComments)
詞雲分析
import jieba
import wordcloud
import numpy as np
from PIL import Image
text= "馬雲曾公開表態稱對錢沒興趣稱其從來沒碰過錢上了微博熱搜"
# 2). '微博熱', '搜'切割有問題, 可以強調
# jieba.suggest_freq(('微博'),True)
# jieba.suggest_freq(('熱搜'),True)
# 強調檔案中出現的所有詞語;
jieba.load_userdict('./doc/newWord')
# 1). 切割中文, lcut返回一個列表, cut返回一個生成器;
result = jieba.lcut(text)
print("切分結果:", result)
# 4). 繪製詞雲
wc = wordcloud.WordCloud(
background_color='snow',
font_path='./font/msyh.ttf', # 處理中文資料時
min_font_size=5, # 圖片中最小字型大小;
max_font_size=50, # 圖片中最大字型大小;
width=200, # 指定生成圖片的寬度
)
wc.generate(",".join(result))
wc.to_file('./doc/douban.png')