1. 程式人生 > >python requests,bs4應用例項

python requests,bs4應用例項

獲取豆瓣最新電影的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')

在這裡插入圖片描述

在這裡插入圖片描述