大家好,我是小五????
生活真是太苦了,需要找點快樂的精神食糧支撐社畜生活,聽說糗事百科段子挺多,今天就來看一看!
糗事百科的段子欄目聲稱:幽默笑話大全__爆笑笑話__笑破你的肚子的搞笑段子,我們用 Python 來看看糗事百科的段子到底怎么樣呢?
本文主要內容:
selenium爬取段子資訊
這次我們利用selenium來實作翻頁爬取段子資訊!
翻頁查看url變化規律:
https://www.qiushibaike.com/text/page/1/
https://www.qiushibaike.com/text/page/2/
https://www.qiushibaike.com/text/page/3/
https://www.qiushibaike.com/text/page/4/
https://www.qiushibaike.com/text/page/5/
https://www.qiushibaike.com/text/page/6/
思路:段子資訊在 id 為 content 的 div 標簽下的 div 下的第二個 div 標簽下的 div 標簽里,獲取到所有 div 標簽的內容,然后遍歷,從中提取出每一條段子資訊,
代碼如下:
from selenium import webdriver
from time import sleep
import logging
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.active
sheet.append(['段子內容', '好笑數', '評論數'])
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')
chrome_driver = r'D:\python\pycharm2020\chromedriver.exe'
options = webdriver.ChromeOptions()
# 可以設定無頭模式 不彈出瀏覽器
# options.add_argument("--headless")
# 關閉左上方 Chrome 正受到自動測驗軟體的控制的提示
options.add_experimental_option('useAutomationExtension', False)
options.add_experimental_option("excludeSwitches", ['enable-automation'])
browser = webdriver.Chrome(options=options, executable_path=chrome_driver)
# 可以設定繞過Webdriver的檢測
browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
def get_data(page): # 爬取資料函式
url = f'https://www.qiushibaike.com/text/page/{page}/'
browser.get(url) # 訪問目標url
browser.maximize_window() # 最大化視窗
sleep(1) # 短暫休眠
# Xpath定位到所有包含段子資訊的div標簽
items = browser.find_elements_by_xpath('//*[@id="content"]/div/div[2]/div')
# print(len(items)) 一頁25條段子
# 遍歷 獲取每一條段子資訊
for item in items:
con = item.find_element_by_xpath('.//a/div/span').text # 段子內容
funny_num = item.find_element_by_xpath('.//div[2]/span[1]/i').text # 好笑數
comment_num = item.find_element_by_xpath('.//div[2]/span[2]/a/i').text # 評論數
sheet.append([con, funny_num, comment_num])
logging.info([con, funny_num, comment_num])
if __name__ == '__main__':
for i in range(1, 14): # 翻頁爬取
get_data(i)
browser.quit() # 關閉瀏覽器
wb.save(filename='datas.xlsx') # 保存資料
運行結果如下:
段子資訊保存到了本地 Excel 里,結果如下:
繪制詞云圖
段子內容詞云圖可視化
import pandas as pd
import jieba
import collections
import re
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# 讀取段子資料
datas = pd.read_excel('datas.xlsx')['段子內容']
# 讀取停用詞資料
with open('stop_words.txt', encoding='utf-8') as f:
con = f.read().split('\n') # 得到每一行的停用詞
stop_words = set()
for i in con:
stop_words.add(i)
result_list = []
for data in datas:
# 文本預處理 去除一些無用的字符 只提取出中文出來
new_data = re.findall('[\u4e00-\u9fa5]+', data, re.S)
new_data = "/".join(new_data)
# 文本分詞
seg_list_exact = jieba.cut(new_data, cut_all=True)
# 去除停用詞和單個詞
for word in seg_list_exact:
if word not in stop_words and len(word) > 1:
result_list.append(word)
print(result_list)
# 篩選后統計
word_counts = collections.Counter(result_list)
# 繪制詞云
my_cloud = WordCloud(
background_color='white', # 設定背景顏色 默認是black
width=800, height=550,
font_path='simhei.ttf', # 設定字體 顯示中文
max_font_size=160, # 設定字體最大值
min_font_size=16, # 設定字體最小值
random_state=88 # 設定隨機生成狀態,即多少種配色方案
).generate_from_frequencies(word_counts)
# 顯示生成的詞云圖片
plt.imshow(my_cloud, interpolation='bilinear')
# 顯示設定詞云圖中無坐標軸
plt.axis('off')
plt.show()
運行效果如下:
老婆、朋友、孩子、媳婦、同事、回家、老公等詞云都是糗事百科段子內容里出現頻率較高,都比較貼進生活,除此之外,"發現" 這個詞也是出現頻率較高的,看來有點東西,
散點圖
分析評論數與好笑數之間關系,散點圖可視化
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
# 讀取資料
df = pd.read_excel('datas.xlsx')
funny_num, comment_num = df['好笑數'], df['評論數']
# 設定中文顯示
mpl.rcParams['font.family'] = 'SimHei'
# 設定圖形顯示風格 ggplot
plt.style.use('ggplot')
# 設定大小 像素
plt.figure(figsize=(9, 6), dpi=100)
# 繪制散點圖
plt.scatter(comment_num, funny_num)
# 添加描述資訊
plt.title('段子評論數與好笑數關系-散點圖')
plt.xlabel('評論數')
plt.ylabel('好笑數')
plt.show()
運行效果如下:
在評論數小于 50 時,點分布密集,大概還有評論數多,好笑數多的關系,評論數大于50之后,點分布非常散亂,段子的評論數和好笑數實時在變,下面來看看我們那是爬取下來的段子里評論數最多、好笑數最多的分別講的啥,
TOP級別段子
import pandas as pd
# 讀取資料
df = pd.read_excel('datas.xlsx')
# 降序排列后列印第一行 評論數最多
df1 = df.sort_values(by='評論數', ascending=False)
print(df1.values[0])
評論數最多的段子
import pandas as pd
# 讀取資料
df = pd.read_excel('datas.xlsx')
# 降序排列后列印第一行 好笑數最多
df1 = df.sort_values(by='好笑數', ascending=False)
print(df1.values[0])
好笑數最多的段子
emmm,幽默笑話大全__爆笑笑話__笑破你的肚子的搞笑段子,就這?
作者:葉庭云
CSDN:https://yetingyun.blog.csdn.net/本文僅用于交流學習,未經作者允許,禁止轉載,更勿做其他用途,違者必究,覺得文章對你有幫助、讓你有所識訓的話,期待你的點贊呀,不足之處,也可以在評論區多多指正,
????《Python最優化演算法實戰》此書以理論結合編程開發為原則,使用Python作為開發語言,講解優化演算法的原理和應用,詳細介紹了Python基礎、Gurobi 優化器、線性規劃、整數規劃、多目標優化、動態規劃、圖與網路分析、智能優化演算法,點擊下圖可看詳情/購買!????
感謝北京大學出版社支持!周日統一兌換!后臺回復“讀書會”進群,聊書聊幣吹吹牛!后臺回復“規則”輕松賺幣,免費包郵帶回家!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/253490.html
標籤:python
上一篇:自學爬蟲專案(一)
